Quick Recipe Version (TL;DR)
Quick Ingredients
- 2 tbsp extra-virgin olive oil
- 1 medium yellow onion, diced
- 4 garlic cloves, minced
- 2 medium carrots, diced (about 1 cup)
- 2 celery stalks, diced (about 1 cup)
- 1 tsp kosher salt, plus more to taste
- 1/2 tsp black pepper
- 2 tbsp tomato paste
- 1 (28 oz) can crushed tomatoes
- 6 cups low-sodium vegetable broth
- 1 tsp dried oregano
- 1 tsp dried basil
- 1/2 tsp dried thyme
- 2 bay leaves
- 1 medium zucchini, diced (about 1 1/2 cups)
- 1 1/2 cups green beans, cut into 1-inch pieces
- 1 (15 oz) can cannellini beans, drained and rinsed
- 1 cup whole-grain small pasta (ditalini, small shells, or elbows)
- 3 cups packed baby spinach
- 1 tbsp fresh lemon juice (about 1/2 lemon)
- Optional: 1/4 cup grated Parmesan, plus more for serving
Do This
- 1) Sauté onion and garlic in olive oil over medium heat, 3–4 minutes.
- 2) Add carrots, celery, salt, and pepper; cook 6–8 minutes until starting to soften.
- 3) Stir in tomato paste and herbs; cook 1 minute, then add crushed tomatoes and broth.
- 4) Simmer 15 minutes, then add zucchini, green beans, and cannellini beans; simmer 10 minutes.
- 5) Add whole-grain pasta; simmer 8–10 minutes until al dente.
- 6) Stir in spinach to wilt, 1–2 minutes.
- 7) Turn off heat; add lemon juice (and Parmesan if using). Taste and adjust seasoning.
Why You’ll Love This Recipe
- Big-pot comfort: Hearty, tomato-rich broth with lots of vegetables and tender beans.
- Weeknight-friendly: Simple chopping, one pot, and straightforward timing.
- Bright finish: A squeeze of lemon wakes up the whole soup right before serving.
- Flexible: Easy to swap vegetables, beans, or pasta based on what you have.
Grocery List
- Produce: 1 yellow onion, 4 garlic cloves, 2 carrots, 2 celery stalks, 1 zucchini, green beans (about 1 1/2 cups), baby spinach (about 3 packed cups), 1 lemon
- Dairy: Parmesan cheese (optional)
- Pantry: Extra-virgin olive oil, tomato paste, 1 (28 oz) can crushed tomatoes, low-sodium vegetable broth, 1 (15 oz) can cannellini beans, whole-grain small pasta, dried oregano, dried basil, dried thyme, bay leaves, kosher salt, black pepper
Full Ingredients
Base & Aromatics
- 2 tablespoons extra-virgin olive oil
- 1 medium yellow onion, diced (about 1 1/2 cups)
- 4 garlic cloves, minced
- 2 medium carrots, diced (about 1 cup)
- 2 celery stalks, diced (about 1 cup)
- 1 teaspoon kosher salt, plus more to taste
- 1/2 teaspoon freshly ground black pepper
Tomato Broth & Seasoning
- 2 tablespoons tomato paste
- 1 (28 oz / 794 g) can crushed tomatoes
- 6 cups (1.4 L) low-sodium vegetable broth
- 1 teaspoon dried oregano
- 1 teaspoon dried basil
- 1/2 teaspoon dried thyme
- 2 bay leaves
Vegetables, Beans, Pasta, and Finish
- 1 medium zucchini, diced (about 1 1/2 cups)
- 1 1/2 cups green beans, trimmed and cut into 1-inch pieces
- 1 (15 oz / 425 g) can cannellini beans, drained and rinsed
- 1 cup whole-grain small pasta (ditalini, small shells, or elbows)
- 3 cups packed baby spinach (about 3 oz / 85 g)
- 1 tablespoon fresh lemon juice (about 1/2 lemon), plus more to taste
- Optional: 1/4 cup (about 1 oz / 28 g) finely grated Parmesan, plus more for serving

Step-by-Step Instructions
Step 1: Sauté the onion and garlic
Set a large heavy-bottomed pot or Dutch oven over medium heat. Add the 2 tablespoons olive oil. Once the oil shimmers, add the diced onion and cook, stirring occasionally, for 3 minutes until it begins to soften.
Add the minced garlic and cook for 30–60 seconds, stirring constantly so it doesn’t brown.
Step 2: Build flavor with carrots and celery
Add the diced carrots, diced celery, 1 teaspoon kosher salt, and 1/2 teaspoon black pepper. Cook for 6–8 minutes, stirring occasionally, until the vegetables soften slightly and the onions look glossy.
This step creates a flavorful base (like an Italian soffritto) that makes the soup taste slow-simmered even on a weeknight.
Step 3: Toast the tomato paste and herbs
Stir in the 2 tablespoons tomato paste, oregano, basil, and thyme. Cook for 1 minute, stirring, until the tomato paste darkens slightly and smells sweet and concentrated.
Add the 2 bay leaves.
Step 4: Add tomatoes and broth, then simmer
Pour in the crushed tomatoes and 6 cups vegetable broth. Stir well, scraping the bottom of the pot to loosen any flavorful bits.
Increase heat to bring the soup to a gentle boil, then reduce to low to maintain a steady simmer. Simmer uncovered for 15 minutes, stirring once or twice.
Step 5: Add zucchini, green beans, and cannellini beans
Add the diced zucchini, green beans, and cannellini beans. Return the soup to a gentle simmer over low and cook for 10 minutes, or until the green beans are crisp-tender.
If the soup is simmering too vigorously, lower the heat. A gentle simmer keeps the vegetables tender (not mushy) and the broth clear and flavorful.
Step 6: Cook the whole-grain pasta in the soup
Stir in the 1 cup whole-grain pasta. Keep the soup at a gentle simmer and cook for 8–10 minutes, stirring occasionally to prevent sticking, until the pasta is al dente.
Tip: Whole-grain pasta can go from al dente to too-soft quickly, so start checking at the 8-minute mark.
Step 7: Wilt spinach and brighten with lemon
Stir in the spinach and cook for 1–2 minutes, just until wilted.
Turn off the heat. Stir in the 1 tablespoon lemon juice (and 1/4 cup Parmesan if using). Taste and adjust with more salt, pepper, or an extra squeeze of lemon. Remove the bay leaves before serving.
Pro Tips
- Cut veggies evenly: Aim for small, similar-sized dice so everything cooks at the same pace.
- Don’t skip the tomato paste step: Cooking it for a minute deepens the tomato flavor and reduces acidity.
- Control the pasta texture: If you expect leftovers, consider cooking the pasta separately and adding it to each bowl so it doesn’t soak up broth in the fridge.
- Finish with lemon off the heat: Lemon tastes fresher and brighter when it’s not simmered.
- Adjust thickness: If the soup gets too thick, stir in an extra 1/2 to 1 cup broth or water when reheating.
Variations
- Extra-herby finish: Add 2 tablespoons chopped fresh parsley or 1–2 tablespoons basil at the end along with the lemon.
- Different beans: Swap cannellini for 1 (15 oz) can chickpeas or great northern beans.
- Gluten-free option: Use gluten-free small pasta and cook it separately, then ladle soup over it (GF pasta can break down if simmered and stored in broth).
Storage & Make-Ahead
Cool soup to room temperature (within 2 hours), then refrigerate in an airtight container for up to 4 days. The pasta will continue to absorb broth as it sits, so the soup will thicken. When reheating, add 1/2 to 1 cup broth or water and warm gently over medium-low heat until steaming hot (about 5–8 minutes), stirring occasionally.
For freezing: for best texture, freeze the soup without the pasta and spinach for up to 3 months. Thaw overnight in the fridge, simmer until hot, then add pasta and spinach fresh before serving.
Nutrition (per serving)
Approximate, based on 1/6 of the recipe, without extra Parmesan at serving: 320 calories; 9 g protein; 8 g fat; 52 g carbohydrates; 12 g fiber; 10 g sugar; 620 mg sodium.

