This is a tomato-beef broth soup loaded with small ground beef meatballs, cannellini beans, and spinach. It takes about two and a half hours start to finish, most of that hands-off simmering. The honest reason to make it: one pound of ground beef feeds four people generously, and most of the other ingredients are pantry staples.
Before you start
Two things actually matter here. First, the wine-and-stock reduction before the tomatoes go in — don’t rush it. Cutting that liquid down by half concentrates the savory base so the finished broth tastes built, not thin. If you’re skipping wine (cooking wine, leftover table wine, or even a splash of red wine vinegar diluted with extra stock all work), just reduce the stock alone until it’s noticeably darker and more fragrant. Second, keep your meatballs small — about three-quarters of an inch. Larger ones take longer to cook through and can fall apart during the long simmer. The mixture is intentionally wet and sticky; that’s what keeps them tender. Wet hands help with rolling.
Make-ahead notes
This soup holds well and actually tastes better the next day once the meatballs have had time to absorb the broth. Store it in an airtight container in the fridge for up to four days. The spinach will soften overnight — if that bothers you, leave it out and stir in a fresh handful when you reheat. For freezing, cool the soup completely, then freeze in portions for up to three months. Freeze before adding the spinach and basil; both go in fresh after reheating. Reheat on the stovetop over medium-low, adding a splash of water or stock if the broth has thickened. The meatballs are fully cooked and will not fall apart on reheating as long as you keep the heat gentle.
Common problems and fixes
- Meatballs falling apart in the pot: This usually means the mixture wasn’t mixed long enough, or the meatballs were stirred too aggressively right after going in. Let them sit undisturbed for the first 10 minutes before stirring, and make sure the egg and breadcrumbs are fully incorporated before rolling.
- Broth tastes flat or watery: The reduction step was cut short, or the passata was too thin. Fix it mid-cook by removing the lid for the last 20–30 minutes of simmering to let some liquid evaporate. A teaspoon of tomato paste stirred in also helps.
- Soup is too salty: Canned beans and Italian-seasoned breadcrumbs both carry salt, and Pecorino Romano is saltier than Parmesan. Add the beans without extra seasoning and taste before salting the broth. A diced raw potato simmered in the soup for 15 minutes can pull back excess salt — remove it before serving.
- Meatballs are dense or rubbery: Overmixing the meat develops the proteins too much. Combine the meatball ingredients until just combined — stop as soon as you don’t see dry breadcrumbs. Skip the garnish of extra grated cheese on top at the table; the soup is already well-seasoned and it’s not worth the extra dish.
- No passata on hand: A 28-ounce can of crushed tomatoes works directly as a substitute. If you only have whole canned tomatoes, crush them by hand before adding. Tomato puree from a can is also fine — just reduce the added water by about half a cup since puree is thicker.

Savory Ground Beef Meatball Soup
Ingredients
2 tablespoon olive oil
¼ cup olive oil - additional
1 small white onion - diced
4 small carrots - diced
2 stalks celery - diced
1 tablespoon red pepper flakes
3 cloves garlic
1 cup red wine
1 cup beef stock (beef broth or beef bouillon)
28 ounces passata or crushed tomatoes (tomato puree with seeds removed)
7 ¼ cups water
15 ounces cannellini beans
2.5 ounces baby spinach
20 leaves basil - sliced
1 pound ground beef
2 medium eggs- 1 tablespoon granulated garlic
1 tablespoon parsley - flat-leaf, fresh , chopped
1 cup breadcrumbs - Italian seasoned
¼ cup Parmesan cheese - grated
¼ cup pecorino romano cheese - grated
1 pinch salt
1 pinch ground black pepper
Instructions
- In a large, deep pot or Dutch oven, preheat olive oil (about three turns of the pan) over medium-high heat. Sauté the onion, carrot and celery until translucent – about 3 minutes. Season with salt and crushed red pepper. Whack each clove of garlic with a knife – once to remove the peel, and then again to open the clove slightly. Add to the pot and cook for an additional 3 minutes.
- Deglaze the pan with red wine. Lower heat to medium and reduce by half. Add the stock and reduce it by half again.
- Meanwhile, combine the meatball ingredients (ground beef, eggs, 1/4 cup olive oil, granulated garlic, chopped fresh flat-leaf parsley, Italian seasoned breadcrumbs, Parmesan cheese, Pecorino Romano cheese, salt and pepper) in a large bowl. Set aside.
- When the liquid has reduced, stir in the tomatoes and water. Season with salt to taste and bring to a bubble. Reduce heat to medium-low.
- Use your hands to combine the meatball mixture. It should be fairly wet and sticky; that makes for juicier meatballs. Roll into 3/4 inch balls and drop them one at a time directly into the soup. (You could bake the meatballs off in the oven – about 20-25 minutes at 350°F.)
- Stir to combine, reduce heat to low, cover and simmer, stirring occasionally, for 1 hour.
- Rinse and drain the beans. Add to the soup and simmer for an additional 30 minutes.
- At this point, skim the soup and remove the garlic if you like.
- Just prior to serving, stir in spinach and basil. Simmer for about 5 minutes to wilt the greens. To serve, spoon into individual bowls and garnish with grated cheese and additional fresh basil. Enjoy!
Nutrition
Your questions, answered
Can I use a beef-pork blend instead of all ground beef?
Yes, and it works well. A 50/50 beef-pork blend makes slightly juicier meatballs because pork has more fat. Both ground beef and ground pork need to reach an internal temperature of 160°F (71°C), so the cooking time stays the same.
Can I skip the red wine entirely?
Yes. Replace it with an equal amount of beef stock and reduce as directed. You can also use a tablespoon of red wine vinegar mixed into the stock for a little acidity — it won’t taste like wine, but it keeps the broth from being one-dimensional.
Can I use dried breadcrumbs I already have instead of Italian-seasoned ones?
Plain dried breadcrumbs work fine. Add an extra half-teaspoon of dried oregano and a pinch of dried basil to the meatball mix to compensate for the missing seasoning. Panko also works but produces a slightly coarser texture.
Do I have to use both Parmesan and Pecorino Romano?
No — using all Parmesan is the most common substitution and the meatballs will still be well-flavored. Pecorino Romano is sharper and saltier, so if you use all Pecorino, reduce the added salt in the meatball mix and taste the broth carefully before seasoning.
More mince recipes to try
- Hearty Beef Kale Soup
- Olive Beef Polpette Perfection
- Beef Ricotta Lasagna Rolls
- Spicy Beef Stuffed Peppers










