This hearty soup brings together tender Italian-style meatballs, vegetables, and small pasta in a rich creamy tomato broth. The meatballs, made with ground beef, breadcrumbs, and Parmesan, are browned first then simmered to perfection. Carrots, celery, and onions add depth while heavy cream creates a velvety finish. Ready in about an hour, this makes six satisfying servings ideal for family dinners.
The first time I made this soup was during a gray November when everything outside felt raw and damp. My kitchen became the only warm place that existed, filled with the scent of garlic and tomatoes bubbling away on the stove. Something about lifting a steaming bowl to your face and letting the cream tomato broth warm you from the inside out just fixes whatever the day threw at you.
I remember making a triple batch for my sister when she was recovering from surgery. She texted me three days later asking if there was any left and then proceeded to eat soup for breakfast which honestly I support completely. Sometimes comfort food follows its own schedule.
Ingredients
- 500 g ground beef or beef pork mix: The pork adds fat and keeps meatballs tender so do not skip it if you can help it
- 1/2 cup breadcrumbs: These bind everything together and keep the meatballs from getting dense or rubbery
- 1/4 cup grated Parmesan cheese: Adds that salty umami punch that makes Italian meatballs taste like Italian meatballs
- 1 large egg: The glue that holds your meatballs together without making them tough
- 2 cloves garlic minced: Fresh garlic in the meatballs gives you little pockets of flavor as you eat
- 2 tbsp chopped fresh parsley: Brightens up the richness and makes everything taste fresh
- 1 tsp dried oregano: That classic Italian herb backbone you cannot do without
- 1/2 tsp salt and 1/4 tsp black pepper: Keep the seasoning light since the soup will also be salted
- 2 tbsp olive oil: One for browning meatballs one for starting your soup base
- 1 medium onion diced: The foundation of flavor that sweetens as it cooks
- 2 carrots and 2 celery stalks diced: Your soup aromatics that build that classic savory base
- 3 cloves garlic minced: More garlic because it is soup and garlic belongs here
- 1 tsp dried basil and 1/2 tsp dried thyme: Dried herbs work beautifully here since they will simmer for a while
- 1/2 tsp crushed red pepper flakes: Optional but that tiny hum of heat makes everything else pop
- 800 g canned crushed tomatoes: The body and soul of your soup base
- 1.2 L chicken or vegetable broth: Your liquid base so choose one you actually like drinking plain
- 1 bay leaf: Adds that subtle background note that says soup has been simmering for hours
- 150 g small pasta: Ditalini or orzo are perfect because they are spoon sized
- 200 ml heavy cream: This is what transforms it from tomato soup to something deeply luxurious
- 100 g baby spinach roughly chopped: Wilts into the hot soup at the end for color and fresh greens
- Salt and black pepper to taste: Always taste at the end because tomatoes vary in acidity
- Freshly grated Parmesan and herbs for serving: The finishing touches that make it feel like a restaurant bowl
Instructions
- Mix and shape your meatballs:
- Combine the ground meat with breadcrumbs Parmesan egg garlic parsley oregano salt and pepper in a large bowl. Mix gently just until everything is distributed because overmixing makes tough meatballs. Form them into small balls about 2.5 cm across and set them on a plate.
- Brown the meatballs:
- Heat one tablespoon of olive oil in your large soup pot over medium heat. Add meatballs in batches so you do not crowd the pan turning them until they are browned on all sides. They will finish cooking in the soup so just get some nice color on them first then transfer to a plate.
- Cook the aromatics:
- Pour in the remaining tablespoon of olive oil into that same pot. Add your onion carrots and celery and cook for about 5 minutes until they are softened and smell amazing. Toss in the garlic basil thyme and red pepper flakes and give it one more minute.
- Build the soup base:
- Pour in the crushed tomatoes and broth then drop in the bay leaf. Bring everything to a gentle simmer then carefully slide those browned meatballs back into the pot. Cover and let it simmer gently for 15 minutes so the meatballs finish cooking and the flavors start mingling.
- Add the pasta:
- Stir in the small pasta and keep simmering uncovered for about 10 minutes. You want the pasta to be al dente and the meatballs completely cooked through. The liquid will reduce slightly which is exactly what you want.
- Finish with cream and spinach:
- Turn the heat down to low and fish out the bay leaf. Pour in the heavy cream and scatter in the chopped spinach. Stir everything together and let it cook for just 2 to 3 minutes until the spinach wilts and the soup turns that gorgeous creamy orange red.
- Serve it up:
- Ladle the hot soup into bowls and shower each one with freshly grated Parmesan and chopped fresh herbs. Set out some crusty bread on the table because you will want something to drag through that creamy broth.
This soup has become my go to when someone has had a hard week or needs a proper hug in a bowl. There is something about the ritual of stirring that cream in at the end watching the broth transform that feels almost meditative.
Making It Your Way
I have played around with this recipe enough to know what works and what does not. Substituting half and half for heavy cream works in a pinch but you lose some of that luxurious body. Ground turkey makes perfectly fine meatballs but you really need that fat from pork or beef to keep them from drying out.
Get Everything Ready First
Having all your vegetables diced before you start cooking makes the whole process feel less chaotic. The soup moves pretty quickly once you start so I chop my onions carrots and celery into little piles on a cutting board first. It saves you from that moment of panic when something is burning and you are still trying to mince garlic.
Leftovers Actually Get Better
Like most soups this one tastes even better the next day after all the flavors have had time to really get to know each other. The pasta will soak up some broth so you might need to splash in a little extra liquid when you reheat it.
- Store in an airtight container for up to 4 days
- The pasta will soften more over time which some people actually prefer
- Freeze without the pasta if you want to keep it longer and add fresh pasta when reheating
There is nothing quite like standing over a steaming pot of this soup on a cold evening while rain taps against the kitchen window.
Recipe FAQs
- → Can I make this soup ahead of time?
-
Yes, prepare up to 2 days ahead and refrigerate. Add pasta when reheating to prevent it from becoming mushy, and stir in cream just before serving.
- → Can I freeze the soup?
-
Freeze without pasta and cream for up to 3 months. Add fresh pasta and cream when reheating for best texture and consistency.
- → What pasta works best?
-
Small shapes like ditalini, orzo, or small shells work perfectly as they fit on the spoon and hold the creamy broth well.
- → Can I make it lighter?
-
Substitute half-and-half or evaporated milk for heavy cream, and use ground turkey or chicken instead of beef for a lighter version.
- → How do I store leftovers?
-
Keep refrigerated in an airtight container for up to 4 days. The pasta will absorb liquid, so add extra broth when reheating if needed.