Comfort Food

Skillet Butter Chicken Meatballs with Spiced Tomato Cream Sauce

Tender spiced chicken meatballs simmered in a rich, garam masala tomato cream sauce — weeknight dinner done in one skillet, 55 minutes total.

By Brian ·
Be the first to rate!
Skillet Butter Chicken Meatballs with Spiced Tomato Cream Sauce

Butter chicken is one of those dishes where the sauce does most of the heavy lifting — so turning it into a meatball format just makes sense. You get more surface area for browning, quicker cook time, and a better protein-to-sauce ratio in every bite. The meatballs themselves are seasoned with garam masala, ginger, and garlic so they're not just carriers; they actively contribute to the overall flavor of the braise.

The sauce follows the classic murgh makhani framework: bloomed whole spices, tomato paste cooked until brick-red, crushed tomatoes, and heavy cream added off-heat to prevent curdling. Expect a sauce that's deeply savory, gently spiced, with a slight sweetness from the tomato. This is a weeknight dinner — it comes together in one 12-inch skillet in about 55 minutes and scales easily for meal prep. If the sauce feels too thick after adding the cream, splash in 2–3 tbsp of chicken stock to loosen it before serving.

↓ Jump to Recipe
🕐 Prep: 20 min | 🔥 Cook: 35 min | ⏱️ Total: 55 min

Ingredients

Servings 4

🛒 Links may earn us a small commission at no cost to you.

🍳

Recommended Gear

12-inch stainless steel or cast iron skillet with lid
Shop →
Large mixing bowl
Shop →
Rimmed plate or sheet pan (for resting meatballs)
Shop →
Microplane or fine grater (for ginger)
Shop →
Instant-read thermometer
Shop →
Wooden spoon or silicone spatula
Shop →

🛒 We may earn a small commission at no extra cost to you. We only recommend gear we'd use ourselves.

Instructions

Prep

  1. 1. In a large mixing bowl, combine the ground chicken, panko, egg, 1 minced garlic clove, 1/2 tsp garam masala, 1/2 tsp cumin, 1/2 tsp coriander, 1/4 tsp cayenne, 1/2 tsp kosher salt, and 1/4 tsp black pepper. Mix with a fork until just combined, then use your hands for a final gentle incorporation — stop as soon as everything looks uniform. Overworking the mix at this stage is the main reason meatballs turn rubbery.
  2. 2. With damp hands, roll the mixture into 1.5-inch balls — you should get about 18–20. Set them on a rimmed plate. The mixture will be slightly tacky; wet your hands again every 4–5 meatballs to prevent sticking.

Brown the Meatballs

  1. 1. Heat 2 tbsp neutral oil in a 12-inch skillet over medium-high until the oil shimmers and a small piece of meat dropped in sizzles immediately, about 90 seconds. Add the meatballs in a single layer — don't crowd them. Work in two batches if needed. Sear without moving for 3 minutes, until the bottom side is deep golden-brown and releases cleanly from the pan. Flip and sear the second side for another 2 minutes. The meatballs won't be cooked through yet — that's fine. Transfer to the plate.

Build the Sauce

  1. 1. Reduce the heat to medium. Add 2 tbsp butter to the same skillet. When the butter melts and the foam subsides, add the diced onion. Cook, stirring occasionally, for 7–8 minutes until the onion is soft and translucent with golden edges — you should hear a steady, quiet sizzle, not an aggressive splatter. Scrape up any browned meatball fond from the bottom of the pan as you stir.
  2. 2. Add the remaining 2 minced garlic cloves and the grated ginger. Stir constantly for 60–90 seconds until fragrant and the raw garlic smell softens — it should smell sweet and slightly toasty, not sharp.
  3. 3. Push the onion mixture to the sides of the pan and add the tomato paste directly to the center. Let it cook undisturbed for 90 seconds, then stir it into the onions and continue cooking, stirring frequently, for another 60–90 seconds. The paste will shift from bright red to a deeper brick-red and will smell slightly caramelized — this step is non-negotiable for sauce depth.
  4. 4. Add the remaining 1/2 tsp garam masala and 1/2 tsp cumin. Stir for 30 seconds until the spices bloom in the fat — they'll smell warm and aromatic immediately.
  5. 5. Pour in the crushed tomatoes and chicken stock. Stir to combine, scraping the bottom of the pan thoroughly. Add 3/4 tsp kosher salt and 1 tsp sugar. Bring to a gentle simmer — small bubbles around the edges, not a boil.

Braise and Finish

  1. 1. Nestle the browned meatballs back into the sauce in a single layer. Spoon sauce over the top of each meatball. Cover the skillet with a lid and simmer over medium-low for 12–14 minutes, until the meatballs register 165°F on an instant-read thermometer and feel firm when pressed lightly with a spoon.
  2. 2. Remove the lid and pull the skillet off the heat. Wait 60 seconds for the sauce temperature to drop slightly, then pour the heavy cream in a slow, steady stream around the edges of the skillet, stirring gently as you go. Adding cream to a boiling sauce is what causes it to break — the brief rest prevents that. If using kasuri methi, crumble it between your palms directly into the sauce now and stir once more.
  3. 3. Return the skillet to the lowest heat setting and warm for 2 minutes — the sauce should be a uniform coral-orange and should coat the back of a spoon. Taste and adjust salt. Scatter fresh cilantro over the top and serve directly from the skillet.

Cook's Notes

  • Don't skip browning the meatballs — that crust is what keeps them from falling apart in the sauce, and the fond left in the pan adds depth to the sauce base.
  • Kasuri methi (dried fenugreek leaves) is sold in most Indian grocery stores and many large supermarkets. It adds a subtly bitter, maple-like note that's characteristic of restaurant-style butter chicken — worth sourcing if you can.
  • If your skillet runs hot, pull it back to medium-low after adding the meatballs to the sauce — a hard simmer will toughen the ground chicken faster than a gentle one.
  • The sauce thickens significantly as it sits. If reheating the next day, add 3–4 tbsp of water or stock and stir over medium-low until it loosens back to its original consistency.
  • Panko absorbs moisture better than regular breadcrumbs and keeps the meatball texture lighter. Standard breadcrumbs work in a pinch but reduce the amount to 3 tbsp.
💡

Pro Tips

  • If the meatballs are sticking to the pan when you try to flip them, they're not ready — leave them another 30–45 seconds. A properly seared meatball releases from the pan on its own when the crust has formed.
  • Ground chicken can vary wildly in fat content by brand. Anything labeled '99% lean' will produce dry, crumbly meatballs — look for packages that list at least 7g fat per 4 oz serving, or mix in 1 tbsp of olive oil with the meat mixture if that's all you have.
  • The cream will break (turn grainy and oily) if the sauce is too hot when you add it — the rest period off heat is critical. If it does break, whisk 1 tbsp of cold butter into the sauce over the lowest heat setting; this usually brings it back together.
  • Grating the ginger on a Microplane rather than mincing it means it dissolves completely into the sauce with no fibrous bits — worth the extra 30 seconds.
  • For deeper sauce color and flavor, use San Marzano whole tomatoes crushed by hand instead of canned crushed tomatoes — they're less watery and more concentrated. Crush them directly into the pan.
  • If you're doubling this recipe, resist the urge to crowd all the meatballs into one pan for browning — work in smaller batches even if it takes longer. Crowding steams instead of sears, and you'll lose the crust that holds the meatballs together during the braise.

What to Serve With This

Basmati rice is the obvious partner, and for good reason — its long, dry grains soak up the tomato cream without turning to mush. Cook it the absorption method with a cardamom pod and a pinch of salt in the water, and you'll get a subtly fragrant base that echoes the spices in the meatballs without competing. Alternatively, warm naan from a store (Stonefire makes a solid version for everyday use) is excellent for dragging through the sauce.

For a vegetable side, a simple raita — plain whole-milk yogurt, grated cucumber, cumin, and salt — cuts through the richness of the cream sauce and resets the palate between bites. A quick sauté of blistered green beans with mustard seeds also works well, adding snap and bitterness as a counterpoint.

On the drinks side, an off-dry Riesling (Mosel-style, around 8–9% ABV) is the most useful wine here — its residual sugar tempers the chili heat, while the high acidity cuts through the cream. If you prefer beer, a malty amber ale like Alaskan Amber provides enough body to stand up to the spice without overwhelming it. For non-alcoholic: a cardamom and rosewater lassi, or simply sparkling water with a squeeze of lime to keep the palate clean.

Variations & Substitutions

For a dairy-free version, replace the heavy cream with full-fat canned coconut cream (the thick kind — scoop from the top of a chilled can of Chaokoh or Aroy-D). Use 1/4 cup in place of the 1/3 cup heavy cream, since coconut cream is richer. Swap the butter for 2 tbsp refined coconut oil when sautéing the aromatics. The sauce will take on a very slight coconut undertone, which actually works well with the garam masala profile.

To go vegetarian, swap the chicken meatballs for spiced paneer dumplings: combine 8 oz crumbled paneer, 1/4 cup breadcrumbs, 1 egg, 1 tsp garam masala, and 1/2 tsp salt. Form into 1.5-inch balls and pan-fry in 2 tbsp neutral oil until golden on two sides, about 3 minutes per side. They're more delicate than the chicken version — handle them gently when adding to the sauce and don't stir aggressively.

For a spicier version, double the cayenne to 1/2 tsp and add 1 tbsp finely minced fresh serrano (seeds and all) to the aromatics stage. This shifts the heat from background warmth to upfront. If you want deeper smokiness without extra heat, add 1/2 tsp smoked paprika alongside the garam masala.

This recipe doubles cleanly. Use a 5-quart sauté pan instead of a 12-inch skillet to accommodate the extra volume, and add 3–4 minutes to the simmering time to ensure the meatballs cook through.

Frequently Asked Questions

Can I make the meatballs ahead of time?

Yes — form and brown the meatballs up to 24 hours in advance, then refrigerate them on a plate covered with plastic wrap. When ready to serve, make the sauce fresh and add the pre-browned meatballs during the simmering stage. They'll reheat through in the sauce in about 10–12 minutes over medium-low heat.

How do I store and reheat leftovers?

Store leftovers in an airtight container in the refrigerator for up to 4 days. Reheat gently on the stovetop over medium-low heat, adding 2–3 tbsp of water or stock to loosen the sauce, which will thicken considerably as it cools. Avoid reheating at a boil — it can cause the cream to separate and turn grainy.

Can I freeze this?

The meatballs freeze well, but cream-based sauces can split upon thawing. If you want to freeze, do so before adding the cream — freeze the meatballs in the tomato base. Thaw overnight in the refrigerator, reheat the base, then stir in the heavy cream fresh before serving.

What can I use instead of ground chicken?

Ground turkey (93% lean) is the closest swap — use it 1:1 and expect a nearly identical texture. Ground pork works too, though it adds more fat and shifts the flavor slightly. Avoid 99% fat-free ground chicken or turkey; without enough fat, the meatballs will be dry and crumbly.

My sauce looks orange and thin — what went wrong?

The most common cause is not cooking the tomato paste long enough. It needs a full 2–3 minutes of direct skillet contact to caramelize and deepen from bright red to brick-red — this step builds the sauce's backbone. If it's thin, simmer uncovered for an extra 5 minutes before adding the cream.

Can I use Greek yogurt instead of heavy cream?

You can, but add it carefully — Greek yogurt will curdle if the sauce is at a rolling boil. Pull the skillet off the heat entirely, let it cool for 60 seconds, then stir in 1/4 cup of full-fat Greek yogurt slowly. Return to the lowest heat setting and don't let it boil again. The sauce will be tangier and less rich than the cream version.

Do I need a food processor to make the meatballs?

No. Mix the meatball ingredients by hand in a bowl — use a fork to combine everything first, then switch to your hands for the final mix. The key is not to overwork the meat; mix just until the ingredients are incorporated and stop. Overworking ground chicken makes the meatballs dense and rubbery.

How do I know when the meatballs are cooked through?

The most reliable check is an instant-read thermometer — ground chicken needs to hit 165°F internally. Visually, the meatballs should feel firm (not squishy) when pressed with a spoon, and any juices should run clear. After 12–14 minutes of simmering in the sauce, 1.5-inch meatballs will reliably be done.

Can I use a slow cooker for this recipe?

Partially. Brown the meatballs in a skillet first for texture, then build the tomato sauce base in the same pan. Transfer everything to a slow cooker and cook on LOW for 3–4 hours. Stir in the cream during the last 30 minutes with the lid cracked slightly to prevent curdling from trapped steam.

Enjoyed this recipe?

Daily Home Cookery is self-funded. If something you cooked here made dinner a little better, a coffee keeps the kitchen running.

☕ Buy me a coffee