Bean Meatball Soup
Hearty meatballs and creamy cannellini beans swim in a light, herby broth with tender greens. A rustic one-pot soup that feels like a warm hug on a cold evening, ready in under an hour and packed with comforting flavor from scratch.
For 4 servings
- prep
Soak the beans overnight.
Cover dried cannellini beans with 3 inches of water and soak at room temperature for 8 hours or overnight. Drain and rinse before using.
TIPIf short on time, use the quick-soak method: boil beans 2 minutes, cover, and let sit 1 hour. - mix
Form the chicken meatballs.
1.In a large bowl, combine ground chicken, breadcrumbs, grated parmesan, beaten egg, 1 minced garlic clove, 1 pinch salt, black pepper, and oregano.2.Mix gently with your hands until just combined — overmixing makes tough meatballs.3.Roll into small balls about 1 inch in diameter.TIPWet your hands lightly to prevent the chicken mixture from sticking. - saute · ~7 min
Sauté the aromatic vegetables.
1.Heat olive oil in a large pot over medium heat.2.Add chopped onion, carrot, and celery. Sauté until softened (5-7 min).3.Add remaining 3 minced garlic cloves and crushed fennel seeds. Cook until fragrant (1 min). - boil
Build the broth and add beans.
1.Pour in water and add soaked, drained cannellini beans to the pot.2.Drop in the parmesan rind and add the remaining pinch of salt and red pepper flakes.3.Bring to a boil, then reduce heat to a gentle simmer. - simmer · ~25 min
Simmer beans until tender.
Cover partially and simmer for 20-25 minutes, or until beans are creamy and tender. Stir occasionally.
TIPCooking time may vary depending on bean age. Taste a few beans to confirm tenderness. - simmer · ~12 min
Poach the meatballs in the simmering soup.
1.Gently drop the chicken meatballs one by one into the simmering broth.2.Do not stir for the first 5 minutes to let meatballs set.3.Simmer uncovered for 10-12 minutes until meatballs are cooked through and float to the top.TIPKeep the soup at a gentle simmer — a rolling boil will break apart the meatballs. - simmer · ~2 min
Wilt in the spinach.
Stir in the chopped spinach and cook until just wilted, about 2 minutes. Remove and discard the parmesan rind.
- mix
Finish with lemon juice and adjust seasoning.
Stir in fresh lemon juice. Taste the broth and adjust salt or pepper if needed.
TIPThe lemon juice brightens the whole pot — add it off heat for the freshest flavor. - garnish
Ladle into bowls and garnish with fresh parsley.
Serve hot in wide bowls, sprinkling each portion with chopped parsley and an extra crack of black pepper if desired.
What to keep in mind.
7 tips from the recipe — small details that make a real difference to the final dish.
- 1Soak the cannellini beans overnight for the creamiest texture; a quick soak works if you're short on time.
- 2Wet your hands lightly before rolling the meatballs to prevent the sticky chicken mixture from clinging.
- 3Don't stir the soup for the first 5 minutes after adding meatballs — this lets them set without breaking apart.
- 4Keep the soup at a gentle simmer, not a rolling boil, or the meatballs will become tough and may fall apart.
- 5Remove the parmesan rind before serving; it infuses the broth with savory depth while simmering.
- 6Add the lemon juice off the heat to preserve its bright, fresh flavor — it lifts the entire soup.
- 7Taste a bean to check tenderness; older dried beans can take longer to become creamy.
Adapt it for your goals.
High-protein
Swap ground chicken for lean ground turkey or extra-lean ground beef to keep protein high; you can also replace half the breadcrumbs with almond flour for fewer carbs.
low oilLow-oil
Skip the olive oil and sauté the aromatics in a splash of water or broth using a nonstick pot — this reduces fat while keeping the flavor base intact.
veganVegan
Use plant-based ground 'meat' for the meatballs, replace the egg with a flax egg (1 tbsp flaxseed meal + 3 tbsp water), and use nutritional yeast in place of parmesan; omit the parmesan rind.
gluten freeGluten-free
Substitute the breadcrumbs with gluten-free panko or crushed rice crackers, and verify your parmesan is gluten-free (most aged parmesan is naturally gluten-free).
Why this is on our healthy list.
Rich in Lean Protein
Ground chicken provides high-quality, lean protein that supports muscle repair and keeps you full longer.
High in Fiber from Cannellini Beans
Cannellini beans are loaded with dietary fiber, which aids digestion and promotes steady blood sugar levels.
Packed with Antioxidants from Spinach
Spinach brings a hearty dose of vitamins A, C, and K, plus antioxidants that help combat oxidative stress.
Low in Saturated Fat
This soup uses minimal olive oil and lean chicken, keeping saturated fat low while delivering satisfying flavor.
Good Source of Calcium
Parmesan cheese contributes a notable amount of calcium for bone health, even in modest amounts.
Frequently asked questions
Yes — use two 15-oz cans, drained and rinsed. Add them in step 4 but reduce the simmering time to just 10 minutes since they're already cooked.



