Bean Soup From Scratch Recipe: Homemade Depth With Caramelized Onions

Soups & Stews

Bean Soup From Scratch Recipe: Homemade Depth With Caramelized Onions

This bean soup from scratch recipe transforms simple ingredients into a deeply flavorful, hearty dish that tastes like a hug in a bowl. The secret lies in caramelizing onions until they're golden and sweet—this step elevates the soup from ordinary to extraordinary.

I've perfected this method over years of testing, ensuring every spoonful delivers rich, savory depth without relying on shortcuts.

What sets this recipe apart is the balance of traditional techniques and modern convenience. You'll start with dried beans for maximum flavor, then build layers of taste through sautéing aromatics, simmering herbs, and finishing with bright citrus.

The result is a soup that's both comforting and sophisticated—ideal for chilly evenings or as a base for a complete meal.

By the time you're done, you'll have a velvety, aromatic bean soup with tender vegetables and caramelized onions that melt into every bite. The texture is perfectly balanced—creamy yet light, with just enough body to satisfy. This recipe delivers restaurant-quality results at home, using simple ingredients and straightforward steps.

Serve it with crusty bread for dipping or alongside a fresh green salad to round out the meal. The flavors only deepen as it sits, making it perfect for meal prep or feeding a crowd. Let's get started on this soul-warming bean soup—your taste buds will thank you.

👨‍🍳
Difficulty
Medium
🌿
Diet
Vegetarian
🔥
Calories
Med Cal

Ingredients for bean soup from scratch

Simple pantry staples and fresh aromatics create this deeply flavorful, restaurant-quality bean soup.

Ingredient Amount Notes
Dried Cannellini Beans 🌾 1 ½ cups Rinsed and picked over
Yellow Onions 🧅 2 medium Thinly sliced for caramelizing
Carrots 🥕 2 medium Peeled and chopped into chunks
Garlic Cloves 🧄 4 cloves Minced for aromatic depth
Celery Stalks 🌿 2 whole Chopped into small pieces
Extra-Virgin Olive Oil 🫒 ½ cup High-quality for richness
Vegetable Broth 💧 4 cups Low-sodium preferred
Fresh Thyme 🌿 1 tbsp Leaves only, chopped fine
Fresh Bay Leaves 🌿 2 whole For subtle herbal depth
Lemon Juice 🍋 2 tbsp Freshly squeezed for brightness
Salt 🧂 1 ½ tsp Diamond Crystal preferred
Black Pepper 🌶️ ½ tsp Freshly ground for heat
Fresh Parsley 🌿 ¼ cup Chopped for garnish
Smoked Paprika 🌶️ ½ tsp For subtle smokiness
Coconut Milk 🥥 ½ cup Full-fat for creaminess

The onions are non-negotiable here—yellow onions caramelize best for that sweet, jammy depth. Whole Foods or Trader Joe's carry the sweetest varieties, but any yellow onion works if it's fresh. For the beans, cannellini has that perfect creamy texture, but navy or pinto beans will work too. Soak overnight for maximum tenderness, or use the quick-soak method if you're in a rush. The olive oil matters—skip the cheap stuff; California Olive Ranch or Bertolli are solid choices for this recipe.

No fresh thyme? Dried works at one-third the amount, but fresh is ideal. The bay leaves can be skipped if unavailable, but they add that subtle herbal complexity. For the vegetable broth, Pacific Foods or Imagine brands are low-sodium and flavorful. The coconut milk adds richness—full-fat canned coconut milk is best, but light works in a pinch. Want more umami? Add 1 tbsp soy sauce or 1 tsp miso paste when you taste. The carrots and celery can be swapped for kale or spinach if you prefer greens, but keep the texture balance in mind.

This soup tastes even better the next day—4-5 days in the fridge, 3 months frozen. Portion into containers for easy lunches. The coconut milk will separate; give it a stir before reheating. For extra depth, toast the smoked paprika in a dry pan for 30 seconds before adding it. Garnish with fresh parsley right before serving—it brightens everything up.

❤️

Why You'll Love This Recipe

  • I’ll be real: I used to dread soaking beans. But these dried Cannellini? Just toss them in cold water overnight, and they’re ready to simmer—no fancy tricks. The onions and celery soften into the broth while you’re chopping, so by the time the garlic hits, everything’s already melting together.
  • No-Soak Necessary: I’ll be real: I used to dread soaking beans. But these dried Cannellini? Just toss them in cold water overnight, and they’re ready to simmer—no fancy tricks. The onions and celery soften into the broth while you’re chopping, so by the time the garlic hits, everything’s already melting together.
  • Umami Bomb: That crispy caramelized onion base? Chef’s kiss. Sauté them low and slow until they’re golden, then add the garlic and celery—it’s where the magic happens. The beans soak up all that deep, savory flavor, turning into something rich and satisfying without a single drop of cream.
  • Lunchbox Hero: Between us, this soup is my secret weapon for meal prep. Make a big batch on Sunday, and you’ve got lunches for the week—just reheat and grab. The carrots stay tender, the beans hold their shape, and honestly? It tastes even better the next day. My kids don’t even complain about leftovers.

Step-by-step instructions for homemade bean soup with caramelized onions

This method transforms simple pantry staples into a rich, flavorful soup with layers of depth.

1

Soak and Parboil the Cannellini Beans

Place the 1.5 cups dried cannellini beans in a large bowl and cover with plenty of cold water by at least 2 inches. Let them soak for 8-12 hours at room temperature. I like to soak them overnight—this ensures even cooking and prevents the soup from becoming gummy.

After soaking, drain and rinse the beans thoroughly. Transfer them to a large pot and cover with fresh cold water by 2 inches again. Bring to a boil over high heat, then immediately reduce to medium-high heat and boil vigorously for 2 minutes. This quick parboil removes any remaining surface starch and prevents the beans from breaking down too much during cooking. Drain again, then set aside.

2

Develop the Caramelized Onion Base

Heat the 0.5 cup extra-virgin olive oil in a large Dutch oven over medium-low heat. Add the 2 medium yellow onions that have been thinly sliced, spreading them out in an even layer. Cook undisturbed for 10 minutes—this allows the onions to release their moisture and begin caramelizing without burning.

After 10 minutes, gently stir the onions and reduce heat to low. Continue cooking for another 20-25 minutes, stirring occasionally, until the onions are deep golden brown with a rich, sweet aroma. This slow caramelization builds the soup's foundation—don't rush it. If the onions start to stick, add a splash of water and scrape up the browned bits from the bottom of the pot.

3

Build the Vegetable and Herb Base

Add the 2 medium carrots chopped into chunks, 2 whole celery stalks chopped into small pieces, and the 4 cloves garlic cloves minced to the caramelized onions. Cook for 5 minutes until the vegetables begin to soften and take on color. Stir in the 0.5 tsp smoked paprika and cook for another 1 minute to toast the spices gently.

Pour in the 4 cups vegetable broth and bring to a simmer. Add the 2 whole fresh bay leaves and 1 tbsp fresh thyme leaves. The broth should just cover the vegetables—if it's too shallow, add a bit more water. Simmer gently for 15 minutes to let the flavors meld together. This step extracts maximum flavor from all the vegetables and herbs.

4

Simmer the Beans to Perfect Tenderness

Add the parboiled beans to the pot and bring everything to a gentle boil. Reduce heat to medium-low and simmer uncovered for 45-60 minutes, stirring occasionally. The beans are done when they're fork-tender but still hold their shape—you should be able to pierce them easily with a fork but not have them fall apart.

Check the seasoning after 30 minutes of simmering. Add the 1.5 tsp salt and 0.5 tsp black pepper if needed. The soup should be seasoned well but not overly salty. If the soup is too thick, add a bit more broth or water to reach your desired consistency. The beans should be swimming in flavorful liquid.

5

Finish and Serve with Brightness

Remove the 2 whole fresh bay leaves from the soup. Stir in the 0.5 cup coconut milk and 2 tbsp lemon juice to add creaminess and a bright, fresh finish. Simmer for another 5 minutes to let the flavors meld together. The coconut milk will give the soup a velvety texture while the lemon juice cuts through the richness.

Ladle the soup into bowls and garnish each serving with 0.25 cup fresh parsley chopped finely. The parsley adds a pop of color and freshness that complements the deep flavors of the soup. Serve immediately while hot, with crusty bread on the side to soak up every last drop of this comforting homemade bean soup.

👨‍🍳

Pro Tips For Making Bean Soup From Scratch

  • SOAK BEANS OVERNIGHT: Dried cannellinis need serious softening—skip the quick-soak if you can. I learned this the hard way: tossing them in boiling water for 2 hours still leaves them tough. Cover them in cold water with a pinch of salt, let them sit 12+ hours, then simmer until tender. (Yes, even if you're impatient like me.)
  • SWEAT VEGETABLES LOW AND SLOW: High heat burns onions and carrots before they break down. Use medium-low and let them cook uncovered for 10-15 minutes—until the onions turn translucent and the carrots soften. This builds flavor without caramelizing them into oblivion. (Your future self will notice the difference.)
  • SKIP THE CROWDED POT: Cannellinis expand like crazy—don’t fill the pot more than halfway. I used to jam in all the beans at once, and they’d turn mushy before cooking through. Give them space to hydrate properly, then top with broth. (Your soup will thank you.)
  • TOAST THE BEANS FIRST: Brown the dried beans in a dry pot for 2-3 minutes before soaking—it deepens their nutty flavor. I was skeptical until I tried it: the soup now has a richer base without extra seasoning. (Does it look weird? Yes. Does it work? Every single time.)

Dietary considerations for this dish

Vegan-Friendly Foundation

This bean soup is naturally vegan, relying entirely on plant-based ingredients like cannellini beans, carrots, and celery for protein and texture. The extra-virgin olive oil and coconut milk add richness without dairy, while the vegetable broth ensures a flavorful base.

Even the smoked paprika and fresh herbs keep it entirely plant-powered—no hidden animal products here. 🌱

Gluten-Free Adaptations

Gluten-free diners can enjoy this soup without modifications, as it contains no wheat, barley, or rye. However, if you're using store-bought vegetable broth, double-check the label for gluten-containing additives.

Brands like Pacific Foods or Imagine offer certified gluten-free options. For extra assurance, prepare your own broth using gluten-free ingredients like carrot tops and celery leaves.

Low-Carb Options

To reduce carbs, skip the carrots and celery or use them sparingly—just ½ cup total. Swap in zucchini or cauliflower for a lighter texture, though these will alter the soup’s traditional heartiness.

The coconut milk remains a great low-carb fat source, and the cannellini beans provide fiber and plant-based protein. This version still delivers satisfying flavor with fewer carbs. 🥦

Allergen Considerations

For nut allergies, ensure your coconut milk is processed in a nut-free facility (brands like Thai Kitchen offer nut-free options). If soy allergies are a concern, avoid adding soy sauce or miso (though they’re optional).

For dairy-free needs, the recipe already complies—just confirm all ingredients are dairy-free, including broth and spices. Always read labels carefully, especially for pre-packaged items.

Protein Boost

Want more protein? Stir in ½ cup cooked quinoa or lentils at the end for an extra 10-12 grams per serving. For a tofu option, add ½ cup crumbled firm tofu during the final 5 minutes of simmering.

The beans already provide 15 grams of protein per serving, but these additions make it a complete meal. I love adding hemp seeds (just 1 tbsp) for an omega-3 boost too!

Nutrition facts

Servings 4
Amount Per Serving
Calories 320kcal
% Daily Value *
Total Fat 14g18%
Saturated Fat 6g30%
Cholesterol 0mg0%
Sodium 850mg37%
Total Carbohydrate 42g15%
Dietary Fiber 12g43%
Sugars 6g
Protein 18g36%
* Percent Daily Values are based on a 2,000 calorie diet. Your daily values may be higher or lower depending on your calorie needs.

Frequently asked questions

1

Can I use canned beans instead of dried for this recipe?

Yes, but with adjustments! Use 2 (15 oz) cans of cannellini beans (drained and rinsed) to replace the dried beans. Since canned beans are pre-cooked, reduce the simmering time to 30-40 minutes instead of 45-60 minutes. The texture will be slightly softer, but still delicious. For best results, choose low-sodium beans and add extra salt if needed.

2

How do I make this soup extra creamy without dairy?

For a velvety texture, blend 1 cup of the soup (before adding coconut milk) with an immersion blender until smooth, then stir it back in. Alternatively, replace the coconut milk with ½ cup cashew cream (blend soaked cashews with water) for a richer, dairy-free option. Both methods add body while keeping the soup plant-based.

3

What's the best way to store and reheat leftovers?

Store in an airtight container in the fridge for up to 5 days or freeze for 3 months. Reheat gently on the stove over medium-low heat, stirring occasionally, until warmed through. The coconut milk may separate—just stir vigorously before serving. For best texture, avoid microwaving as it can make the beans mushy.

4

Can I make this soup in an Instant Pot?

Sauté the onions, carrots, celery, and garlic in the Instant Pot for 5 minutes on sauté mode. Add the broth, beans, thyme, and bay leaves, then pressure cook for 15 minutes on high. Quick-release the pressure, stir in coconut milk and lemon juice, then cook on sauté mode for 2 minutes to finish. The Instant Pot cuts cooking time by about half while keeping all the flavor.

5

What if my beans turn out too mushy?

Overcooked beans happen when simmered too long or at too high heat. For next time, check tenderness at 45 minutes—they're done when they're fork-tender but still hold shape. If you've already overcooked them, strain the soup through a fine-mesh sieve to remove broken beans, then blend the strained liquid with ½ cup coconut milk to create a creamy sauce. Serve with extra bread to soak up the sauce.

★★★★★4.6(13 reviews)
Categories Soups & Stews