This hearty bowl brings together handmade Italian-style meatballs, small pasta, and fresh vegetables in a luscious tomato-cream broth. The meatballs stay incredibly tender after simmering directly in the liquid, while the ditalini or orzo pasta adds satisfying substance. A splash of heavy cream at the end creates that signature velvety texture, and baby spinach wilts in for fresh color and nutrients. The entire preparation comes together in just one hour, making it ideal for weeknight dinners or meal prep batches.
The first time I made this soup was during a particularly brutal February when my apartment heater was barely holding its own against the drafty windows. I had been craving something that felt like a warm embrace but didn't require hours at the stove. This soup ended up being exactly what I needed, rich and comforting enough to make me forget about the weather outside entirely.
Last winter, my sister came over after a terrible week at work and I put a pot of this on the stove. She took one sip, closed her eyes, and told me it was exactly what she needed. Now she requests it every time she visits, saying it's the only thing that can fix a bad day.
Ingredients
- Ground beef (500 g or beef and pork mix): The pork adds extra fat and flavor that keeps the meatballs incredibly tender, but all beef works perfectly too
- Breadcrumbs (1/2 cup): These are the secret to keeping meatballs from becoming tough little rocks, they absorb moisture and create that perfect texture
- Parmesan cheese (1/4 cup grated): Dont use the pre-grated stuff in the tub, fresh grated melts into the meatballs and adds that nutty richness you can't fake
- Large egg: Acts as the binding agent that holds everything together without making the mixture dense
- Garlic (5 cloves total): Fresh minced garlic is non-negotiable here, it builds that aromatic base that makes your whole kitchen smell incredible
- Fresh parsley (2 tbsp chopped): I learned that adding herbs directly to the meatball mixture layers flavor throughout every single bite
- Olive oil (2 tbsp): Use good quality olive oil since youre not cooking it at high heat, the fruitiness really comes through
- Onion, carrots, celery: This classic mirepoix creates the foundational flavor base that makes the soup taste like it simmered all day
- Dried basil and thyme: Dried herbs actually work better than fresh here since they'll bloom during the longer simmer time
- Crushed tomatoes (800 g): I prefer crushed over diced for soups because they break down beautifully and create that rustic texture
- Small pasta (1 cup): Ditalini is my go-to but orzo or even broken spaghetti work in a pinch, just avoid anything too large
- Heavy cream (200 ml): This is what transforms it from standard tomato soup to something velvety and restaurant-worthy
- Baby spinach (100 g): Added at the very end so it just wilts, bringing freshness and color without getting slimy
Instructions
- Mix the meatball mixture:
- Combine everything in a large bowl and mix with your hands just until the ingredients are evenly distributed, overworking makes tough meatballs
- Form small meatballs:
- Roll them into about 1-inch balls, they'll plump up slightly as they cook so keep them on the smaller side for easy spooning
- Brown the meatballs in batches:
- Heat olive oil in your soup pot over medium heat and cook them just until golden on all sides, they don't need to cook through yet
- Sauté the vegetable base:
- Add the onion, carrots, and celery to the same pot, cooking for about 5 minutes until they soften and start to smell sweet
- Add the aromatics:
- Stir in the garlic, basil, thyme, and red pepper flakes and cook for just one minute until fragrant, careful not to burn the garlic
- Build the soup base:
- Pour in the crushed tomatoes and broth, drop in the bay leaf, and return the browned meatballs to the pot
- Simmer together:
- Bring everything to a gentle bubble then cover and let it simmer for 15 minutes so the flavors meld and meatballs finish cooking
- Cook the pasta:
- Stir in the pasta and continue simmering uncovered for about 10 minutes until tender, stirring occasionally so it doesn't stick
- Add the cream and spinach:
- Reduce the heat to low, remove the bay leaf, and stir in the heavy cream and spinach, cooking just 2-3 minutes until the spinach wilts
- Season and serve:
- Taste and add salt and pepper as needed, then ladle into bowls topped with extra Parmesan and fresh herbs
This recipe has become my go-to when friends need comfort food but I don't have the energy for something complicated. Something about tender meatballs floating in that creamy tomato broth just makes people feel taken care of.
Making It Ahead
I've learned to cook the pasta separately and add it just before serving if I'm making this ahead for a party. The pasta soaks up so much broth overnight that leftovers can become more like stew than soup. Store the soup base and meatballs in one container and the cooked pasta in another, then combine them when reheating.
Perfecting The Cream
Temper the cream before adding it by whisking a small amount of the hot soup into it first, then pour it back into the pot. This prevents the cream from curdling when it hits the hot liquid. I learned this the hard way after making a soup that tasted delicious but looked slightly grainy.
Getting Creative
Don't be afraid to play with the vegetable base depending on what's in your fridge. I've added diced zucchini in summer and swapped in kale for spinach when that's what I had on hand.
- A splash of white wine added with the tomatoes brings brightness that cuts through the cream
- Try stirring in a spoonful of pesto at the end for an incredible basil punch
- A piece of parmesan rind simmered in the broth adds incredible depth, just fish it out before serving
There's something so satisfying about ladling this soup into bowls and watching people's faces light up. It's simple food that feels special, exactly what comfort cooking should be.
Common Questions
- → Can I make the meatballs ahead of time?
-
Absolutely. Form and brown the meatballs up to 24 hours in advance, then refrigerate until ready to simmer in the broth. This actually enhances flavor development.
- → What pasta works best in this soup?
-
Small shapes like ditalini, orzo, tubetti, or tiny shells hold up beautifully during simmering. Avoid larger pasta which may become mushy or overpower the delicate balance.
- → How do I store leftovers?
-
Cool completely and refrigerate in airtight containers for up to 4 days. The pasta will absorb more liquid, so add extra broth when reheating. Freezing works best without the pasta added.
- → Can I make this lighter?
-
Replace heavy cream with half-and-half, evaporated milk, or full-fat coconut milk. Use lean ground beef or turkey for the meatballs, and increase vegetables for added bulk.
- → What can I serve alongside?
-
Crusty bread, garlic knots, or a simple green salad complement perfectly. A light white wine like Pinot Grigio pairs wonderfully with the rich, tomato-based broth.
- → Is gluten-free possible?
-
Simply use gluten-free breadcrumbs in the meatballs and substitute your favorite gluten-free small pasta. Double-check that all seasonings and canned tomatoes are certified gluten-free.