This post may contain affiliate links. Please read our disclosure policy.
Simmered in a buttery and savory gravy, these vegan Swedish meatballs are tender, meaty, and so delicious served over mashed potatoes! Instead of using store-bought vegan ground meat, this recipe has you making both the meatballs and gravy from scratch!

I’ve made many dishes featuring meatballs before, from spaghetti and meatballs to tempeh meatballs and sweet and sour tofu meatballs, but there is one dish I wanted to tackle for a long time. And after a few rounds of testing, I’m coming up with another plant-based version of a classic dish that everyone who has ever set foot in Ikea is familiar with: Swedish meatballs!
My version consists of homemade meatballs infused with warm spices like nutmeg and white pepper, simmered in a buttery gravy made with a roux, vegetable stock, and cashew cream. It’s comfort food at its best!
⭐️ What Makes It So Good
- All made from scratch. Tired of using processed vegan ground meat? I’ve got you covered here as both the meatballs and the sauce are made entirely from scratch! Perfectly meaty and tender!
- Savory and oh so creamy. The gravy of Swedish meatballs can be a bit bland. Not here! I’ve seasoned it with plenty of vegan Worcestershire sauce, Dijon mustard, and soy sauce to add depth and savoriness.
- Hearty and warming. Just like my vegan moussaka and parsnip and carrot bake, this dish has that stick-to-your-ribs feeling and will warm you up from the inside on chilly days.
🌿 What You’ll Need
You can find the exact measurements in the recipe card at the end of this post.
For the Meatballs

- TVP chunks – Combined with vital wheat gluten, texture vegetable protein chunks create a meaty bite. Since not all TVP brands have the same size, I recommend measuring it with a scale rather than using cup measurements. You should use about 1 ounce (28 g).
- Vital wheat gluten – Vital wheat gluten is a must here. It holds the mixture together, prevents the meatballs from falling apart, and adds a subtle chewiness.
- White beans – You will also find cooked white beans in the meatballs. The addition of beans creates structure and keeps the texture tender. Here’s a quick tip: Don’t bother cooking the beans from scratch, use cooked beans from a small can to save time.
- Spices – To season the meatballs, I went with a combination of white pepper, nutmeg, and allspice. Those are the most common spices used to make Swedish meatballs. No allspice? You can replace it with a pinch of each: ground cinnamon, ground cloves, and ground nutmeg.
- Onion powder
- Soy sauce – For saltiness and umami.
- Sugar – To balance the saltiness.
- Oil – Any neutral oil works.
- Garlic
- Parsley – Use either fresh or frozen chopped parsley. Got leftover fresh parsley? Chop it, transfer it to a freezer bag, and freeze it. It keeps very well, and it’s super handy!
For the Gravy

- Butter – For creaminess and a rich buttery flavor. Use your favorite store-bought brand or check out my cultured vegan butter recipe.
- Flour – Use all-purpose flour.
- Vegetable broth – I went with vegetable broth, but feel free to use Better Than Bouillon’s no-beef broth paste.
- Plant-based cream – For a velvety smooth consistency. Use store-bought plant-based cream or make your own cashew cream by blending 1/3 cup soaked cashews with 1/3 cup water. I personally used the second option.
- Worcestershire sauce – Be careful, regular Worcestershire sauce contains anchovies, so you must absolutely use a vegan alternative. I suggest buying vegan Worcestershire sauce online or checking at your local supermarkets to see if they have any. Substitute: You can replace it with about 1 teaspoon of lemon juice or apple cider vinegar. It won’t taste exactly the same, but it will brighten the gravy and add a hint of tanginess.
- Mustard – Dijon mustard adds a hint of spiciness.
- Soy sauce – Because you don’t want a bland sauce! Soy sauce brings extra saltiness and depth.
- White pepper
Dark soy sauce: This one’s completely optional. I like to add 3/4 teaspoon of dark soy sauce to darken the color of the gravy. If you’re using vegan beef broth, you might not need it, but if you’re using regular vegetable broth, your sauce will have a pale color. It doesn’t affect the flavor though, it’s just there to make the sauce more appetizing.
🥣 Instructions (With Photos)
1. Make the Meatballs
- Rehydrate the TVP. Cover the TVP chunks with hot water and let them rehydrate for about 20 minutes, or until soft.
- Drain them well. Rinse the chunks under cold water 2-3 times, then drain. Pat them dry using kitchen paper towels.
- Process the beans into a paste. Add the cooked white beans and aromatics to a food processor and process for 10-15 seconds, until a paste forms.
- Add the TVP. Add the rehydrated TVP chunks and process for another 4-5 seconds, or until it resembles ground meat.
- Combine with the gluten. Add the vital wheat gluten and mix until it forms a thick paste.
- Shape into balls. Shape the balls to about 1.5 tablespoons each and transfer them to a steamer.
- Steam. Steam the meatballs for 25-30 minutes. Let them cool for at least 30 minutes.
- Pan-fry the meatballs. Heat some oil in a non-stick skillet and pan-fry the meatballs for 6-8 minutes, or until evenly golden brown. Transfer them to a plate and wipe the skillet clean with a kitchen paper towel.
2. Prepare the Sauce
- Make a roux. Melt the butter over medium heat. Once melted, add the flour and stir until well combined, with no lumps remaining.
- Add the remaining ingredients. Pour in the vegetable broth, plant-based cream, and seasonings. Whisk until everything is combined.
- Cook until thickened. Heat over medium heat for 5-7 minutes, stirring regularly, until the sauce thickens.
- Add the meatballs. Finally, add the vegan meatballs to the sauce and toss to coat. Cook them in the sauce for 2-3 minutes.
- Serve! Garnish with chopped parsley, and serve!

📔 Thomas’ Tips
Pat the TVP dry. After rinsing and draining the TVP chunks, squeeze them by hand to remove all excess water. Then transfer them to a sheet of kitchen paper towels and press with another sheet to absorb any remaining moisture.
Make a brown roux. Looking to add a bit more flavor to the sauce? You can brown the butter and flour mixture until it turns golden brown. Thanks to the Maillard reaction, the butter will brown and develop a nutty aroma.
Adjust the consistency of the sauce. If you’re using homemade cashew cream, 3 tablespoons of flour should be enough to make the roux, as the cream will naturally thicken the sauce. On the other hand, if using store-bought cream, use 1/4 cup of flour.
Taste and adjust the saltiness of the sauce. All vegetable broths vary in saltiness. That’s why I recommend adding only half the soy sauce at first, then adding the rest after tasting.
Do not simmer the meatballs for too long. To prevent the meatballs from falling apart, it’s best not to simmer them in the sauce for too long. 2-3 minutes is usually enough.
🍄🟫 Variations
- Add extra vegetables: Before making the roux, sauté diced mushrooms, carrots, red bell peppers, or your favorite vegetables!
- Incorporate some greens: Add a handful of baby spinach, kale, or chopped pak choy while the sauce is simmering for freshness and a pop of color.
🍚 Serving Suggestions
We love serving these meatballs over mashed potatoes, but you could also serve them with spaghetti, mashed celery and cauliflower, rice, or (though not very traditional) ramen noodles!
❄️ Storing and Reheating
- To store: You can store the meatballs in the gravy for up to 3 days in the refrigerator.
- To freeze: If you plan on freezing this dish, it’s best to freeze the meatballs and the gravy separately. Thaw overnight in the refrigerator. Then you can pan-fry the meatballs, reheat the gravy, and combine them.
- To reheat: Reheat over medium heat in a skillet for 8-10 minutes or until the meatballs are warm. Note: Since the gravy will have thickened, add a splash of water and a pinch of salt.

💬 FAQs
Unfortunately, it would be difficult to make this recipe gluten-free since both the meatballs and the gravy contain gluten. An option would be to use store-bought vegan ground meat to make the meatballs and replace the flour in the gravy with a gluten-free flour blend.
Either you didn’t remove enough moisture from the TVP after soaking, or you have steamed the meatballs for too long. Just keep in mind that these meatballs will never be as firm as store-bought ones.
If your meatballs are too chewy, it often means that you have added too much gluten. This can happen if you use the measuring cup as a scoop rather than the spoon-and-level method.
Yes, for extra flavor, I suggest pan-frying the meatballs until slightly charred before adding them to the gravy
You can make the meatballs up to 3 days ahead and refrigerate them. For the gravy, it’s best to make it right before serving.


Save this recipe!
Enter your email below and I’ll send it to your inbox!
Plus, you will receive new recipes every week!
Vegan Swedish Meatballs
Ingredients
Meatballs
- 1/2 cup (28 g) TVP chunks
- 1/4 cup (52 g) cooked white navy beans
- 1 tbsp (15 ml) oil
- 1 tbsp (15 ml) soy sauce
- 1 tbsp (15 ml) water
- 1 tbsp (7 g) nutritional yeast
- 2 tsp (8 g) granulated sugar
- 1 tsp onion powder
- 2 cloves of garlic roughly chopped
- 3 tbsp chopped parsley
- 1/2 tsp dried thyme
- 1/4 tsp ground nutmeg
- 1/4 tsp ground white pepper
- 1/8 tsp ground allspice
- 5 tbsp (42 g) vital wheat gluten
Gravy
- 1/4 cup (57 g) vegan butter
- 3 tbsp (22 g) all-purpose flour
- 2 cups (480 ml) vegetable broth
- 2/3 cup (160 ml) plant-based cream (see below for a homemade cashew cream version)
- 1 tbsp (15 ml) vegan Worcestershire sauce
- 1 and 1/2 tsp (7 ml) soy sauce
- 1 tsp (5 ml) Dijon mustard
- 1/4 tsp ground white pepper
- 3/4 tsp dark soy sauce (optional, for color)
Homemade Cashew Cream
- 1/3 cup (50 g) raw cashews (soaked overnight)
- 1/3 cup (80 ml) water
Instructions
Meatballs
- Rehydrate the TVP. Add the TVP chunks to a large bowl and cover with hot water. Allow it to rehydrate for about 20 minutes or until soft.
- Drain it well. Next, drain the chunks using a colander and rinse them under cold water 2-3 times. Use your hands to squeeze them as much as possible to remove the water they have absorbed. Line a cutting board with a few sheets of kitchen paper towels. Transfer the chunks to the kitchen paper towels, then top with a few more sheets. Press to remove as much water as possible. Set the TVP chunks aside.
- Process the beans into a paste. Add the cooked white beans, oil, soy sauce, water, nutritional yeast, sugar, onion powder, garlic, parsley, dried thyme, nutmeg, ground white pepper, and allspice. Process for 10-15 seconds or until it forms a paste. You may have to use a spoon to scrape down the sides.
- Add the TVP. Add the rehydrated TVP chunks and process for another 4-5 seconds, or until it resembles ground meat. Transfer the mixture to a mixing bowl.
- Combine with the gluten. Add the vital wheat gluten and mix until well combined. It should form a thick paste.
- Shape into balls. Using a cookie scoop, scoop about 1.5 tablespoons of the mixture and shape it into a ball using your hands. Transfer to the steamer and repeat with the remaining mixture. Note: I ended up with 9 large meatballs; feel free to make them smaller if you prefer.
- Steam. Bring about 2 cups of water to a boil in a saucepan that can fit under a bamboo basket steamer. Once boiling, place the steamer on top of the pot and steam the meatballs for 25-30 minutes. Let them cool for at least 30 minutes. At first, they will appear very soft but will firm up a bit as they cool.
- Pan-fry the meatballs. Heat about 2 tablespoons of oil in a large non-stick skillet. Once hot, add the meatballs and pan-fry for 6-8 minutes, stirring occasionally, until evenly golden brown. Transfer the meatballs to a plate and wipe the skillet clean with a kitchen paper towel.
Gravy
- Make a roux. Melt the butter over medium heat in the skillet you just cleaned. Once melted, add the flour and stir until fully combined, with no lumps remaining.
- Add the remaining ingredients. Pour in the vegetable broth, plant-based cream, vegan Worcestershire sauce, soy sauce, mustard, ground white pepper, and dark soy sauce (if using, for color). Use a whisk to mix everything together.
- Cook until thickened. Heat over medium heat for 5-7 minutes, whisking regularly, until the sauce thickens.
- Add the meatballs. Carefully add the vegan meatballs to the sauce and toss to coat.
- Cook and serve! Cook the meatballs in the sauce for 2-3 minutes, garnish with chopped parsley, and serve!
- You can store the meatballs in the gravy in the refrigerator for up to 3 days.
Homemade Cashew Cream
- If you want to make your own plant-based cream: Drain the soaked cashews and blend them with the water until smooth.
Notes

About the Author
Thomas Pagot is the founder, photographer, and recipe developer behind Full of Plants. He created the blog in 2016 as a personal cookbook for vegan recipes. Through years of recipe development, Thomas has successfully grown Full of Plants into a trusted resource for plant-based recipes.

























Leave a Comment