When the craving for deep savory comfort strikes, these One-Skillet French Onion Meatballs deliver pure restaurant-quality magic in under an hour. Juicy seasoned beef meatballs are nestled into a luscious, deeply caramelized onion gravy simmered in rich beef bone broth, then blanketed under a bubbling, golden canopy of melted Gruyu00e8re and Swiss cheese. It is everything you love about classic French onion soup transformed into a hearty, satisfying weeknight centerpiece.

Why Youu2019ll Love This Recipe
This recipe captures the timeless depth of classic French bistro cooking while streamlining the technique into a single skillet:
- Single-Skillet Simplicity: From searing the meatballs to caramelizing the onions and melting the cheese, everything happens in one pan for effortless cleanup.
- 100% Halal Wholesome: Traditional French onion soup often relies on dry white wine or cognac for deglazing. This recipe builds immense savory depth using rich beef bone broth, naturally caramelized sweet onions, and a splash of umami-packed Worcestershire sauce.
- Ultra-Tender Meatballs: A gentle pan sear locks in juiciness before the meatballs finish simmering directly in the savory onion gravy.
- The Ultimate Comfort Pairing: Incredible spooned over fluffy garlic mashed potatoes, buttered egg noodles, or mopped up with warm crusty sourdough bread.
Key Ingredients & Smart Swaps

- 1.5 lbs lean ground beef (85/15)
- 1/2 cup panko breadcrumbs
- 1 large egg, lightly beaten
- 3 cloves fresh garlic, finely minced
- 2 tbsp fresh flat-leaf parsley, finely chopped
- 1 tbsp Worcestershire sauce
- 1 tsp kosher salt
- 1/2 tsp freshly cracked black pepper
- 2 tbsp extra virgin olive oil
- 2 tbsp unsalted butter
- 3 large yellow onions, peeled and thinly sliced
- 1 tbsp all-purpose flour
- 2 cups low-sodium beef bone broth
- 1 tsp fresh thyme leaves (plus extra for garnish)
- 1.5 cups shredded Gruyu00e8re or Swiss cheese (or Provolone blend)
Step-by-Step Cooking Walkthrough
Step 1: In a large mixing bowl, gently combine ground beef, panko breadcrumbs, beaten egg, minced garlic, parsley, Worcestershire sauce, salt, and pepper until just incorporated. Shape into 16 plump, uniform meatballs.
Step 2: Heat 1 tbsp olive oil in a 12-inch oven-safe cast iron skillet over medium-high heat. Sear the meatballs for 5 to 6 minutes, turning gently, until browned on all sides. Transfer meatballs to a warm plate (they will finish cooking in the gravy).
Step 3: In the same skillet, melt butter with remaining 1 tbsp olive oil over medium-low heat. Add the sliced yellow onions and a pinch of salt. Cook low and slow for 20 to 25 minutes, stirring occasionally, until soft, jammy, and deeply caramelized to a golden amber hue.
Step 4: Sprinkle flour over the caramelized onions and stir constantly for 1 minute to cook out the raw flour taste. Pour in beef bone broth and fresh thyme leaves, using a wooden spoon to scrape up all the delicious browned bits (fond) from the bottom of the skillet. Simmer for 4 to 5 minutes until the gravy thickens slightly.
Step 5: Nestle the seared meatballs and any resting juices back into the bubbling onion gravy. Spoon gravy generously over each meatball, reduce heat to low, cover, and simmer for 8 minutes until meatballs reach an internal temperature of 160 F (71 C).
Step 6: Uncover and blanket the meatballs with shredded Gruyu00e8re and Swiss cheese. Broil in the oven (or cover with a lid over low heat) for 3 to 4 minutes until cheese is completely melted, bubbling, and blistered with golden-brown spots.
Step 7: Garnish with fresh thyme leaves and cracked black pepper. Serve immediately piping hot with creamy mashed potatoes, buttered egg noodles, or warm crusty French baguette.


3 Chef Secrets for Perfect Results
1. Do Not Rush the Onions: True caramelization requires patience. Cook the sliced onions over medium-low heat for at least 20 minutes until they reduce to a deep jammy amber. This natural sweetness is the entire flavor foundation of the gravy.
2. Gentle Mixing Technique: Overworking ground beef compacts the proteins and creates dense meatballs. Use clean hands to combine the ingredients just until incorporated, then roll with light pressure.
3. Scrape the Skillet Fond: The browned bits left behind after searing the meatballs contain concentrated flavor. When you pour in the beef bone broth, scrape the skillet bottom vigorously with your wooden spoon to incorporate that richness into the gravy.
Storage, Freezing & Reheating Instructions
- Refrigeration: Allow leftovers to cool completely, then transfer to airtight glass containers. Store refrigerated for up to 4 days. The onion gravy tastes even more spectacular the next day!
- Freezing: Meatballs and gravy freeze remarkably well for up to 3 months. For best results, freeze before topping with cheese. Thaw overnight in the refrigerator.
- Reheating: Warm gently in a covered skillet over medium-low heat with a splash of beef broth until simmering (165 F). Add fresh cheese and broil before serving.
Frequently Asked Questions
Can I use ground turkey instead of ground beef?
Yes! Ground turkey (93/7) or ground chicken makes a fantastic leaner alternative. Because poultry has less fat, sear gently in an extra tablespoon of butter to keep them succulent.
What is the best cheese substitute if I don’t have Gruyu00e8re?
Swiss cheese, Fontina, Provolone, or low-moisture mozzarella all melt beautifully and provide that quintessential gooey cheese pull.
Can I make the meatballs ahead of time?
Yes. You can roll the uncooked meatballs up to 24 hours in advance and keep them covered in the refrigerator until ready to sear.
Pin This Recipe for Later
One-Skillet French Onion Meatballs
- Total Time: 50 min
- Yield: 4 to 5 servings 1x
Description
Juicy beef meatballs simmered in rich caramelized onion beef bone broth gravy under a melted blanket of bubbly Gruyere. The ultimate cozy weeknight comfort.
Ingredients
1.5 lbs lean ground beef (85/15)
1/2 cup panko breadcrumbs
1 large egg, lightly beaten
3 cloves fresh garlic, finely minced
2 tbsp fresh flat-leaf parsley, finely chopped
1 tbsp Worcestershire sauce
1 tsp kosher salt
1/2 tsp freshly cracked black pepper
2 tbsp extra virgin olive oil
2 tbsp unsalted butter
3 large yellow onions, peeled and thinly sliced
1 tbsp all-purpose flour
2 cups low-sodium beef bone broth
1 tsp fresh thyme leaves (plus extra for garnish)
1.5 cups shredded Gruyu00e8re or Swiss cheese (or Provolone blend)
Instructions
In a large mixing bowl, gently combine ground beef, panko breadcrumbs, beaten egg, minced garlic, parsley, Worcestershire sauce, salt, and pepper until just incorporated. Shape into 16 plump, uniform meatballs.
Heat 1 tbsp olive oil in a 12-inch oven-safe cast iron skillet over medium-high heat. Sear the meatballs for 5 to 6 minutes, turning gently, until browned on all sides. Transfer meatballs to a warm plate (they will finish cooking in the gravy).
In the same skillet, melt butter with remaining 1 tbsp olive oil over medium-low heat. Add the sliced yellow onions and a pinch of salt. Cook low and slow for 20 to 25 minutes, stirring occasionally, until soft, jammy, and deeply caramelized to a golden amber hue.
Sprinkle flour over the caramelized onions and stir constantly for 1 minute to cook out the raw flour taste. Pour in beef bone broth and fresh thyme leaves, using a wooden spoon to scrape up all the delicious browned bits (fond) from the bottom of the skillet. Simmer for 4 to 5 minutes until the gravy thickens slightly.
Nestle the seared meatballs and any resting juices back into the bubbling onion gravy. Spoon gravy generously over each meatball, reduce heat to low, cover, and simmer for 8 minutes until meatballs reach an internal temperature of 160 F (71 C).
Uncover and blanket the meatballs with shredded Gruyu00e8re and Swiss cheese. Broil in the oven (or cover with a lid over low heat) for 3 to 4 minutes until cheese is completely melted, bubbling, and blistered with golden-brown spots.
Garnish with fresh thyme leaves and cracked black pepper. Serve immediately piping hot with creamy mashed potatoes, buttered egg noodles, or warm crusty French baguette.
- Prep Time: 15 min
- Cook Time: 35 min
