Soups & Stews
This 99 French onion soup recipe transforms humble onions into a symphony of caramelized sweetness and golden, bubbling cheese—every spoonful delivers restaurant-quality depth. The secret lies in slow caramelization, where onions melt into a rich, amber base that forms the soul of this classic. I've perfected the technique over years of testing, ensuring that crispy bread topping and melty Gruyère create the perfect textural contrast.
The process begins with patience—cooking onions for 45 minutes until they're deep brown and jammy, then building a velvety broth with beef stock and a classic roux. What sets this apart is the balance: rich enough to satisfy, light enough to enjoy on chilly evenings. The final touch? A crispy bread crown that toasts to golden perfection while the cheese bubbles beneath.
What you'll achieve is a soup that's crispy on top, velvety in the middle, and packed with umami in every bite. The aroma alone will have everyone gathering around the table, while the first sip delivers that perfect harmony of caramelized onions, savory broth, and melted cheese. This is comfort food at its finest—elegant yet approachable.
Whether you're serving a crowd or treating yourself to a cozy meal, this recipe scales beautifully. The techniques are traditional, but the result feels like a gourmet experience. Let's create this timeless classic together—starting with those first onions.
Ingredients for 99 french onion soup
Four large onions and a few key ingredients transform into restaurant-quality French onion soup.
| Ingredient | Amount | Notes |
|---|---|---|
| Yellow Onions 🧅 | 4 large | Sliced thinly for caramelization |
| Unsalted Butter 🧈 | 4 tbsp | For rich flavor base |
| All-Purpose Flour 🌾 | 2 tbsp | For classic roux |
| Beef Stock 💧 | 4 cups | High-quality, homemade preferred |
| Dry White Wine 🍷 | ½ cup | Bold and dry variety |
| Chicken Stock 💧 | 2 cups | For balanced flavor |
| Gruyère Cheese 🧀 | 2 cups | Freshly grated, nutty flavor |
| Emmental Cheese 🧀 | 1 cup | Mild, melty texture |
| Baguette 🍞 | 1 whole | Crusty, day-old preferred |
| Olive Oil 🫒 | 2 tbsp | For bread topping |
| Salt 🧂 | 1 ½ tsp | Kosher or sea salt |
| Black Pepper 🌶️ | ½ tsp | Freshly ground preferred |
| Fresh Thyme 🌿 | 2 sprigs | Or 1 tsp dried thyme |
| Garlic Cloves 🧄 | 4 cloves | Minced for depth |
The onions are the star—yellow onions with a crisp bite work best. Whole Foods or Trader Joe's often have the sweetest varieties in season. Look for firm, dry onions with no sprouting. I usually grab a bag of Vidalias if they're available, but yellows are the classic choice. Thinly slice them (about 1/8-inch thick) so they caramelize properly. The butter matters too—European-style like Plugrá has more flavor than American butter. Don't skip the thyme—it adds that herbal depth that makes this dish sing.
No wine? Dry vermouth or even extra beef stock works in a pinch, but the acidity helps balance the sweetness. Fresh thyme is ideal, but dried at half the amount gets you close. The Gruyère should be real Swiss Gruyère—pre-shredded melts differently. For the bread, day-old baguette is perfect, but fresh works if you toast it first. The cheese blend is key: Gruyère for nutty flavor and Emmental for that classic stretchy melt. If you can only find one, Gruyère is the way to go—it's more flavorful.
This soup tastes even better the next day—make extra and freeze portions. The bread topping keeps for 2 days if stored separately, but the soup itself stays good for 5 days in the fridge. For make-ahead, assemble everything except the cheese and bread, then bake just before serving. The cheese will melt beautifully, and the bread will get that perfect crisp. Portion into individual bowls for easy reheating—just pop under the broiler for 3-5 minutes to crisp the top.
Why You'll Love This Recipe
- One-Pot Magic: I swear by this recipe—just onions, butter, and a splash of wine caramelizing in one pot. No chopping boards to clean, no extra dishes. The flour thickens everything right there while you sip your wine (because why not?).
- Caramelized Gold: That slow cook of onions in butter until they’re deep amber? It’s like liquid sweetness with a savory punch. The white wine cuts through the richness, and the beef stock ties it all together—comfort in a bowl, every time.
- Weeknight to Dinner Party: Make a double batch on Sunday—leftovers reheat beautifully, and it’s still impressive enough for guests. (Yes, even when you’re wearing pajama pants.) The crusty bread topping? Instant upgrade from "weeknight meal" to "special occasion."
- Budget-Friendly Luxury: Onions are cheap, beef stock stretches far, and a little wine makes it feel fancy. I’ve fed four people for under $10, and they’ve all asked for seconds. That’s the kind of recipe that makes grocery shopping feel like a win.
Step-by-step instructions for French onion soup
Here's how to build the ultimate French onion soup with a golden, crispy bread top.
Caramelize the Onions to Perfection
Slice the 4 large yellow onions thinly and evenly—about ⅛-inch thick. Heat 2 tablespoons of the unsalted butter in a large Dutch oven over medium-low heat. Add half the onions and let them cook undisturbed for 10 minutes, stirring occasionally. You want them to soften and release moisture before browning.
After 10 minutes, add the remaining onions and the other 2 tablespoons of butter. Continue cooking for another 20-25 minutes, stirring frequently. The onions should turn deep golden brown with a rich, sweet aroma—this is the secret to authentic flavor. If they start to stick, add a splash of water and scrape up any browned bits from the bottom. This caramelization process builds the soul of your soup.
Build the Roux and Deglaze
Once the onions are beautifully caramelized, sprinkle the 2 tablespoons of all-purpose flour over them and stir vigorously for 2 minutes. This creates a roux that will thicken your soup. Cook the roux until it turns a light golden color—about the shade of pale toast. Be patient here; a well-cooked roux prevents a gummy soup.
Pour in the 0.5 cup dry white wine and scrape up all those delicious browned bits from the bottom of the pot. Let the wine simmer for 3-4 minutes until it reduces by half. Then add the 4 cups beef stock and 2 cups chicken stock, along with the 2 sprigs fresh thyme and 4 minced garlic cloves. Bring everything to a gentle simmer and let it cook uncovered for 20 minutes. This step develops the flavors and ensures your soup has depth.
Season and Simmer the Soup
Add the 1.5 teaspoons salt and 0.5 teaspoon black pepper to the simmering soup. Taste and adjust the seasoning if needed—you want it to be rich and savory, not bland. Let the soup simmer gently for another 15-20 minutes until it's reduced slightly and the flavors have melded together beautifully. The soup should be thick enough to coat the back of a spoon but still have a lovely consistency.
While the soup simmers, prepare the baguette. Cut it into 1-inch thick slices—you should have enough for 4 bowls with 2 slices each. Brush both sides of each slice with the 2 tablespoons olive oil and toast them in a 375°F oven for 5-7 minutes until golden brown. These crispy bread slices will be the perfect topping for your soup.
Assemble and Bake the Cheesy Topping
Preheat your broiler to high. Ladle the hot soup into 4 oven-safe bowls, placing 2 toasted baguette slices in each bowl. Top each with an even layer of the 2 cups grated Gruyère cheese and 1 cup grated Emmental cheese. The cheese should cover the bread completely—this ensures a perfectly melty, golden crust.
Place the bowls on a baking sheet and broil for 3-5 minutes, watching carefully. You want the cheese to bubble and turn golden brown, not burn. The moment the cheese is bubbly and the top is golden brown, remove the bowls from the oven. Let them sit for 2 minutes before serving—this resting time allows the cheese to set slightly for easier handling.
Serve Immediately for Maximum Enjoyment
Serve the French onion soup straight from the bowls while the bread is still crispy and the cheese is gooey. The contrast of the warm, melty cheese against the crispy bread top creates the perfect texture combination. Each spoonful delivers layers of caramelized onion flavor, rich broth, and that irresistible cheesy finish.
For an extra touch, garnish with a sprinkle of fresh black pepper and a few thyme leaves. The soup is best enjoyed immediately, so gather your loved ones around and savor this classic comfort dish together. The crispy bread top is what makes this soup truly special—don't skip this step!
Pro Tips For Making 99 French Onion Soup
- Caramelize the Onions Slow: I learned this the hard way—rushing the onions turns your soup into onion-flavored stock. Use medium-low heat and let them cook for at least 45 minutes, stirring occasionally, until they’re deep golden and almost jammy. The longer they cook, the richer the flavor, and that’s the whole point of this dish.
- Deglaze with Wine Early: Don’t wait until the onions are done to add the white wine—pour it in while they’re still cooking, right after the butter melts. The alcohol burns off faster when the pan is hot, and you’ll get more depth of flavor without overpowering the dish. (Yes, even if you’re impatient like me.)
- Skip the Crowding in the Pan: Overfilling your pot with onions means they steam instead of caramelize. Work in batches if needed—start with half the onions, cook them until deeply colored, then add the rest. Your future self will thank you when the soup tastes like it belongs in a Parisian bistro.
- Toast the Flour Properly: After cooking the onions, let the butter melt completely and cook the flour for 2-3 minutes until it’s nutty-smelling and lightly golden. This step makes a real difference—it adds thickness and a subtle toasted flavor that cheapens out if you rush it. (No, skipping it won’t ruin the soup, but it won’t taste like 99 either.)
Serving suggestions for leftovers
Bread Top Variations
Skip the baguette for a garlic bread twist—use a focaccia loaf instead, brushing with garlic-infused olive oil and sprinkling with fresh rosemary before toasting. For a gluten-free option, substitute with gluten-free baguette slices or crispy polenta rounds—they hold up beautifully under the cheese. 🍞
Cheese Substitutes
If Gruyère is unavailable, try Comté for a similar nutty depth or Parmesan for extra umami. For a vegan version, melt nutritional yeast mixed with cashew cream on top of the bread before broiling. The key is achieving that gooey, golden crust—experiment with mozzarella for stretchiness or sharp cheddar for tang.
Garnish Ideas
Add a fresh thyme sprig or chopped chives for brightness. A drizzle of truffle oil (just ½ teaspoon) elevates the dish to gourmet status. For a spicy kick, sprinkle crushed red pepper flakes or a pinch of smoked paprika before serving. These finishing touches turn a classic into something special. 🌿
Serving Style
For a restaurant-worthy presentation, serve in individual oven-safe bowls with a wooden spoon resting on the rim. Pair with a crisp white wine like Sauvignon Blanc or a dark beer like a stout. For a family-style meal, serve in a large cast-iron pot with extra bread and cheese on the side for topping.
Make-Ahead Tips
Assemble the soup without the cheese and bread up to 2 days ahead, then refrigerate. When ready to serve, reheat the soup in a pot, toast the bread fresh, and broil the cheese just before serving. For freezer-friendly portions, freeze the soup in airtight containers and reheat on the stovetop—just add the bread and cheese fresh. ❄️
Dietary Adaptations
For a low-carb version, use cauliflower crust or zucchini rounds instead of bread. A dairy-free option swaps cheese for melted vegan mozzarella or cashew-based cheese sauce. Always adjust cooking times—vegan cheese may require 1-2 extra minutes under the broiler to achieve the same crispy texture. 💫
Nutrition facts
Frequently asked questions
Why do my onions burn before caramelizing?
This happens when cooking at too high heat or stirring too frequently. Use medium-low heat and let the onions cook undisturbed for 10 minutes at a time. Stirring releases moisture too quickly, preventing proper browning. If they stick, add a splash of water and scrape up the browned bits—they're packed with flavor!
Can I make this soup vegetarian?
Replace the beef stock with mushroom or vegetable stock and add 1 cup of chopped mushrooms to the caramelized onions for depth. For umami, stir in 1 teaspoon soy sauce or miso paste when adding the wine. The cheese topping stays the same—just ensure your cheese is vegetarian-friendly.
How do I fix soup that's too thin?
Simmer the soup uncovered for 10-15 extra minutes to reduce it naturally. If it's still too thin, mix 1 tablespoon cornstarch with 2 tablespoons cold water, stir into the soup, and cook for 2-3 minutes until thickened. Avoid over-thickening—you want a velvety, spoonable consistency, not gluey.
What's the best way to reheat leftovers?
Reheat the soup (without cheese/bread) on the stovetop over medium-low heat until warm. For the bread top, toast fresh slices in the oven, then add cheese and broil for 2-3 minutes until bubbly. Never microwave the cheese—it won't crisp properly! The soup stays good for 5 days refrigerated or 3 months frozen.
Can I use pre-caramelized onions?
Yes, but fresh caramelization makes all the difference! Store-bought versions often lack depth. If using them, sauté with 1 extra tablespoon butter for 5 minutes to enhance flavor. For homemade shortcuts, par-cook onions in the microwave for 3 minutes before stovetop caramelizing to save time.
