Soups & Stews
This ball soup recipe transforms humble ingredients into a deeply comforting dish that simmers for hours, creating tender meatballs in a velvety tomato broth. The slow cooking process develops layers of flavor—savory meatballs, aromatic herbs, and a rich, velouté-like sauce—that make every spoonful satisfying.
I’ve perfected this version after years of testing, balancing tradition with modern efficiency for a result that feels both nostalgic and refined.
The secret lies in the broth: a slow-simmered blend of tomatoes, garlic, and herbs that infuses the meatballs with depth. Using ground beef and pork creates a tender, juicy texture, while a touch of breadcrumbs ensures they hold together without becoming dense.
The vegetables—carrots, celery, and onions—add natural sweetness and structure, rounding out the dish with every bite.
What makes this recipe stand out is its versatility—it’s hearty enough for a family dinner but elegant enough for a special occasion. The meatballs stay tender and flavorful, while the sauce thickens just enough to coat each spoonful without being heavy.
Serve with crusty bread to soak up every last drop of that rich, aromatic broth.
Perfect for chilly evenings or when you crave a meal that feels like a warm embrace, this ball soup delivers restaurant-quality comfort at home.
The prep takes just 30 minutes, but the reward is worth the wait—a dish that tastes even better the next day as the flavors meld together.
Ingredients for ball soup
Sixteen ingredients for a deeply satisfying soup that tastes even better the next day.
| Ingredient | Amount | Notes |
|---|---|---|
| Ground Beef 🥩 | 1 ½ lb | 80% lean for juiciness |
| Ground Pork 🐷 | ½ lb | Finely ground for texture |
| All-Purpose Flour 🌾 | ½ cup | For meatball binding |
| Fresh Parsley 🌿 | ¼ cup | Finely chopped, stems okay |
| Fresh Basil 🌿 | ¼ cup | Chopped for fresh aroma |
| Large Eggs 🥚 | 2 whole | Room temperature preferred |
| Garlic Cloves 🧄 | 4 cloves | Minced for deep flavor |
| Carrots 🥕 | 3 medium | Peeled and diced small |
| Celery Stalks 🧅 | 3 whole | Chopped finely for base |
| Yellow Onion 🧅 | 1 medium | Diced for aromatic base |
| Canned San Marzano Tomatoes 🍅 | 28 oz | Crushed by hand preferred |
| Tomato Paste 🍅 | 2 tbsp | For rich tomato depth |
| Dry White Wine 🍷 | ½ cup | Substitute with broth if needed |
| Beef Broth 💧 | 2 cups | Low-sodium preferred |
| Bay Leaves 🌿 | 2 whole | Fresh preferred, dried okay |
| Salt 🧂 | 1 ½ tsp | Adjust to taste |
| Black Pepper 🌶️ | 1 tsp | Freshly ground preferred |
| Olive Oil 🫒 | 2 tbsp | Extra-virgin for richness |
The ground beef and pork blend is key—80% lean beef keeps it tender, while the pork adds richness. Most grocery stores carry pre-ground meat, but if you're buying whole cuts, ask for them to grind it fresh at the meat counter. Costco and Trader Joe's both have excellent quality at reasonable prices. For the tomatoes, San Marzano cans are worth the splurge—they're sweeter and less acidic, which balances the acidity in the wine. If you can't find them, any high-quality crushed tomatoes will work, but avoid the watery brands.
No white wine? Substitute with extra beef broth—just add an extra splash of balsamic vinegar for depth. Fresh herbs are ideal, but dried oregano at half the amount works in a pinch. The carrots and celery can be swapped for frozen if you're short on time, though fresh has better texture. For the meatballs, don't overmix the ingredients—just combine until just combined to keep them tender. The tomato paste is non-negotiable here—it thickens the sauce beautifully without making it heavy.
This soup tastes even better the next day as the flavors meld together. Store in an airtight container in the fridge for up to 5 days, or freeze for 3 months. I like to portion it into individual containers so I can grab a ready-made lunch. The meatballs reheat beautifully—just warm through gently on the stove with a splash of broth to keep them moist. For extra richness, stir in a spoonful of the broth you froze with the soup when reheating.
Why You'll Love This Recipe
- No-Fuss Assembly: I swear by this—just mix the ground beef and pork with a handful of flour, shape into balls, and drop them in simmering broth. No rolling pins, no fancy techniques, just raw, satisfying hands-on work that takes all of two minutes.
- Herb-Packed Punch: That bright parsley and basil chopped right into the broth? It’s the secret weapon. The meatballs stay tender but soak up the flavor, giving every bite a fresh, almost Mediterranean lift without needing fancy herbs.
- Leftover Hero: Between us, this soup is made for leftovers. The meatballs reheat perfectly—no drying out, no sad textures—and I’ve turned yesterday’s dinner into tomorrow’s lunchbox filler with zero effort.
- Budget Meal Magic: Ground pork and beef stretch for miles here, and flour’s the only “expensive” ingredient you’ll need. Honestly, I’ve fed six people for under $15, and no one ever complains about the taste—or the seconds.
Step-by-step instructions for slow-simmered meatballs in tomato velouté
Here's the method for creating tender meatballs and velvety tomato broth—simple but precise steps for perfect results.
Prepare the Meatball Mixture
In a large bowl, combine the 1.5 lb ground beef and 0.5 lb ground pork. This blend gives you juiciness from the beef and fine texture from the pork. Add the 0.5 cup all-purpose flour, 1.5 tsp salt, and 1 tsp black pepper, mixing gently with your hands until just combined. Overmixing develops gluten, which makes meatballs tough.
In a separate small bowl, beat the 2 whole large eggs until just combined. Add the eggs to the meat mixture along with the 0.25 cup finely chopped fresh parsley and 0.25 cup chopped fresh basil. Mix carefully—just until everything comes together. The dough should hold its shape when pressed but still be tender. If it feels too wet, add 1 tablespoon more flour; if too dry, add 1 teaspoon beef broth. Form into 1.5-inch diameter meatballs (about 18 total) and set aside on a plate.
Build the Aromatic Base
Heat the 2 tbsp olive oil in a large Dutch oven over medium heat. Add the 1 medium yellow onion, 3 medium carrots, and 3 whole celery stalks, all diced small. Cook for 8-10 minutes until the vegetables soften and the onion becomes translucent. This step develops the foundational flavors of the soup.
Add the 4 cloves minced garlic and cook for 30 seconds until fragrant—don't let it brown or it'll turn bitter. Stir in the 2 tbsp tomato paste and cook for 1 minute to deepen the tomato flavor. Pour in the 0.5 cup dry white wine and let it simmer for 2 minutes until mostly evaporated. This deglazing step captures all the browned bits from the vegetables.
Simmer the Meatballs and Broth
Add the 18 meatballs in a single layer to the Dutch oven. Cook for 5 minutes on all sides until lightly browned. This initial sear locks in juices and creates texture. Pour in the 28 oz canned San Marzano tomatoes (crushed by hand if possible) and 2 cups beef broth. Add the 2 whole bay leaves and bring to a gentle simmer.
Cover the pot and reduce heat to low. Let the soup simmer for 1 hour 15 minutes, stirring occasionally. The meatballs should cook through and the broth should thicken slightly. You'll know they're done when a meatball inserted with a fork feels tender all the way through and the broth coats the back of a spoon with a velvety consistency. If the broth reduces too much, add ½ cup water to maintain the right texture.
Finish and Serve
Remove the 2 whole bay leaves and adjust seasoning if needed. Taste the broth and add more salt or black pepper as necessary. The soup should be rich but balanced—slightly acidic from the tomatoes, savory from the meat, and aromatic from the vegetables.
Serve the meatballs directly from the pot, ladling generous portions of broth over them. The meatballs should be tender with just a hint of pink in the center, and the broth should coat the spoon with a silky, velvety texture. Garnish with additional fresh parsley and fresh basil if desired. This dish tastes even better the next day as the flavors meld further.
Pro Tips For Making Ball Soup
- MEAT TEMPERATURE MATTERS: Use a meat thermometer—ground beef and pork need to hit 160°F (71°C) in the center, not just look cooked. I learned this the hard way when my first batch came out gray inside (yes, I ate it anyway, but don’t).
- CHILL THE MIX BEFORE SHAPING: Roll the meat-flour mixture into balls after chilling it 30 minutes in the fridge. Warm dough sticks, tears, and turns mushy—cold hands and a firm texture guarantee cleaner shapes and better searing.
- DON’T OVERMIX THE DOUGH: Knead just until combined—overworking the meat and flour makes the balls dense and chewy. My grandmother’s trick: use a fork to rough-mix, then wet hands to shape. Less effort, same flavor.
- BROWN IN BATCHES: Crowding the pan steams the meat instead of searing it. Cook in single-layer batches over medium-high heat for 2–3 minutes per side—golden crusts happen when they’re not fighting for space. (Your future self will thank you.)
Perfect pairings for ball soup
Crusty Bread Pairings
Nothing beats this soup with a warm, crusty loaf to soak up every last drop of that rich tomato broth. I love using a sourdough baguette from my local bakery—its chewy texture and tangy flavor complement the meatballs perfectly.
For a more rustic option, try a focaccia with rosemary and olive oil drizzled on top. If you're short on time, a garlic breadstick from Trader Joe's works in a pinch. 🥖
Cheesy Toppings
Add a sprinkle of Parmesan cheese right before serving for a salty, umami boost that pairs beautifully with the tomato broth. I like using a freshly grated version for the best texture.
For a richer option, try shredded mozzarella or fontina cheese—both melt slightly when the soup is piping hot, creating a creamy finish. A few drops of hot honey drizzled on top adds a sweet contrast. 🧀
Green Salad Contrast
A crisp arugula salad with lemon vinaigrette cuts through the richness of the soup beautifully. Toss 4 cups baby arugula with 2 tbsp olive oil, 1 tbsp fresh lemon juice, and a pinch of flaky sea salt.
Add ½ cup shaved Parmesan for extra crunch. The peppery bite balances the hearty meatballs and velvety broth. 🥗
Wine Pairings
A Chianti Classico from Tuscany is my go-to wine for this soup—its bright acidity and cherry notes complement the tomato broth perfectly. For something lighter, a Pinot Noir from Oregon offers earthy undertones that harmonize with the meatballs.
If you prefer white, a dry Vermentino from Sardinia provides crispness without overpowering the dish. 🍷
Beverage Pairings
A cold Italian lager like Peroni or Moretti cleanses your palate between spoonfuls of rich soup. For a non-alcoholic option, sparkling water with a squeeze of lemon adds a refreshing contrast.
If you're feeling indulgent, a dark beer like a stout adds a malty depth that pairs surprisingly well with the tomato base. 🍺
Garnish Ideas
Finish your bowl with fresh basil leaves or parsley for a pop of color and brightness. A drizzle of extra-virgin olive oil enhances the flavors, while red pepper flakes add a subtle kick for those who love heat.
For a touch of luxury, a few toasted pine nuts or crispy fried shallots add crunch and texture. ✨
Nutrition facts
Frequently asked questions
Can I make this ball soup vegetarian?
Swap the ground beef and pork for 1 lb lentils or 1.5 lbs mushrooms (finely chopped) mixed with 0.5 cup breadcrumbs and 1 flax egg (1 tbsp ground flax + 3 tbsp water). Use vegetable broth instead of beef broth and add 1 tsp smoked paprika for depth. The meatballs will have a heartier texture but still hold together beautifully.
Why do your meatballs stay tender while others turn dry?
The secret is in the binding agents and cooking method. Using 1.5 tsp salt and 0.5 cup flour creates a delicate network that holds moisture, while the 1-hour 15-minute low simmer ensures even cooking without overcooking. Never skip the 5-minute sear—it creates a barrier that locks in juices. Overmixing or high heat are the usual culprits for dry meatballs.
Can I make this soup in an Instant Pot?
Yes! Sauté the vegetables and garlic normally, then add all remaining ingredients except the bay leaves. Seal the lid, set to high pressure for 15 minutes, then quick-release. The meatballs will be tender but slightly less browned. Add 2 bay leaves during the last 5 minutes of natural release for flavor. The broth will be thinner—reduce it uncovered on the stove for 10 minutes if you prefer a thicker consistency.
How can I make this soup kid-friendly?
Blend half the soup before serving and strain out any large meatball pieces. Use ground turkey instead of beef/pork for milder flavor, and reduce the garlic to 2 cloves. Serve the meatballs on the side with buttered noodles or crusty bread for dipping. Kids often prefer the meatballs plain—skip the herbs in the mixture and add them to the broth separately.
Can I prep this ahead of time?
This soup tastes even better the next day! Form the meatballs and refrigerate them uncovered on a tray for 30 minutes to firm up, then store in an airtight container. The broth can be made up to 2 days ahead—just reheat gently on the stove. For a freezer meal, freeze the meatballs separately and the broth in portions. When ready to serve, simmer the meatballs in fresh broth for 10 minutes to revive their texture.
