When my pickiest eater was little, dinner was a negotiation.
I tried to get more vegetables and protein into one bowl, and I was losing. Meatball soup was the dish that finally worked — the meatballs and the pasta were the cover story, and the carrots, celery, and spinach went in underneath them without a single complaint.
The bowls came back empty. Mission accomplished.
That kid is older now and doesn’t need vegetables hidden anymore, and this soup is still the one they ask for. It’s been on constant repeat in our house through every fall and winter since those early years, and we pull out the Dutch oven for it before anything else.
I make it when the weather turns, and I want something that feels like it simmered all afternoon.
It’s also the soup I make when I want the frozen-meatball shortcut to taste like it wasn’t one.
The meatballs are fresh ground beef, seared in the pot before anything else goes in, and the browned bits left on the bottom become the base of the broth.
It comes to about 28 grams of protein per serving, and I tested it in my kitchen with 90/10 beef and ditalini—the detail that makes it reliable is mixing the meatball mixture gently, just until it comes together, because overworking ground beef makes it dense, and no amount of simmering fixes that.
Why This Recipe Works

Pan-searing the meatballs in the pot builds the flavor base for the whole soup. Browning meat creates the savory compounds that make broth taste rich, and the browned bits stuck to the bottom of the pot form the foundation. If you drop raw or frozen meatballs straight into the liquid, you skip that step, and the broth tastes thin no matter how long it simmers. Sear them first, in a single layer, and scrape the fond up when the broth goes in.
The mirepoix and tomato paste go into the meatball drippings, not fresh oil. Onion, carrot, and celery cooked in the rendered beef fat pick up flavor that oil can’t give them, and the tomato paste bloomed in that fat for a minute turns deep red and loses its raw, tinny edge. That one minute is the difference between a broth that tastes like tomatoes and one that tastes like a tomato-beef soup.
Fire-roasted tomatoes add a smoky depth that plain canned tomatoes don’t have. They’re not just a texture upgrade — the roasting gives them a sweetness and a slight char that stands up to the beef broth. If you only have regular diced tomatoes, the soup still works, but it tastes flatter, and you’ll want an extra pinch of Italian seasoning.
Cooking the pasta separately is the single most important step for leftovers. Pasta boiled in the soup keeps absorbing broth after it comes off the heat, and by the next day you have a thick, starchy porridge instead of a soup with pasta in it. Boil it separately, toss it with a little oil, and add it to the bowl so the pasta stays al dente and the broth stays broth. If you’re eating the whole pot in one sitting, you can add the pasta to the pot for the last seven or eight minutes instead.
An egg yolk and a quarter cup of Parmesan keep the meatballs tender. Lean ground beef dries out fast when simmered. The yolk adds fat and moisture, the Parmesan adds flavor and a little binding, and the gentle mixing keeps the proteins from tightening. Skip any of those and the meatballs come out firm and dry.
The spinach goes in off the heat, at the very end. Spinach releases water when it cooks, and a full two cups added early would dilute the broth. Stirred in with the heat off, it wilts in the residual warmth in about a minute and stays bright green.
Ingredients That Matter

Most of this list is flexible. Three ingredients are easy to get wrong, so those are the ones worth explaining.
90/10 or 93/7 lean ground beef. This is the protein and the flavor, and it’s the reason this soup beats the frozen-meatball version. 90/10 is the sweet spot — enough fat to brown and stay juicy, not so much that the broth turns greasy. 93/7 works but is a little drier; if you use it, don’t skip the egg yolk. Avoid 80/20 here — the fat renders into the broth and makes the soup heavy.
Fire-roasted diced tomatoes. They bring a smoky sweetness regular canned tomatoes lack, and they’re what makes this taste like a soup that simmered longer than it did. If you can only find plain diced tomatoes, add an extra half teaspoon of Italian seasoning and a pinch of smoked paprika to compensate.
Small pasta — ditalini, acini di pepe, or star pasta. Small shapes work because they fit on a spoon with the meatballs and broth. Ditalini is the most forgiving, star pasta is the most traditional for pastina, and acini di pepe is the smallest. Don’t use regular elbow macaroni — it’s too large and absorbs too much broth if it sits.
How to Make It

Step 1: Shape the meatballs.
In a medium bowl, combine 1 pound of 90/10 ground beef, ¼ cup of freshly grated Parmesan, 1 egg yolk, ½ teaspoon garlic powder, 1 teaspoon Italian seasoning, ½ teaspoon kosher salt, and ¼ teaspoon black pepper. Mix gently with your hands just until combined — stop as soon as there are no dry spots. Roll into small meatballs about ¾ inch wide; you should get 24 to 30.
Step 2: Sear the meatballs.
Heat 1 tablespoon of olive oil in a large Dutch oven or heavy soup pot over medium-high heat. Add the meatballs in a single layer and sear for 3 to 4 minutes, turning gently, until browned on all sides but not cooked through — the centers should still be slightly pink. Transfer to a plate with a slotted spoon and set aside.
Step 3: Sauté the mirepoix and bloom the tomato paste.
Reduce the heat to medium. Add 1 diced medium onion, 2 carrots sliced into thin rounds, and 2 chopped celery stalks to the fat remaining in the pot. Cook for 4 to 5 minutes, until the vegetables are softened and the onion looks translucent. Add 3 minced garlic cloves and 1 tablespoon of tomato paste and stir constantly for 1 minute, until the paste turns deep red and smells sweet rather than raw.
Step 4: Build the broth.
Pour in 2 cans (14.5 oz each) fire-roasted diced tomatoes with their juices, 4 cups low-sodium beef broth, 1 teaspoon Italian seasoning, and 1 bay leaf. Scrape the bottom of the pot with a wooden spoon to lift the browned bits — that’s the flavor base. Bring to a simmer.
Step 5: Simmer the meatballs.
Return the seared meatballs and any juices on the plate to the pot. Cover partially, reduce heat to medium-low, and simmer gently for 12 to 15 minutes, until the vegetables are tender and the meatballs reach 160°F.
Step 6: Cook the pasta separately.
While the soup simmers, cook 1 cup of ditalini, star pasta, or acini di pepe in a separate pot of well-salted boiling water until al dente. Drain and toss with ½ teaspoon olive oil to prevent sticking.
Step 7: Finish and serve.
Turn off the heat, discard the bay leaf, and stir in 2 cups of fresh baby spinach until just wilted, about 1 minute. Divide the cooked pasta among 6 bowls, ladle the hot soup over the top, and garnish with grated Parmesan and chopped fresh parsley.
Tips and Troubleshooting

The meatballs turned out dense and tough. You overworked the mixture, or the beef was too lean. Mix just until combined, use 90/10, and don’t skip the egg yolk and Parmesan.
The meatballs fell apart in the broth. They weren’t seared long enough to set, or the mixture was too wet. Sear them until browned on all sides before returning them to the pot, and make sure the egg yolk is fully mixed in.
The broth tastes thin and watery. You didn’t scrape up the fond, or you didn’t bloom the tomato paste. Scrape the bottom of the pot when the broth goes in, and cook the paste for the full minute until it darkens.
The soup turned into porridge overnight. The pasta cooked in the soup. Boil the pasta separately and add it to the bowl, or if you’re eating it all at once, add it to the pot for only the last 7 to 8 minutes.
The broth is too salty. Both the beef broth and Parmesan add salt. Use low-sodium broth, taste before adding any extra salt, and if it’s already too salty, add a splash of water or an extra half cup of unsalted broth.
The spinach turned dark and slimy. It cooked too long. Stir it in with the heat off and pull the pot off the burner — it wilts in about a minute.
The meatballs are dry in the center. They simmered too long, or the beef was too lean. Simmer for 12 to 15 minutes, not longer, and pull them at 160°F.
Other Cooking Methods
I haven’t tested this in a slow cooker, and the crockpot version would be a different recipe—the meatballs would need to be seared first, the pasta would still need to be cooked separately, and the simmer time would change the meatballs’ texture. If you try it, I’d love to hear how it turns out.
Storage and Make-Ahead
Store the soup, without the pasta, in a sealed container in the refrigerator for up to 4 days. Store the cooked pasta separately and add it to the bowl when you reheat — pasta stored in the broth absorbs it and turns soft.
Reheat the soup gently on the stovetop or in the microwave until it reaches 165°F. If it has thickened, loosen it with a splash of broth or water.
I don’t recommend freezing the soup with pasta, but the soup base without pasta freezes well for up to 3 months. Thaw overnight in the refrigerator and reheat gently, then cook fresh pasta to serve with it.
Store leftovers in the refrigerator within 2 hours of cooking, and discard anything left at room temperature for more than 2 hours.
Homemade Italian Ground Beef Meatball & Pastina Soup
Juicy pan-seared ground beef mini meatballs simmered in a rich tomato-beef broth with carrots, celery, spinach, and tender ditalini or star pasta. About 28 g of protein per serving.
Ingredients
For the meatballs:
- 1 lb 90/10 lean ground beef
- ¼ cup freshly grated Parmesan
- 1 egg yolk
- ½ tsp garlic powder
- 1 tsp Italian seasoning
- ½ tsp kosher salt
- ¼ tsp freshly ground black pepper
For the soup:
- 1 tbsp olive oil
- 1 medium yellow onion, finely diced
- 2 medium carrots, sliced into thin rounds
- 2 celery stalks, finely chopped
- 3 cloves garlic, minced
- 1 tbsp tomato paste
- 2 (14.5 oz) cans fire-roasted diced tomatoes, undrained
- 4 cups low-sodium beef broth
- 1 tsp Italian seasoning
- 1 bay leaf
- 1 cup small star-shaped pasta, ditalini, or acini di pepe, cooked separately
- 2 cups fresh baby spinach, roughly chopped
- ¼ cup fresh parsley or grated Parmesan, for garnish
Instructions
- Combine the ground beef, Parmesan, egg yolk, garlic powder, Italian seasoning, salt, and pepper in a bowl. Mix gently just until combined and roll into ¾-inch meatballs, about 24 to 30.
- Heat the olive oil in a large Dutch oven over medium-high heat. Sear the meatballs in a single layer for 3 to 4 minutes, turning gently, until browned on all sides but not cooked through. Transfer to a plate.
- Reduce heat to medium. Add the onion, carrots, and celery to the pot and cook 4 to 5 minutes until softened. Add the garlic and tomato paste and stir constantly for 1 minute until deep red and fragrant.
- Pour in the tomatoes, broth, Italian seasoning, and bay leaf, scraping up the browned bits. Bring to a simmer.
- Return the meatballs and their juices to the pot. Cover partially and simmer on medium-low for 12 to 15 minutes, until the vegetables are tender and the meatballs reach 160°F.
- Cook the pasta separately in salted boiling water until al dente. Drain and toss with ½ teaspoon olive oil.
- Turn off the heat, discard the bay leaf, and stir in the spinach until wilted. Divide the pasta among 6 bowls, ladle the soup over the top, and garnish with Parmesan and parsley.
Notes
Notes: Store the soup and pasta separately in the refrigerator for up to 4 days. The soup base freezes well for up to 3 months without the pasta. Nutrition information is an estimate.
Nutrition (per serving, estimated): About 340 calories, 28g protein, 26g carbs, 12g fat, 4g fiber, 680mg sodium.
FAQ
Can I make this meatball soup in a crockpot?
I haven’t tested a crockpot version, and it would be a different recipe — the meatballs still need to be seared first for flavor, and the pasta still needs to be cooked separately. If you try it, sear the meatballs and sauté the mirepoix on the stovetop first, then transfer everything to the slow cooker and cook on low for 4 to 5 hours, adding the spinach at the end.
Can I use frozen meatballs instead?
You can, and it’s faster, but the soup will taste thinner because you lose the fond from searing fresh meatballs. If you use frozen, brown them briefly in the pot first to build some flavor, and add them to the broth for the last 15 minutes.
Can I make this creamy?
Stir in a splash of heavy cream or a cornstarch-and-milk slurry at the end, off the heat, for a creamy meatball soup. I haven’t tested exact amounts, so start with ¼ cup of cream and add more to taste.
What pasta works best?
Ditalini is the most forgiving, star pasta is the most traditional for pastina, and acini di pepe is the smallest. Avoid large shapes like elbows or rigatoni — they absorb too much broth and don’t fit on a spoon with the meatballs.
Can I use ground turkey or chicken instead of beef?
Yes, but use 93/7 or a mix with a little dark meat, because lean turkey dries out faster than beef. Keep the egg yolk and Parmesan for moisture, and taste the broth before adding salt.
How do I keep the pasta from getting soggy in leftovers?
Store the pasta separately from the soup and add it to the bowl when you reheat. Pasta stored in the broth keeps absorbing liquid and turns soft within a day.
More Ground Beef Recipes You’ll Love
- Juicy Beef Meatballs for Spaghetti — The Italian Comfort Food You’ll Make on Repeat
- Meatball Meal Prep — 40g Protein, 5 Lunches in 45 Minutes
- Creamy Chicken Noodle Soup from Scratch — 43g Protein, Comfort in a Bowl
Closing
Make this meatball soup on a cold night when you want something that tastes like it simmered all afternoon but didn’t.
The technique in the recipe card — searing the meatballs in the pot first, blooming the tomato paste in the beef drippings, scraping up the fond, and cooking the pasta separately — is what makes it taste rich instead of thin and keeps the leftovers from turning to porridge.
If you try the crockpot version or make it creamy, let me know how it turns out.