These French Onion Meatballs are tender beef and pork meatballs mixed with sweet, golden onions, baked, then coated in a savory onion gravy and broiled under melted Gruyère. They make a hearty dinner for about 6 people, and each serving has roughly 30 grams of protein before any bread is added.
What Makes These French Onion Meatballs Great?

Everything you love about a bowl of French onion soup is in here: sweet onions, a savory broth, a little wine, and browned, bubbly cheese. The difference is that the onions also go inside the meatballs, which keeps them moist and gives them a deeper flavor than plain seasoned meat. The gravy is built right in the same pan, so nothing gets wasted.
Why You’ll Love It
- No batch frying. The meatballs bake on one sheet pan, so there is no splattering oil and no standing over a skillet turning them.
- The onions work twice. Half go into the meatball mix and half become the base of the gravy, so you only cook them once.
- Easy to get ahead on. The onions and meatballs can be made a day early, and the final gravy and broil take about 15 minutes.
- Flexible for different appetites. Serve them with baguette, mashed potatoes, egg noodles, or rice, depending on who is at the table.
The Onions
So how do you get the onions right? Slowly. Cooking them gently in butter draws out their natural sugars, and they turn soft, sweet, and golden. That golden color and sweet flavor is what people mean by “caramelized.” It is the backbone of this whole dish, so it is worth the 25 minutes.
Yellow onions are the best choice here. They have enough natural sugar to brown well and enough bite to stay interesting. A splash of dry white wine at the end loosens the browned bits from the pan and adds a little acidity.
What You’ll Need for the Onions
- 2 lb yellow onions (about 3 large), thinly sliced, they cook down into the sweet base of the whole dish.
- 4 tablespoons unsalted butter, gives richness, and using unsalted lets you control the salt.
- 1 tablespoon olive oil, helps keep the butter from browning too fast.
- 1/2 teaspoon kosher salt, draws moisture out of the onions so they soften.
- 1/4 teaspoon black pepper, adds a little warmth.
- 1/2 cup dry white wine, such as Pinot Grigio or Sauvignon Blanc, adds brightness and lifts the browned bits off the pan.
- 2 teaspoons fresh thyme leaves, the classic herb for French onion flavor.
- 3 garlic cloves, finely chopped, adds savory depth without overpowering the onions.
The Meatballs

Using beef and pork together is honestly the best move here. Beef gives you the meaty flavor, and pork adds fat and softness so the meatballs don’t turn dense. Choose 80/20 ground beef, since leaner beef makes drier meatballs.
The panko soaked in milk is what keeps them tender. It holds onto moisture while the meatballs bake. Gruyère mixed right in means you get little melty pockets of cheese in every bite, and trust me, that part is so good.
What You’ll Need for the Meatballs
- 1/2 cup panko breadcrumbs, soak up the milk and keep the meatballs from turning tough.
- 1/3 cup whole milk, softens the panko so it blends smoothly into the meat.
- 1/4 cup chopped fresh parsley, plus extra for garnish, adds a fresh, green note against the rich cheese.
- 1 tablespoon Dijon mustard, gives gentle tang that cuts through the richness.
- 1 large egg, holds everything together.
- About 3/4 cup of the cooked onions, finely chopped (half of the batch from above), build in sweetness and moisture.
- 1 lb ground beef, 80/20, the fat keeps the meatballs juicy.
- 1/2 lb ground pork, makes the texture softer and more tender.
- 1 cup shredded Gruyère cheese, a nutty, melty cheese that tastes like the soup.
- 3/4 teaspoon kosher salt, seasons the meat all the way through.
- 1/2 teaspoon black pepper, adds a little heat.
The Onion Gravy and Cheesy Topping

The gravy starts with the same pan you cooked the onions in, which means all the flavor stays put. Butter and flour are cooked together first. This mixture is called a roux, and it thickens the broth so the sauce clings to the meatballs instead of running off.
Want a sauce that tastes a bit sharper and more like real French onion soup? A small splash of vinegar at the end does the trick. Then the meatballs get a blanket of Gruyère and a quick trip under the broiler, which is your oven’s top heat, strong enough to melt and brown the cheese in just a few minutes.
What You’ll Need for the Gravy and Topping
- 2 tablespoons unsalted butter, the fat for the roux.
- 2 tablespoons all-purpose flour, thickens the broth into a gravy.
- 2 cups low-sodium beef broth, gives the sauce its savory base, and low-sodium keeps the final dish from getting too salty.
- 2 teaspoons Worcestershire sauce, adds a deep, slightly tangy savory note.
- 1 teaspoon sherry vinegar or red wine vinegar, brightens the sauce at the end.
- 1 cup shredded Gruyère cheese, goes on top and melts into a golden crust.
- 1 small baguette, sliced and toasted if you like, soaks up the sauce.
How to Make French Onion Meatballs
Start the Onions
Heat the oven to 425°F and line a baking sheet with parchment paper. In a large ovenproof braiser or deep 12-inch skillet (a braiser is just a wide, heavy pan with a lid and low sides), melt the butter with the olive oil over medium-low heat.
Add the onions, 1/2 teaspoon salt, and 1/4 teaspoon pepper, then cover and cook for about 10 minutes, stirring once, until soft and see-through. Uncover, raise the heat to medium, and cook another 10 minutes, stirring often, until very soft and deep golden.
Add the Wine, Thyme, and Garlic
Pour in the wine and add the thyme and garlic. Cook for about 5 minutes, stirring, until the liquid has cooked away and the onions look glossy and jammy.
Scoop half of the onions onto a cutting board and let them cool for a few minutes. Leave the rest in the pan, then finely chop the cooled onions.
Mix the Meatballs
In a large bowl, stir together the panko, milk, parsley, Dijon, egg, chopped onions, 3/4 teaspoon salt, and 1/2 teaspoon pepper.
Add the beef, pork, and 1 cup of the Gruyère. Mix gently with your hands, just until everything is combined.
Overmixing makes meatballs tough, so stop as soon as you don’t see streaks.
Shape and Bake
Roll the mixture into about 36 meatballs, using roughly 1 1/2 tablespoons for each. Space them out on the lined baking sheet.
Bake for about 15 minutes, until golden brown on the outside and the center reaches 160°F on an instant-read thermometer, which is the safe temperature for ground beef and pork.
Make the Gravy
About 5 minutes before the meatballs are done, add the 2 tablespoons butter to the onions in the pan and melt it over medium heat.
Sprinkle in the flour and stir for 1 to 2 minutes, until it no longer smells like raw flour.
Slowly pour in the broth, whisking the whole time so no lumps form, then add the Worcestershire sauce.
Simmer for 4 to 5 minutes, until the sauce is thick enough to coat the back of a spoon, then stir in the vinegar.
Broil With the Cheese

Add the baked meatballs to the pan and turn them gently so they are coated in gravy. Sprinkle the remaining 1 cup Gruyère over the top.
Switch the oven to broil and set the rack about 6 inches from the heat. Broil for 2 to 3 minutes, watching closely, until the cheese is golden and the sauce is bubbling. Sprinkle with parsley and serve with the baguette slices.
Variations and Customizations
You can change this recipe quite a bit depending on what you have on hand or who you are feeding. The basic idea is cooked onions, savory meat, and melted cheese, so most swaps that keep those three things will work.
- Use all beef (1 1/2 lb) if you don’t have pork. The meatballs will be a little firmer and less rich.
- Swap the Gruyère for Swiss, provolone, or fontina if that’s what you can find.
- Replace the wine with 1/2 cup extra beef broth plus an extra 1/2 teaspoon vinegar if you’d rather not cook with alcohol.
- Make smaller meatballs, about 1 tablespoon each, for appetizers, and bake for 12 to 13 minutes.
- Add a pinch of red pepper flakes to the meat mix for a little heat.
- Spoon leftovers into toasted sub rolls with extra cheese for meatball sandwiches.
Toppings, Add-Ons, and Finishing Touches
These meatballs are already rich and cheesy, so the best finishing touches add freshness or a little sharpness. A few simple things on top make each bite feel lighter, and they also let everyone customize their own plate.
- Extra chopped parsley, for a fresh, green finish.
- Fresh thyme leaves, to echo the herb in the onions.
- Cornichons or sliced dill pickles, for a tangy bite against the cheese.
- Cracked black pepper, for a little heat.
- Toasted baguette slices, for scooping up every drop of gravy.
Storing, Reheating, and Meal Prep
Let leftovers cool for no more than 2 hours, then store them in an airtight container in the refrigerator for up to 4 days. For the best texture, you can make the onions and bake the meatballs a day ahead, keep them in the fridge, and then make the gravy and broil the cheese just before serving.
To reheat, put the meatballs and sauce in a baking dish, add a splash of broth, cover with foil, and warm at 350°F for 15 to 20 minutes, until hot all the way through (165°F). The extra broth keeps everything from drying out. The cooked meatballs and gravy also freeze well for up to 3 months. Freeze them without the cheese topping, thaw overnight in the fridge, then add fresh cheese and broil again before serving.
French Onion Meatballs With Gruyère and Onion Gravy
Description
Tender beef and pork meatballs mixed with sweet, golden onions, baked until browned, then coated in a savory onion gravy and broiled under melted Gruyère cheese. A hearty, comforting dinner that tastes like French onion soup.
Ingredients
For the Onions
For the Meatballs
For the Gravy and Topping
Instructions
Cook the Onions
-
Use a large ovenproof braiser (a wide, heavy pan with a lid and low sides) or a deep 12-inch skillet with an oven-safe handle. Melt 4 tablespoons butter with the olive oil over medium-low heat, then add the onions, 1/2 teaspoon salt, and 1/4 teaspoon pepper. The pan will look very full at first, which is normal because onions shrink a lot as they cook. Cover and cook for about 10 minutes, stirring once, until the onions are soft and see-through. Uncover, raise the heat to medium, and cook for about 10 minutes more, stirring often, until they are very soft and deep golden.
Add the Wine, Thyme, and Garlic
-
Pour in the wine and add the thyme and garlic. Cook for about 5 minutes, stirring now and then, until the liquid has cooked away and the onions look glossy and jammy. Scoop half of the onions onto a cutting board and let them cool for about 10 minutes, then chop them finely. Leave the rest of the onions in the pan and turn off the heat.
Mix the Meatball Mixture
-
In a large bowl, stir together the panko, milk, parsley, Dijon, egg, chopped onions, 3/4 teaspoon salt, and 1/2 teaspoon pepper. It will look like a thick, wet paste, which is exactly right. Add the ground beef, ground pork, and 1 cup Gruyère. Mix gently with your hands for about 1 minute, just until no streaks remain. The mixture will feel soft and slightly sticky, and overmixing can make the meatballs tough, so stop as soon as everything is combined.
Shape the Meatballs
-
Line a large baking sheet with parchment paper. Wet your hands lightly with water to keep the mixture from sticking, then roll about 1 1/2 tablespoons of the mixture into a smooth ball. Repeat to make about 36 meatballs and space them out on the lined baking sheet. Don’t worry if they are not perfectly round, as they will firm up and neaten as they bake.
Chill the Meatballs
-
Place the baking sheet in the refrigerator for 15 minutes. Chilling firms up the fat in the meat so the meatballs hold their shape in the oven and stay tender. While they chill, heat the oven to 425°F with the rack in the center.
Bake the Meatballs
-
Bake the meatballs for about 15 minutes, until they are golden brown on the outside and the center reaches 160°F on an instant-read thermometer, which is the safe temperature for ground beef and pork. You may see some fat on the parchment, and this is normal. The kitchen will smell wonderfully savory by the time they are done.
Make the Gravy
-
About 5 minutes before the meatballs finish baking, return the pan with the onions to medium heat and melt 2 tablespoons butter in it. Sprinkle in the flour and stir for 1 to 2 minutes, until it no longer smells like raw flour. This butter and flour mixture is called a roux, and it thickens the gravy. Slowly pour in the broth while whisking constantly, then add the Worcestershire sauce. Simmer for 4 to 5 minutes, until the gravy is thick enough to coat the back of a spoon, then stir in the vinegar. If a few lumps appear, keep whisking and they will smooth out.
Broil With the Cheese
-
Add the baked meatballs to the pan and gently turn them until they are coated in gravy. Sprinkle the remaining 1 cup Gruyère over the top. Switch the oven to broil (the oven’s strong top heat) and place the rack about 6 inches from the heat. Broil for 2 to 3 minutes, watching closely, until the cheese is melted and golden and the gravy is bubbling. Sprinkle with parsley and serve warm with sliced baguette for soaking up the gravy.
Note
Choose 80/20 ground beef for the juiciest meatballs, as leaner beef can turn dry. Shredding Gruyère from a block melts more smoothly than pre-shredded cheese.
To save time, cook the onions and shape the meatballs up to 1 day ahead. Keep them covered in the refrigerator, then bake, make the gravy, and broil just before serving.
Store leftovers in an airtight container in the refrigerator for up to 4 days. Reheat in a covered baking dish with a splash of beef broth at 350°F for 15 to 20 minutes, until hot all the way through (165°F). The cooked meatballs and gravy can be frozen without the cheese topping for up to 3 months. Thaw overnight in the refrigerator, then add fresh cheese and broil again.
If the gravy is too thin, simmer it for 2 to 3 more minutes. If it is too thick, whisk in a splash of broth. If the cheese browns too quickly under the broiler, lower the rack slightly. Calories are an estimate and will vary with the brands used.