This satisfying soup brings together homemade Italian-style meatballs, aromatic vegetables, and small pasta in a luscious creamy tomato base. The meatballs, seasoned with Parmesan, garlic, and herbs, develop deep flavor after browning before simmering to perfection in the broth.
What makes this special is the finishing touch of heavy cream and fresh spinach, creating a silky texture and vibrant color. Each bowl delivers tender meatballs, al dente pasta, and wholesome vegetables in a rich, comforting broth that's perfect for chilly evenings.
Ready in about an hour, this soup serves six generously and pairs beautifully with crusty bread for soaking up every drop of the flavorful broth.
Rain was tapping against my kitchen window last Tuesday when I decided this soup needed to happen. Something about gray skies makes me crave anything with tomatoes and cream. I ended up making enough for my whole street and barely saved a bowl for myself.
My neighbor actually knocked on my door to ask what smelled so good. I sent her home with a container and she texted me ten minutes later saying she licked it clean. Now she asks about this soup every time she sees me in the hallway.
Ingredients
- 500 g ground beef or beef pork mix: The fat content keeps meatballs tender and adds flavor to the broth
- 1/2 cup breadcrumbs: Essential binding but dont overmix or meatballs get tough
- 1/4 cup grated Parmesan: Adds umami depth that makes everything taste restaurant quality
- 1 large egg: The glue that holds everything together without making the mixture heavy
- 2 cloves garlic minced: Fresh garlic beats powder every single time in meatballs
- 2 tbsp fresh chopped parsley: Brightens the rich meat and adds little green flecks
- 1 tsp dried oregano: Classic Italian herb that pairs perfectly with beef
- 1/2 tsp salt and 1/4 tsp black pepper: Keep seasoning light because soup will be salted too
- 2 tbsp olive oil: Split between browning meatballs and starting the soup base
- 1 medium onion diced: The foundation of flavor that sweetens as it cooks
- 2 carrots and 2 celery stalks diced: Classic mirepoix that gives body and sweetness
- 3 cloves garlic minced: More garlic because you can never really have too much
- 1 tsp dried basil and 1/2 tsp dried thyme: Dried herbs work beautifully in long simmered soups
- 1/2 tsp crushed red pepper flakes: Optional but that tiny kick makes everything more interesting
- 800 g canned crushed tomatoes: Whole tomatoes crushed by hand have better texture
- 1.2 L chicken or vegetable broth: Use good quality broth because it becomes the base flavor
- 1 bay leaf: Old school trick that adds subtle background depth
- 150 g small pasta: Ditalini or orzo are perfect because they fit on the spoon
- 200 ml heavy cream: The magic ingredient that transforms tomato soup into something special
- 100 g baby spinach chopped: Wilts into beautiful green ribbons and adds nutrition
- Salt and black pepper: Taste at the end and adjust because broth brands vary
- Freshly grated Parmesan and herbs: The finishing touch that makes it look fancy
Instructions
- Make the meatball mixture:
- Combine ground meat with breadcrumbs Parmesan egg garlic parsley oregano salt and pepper. Mix with your hands until just combined. Overmixing makes tough meatballs.
- Shape into small balls:
- Form mixture into about 24 meatballs roughly 2.5 cm each. Keep them slightly uniform so they cook evenly. Set them on a plate while you heat the pot.
- Brown the meatballs:
- Heat 1 tbsp olive oil in your soup pot over medium heat. Add meatballs in batches turning to brown all sides. They finish cooking in the soup so dont worry about them being done yet.
- Start the soup base:
- Add remaining olive oil to the same pot. Cook onion carrots and celery for about 5 minutes until softened and fragrant. Add garlic basil thyme and red pepper flakes for one minute more.
- Build the soup:
- Pour in crushed tomatoes broth and bay leaf. Bring everything to a gentle simmer. Return those beautiful browned meatballs back into the pot where they belong.
- Simmer together:
- Cover and let everything cook gently for 15 minutes. The meatballs will finish cooking and flavor the broth. Your kitchen will start smelling amazing right about now.
- Add the pasta:
- Stir in the small pasta and simmer uncovered for about 10 minutes. Cook until pasta is al dente because it will continue softening in the hot soup.
- Creamy finish:
- Remove the bay leaf and reduce heat to low. Pour in heavy cream and add chopped spinach. Stir for 2 to 3 minutes until spinach wilts and soup turns that gorgeous creamy color.
- Season and serve:
- Taste and add salt and pepper if needed. Ladle into bowls and top with fresh Parmesan and herbs. Watch people instantly relax when they take that first spoonful.
My sister claimed she didnt like soup until she tried this at my house last winter. Now she requests it every birthday instead of cake. I take that as the highest compliment possible.
Making It Your Own
Half and half works if you want something lighter but the texture changes slightly. Evaporated milk is another option that adds creaminess without the richness of heavy cream. I have also used coconut milk in a pinch and it created an interesting but delicious fusion version.
Perfect Pasta Every Time
Small pasta shapes are ideal because they stay suspended in the broth instead of sinking to the bottom. Orzo ditalini mini shells or even broken spaghetti pieces work beautifully. Just remember that pasta continues absorbing liquid so the soup will thicken over time.
Make Ahead Magic
This soup actually tastes better the next day when all the flavors have had time to get to know each other. The cream might change texture slightly when reheated so give it a good stir and maybe add a splash more broth. I often make a double batch specifically for leftovers.
- Cool soup completely before refrigerating and it will keep for up to 4 days
- Freeze without the pasta and cream for best results then add fresh when reheating
- Reheat gently over medium low heat stirring occasionally to prevent separating
There is something deeply satisfying about a recipe that looks impressive but comes together in about an hour. This is the soup I make when I need to remind myself why I love cooking.
Recipe FAQs
- → Can I make the meatballs ahead of time?
-
Absolutely. You can prepare and shape the meatballs up to 24 hours in advance. Store them covered in the refrigerator until you're ready to brown and simmer them in the soup.
- → What type of pasta works best in this soup?
-
Small pasta shapes like ditalini, orzo, mini shells, or tubetti hold up well without becoming mushy. Avoid larger shapes as they can overpower the spoonful and may require longer cooking time.
- → Can I freeze this soup?
-
You can freeze the soup without the pasta and cream. Add fresh pasta and cream when reheating to prevent texture issues. The meatballs freeze beautifully and actually develop more flavor when frozen and reheated.
- → How do I prevent the cream from curdling?
-
Always reduce the heat to low before adding the heavy cream, and stir constantly as you incorporate it. Avoid boiling after the cream is added, and add the spinach last just before serving.
- → Can I use store-bought frozen meatballs?
-
Yes, frozen meatballs work well in a pinch. Add them directly to the simmering broth and cook until heated through, about 10-15 minutes. You may want to skip the initial browning step since they're already cooked.
- → What can I substitute for heavy cream?
-
Half-and-half, evaporated milk, or full-fat coconut milk all work as lighter alternatives. Keep in mind that the soup will be less rich and creamy, but still delicious.