These easy vegan meatballs are hearty, flavorful, and packed with protein. Made with pantry-friendly TVP (textured vegetable protein), they bake up tender and meaty with lightly crisp edges. Perfect for spaghetti, meatball subs, bowls, or appetizers, and they freeze beautifully for meal prep.

I know "textured vegetable protein" doesn't exactly sound appetizing. But hear me out: this inexpensive pantry ingredient makes the BEST vegan meatballs. Unlike a lot of vegan meatball recipes made with beans or lentils (which can sometimes turn out mushy) or pricy store-bought vegan ground (which isn't always very healthy), TVP creates a chewy, hearty, meaty texture that gets crispy on the outside while staying tender in the middle. Plus, it's shelf-stable, high in protein, and made from just one ingredient: soy flour. I always keep a bag in my pantry for recipes like this and my reader-favorite Vegan Breakfast Sausage Patties. If you are new to TVP, don't be afraid to try it! It is so convenient and delicious.

Why These Vegan Meatballs Are the Best EVER
- Amazing meaty texture: TVP gives these meatballs a hearty, chewy texture without needing expensive store-bought vegan meat.
- Budget-friendly: These homemade vegan meatballs are cheaper than packaged vegan meatballs or plant-based ground.
- Protein-packed: TVP is naturally high in protein, making these meatballs hearty and satisfying.
- Made with pantry staples: No special vegan meats required. Just simple ingredients you can keep on hand.
- Perfect for meal prep: They freeze beautifully and reheat like a dream too.

Ingredients for Vegan Meatballs
- Olive oil: Or use broth or water for an oil-free version.
- Yellow onion and garlic: Chop the onion finely and mince or press the garlic so it blends seamlessly into the meatball mixture.
- TVP granules: You can find these in the health food section of your grocery store, in health food stores, or you can buy them online.
- Broth: Vegan beefless broth gives the richest flavor, but mushroom or vegetable broth also works well.
- Soy sauce: Use tamari for a gluten-free version.
- Nutritional yeast: For savory depth and a little cheesy flavor.
- Seasonings: Dried basil, whole fennel seeds, and black pepper.
- All-purpose flour: Helps bind everything together. Use an all-purpose gluten-free flour blend if needed.
How to Make Vegan Meatballs

- Sauté the Aromatics: Heat olive oil in a large skillet over medium heat. Add the onion and garlic and cook until softened and lightly golden.

- Hydrate the TVP: Stir in the TVP, broth, and soy sauce. Bring to a simmer, then cover and cook until the liquid is absorbed and the TVP softens.

- Season and Bind: Remove from heat and stir in the nutritional yeast, basil, fennel seeds, and black pepper. Add the flour and mix until a dough forms that holds together when pressed. If the mixture feels too wet, add another tablespoon of flour. If it feels dry, add a splash of broth or water.

- Shape the Meatballs: Let the mixture cool slightly, then roll into meatballs about 2 tablespoons each. A cookie scoop works well for evenly sized meatballs.

- Bake: Place the meatballs on a parchment-lined baking sheet and lightly brush or spray with oil. Bake at 400°F for 30 to 35 minutes, turning them a few times during baking, until browned and firm on the outside.

- Use: Add tp marinara sauce and serve over pasta, use them in a vegan meatball subs, enjoy them as an appetizer, or munch on them straight from the pan.
Tips and Variations
- Don't skip the resting time: Letting the mixture cool slightly before rolling makes it much easier to shape and helps the meatballs hold together better.
- The mixture should feel like cookie dough: If it's too wet, add another tablespoon of flour. If it's too dry or crumbly, add a splash of broth or water.
- Wet your hands: The mixture can be a little sticky while shaping, so lightly damp hands make rolling much easier.
- Bake before simmering in sauce: For the best texture, bake the meatballs first so they hold together nicely, then simmer them in marinara.
- Air fryer option: Air fry at 370°F for 18 to 24 minutes, shaking a few times during cooking, until browned and firm.

Ways to Serve Vegan Meatballs
These vegan meatballs are so versatile! Here are a few of my favorite ways to serve them:
- With spaghetti and marinara
- Stuffed into meatball subs with melty Vegan Mozzarella
- Served as an appetizer with dipping sauce (try my Vegan Grape Jelly Meatballs)
- Tossed into pasta bake
- Added to grain bowls
- Paired with Garlic Mashed Potatoes and Vegan Mushroom Gravy
Storage and Freezing
- Fridge: Store leftover vegan meatballs in an airtight container in the fridge for up to 4 days.
- Freezer: Let the meatballs cool completely, then freeze them in a single layer before transferring to a freezer-safe bag or container. Freeze for up to 3 months.
- Reheating: Bake from frozen at 375°F for 15 to 20 minutes until heated through, or simmer directly in sauce during the last few minutes of cooking.

If you try this vegan meatballs recipe, let us know by leaving a comment and rating it. I'd love to see what you made. Share your creation in the It Doesn't Taste Like Chicken Community (this is where we're all hanging out now!) or tag @itdoesnttastelikechicken on Instagram.
Bon appetegan!
Sam Turnbull.

(click stars to vote)
Vegan Meatballs (Easy, Protein-Packed & Perfectly Meaty)
Servings: (about 12 meatballs)
PRINT
PIN
Video
COMMENT
Ingredients
- 1 tablespoon olive oil, (plus more for brushing or spraying)
- 1 yellow onion, chopped
- 4 cloves garlic, minced or pressed
- 1 cup dry TVP granules, (also called textured vegetable protein)
- 1 cup vegan beefless broth, mushroom broth, or vegetable broth
- 2 tablespoons soy sauce
- 2 tablespoons nutritional yeast
- 1 tablespoon dried basil
- 1 teaspoon whole fennel seeds
- ½ teaspoon black pepper
- ½ cup all-purpose flour
Instructions
- Prep the oven: Preheat your oven to 400°F (200°C). Line a large baking sheet with parchment paper or lightly grease it.
- Sauté the aromatics: Heat the olive oil in a large skillet over medium heat. Add the onion and garlic and cook for about 4-5 minutes until softened and just beginning to brown.
- Hydrate the TVP: Stir in the TVP, broth, and soy sauce. Bring to a gentle simmer, then reduce heat to low, cover, and cook for 5-10 minutes, stirring often, until the TVP is softened and all of the liquid is absorbed.
- Season and bind: Remove from heat. Stir in the nutritional yeast, basil, fennel seeds, and black pepper. Add the flour and mix very well until a dough forms that holds together when pressed. If the mixture feels too wet, add a little more flour 1 tablespoon at a time. If too dry, add a broth or water 1 tablespoon at a time.
- Shape the meatballs: Let the mixture cool slightly, then scoop about 2 tablespoons (30 g) and gently roll into meatballs. A cookie scoop works great for even sizing. If the mixture sticks, lightly wet your hands before rolling. Place on the prepared baking sheet and repeat with the remaining mixture to make about 12 meatballs.
- Bake: Lightly brush or spray the tops with oil. Bake for 30-35 minutes, turning the meatballs 2-3 times during baking, until browned, firm on the outside, and cooked through.
- Serve: Serve hot with pasta and marinara, in meatball subs, in bowls, or as an appetizer with your favorite dipping sauce.












Nan says
For a last minute dinner, I made patties and cooked them in my skillet with a pinch of coconut oil. Quick and delicious! Thanks Sam, for your amazing recipes. I've used TVP for many years as a long time vegetarian, but this one was a new one for me. Excellent!! Can't wait to try to sausage recipe.
Sam Turnbull @ It Doesn't Taste Like Chicken says
So happy you enjoyed them, Nan! 😊 I love that idea for a quick dinner, and I hope you enjoy the sausage recipe too!
Sarah says
Delicious! Mine were a bit chewy-not sure if I did something wrong, but I liked them. I didn't use onion or garlic but used oregano and basil. I whipped up a quick marinara sauce and had some whole grain spaghetti.
Sam Turnbull @ It Doesn't Taste Like Chicken says
So happy you enjoyed them, Sarah! 😊 Omitting the onion and garlic likely made the meatballs a bit chewier, since they add moisture and help soften the texture. Glad you still enjoyed them! 💛
Stacie Smith says
Hi, is there a low sodium TVP? Also is there an alternative flour that works in this recipe?
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Stacie! Most plain TVP is naturally fairly low in sodium as it usually only has one ingredient, soy. You can also substitute all-purpose flour with a 1:1 gluten-free flour blend if needed. The texture may be slightly softer depending on the blend used. 😊
Carol Sandt says
How about a TVP-based recipe for Swedish meatballs? In the meantime, I plan to try your lentil-based Swedish meatballs.
Sam Turnbull @ It Doesn't Taste Like Chicken says
Ooo, that's a fun idea, Carol! 😊 You could definitly use these TVP meatballs in the swedish meatball sauce!
Nina Randall says
Which meatball recipe is better?
The Vegan Italian Seitan or This one?
This Italian Nona is still looking for the best vegan meat ball recipe.
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Nina! I think both are delicious, this meatball recipe is slightly more tender with lightly crisp edges. The seitan meatballs are a bit chewier and more meat-like. Hope this helps 😊
Emaven says
These look amazing, but for soy allergy, is there a textured vegetable protein made without soy?
Pat says
there is a texturized pea protein. not sure it will work in this recipe. I have used it in some other ones and it worked fine.
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Emaven! Textured pea protein does exist and may work, although I haven't tested it in this recipe myself.
Mika says
I’ve used fava bean tofu, brand Big Mountain, to make meatballs.
Emma says
Hi Sam,
I can’t find TVP where I live, so I’m wondering if I can use soy chunks instead, blended in a food processor after cooking them? Thank you!
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Emma! I haven't tested soy chunks, but I believe they are basically the same thing just bigger. So yes, pulse the chunks into little pieces, and then follow the recipe. Let me know how it turns out 😊
Mika says
I get tvp on amazon.
petwisp says
I made these meatballs with homemade oyster mushroom broth. This recipe makes wonderful meatballs and I had no trouble with them falling apart. I followed the recipe but accidentally added 2 tablespoons basil and will make them again. The recipe is easy to follow and make.
Sam Turnbull @ It Doesn't Taste Like Chicken says
So glad you enjoyed them, petwisp! That sounds delicious 🙂
Stella says
Question: can this recipe be made into a meatloaf? Or large meatballs that can be sliced for a sandwich?
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Stella! Yes, you could shape the mixture into a small meatloaf or larger meatballs. Just keep an eye on the baking time as a larger shape may need a bit longer to cook through 😊 You could also try my lentil meatloaf recipe. Enjoy!
Stella L Carlstrom says
Thank you!
Dru says
Hey there! I followed the instructions exactly. The meatballs are amazing on the exterior, but mushy inside. I tried to avoid overmixing them. Popping them back in the oven low and slow to see if dehydrating them is going to help. Advice?
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Dru! If they’re mushy inside it usually means they need a bit longer to bake or the mixture had a little extra moisture. Putting them back in the oven should help firm them up. Next time you could also try baking them a few minutes longer before serving, or making the meatballs a bit smaller so they cook through better. Hope that helps! 😊
joe grech says
I just read your response that flour is used to hold patties drom falling apart. Why cannot same be used for the Italian sausages???
I cannot obtain the vwp.
Thanks.
Joe
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Joe! Vital wheat gluten is what gives seitan-style recipes their chewy, meaty texture, so it can’t be replaced with regular flour. For the meatballs, the flour works as a binder, but it won’t create that same texture as VWG.
Christine says
I made these for supper tonight, and boy were they good. I made 28 smaller tvp balls, and used oregano instead of basil. They turned out great, they were crispy and brown on the outside and soft and delicious inside. I ate some of them with my spaghetti and a couple I just dipped into the tomato sauce and they were excellent. I will definitely make these again and probably double or triple to freeze some. Great recipe, thank you for sharing 🙂
Sam Turnbull @ It Doesn't Taste Like Chicken says
Wonderful! So thrilled you enjoyed them so much Christine, thank you for the review 🙂
nadya says
These are excellent. The fennel and basil combination makes them smell divine while baking and they are delicious.
Sam Turnbull @ It Doesn't Taste Like Chicken says
Yay! So happy you enjoyed them nadya 🙂
Melissa Hawthorne says
I think I did something wrong...mine came out VERY dense & it barely made 10 small meatballs. This is my first attempt at using TVP, so I am guessing I did something wrong, but I triple checked the measurements, so I can't figure out what went wrong. Any suggestions would be greatly appreciated.
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Melissa, it sounds like the TVP may not have fully absorbed the broth or the mixture may have been packed too tightly — make sure it’s soft and hydrated before adding flour, and gently scoop/roll (don’t compress too much) 😊
Tashana says
The flavor is great! However the exterior was a bit hard and crunchy. Did I coat them in too much oil? Otherwise 10 out of 10.
Jess @ It Doesn't Taste Like Chicken says
We're glad you liked them! Too much oil or perhaps a little too long in the oven, it's tough to say exactly without being in the kitchen with you. 🙂
Robert says
I have made this excellent recipe several times. Best mouth-fill meatballs ever! I have made two tweaks that I will share. First, I add 1 tablespoon of Marmite just as the onion becomes translucent. This creates a meatier taste. Second, I add a couple of teaspoons of beat powder to the vegan broth for color.
I have also tried steaming these for a moister ball. I steam for 25 minutes. This works well, too. With this approach add two tablespoons of oil to when at the sauté stage because there will be no brush-on oil.
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Robert, yay that makes me so happy! My husband would approve of the marmite addition, haha. Love your tweaks, I will have to try them, so happy you enjoy the recipe! 🙂
Lorna Cassano says
Can these be simmered in sauce, or will they fall apart?
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Lorna, I recommend baking them then adding them to your sauce in the last 5 to 10 minutes so that they still hold their shape and don't get soggy. I hope that helps!
Rhea says
Great recipe! I had leftover veg curry that I wanted to stretch for another meal, so made the meatballs to mix in. I just omitted the nutritional yeast and substituted Garam Masala for the Basil. The family loved it! Will definitely make them again. Thanks so much for sharing the recipe.
Sam Turnbull @ It Doesn't Taste Like Chicken says
Oooh sounds so yum! I am so happy you and your family enjoyed it Rhea 🙂
Jen says
This turned out so yummy! Thank you for all your recipes .. they are always excellent EVERY TIME !
Sam Turnbull @ It Doesn't Taste Like Chicken says
Aww that makes me so happy! Thank you so much, Jen! Thrilled you enjoy it so much!
Melissa says
Made these to stick in the freezer for post-partum. They turned out really good! Going to go ahead and make another batch to also freeze. I did add a dash of worcestershire, parsley, and a flax egg, and used bread crumbs instead of flour. They turned out a bit salty so I will adjust the soy sauce next time, but could also be because I added worcestershire. Overall really yummy and great way to use up TVP!
Sam Turnbull @ It Doesn't Taste Like Chicken says
So happy you enjoyed them Melissa!
Karen McGregor-Lucchesi says
My husband and I Loved loved LOVED this recipe, Sam!!! So easy and delicious!! I was thinking about making a double batch and freezing some. I have never frozen TVP Do you think it would work? Maybe pre baked?
Sam Turnbull @ It Doesn't Taste Like Chicken says
Hi Karen, I'm so happy to hear you and your husband loved the recipe! 😊 Yes, you can absolutely freeze the TVP meatballs. I recommend baking them first, letting them cool completely, and then freezing them in a single layer on a baking sheet before transferring them to an airtight container or freezer bag. That way, they won’t stick together, and you can take out just as many as you need! When you're ready to enjoy them, reheat straight from frozen by baking at 375°F (190°C) for about 15-20 minutes or until heated through. Hope that helps, and happy cooking! 💛