Quick Recipe Version (TL;DR)
Quick Ingredients
- 2 tbsp olive oil, plus 1 tbsp to finish
- 1 medium yellow onion, diced (1 cup)
- 2 carrots, diced (1 cup); 2 celery ribs, diced (3/4 cup)
- 4 garlic cloves, minced
- 2 tbsp tomato paste; 1 tsp dried oregano; 1/2 tsp dried thyme; 1/4 tsp red pepper flakes (optional); 2 bay leaves
- 1 can (28 oz) crushed tomatoes
- 6 cups low-sodium vegetable broth
- 1 small waxy potato, diced (1 cup) (optional)
- 1 medium zucchini, diced (2 cups); 1 cup green beans, cut 1-inch
- 1 can (15 oz) cannellini beans, drained and rinsed
- 1 cup (6 oz) whole-wheat ditalini or small pasta
- 4 cups baby spinach or 3 cups chopped kale
- 1 tbsp lemon juice or red wine vinegar
- 1/2 cup finely grated Parmesan, fresh basil, kosher salt, black pepper
Do This
- 1. Warm 2 tbsp oil in a large pot over medium heat; sauté onion, carrot, and celery with a pinch of salt until softened, 6–8 minutes. Add garlic 30 seconds.
- 2. Stir in tomato paste, oregano, thyme, and red pepper flakes; cook until paste darkens, 1–2 minutes.
- 3. Add crushed tomatoes, broth, bay leaves, and potato. Bring to a boil, then reduce to a gentle simmer (185–195°F), 10 minutes.
- 4. Add zucchini and green beans; simmer until just tender, 8–10 minutes.
- 5. Stir in cannellini beans and pasta; simmer, stirring often, until pasta is al dente, 8–10 minutes. Add water as needed to loosen.
- 6. Add spinach or kale; cook until wilted, 2–3 minutes. Remove bay leaves.
- 7. Off heat, stir in lemon juice, 1 tbsp olive oil, chopped basil, and season to taste. Serve with Parmesan.
Why You’ll Love This Recipe
- Comforting, vegetable-forward soup with a rich, tomatoey broth that feels like a hug in a bowl.
- Balanced nutrition from beans, whole-grain pasta, and plenty of seasonal produce.
- Weeknight-friendly yet worthy of guests; make once and enjoy all week.
- Flexible: swap in the veggies you have and adjust spice and texture to your taste.
Grocery List
- Produce: Yellow onion, carrots, celery, garlic, zucchini, green beans, baby spinach or kale, small waxy potato (optional), fresh basil, lemon
- Dairy: Parmesan cheese (and optional Parmesan rind)
- Pantry: Olive oil, crushed tomatoes (28 oz), low-sodium vegetable broth, cannellini beans (15 oz), whole-wheat ditalini or small pasta, tomato paste, dried oregano, dried thyme, crushed red pepper flakes, bay leaves, kosher salt, black pepper
Full Ingredients
Aromatics and Seasoning
- 2 tbsp olive oil (30 ml), plus 1 tbsp (15 ml) to finish
- 1 medium yellow onion, diced (about 1 cup/150 g)
- 2 medium carrots, diced (about 1 cup/130 g)
- 2 celery ribs, diced (about 3/4 cup/85 g)
- 4 garlic cloves, minced (about 1 tbsp/12 g)
- 2 tbsp tomato paste (33 g)
- 1 tsp dried oregano (1 g)
- 1/2 tsp dried thyme (0.5 g)
- 1/4 tsp crushed red pepper flakes (optional)
- 2 bay leaves
- 1 1/4 tsp kosher salt, plus more to taste
- 1/2 tsp freshly ground black pepper
Liquids and Tomatoes
- 1 can (28 oz/794 g) crushed tomatoes
- 6 cups (1.4 L) low-sodium vegetable broth
- Optional: 1 Parmesan rind (2–3 inches) for simmering
- Up to 1 cup (240 ml) water, as needed to thin
Vegetables
- 1 small waxy potato, 1/2-inch dice (about 1 cup/150 g) (optional but hearty)
- 1 medium zucchini, 1/2-inch dice (about 2 cups/250 g)
- 1 cup (4 oz/115 g) green beans, trimmed and cut into 1-inch pieces
- 4 cups baby spinach (about 120 g) or 3 cups chopped lacinato kale (about 90 g, stems removed)
Beans and Pasta
- 1 can (15 oz/425 g) cannellini beans, drained and rinsed
- 1 cup (6 oz/170 g) whole-wheat ditalini or other small pasta
Finishers
- 1 tbsp fresh lemon juice or red wine vinegar (15 ml)
- 1/2 cup (1 oz/28 g) finely grated Parmesan cheese, plus more for serving
- 1/2 cup loosely packed fresh basil leaves (about 15 g), thinly sliced
- Extra-virgin olive oil, for drizzling

Step-by-Step Instructions
Step 1: Prep the vegetables and gather everything
Dice the onion, carrots, celery, and zucchini into 1/2-inch pieces. Trim and cut the green beans into 1-inch pieces. If using, peel and dice the potato into 1/2-inch cubes. Mince the garlic. Rinse and drain the cannellini beans. Measure the pasta and broth. Stack basil leaves and slice thin (chiffonade). Grate the Parmesan. Having everything ready makes the cooking smooth.
Step 2: Sweat the aromatics
Place a large heavy pot or Dutch oven over medium heat. Add 2 tbsp olive oil. When shimmering, add onion, carrot, and celery plus a pinch of salt. Cook, stirring occasionally, until softened and lightly translucent, 6–8 minutes. Add the garlic and cook until fragrant, 30 seconds. Stir in tomato paste, oregano, thyme, and red pepper flakes (if using); cook 1–2 minutes until the paste turns a deeper brick red and coats the vegetables.
Step 3: Build and simmer the tomato broth
Pour in the crushed tomatoes and vegetable broth. Add bay leaves and the diced potato (if using). If you have a Parmesan rind, add it now. Bring to a boil over medium-high heat, then reduce to maintain a gentle simmer at 185–195°F. Simmer uncovered for 10 minutes, stirring occasionally. Skim any foam, and if the soup looks too thick, add up to 1 cup water to reach a brothy consistency.
Step 4: Add the mid-cook vegetables
Add the zucchini and green beans. Continue to simmer gently until the vegetables are just tender, 8–10 minutes. Keep the heat at a low simmer; vigorous boiling can break up the vegetables and make the broth cloudy.
Step 5: Beans and pasta
Stir in the cannellini beans and whole-wheat ditalini. Simmer, stirring often so the pasta does not stick to the bottom, until the pasta is al dente, 8–10 minutes. Adjust the heat to keep the liquid at a gentle simmer (around 190°F). If the soup thickens more than you like, add hot water or broth 1/2 cup at a time to loosen.
Make-ahead option: For the best leftovers, boil the pasta separately in salted water until 1 minute shy of package directions. Drain, toss with a little olive oil, and add to bowls when serving.
Step 6: Wilt the greens and balance
Add the spinach (or kale) and cook until wilted and tender, 2–3 minutes. Remove and discard the bay leaves and Parmesan rind. Off heat, stir in the lemon juice (or red wine vinegar) and 1 tbsp olive oil. Taste and adjust seasoning with additional salt and black pepper.
Step 7: Serve and garnish
Ladle the soup into warm bowls. Top with a generous sprinkle of grated Parmesan and basil ribbons. Finish with a light drizzle of olive oil and a few grinds of black pepper. Serve hot with crusty bread. For holding or serving later, keep cooked pasta separate and add to bowls just before ladling in the soup.
Pro Tips
- Add a Parmesan rind to the simmer for savory depth, then remove before serving.
- Dice vegetables to a similar size (about 1/2 inch) for even cooking and a satisfying, spoonable texture.
- Keep the simmer gentle (185–195°F); a rolling boil can make vegetables mushy and pasta gummy.
- Season in layers: a pinch with the aromatics, again after simmering, and finish to taste at the end.
- If your tomatoes taste sharp, balance with an extra 1–2 teaspoons of olive oil or a pinch of sugar.
Variations
- Vegan/Dairy-Free: Skip Parmesan and the rind; finish with 2–3 tbsp nutritional yeast and a bit more olive oil.
- Gluten-Free: Use gluten-free short pasta or diced cooked potatoes instead of pasta.
- Seasonal Swap: In spring, use asparagus and peas for zucchini/green beans; in fall, use diced butternut squash and cabbage (add earlier to cook through).
Storage & Make-Ahead
Refrigerate cooled soup (without pasta if possible) in airtight containers for up to 4 days. Store cooked pasta separately; combine in bowls when serving to prevent sogginess. Reheat gently on the stovetop to 165°F, thinning with water or broth as needed. Freeze up to 3 months for best quality, but freeze the soup without greens and pasta; add fresh spinach and freshly cooked pasta after reheating. Thaw overnight in the refrigerator before reheating.
Nutrition (per serving)
Approximate: 320 calories; 10 g fat; 49 g carbohydrates; 13 g protein; 11 g fiber; 780 mg sodium. Values will vary based on exact products and salt added.

