If you’re looking for a meal that’s cozy, satisfying, and ready in under 60 minutes, this Meatball Soup recipe is your new weeknight hero. Packed with tender homemade meatballs, colorful vegetables, and a rich tomato broth, it’s the kind of dish that warms you from the inside out—perfect for busy families, tired parents, or anyone craving comfort without the fuss. This version skips the guesswork with foolproof steps and smart tips so you get great flavor and perfect texture every time.
Total time: 55 minutes
Main flavors: Savory beef, aromatic herbs, bright tomato, and a hint of garlic
Why this works better: Unlike soups that rely on store-bought meatballs or bland broth, this recipe builds flavor from the start—browning the meatballs first, layering aromatics, and using a mix of crushed tomatoes and broth for depth. Plus, the pasta soaks up just enough liquid to keep the soup hearty without turning mushy.
Recipe Highlights
- Prep Time: 20 minutes
- Cook Time: 35 minutes
- Total Time: 55 minutes
- Servings: 6
- Difficulty: Easy
Why You’ll Love This Meatball Soup Recipe
- Ready in under an hour—perfect for busy weeknights when you need dinner fast but don’t want to sacrifice flavor.
- Balanced texture—meatballs stay tender, veggies are just crisp enough, and the pasta holds its shape.
- One-pot meal—minimal cleanup, maximum flavor, and everything cooks together for easy assembly.
- Family-approved—picky eaters love the meatballs, and even kids will eat their carrots and spinach in this one.

Key Ingredients
Ground beef (1 pound) – The base of your meatballs. Lean ground beef (90/10) works best—it holds together well without being greasy. For a lighter option, swap in ground turkey or chicken, but add 1 tablespoon of olive oil to the mixture to keep them moist.
Egg (1 large) – Binds the meatballs so they don’t fall apart in the soup. No substitutes here—skip it and your meatballs may crumble.
Freshly grated Parmesan (½ cup) – Adds umami and richness to the meatballs. Pre-grated won’t melt as smoothly, so take the extra minute to grate it fresh. For dairy-free, use nutritional yeast or omit it.
Crushed tomatoes (1 can, 28 oz) – Gives the broth body and tang. I prefer fire-roasted for extra depth, but regular works fine. Never use tomato sauce—it’s too sweet and thin.
Low-sodium beef broth (6 cups) – Builds a savory base without oversalting. You can use chicken broth for a lighter taste, but beef adds more richness. Always go low-sodium so you control the salt level.
Ditalini pasta (1⅓ cups) – Small, tube-shaped pasta that cooks evenly and holds broth well. Orzo, acini di pepe, or small shells work too. Avoid long or wide pastas—they don’t belong in this soup.
See the recipe card below for a complete ingredient list with exact measurements.
How to Make Meatball Soup Recipe
1. Make the meatball mixture. In a large bowl, combine 1 pound ground beef, ½ cup breadcrumbs, ¼ cup grated Parmesan, 1 egg, 1 teaspoon kosher salt, ½ teaspoon garlic powder, ½ teaspoon onion powder, and ½ teaspoon Italian seasoning. Mix gently with your hands—don’t overwork it, or the meatballs will be tough. Roll into 1-inch balls (about 18–20). Pro tip: Wet your hands slightly to prevent sticking.

2. Brown the meatballs. Heat 1 tablespoon olive oil in a large Dutch oven or soup pot over medium heat. Add meatballs in batches—don’t crowd the pan—and cook 2–3 minutes per side until lightly browned (they’ll finish cooking in the soup). Remove and set aside. This step makes all the difference—browning builds flavor and keeps meatballs intact.

3. Sauté the aromatics. In the same pot, add chopped onion, carrots, and celery. Cook 5–6 minutes until softened and fragrant. Stir in 3 cloves minced garlic and 3 tablespoons tomato paste. Cook 1 minute more—just until the paste darkens slightly. This concentrates flavor and removes the raw garlic taste.
4. Build the broth. Pour in 6 cups beef broth and 1 (28 oz) can crushed tomatoes with their juice. Add 1 teaspoon Italian seasoning and ½ teaspoon salt. Bring to a boil, then reduce to a simmer.
5. Cook the pasta and finish. Stir in 1⅓ cups ditalini and return meatballs to the pot. Simmer 10–12 minutes until pasta is al dente and meatballs are cooked through (internal temp 160°F). Stir in 3 cups fresh spinach and cook 1–2 minutes until wilted. Taste and adjust salt and pepper.

You’ll know it’s ready when the broth is rich and fragrant, the pasta is tender but not soft, and the meatballs bounce back when pressed lightly.
Pro Tips for Perfect Results
- Don’t skip browning the meatballs. It locks in juices and prevents them from breaking apart. If you’re short on time, you can poach them directly in the soup—but the flavor won’t be as deep.
- Cook pasta al dente. Overcooked pasta turns mushy, especially in leftovers. Start checking at 10 minutes.
- Use low-sodium broth. You’re adding salt at multiple stages—meatballs, broth, seasoning—so starting with low-sodium gives you control.
- Add greens at the end. Spinach, kale, or escarole should go in during the last 2 minutes to keep color and texture.
- Let it rest 5 minutes before serving. This lets flavors settle and makes the broth even more cohesive.
Storage and Reheating
- Fridge: Store in an airtight container for up to 4 days. The pasta will absorb more broth over time, so add a splash of water or broth when reheating.
- Freezer: Freeze for up to 3 months—but leave out the pasta if you plan to freeze. Cook it fresh when reheating to avoid mushiness.
- Reheating: Warm on the stovetop over medium-low heat, stirring occasionally. If frozen, thaw overnight in the fridge first. Microwaving works too—cover and heat in 90-second intervals, stirring in between.
Expect the meatballs to stay firm, but the pasta will soften slightly with each reheat.
Recipe Variations
- Gluten-free: Swap regular breadcrumbs for gluten-free and use gluten-free pasta (like brown rice or chickpea ditalini).
- Dairy-free: Omit Parmesan or use a dairy-free alternative. The meatballs will still hold together thanks to the egg and breadcrumbs.
- Vegetable boost: Add zucchini, bell peppers, or green beans in step 3 with the carrots and celery.
- Spicy kick: Stir in ¼ teaspoon red pepper flakes with the broth, or top bowls with crushed Calabrian chiles.
Frequently Asked Questions
Can I make this ahead? Yes! Brown the meatballs and chop the veggies up to a day in advance. Store separately in the fridge. Assemble and cook when ready—cuts prep time to 20 minutes.
Can I use store-bought meatballs? You can, but they’re often over-seasoned or too dense. If using frozen, brown them first to revive texture and flavor.
How do I know when the meatballs are done? They should reach 160°F internally and feel firm but springy when pressed. If you don’t have a thermometer, cut one open—no pink should remain.
Why did my meatballs fall apart? Most likely causes: too much moisture (wet hands, watery ingredients), under-mixing (not enough binding), or adding them to a non-boiling broth. Make sure the soup is simmering when you add them.
This has become my go-to weeknight dinner when I need something fast but still feel-good. My kids actually ask for the vegetables in this one—yes, really. And the best part? One pot, one bowl, and zero stress.
If you try this Meatball Soup recipe, I’d love to hear how it turned out. Tag me on Pinterest or leave a comment—nothing makes me happier than knowing it warmed your table too.
Comforting Meatball Soup Recipe For Weekends
Course: Dinner, Main, SoupsCuisine: American, ItalianDifficulty: Easy5
servings20
minutes35
minutes300
kcal55
minutesA cozy, family-friendly meatball soup with tender 1-inch beef meatballs, veggies, ditalini pasta, and a rich tomato-beef broth—all in one pot and ready in 55 minutes. Browning the meatballs first builds deep flavor, while cooking the pasta al dente keeps the texture just right. Perfect for busy weeknights and picky eaters alike.
Ingredients
For the Meatballs:
1 pound lean ground beef (90/10)
½ cup plain breadcrumbs (use gluten-free if needed)
¼ cup freshly grated Parmesan cheese (or dairy-free alternative)
1 large egg
1 teaspoon kosher salt
½ teaspoon garlic powder
½ teaspoon onion powder
½ teaspoon Italian seasoning
- For the Soup:
1 tablespoon olive oil
½ medium yellow onion, chopped (about ¾ cup)
2 medium carrots, chopped (about 1 cup)
2 celery ribs, chopped (about ¾ cup)
3 cloves garlic, minced
3 tablespoons tomato paste
6 cups low-sodium beef broth
1 (28 ounce) can crushed tomatoes, with juice
1 teaspoon Italian seasoning
½ teaspoon kosher salt (plus more to taste)
1⅓ cups dry ditalini pasta (or small shells/orzo)
3 cups fresh baby spinach, roughly chopped
Fresh parsley, chopped, for serving (optional)
Freshly grated Parmesan, for serving (optional)
Freshly ground black pepper, to taste
Directions
- Make the meatball mixture (5 minutes)
In a large bowl, combine ground beef, breadcrumbs, Parmesan, egg, salt, garlic powder, onion powder, and Italian seasoning. Mix gently with your hands until just combined—do not overwork to keep meatballs tender.
Tip: Lightly wet hands to prevent sticking while mixing. - Shape the meatballs (5 minutes)
Roll into 1-inch meatballs (about 18–20 total). Place on a parchment-lined sheet pan while you preheat the pot.
Visual cue: Meatballs should be smooth and firm enough to hold shape, not sticky or cracking. - Brown the meatballs (8–10 minutes)
Heat olive oil in a Dutch oven over medium heat (about 350°F surface temp if using an infrared thermometer).
Add meatballs in a single layer without crowding. Brown 2–3 minutes per side until lightly golden; turn to brown at least two sides. Transfer to a plate. They will finish cooking in the soup.
Success looks like: Light golden crust with browned bits (fond) on the pot bottom. Meatballs remain intact. - Sauté aromatics and tomato paste (6–7 minutes)
In the same pot, add onion, carrots, and celery. Cook over medium heat for 5–6 minutes until softened and fragrant, scraping up some fond.
Stir in garlic and tomato paste; cook 60 seconds until the paste deepens in color and smells sweet-savory.
Tip: If the pot looks dry, add 1–2 teaspoons more oil to prevent scorching. - Build the broth and simmer (15 minutes total)
Pour in beef broth and crushed tomatoes with their juices. Stir in Italian seasoning and ½ teaspoon salt. Bring to a boil over medium-high heat, then reduce to a steady simmer.
Stir in ditalini pasta and return browned meatballs (and any juices) to the pot. Simmer 10–12 minutes, stirring occasionally, until pasta is al dente and meatballs reach 160°F internal temperature.
Visual cues: Gentle bubbling; pasta plumps but still resists lightly at the center; broth becomes a rich, tomato-red and aromatic. - Finish with greens and season (2–3 minutes)
Stir in spinach and cook 1–2 minutes until just wilted and vibrant.
Taste and adjust salt and pepper. If broth thickened more than desired, add ¼–½ cup hot water or broth to loosen.
Rest 5 minutes off heat for flavors to meld. - Serve
Ladle into warm bowls. Garnish with chopped parsley and a light shower of Parmesan, if desired.
Pro tip: Serve with crusty bread for dipping and a squeeze of lemon for brightness if you like.
Notes
- Notes and Tips
Browning matters: Searing develops fond for a deeper broth and helps meatballs hold together.
Control the salt: Use low-sodium broth so you can season precisely at the end.
Pasta texture: Start checking ditalini at 10 minutes; remove from heat when just al dente to prevent sogginess.
Greens go last: Spinach needs only 1–2 minutes to wilt while staying bright.
Make-ahead: Shape and brown meatballs up to 24 hours ahead; refrigerate separately. Chop vegetables in advance to cut same-day prep to 20 minutes. - Variations
Gluten-free: Use gluten-free breadcrumbs and gluten-free ditalini or small shells.
Dairy-free: Omit Parmesan in the meatballs and as garnish; add 1 tablespoon olive oil to the meat mixture for richness.
Extra veggies: Add 1 chopped zucchini or 1 cup green beans with the carrots and celery.
Spicy: Add ¼ teaspoon red pepper flakes with the broth or finish bowls with Calabrian chile paste. - Nutrition (per serving; 1/6 of recipe)
Calories: 256
Protein: 16.3 g
Fat: 11.1 g
Saturated Fat: 4.4 g
Carbohydrates: 23.7 g
Fiber: 4.3 g
Total Sugar: 6.2 g
Sodium: 592.5 mg
Cholesterol: 76 mg

