Sweet and sour meatballs, or tang cu wan zi (糖醋丸子), are the dish I make when I want a takeout-style dinner without standing over a wok of hot oil. The appeal is the contrast: a tender pork ball, slightly caramelized at the edges, dragged through a glossy sauce that tastes of black vinegar, tomato, and caramelized sugar in roughly equal measure. What trips people up at home is not the recipe. It is the sauce. Sweet-and-sour is the easiest sauce in Chinese cooking to get wrong, because the line between bright and cloying is a single tablespoon of sugar.
Bake the meatballs at 180°C (350°F) for about 12 minutes to an internal temperature of 71°C (160°F), then coat them in a cornstarch-thickened sauce only after you pull the pan off the heat. The make-or-break detail is pulling the sauce the instant it coats a spatula; ten seconds longer and it turns gummy.
What this dish actually is
Tang cu is a northern flavor profile, not a Cantonese one, even though it reads as "takeout" to most American cooks. The technique of using caramelized sugar cut with mature rice vinegar appears across Shanxi and Shandong cooking, where vinegar is treated as a seasoning on par with soy sauce. The version most home cooks recognize, with tomato ketchup in the sauce, is a mid-twentieth-century adaptation. Ketchup adds both acid and a rounded sweetness that plain sugar and vinegar struggle to match, and it gives the sauce its red-brown shine. If you have made sweet and sour ribs or sweet and sour fish, the sauce here follows the same logic, just built for the shorter cooking time a meatball needs.
Where this dish differs from its cousins is in the meatball itself. Lion's head meatballs are braised and stay pillowy soft; pearl meatballs are steamed under a coat of sticky rice. Tang cu wan zi are meant to be baked or fried firm enough to hold up to a sauce that would otherwise turn them to mush. That firmness is the whole reason the dish works.
The ingredients, and what each one is doing
Ingredients at a glance

Two things drive the texture of the meatball, and they work against each other. Egg and cornstarch bind the meat so it does not crumble in the oven, but the more binder you add, the denser the ball. Panko breadcrumbs are the trick to keeping the center light: they hold water from the egg and steam open during baking, so the meatball stays juicy without turning into a hockey puck. This is the same logic behind why a meatball soup floats its balls gently in broth rather than searing them.
| Ingredient | Amount | Notes / substitute |
|---|---|---|
| Ground pork | 450 g (1 lb) | Pick a grind with visible fat, around 80/20. Beef, chicken, or turkey work; lean turkey will be dry unless you add a tablespoon of oil to the mix. |
| Egg | 1 large | Binds and tenderizes. The yolk's fat keeps the meat moist. |
| Panko breadcrumbs | 2 tablespoons | Regular dried breadcrumbs absorb more liquid and make the ball denser; use less if substituting. |
| Cornstarch | 1 tablespoon | Tenderizes the protein and helps the surface brown. Potato starch is a near-equivalent swap. |
| Light soy sauce | 1 tablespoon | Seasons the meat. Use light, not dark, to keep the inside pale. See light vs dark soy sauce for the difference. |
| Toasted sesame oil | 1 teaspoon | Aroma only. Adding more does not make it better; it overwhelms the sauce. |
| Salt | ½ teaspoon | Kosher or fine. This is the base seasoning, the soy sauce is supplementary. |
| Ground white pepper | ¼ teaspoon | Warmer and less sharp than black pepper. Black pepper works but changes the flavor. |
| Garlic powder | ¼ teaspoon (optional) | Skip if you are sensitive to it; the sauce carries the savory load. |
| Ingredient | Amount | Notes / substitute |
|---|---|---|
| Tomato ketchup | 3 tablespoons | Not optional here. It supplies acid, sugar, and the red color all at once. |
| Black rice vinegar | 2 tablespoons | Chinkiang style. Deeper, maltier than white rice vinegar. See the black rice vinegar guide for why it matters. |
| Sugar | 2 tablespoons | White is fine. Rock sugar gives a cleaner sweetness if you have it. |
| Light soy sauce | 1 tablespoon | Salty backbone for the sauce. |
| Cornstarch | 2 teaspoons | Thickens the sauce so it clings. Double this if you like a heavy glaze. |
| Ground white pepper | ¼ teaspoon | Ties the sauce back to the meat seasoning. |
| Water | 2 tablespoons | Just enough to thin the slurry so it pours. |
| Toasted sesame seeds | To garnish | Optional but worth it for the contrast against the glossy sauce. |
Mixing and shaping the meatballs
- Combine the meat mixture by hand. Put the pork and everything else in a wide bowl and mix with your fingers, turning the mass rather than mashing it. Stop the moment the seasonings are evenly distributed. The myosin in the meat starts to bind the more you work it, and overworked pork turns dense and bouncy in a bad way.
- Portion by heaping tablespoon. Aim for 20 to 22 balls, roughly 20 to 22 g each. Equal size matters more than the exact count; uneven balls finish cooking at different times, and a few overcooked ones will taste dry.
- Roll with wet or oiled hands. A light film of water or cooking oil on your palms stops the meat from sticking and gives a smooth surface. Roll gently between your palms, no squeezing. Squeezed balls compress and bake up tough.

Oil or wet your hands lightly, then roll each portion just until smooth without squeezing. Keep every ball the same size so the whole batch browns and cooks through at the same rate.
Why I bake instead of deep-fry
The traditional method is shallow- or deep-fried, which gives a crisper shell. I bake because the oven handles a whole tray at once, uses a fraction of the oil, and the meatballs still brown on the side that faces the pan. For a weeknight dish, that trade is easy to make. If you want the fried texture for a crowd, you can shallow-fry in batches; just be honest that it doubles the hands-on time.
- Heat the oven to 180°C (350°F). Drop to 160°C (320°F) if yours is fan-assisted, or the bottoms will scorch before the centers are done.
- Arrange with space between each ball on a lined or non-stick baking dish. Crowding steams them instead of browning.
- Bake about 12 minutes, then check temperature. A probe through the center of the largest ball should read at least 71°C (160°F). Below that the pork is unsafe and the texture is pasty; above 77°C (170°F) it starts to dry out fast. My own early failures were all from overcooking, not undercooking.
Cooking the sauce without breaking it
Stir all the sauce ingredients in a bowl until the cornstarch dissolves completely. Any lumps now will be lumps forever, since cornstarch gels the instant it hits heat. Pour the slurry into a cold skillet, then turn the heat to low. Stirring constantly, watch for the moment the liquid turns from cloudy and thin to glossy and coating the back of your spatula. That transition happens in seconds. The instant it does, kill the heat and slide the meatballs in. Residual heat keeps the sauce loose enough to toss, and the cornstarch continues to set as it cools. If you cook it one beat too long, the sauce seizes into a sticky paste and you have to thin it with a splash of hot water.
- Toss the baked meatballs into the sauce off the heat. Fold gently so you do not break the balls apart.

Take the skillet off the heat before adding the baked meatballs, then fold gently until the glossy sauce coats every ball and leaves only a thin film on the pan; add sesame after coating.
- Coat evenly and transfer to a serving plate. Scatter with sesame seeds. Serve right away, because the sauce sets as it sits and loses its shine.
When things go wrong
Meatballs fall apart in the oven. Either the pork was too lean, the egg was small or missing, or you did not let the cornstarch hydrate before baking. Use fattier pork and measure the cornstarch; it is doing real structural work.
Meatballs are dense and rubbery. You overmixed. Treat the pork like a biscuit dough: combine, stop. Wet hands while rolling also help, because they keep you from compressing the meat.
Sauce tastes flat or one-note sour. The vinegar-to-sugar ratio is personal. If your black vinegar is particularly aggressive, add sugar a half-teaspoon at a time until the sourness stops biting. A pinch of salt also wakes up sweet-and-sour sauces that read as candy.
Sauce is runny and refuses to cling. You undercooked the cornstarch. Bring it back to a bare simmer for ten seconds more. If it is already off the heat and too thin, do not just stir longer; it needs that heat to activate.
Sauce turned into a lump or a skin. Overcooked cornstarch. Whisk in a tablespoon of hot water off the heat and strain out any skin. The flavor is fine; only the texture suffered.
Variations and what to serve alongside
The base recipe takes flavor twists easily. Stir a teaspoon of grated ginger and a minced scallion into the meat for a brighter ball. A half-teaspoon of five spice powder pushes the meat toward a more aromatic, northern character. For heat, a spoonful of chili oil stirred into the finished sauce is the cleanest addition.
On the table, serve these over plain steamed rice with one vegetable to cut the richness. Garlic broccoli is the obvious pairing because its bitterness balances the sugar; a quick napa cabbage stir-fry with a hot-and-sour dressing does the same job. For a bigger spread, treat the meatballs as the centerpiece of a takeout night alongside lo mein or vegetable spring rolls. They also belong on a holiday table, and they fit right into a Chinese takeout lineup that feeds a crowd without much last-minute work.
Make-ahead, storage, and reheating
This is a good party dish because each part travels separately. Bake the meatballs up to a day ahead and keep them covered in the fridge. Mix the sauce and hold it at room temperature. Twenty minutes before serving, reheat the meatballs in a 160°C (320°F) oven for about six minutes, or sear them briefly in a little oil in a skillet, then build the sauce fresh and toss. Reheating already-sauced meatballs is a mistake; the cornstarch breaks down and the coating turns watery. Leftover sauced meatballs keep for two days in the fridge and reheat gently in a covered pan with a splash of water, but expect a softer texture than fresh. I do not recommend freezing the sauced dish; the meatballs freeze fine on their own for up to a month.
Frequently asked questions
Can I use chicken or turkey instead of pork? Yes, but lean poultry dries out. Choose thigh mince over breast, and add a tablespoon of neutral oil to the mix to replace the missing fat.
Do I have to use black rice vinegar? No, but the sauce loses depth without it. White rice vinegar is sharper and cleaner; add a quarter-teaspoon of soy sauce to compensate for the missing umami.
Can I cook these in an air fryer? Yes. 185°C (375°F) for 9 to 11 minutes, shaking once. Check the internal temperature the same way; air fryers run hot on the outside and can overcook the center.
Why is my sauce not glossy? Gloss comes from the ketchup and fully gelatinized cornstarch. If the sauce looks dull, you either skipped the ketchup or pulled the pan off the heat before the starch finished thickening.
How do I make it less sweet? Cut the sugar to one tablespoon and raise the vinegar by a teaspoon. Taste the raw slurry before cooking and adjust; the ratio barely shifts with heat.
At the end, this dish rewards two small disciplines: stop mixing the meat the second it comes together, and pull the sauce off the heat the second it coats a spoon. Get those two moments right and the rest is forgiving. My own version has changed more times than I can count, usually in the sugar-to-vinegar ratio, and that is the part worth tweaking to your own palate before anything else.



