This vegetarian chili recipe is hearty, smoky, and packed with good-for-you ingredients. A quick, easy recipe that’s cozy and always a crowd favorite!

This easy vegetarian chili is a favorite I’ve been making for years now. It’s one of those recipes that friends and family specifically request: “Can you make that chili again?” Most people who try it don’t even realize there’s no meat until I tell them. It’s that satisfying and hearty!
As a cookbook author who specializes in vegetarian and vegan recipes, I’ve made my share of sub-par meatless chili recipes. Finally, I hit upon my favorite formula! This chili has fire roasted tomatoes for smokiness, two types of beans, quinoa, and a few secret ingredients that create a savory depth that feels satisfying even though it’s totally plant-based.
Why I Love This Chili
This vegetarian chili recipe checks every box for what I want in an easy dinner:
- It’s genuinely hearty. Black beans and kidney beans combined with quinoa make this veggie chili substantial enough that no one misses the meat.
- It comes together fast. Total time from start to finish is around 30 minutes: perfect for busy weeknight dinners when you need something on the table quickly.
- It’s versatile. This recipe is vegetarian, but it’s also vegan (with vegan butter) and gluten free.
- Everyone genuinely loves it. From picky kids to meat lovers, this chili wins people over. I’ve served it countless times and the pot always comes back empty. (I have especially fond memories of my kids and their friends enjoying it!)
5-Star Reader Review
”This chili was delicious and thick! I made a double batch for family dinner, paired with your Greek yogurt cornbread muffins! So good!” -Julie C.
Ingredients You’ll Need
A great vegetarian chili goes beyond bean soup. It’s hard to replicate the heartiness of that signature flavor without using meat (trust me, as a vegetarian and vegan recipe writer, I’ve had lots of experience trying!).
My recipe uses a combination of “secret” ingredients to bring a savory, salty umami. My original inspiration was open-fire cooking: Alex and I first made it over a fire in our backyard! Since it was created for outdoor cooking, this chili is very easy to put together. Here’s what you’ll need:
- Onion and garlic: These add the foundational flavor.
- Olive oil and butter: I’ve found using both olive oil and a little butter adds just the right amount of richness that you need since there’s no meat. Feel free to use vegan butter or refined coconut oil as a dairy-free substitute.
- Quinoa: In a vegetarian chili, quinoa is a nice substitute for the texture of meat.
- Beans and corn: I like to use a mix of black beans and kidney beans. Corn adds pops of sweetness.
- Canned fire roasted tomatoes: This type of canned tomatoes has a naturally sweet flavor that’s essential.
- Ketchup, mustard, and Worcestershire sauce: These are some of the “secret” ingredients that add flavor. I’ve tried it without ketchup but it really is the key. You can also vegan Worcestershire for keep it fully vegan.
- Chili powder, oregano, garlic powder, cumin, smoked paprika: Stirring in smoked paprika at the end adds an irresistible smokiness: it’s my secret weapon for plant-based dishes,

It’s All in the Tomatoes
You can make this vegetarian chili recipe with any type of canned tomato, but the best option is fire roasted tomatoes. This type of tomato is roasted over an open flame, which infuses a sweet and smoky flavor to the tomatoes. They taste better than standard canned tomato, which can taste flat and bitter.
Can’t find fire roasted tomatoes? San Marzano tomatoes can work in a pinch: this Italian type of tomato has a sweeter flavor right out of the can too. Or, simply use the best canned tomatoes you can find.
Tips for Making the Best Vegetarian Chili
This stovetop version takes 30 minutes total, but you can also make it in a slow cooker (see FAQs) or Instant Pot (see my Instant Pot vegetarian chili). Here’s how to get the best results every time:
- Use all the ingredients listed in the recipe! I know it sounds silly, but each ingredient is really optimized for flavor. The fire roasted tomatoes, butter, Worcestershire, and ketchup are specifically important.
- Add smoked paprika at the end. This is crucial! Smoked paprika can lose its power when cooked too long, so stirring it in at the end adds a deep smoky flavor.
- Adjust the consistency. If your chili seems too thick, add water or vegetable broth a little at a time. If it’s too thin, let it simmer uncovered for a few extra minutes.
- Taste and adjust. Before serving, taste and add more kosher salt if needed. The salt is what makes all the other flavors pop.
Toppings & Add-Ins
One of the best parts of a vegetarian chili recipe is loading it up with toppings! Once you’ve whipped up a big, steaming pot on the stovetop, assemble your toppings of choice. Here are a few of our favorite options:
- Shredded cheese: Try cheddar, Mexican blend or Monterrey Jack.
- Sour cream: It’s required, in my opinion! For vegan, use Cashew Cream or Vegan Queso.
- Green onion: Onion adds just the right savory flair.
- Cilantro: Fresh cilantro adds an herby nuance.
- Hot sauce: Try a Mexican hot sauce like Cholula.
- Crushed tortilla chips or roasted pepitas: Add a salty crunch.
- Sweet potatoes: If you’d like, you can add diced sweet potatoes to the mix for another texture (similar to my Pumpkin Chili).
- Pickled onions or peppers: Add pickled red onions or pickled jalapeños for a add bright color and tangy flavor to chili.
- Spicy ingredients: The base recipe is mild. For more heat, add cayenne pepper, diced jalapeño peppers (with seeds), or a small amount of chipotle powder to taste.

Favorite Pairings
Turn this vegetarian chili recipe into a meal by adding a few simple side dishes! Cornbread is an obvious pair with this hearty stew, but there are lots of other options and ideas. Here are some sides to serve with chili:
- Add classic skillet cornbread or cornbread muffins
- I love this Mexican cornbread with jalapeños or my favorite vegan cornbread
- Add a green salad like Mexican chopped salad or kale Caesar salad
- Pair this chili with fries or sweet potato fries
- Serve it over a baked potato or baked sweet potato

Make-Ahead & Storage
This vegetarian chili works great as a make ahead recipe for meal prep. However, keep in mind that the chili becomes very thick when refrigerated, so reheat on the stovetop and stir in a little extra water, then taste and add additional salt if necessary until the flavor pops.
Leftovers store for up to 3 days refrigerated. They also freeze well: place in a freezer-safe container and freeze for up to 3 months.
Dietary notes
This vegetarian chili recipe is vegetarian, vegan, plant-based, dairy-free and gluten-free.
Frequently asked questions
For a slow cooker vegetarian chili, add all ingredients except the smoked paprika to your crockpot. Cook on low for 6 to 8 hours or on high for 3 to 4 hours. Stir in the smoked paprika during the last 15 minutes of cooking. You may need to add extra water or vegetable broth since slow cooking tends to thicken the chili even more. Keep in mind, I have not tested this variation!
Yes! While this stovetop version is quick enough that pressure cooking isn’t necessary, you can adapt it. See my Instant Pot vegetarian chili recipe.
This recipe is already quite thick thanks to the quinoa and beans. If you want it even thicker: (1) Use 3 cans of beans total instead of 2, (2) Let it simmer longer uncovered to reduce excess liquid, (3) Mash a few spoonfuls of the beans against the side of the pot to create a thicker base, or (4) Add cooked lentils for extra body and protein.
Vegetarian Chili Recipe
This vegetarian chili recipe is the best: loaded with hearty flavor and good-for-you ingredients! Even better, it’s quick and easy.
- Prep Time: 5 minutes
- Cook Time: 25 minutes
- Total Time: 30 minutes
- Yield: 6
- Category: Main dish
- Method: Stovetop
- Cuisine: Chili
- Diet: Vegetarian
Ingredients
- 1 medium yellow onion
- 3 cloves garlic
- 2 tablespoons olive oil
- ⅓ cup dry quinoa
- 1 cup water
- 1 (or 2) 15-ounce can black beans, drained*
- 1 15-ounce can kidney beans, drained
- 2 28-ounce cans diced fire roasted tomatoes**
- 4 tablespoons salted butter (or vegan butter)
- 1 15-ounce can corn (or 1 ½ cups frozen corn), drained
- 1 tablespoon yellow mustard
- 1 tablespoon vegan Worcestershire sauce (or omit)
- ½ cup ketchup
- 2 tablespoons each chili powder and dried oregano
- 1 tablespoon each garlic powder and cumin
- 1 ½ teaspoons kosher salt
- 1 teaspoon smoked paprika
Instructions
- Dice the onion. Mince the garlic.
- In a large pot or Dutch oven***, heat the olive oil over medium heat. Add the onions and garlic and sauté for 5 to 7 minutes, until tender.
- Add all other ingredients except for the smoked paprika. Simmer for 25 minutes, then stir in the smoked paprika. Serve immediately with toppings of your choice. Store leftovers refrigerated for up to 3 days, or frozen for 3 months. Leftovers become very thick when refrigerated, so reheat on the stovetop and stir in a little extra water, then taste and add additional salt if necessary until the flavor pops.
Notes
*Make this recipe with a total of 3 15-ounce cans of beans for an even more filling meal.
**Fire roasted tomatoes are key for the flavor here. If you can’t find them, use San Marzano tomatoes or best quality canned tomatoes.
***This recipe is easy to cook over an open fire. If you’re taking it camping, prep the minced onion and garlic and place in a sealed container. Place the ingredients from water through kosher salt in another large sealed container, but keep out the dry quinoa and add it when cooking.
(function(){
window.addEventListener( ‘message’, function( event ){
if ( ( ‘https://nutrifox.com’ !== event.origin && ‘https://nutrifox.test’ !== event.origin ) ||
typeof event.data !== ‘string’ ) {
return;
}
var payload = JSON.parse( event.data );
switch ( payload.event ) {
case ‘setHeight’:
var iframe = document.getElementById( ‘nutrifox-label-‘ + payload.recipeId );
iframe.style.height = payload.height + ‘px’;
break;
}
} );
}());
window.trCommon={“minRating”:6,”ajaxurl”:”https://www.acouplecooks.com/wp-admin/admin-ajax.php”,”ratingNonce”:””,”postId”:140177};
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.smoothScroll = {
init() {
document.addEventListener( ‘click’, ( e ) => {
let anchor = e.target;
if ( anchor.tagName !== ‘A’ ) {
anchor = anchor.closest( ‘a.tasty-recipes-scrollto’ );
}
if ( ! anchor || ! anchor.classList.contains( ‘tasty-recipes-scrollto’ ) ) {
return;
}
const elementHref = anchor.getAttribute( ‘href’ );
if ( ! elementHref ) {
return;
}
e.preventDefault();
this.goToSelector( elementHref );
});
},
goToSelector( selector ) {
const element = document.querySelector( selector );
if ( ! element ) {
return;
}
element.scrollIntoView( { behavior: ‘smooth’ } );
}
};
document.addEventListener(
‘DOMContentLoaded’,
() => window.TastyRecipes.smoothScroll.init()
);
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.cookMode = {
wakeLockApi: false,
wakeLock: false,
cookModeSelector: ‘.tasty-recipes-cook-mode’,
init() {
if (“wakeLock” in navigator && “request” in navigator.wakeLock) {
this.wakeLockApi = navigator.wakeLock;
}
const cookModes = document.querySelectorAll(this.cookModeSelector);
if (cookModes.length > 0) {
for (const cookMode of cookModes) {
if (this.wakeLockApi) {
cookMode.querySelector(‘input[type=”checkbox”]’).addEventListener(“change”, event => {
this.checkboxChange(event.target);
}, false);
} else {
cookMode.style.display = “none”;
}
}
}
},
checkboxChange(checkbox) {
if (checkbox.checked) {
this.lock();
} else {
this.unlock();
}
},
setCheckboxesState(state) {
const checkboxes = document.querySelectorAll(this.cookModeSelector + ‘ input[type=”checkbox”]’);
for (const checkbox of checkboxes) {
checkbox.checked = state;
}
},
async lock() {
try {
this.wakeLock = await this.wakeLockApi.request(“screen”);
this.wakeLock.addEventListener(“release”, () => {
this.wakeLock = false;
this.setCheckboxesState(false);
});
this.setCheckboxesState(true);
} catch (error) {
this.setCheckboxesState(false);
}
},
unlock() {
if (this.wakeLock) {
this.wakeLock.release();
this.wakeLock = false;
}
this.setCheckboxesState(false);
}
};
(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
document.addEventListener(“DOMContentLoaded”, callback);
}
})(() => {
window.TastyRecipes.cookMode.init();
});
window.TastyRecipes = window.TastyRecipes || {};
window.TastyRecipes.staticTooltip = {
element: null,
tooltipElement: null,
deleting: false,
init( element ) {
if ( this.deleting ) {
return;
}
this.element = element;
this.buildElements();
},
destroy() {
if ( ! this.tooltipElement || this.deleting ) {
return;
}
this.deleting = true;
this.tooltipElement.classList.remove( ‘opened’ );
setTimeout( () => {
this.tooltipElement.remove();
this.deleting = false;
}, 500 );
},
buildElements() {
const tooltipElement = document.createElement( ‘div’ );
tooltipElement.classList.add( ‘tasty-recipes-static-tooltip’);
tooltipElement.setAttribute( ‘id’, ‘tasty-recipes-tooltip’ );
const currentTooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
if ( currentTooltipElement ) {
document.body.replaceChild( tooltipElement, currentTooltipElement );
} else {
document.body.appendChild( tooltipElement );
}
this.tooltipElement = document.getElementById( ‘tasty-recipes-tooltip’ );
},
show() {
if ( ! this.tooltipElement ) {
return;
}
const tooltipTop = this.element.getBoundingClientRect().top
+ window.scrollY
– 10 // 10px offset.
– this.tooltipElement.getBoundingClientRect().height;
const tooltipLeft = this.element.getBoundingClientRect().left
– ( this.tooltipElement.getBoundingClientRect().width / 2 )
+ ( this.element.getBoundingClientRect().width / 2 ) – 1;
const posLeft = Math.max( 10, tooltipLeft );
this.maybeRemoveTail( posLeft !== tooltipLeft );
this.tooltipElement.setAttribute( ‘style’, ‘top:’ + tooltipTop + ‘px;left:’ + posLeft + ‘px;’ );
this.tooltipElement.classList.add( ‘opened’ );
},
maybeRemoveTail( removeTail ) {
if ( removeTail ) {
this.tooltipElement.classList.add( ‘tr-hide-tail’ );
} else {
this.tooltipElement.classList.remove( ‘tr-hide-tail’ );
}
},
changeMessage( message ) {
if ( ! this.tooltipElement ) {
return;
}
this.tooltipElement.innerHTML = message;
}
};
window.TastyRecipes.ajax = {
sendPostRequest( url, data, success, failure ) {
const xhr = new XMLHttpRequest();
xhr.open( ‘POST’, url, true );
xhr.send( this.preparePostData( data ) );
xhr.onreadystatechange = () => {
if ( 4 !== xhr.readyState ) {
return;
}
if ( xhr.status === 200 ) {
success( JSON.parse( xhr.responseText ) );
return;
}
failure( xhr );
};
xhr.onerror = () => {
failure( xhr );
};
},
preparePostData( data ) {
const formData = new FormData();
for ( const key in data ) {
formData.append( key, data[key] );
}
return formData;
},
};
window.TastyRecipes.ratings = {
defaultRating: 0,
currentRatingPercentage: 100,
savingRating: false,
init( minRating ) {
this.minRating = minRating;
this.formWatchRating();
this.closeTooltipWhenClickOutside();
this.addBodyClassBasedOnSelectedRating();
this.backwardCompFormRatingPosition();
},
formWatchRating() {
const ratings = document.querySelectorAll(‘.tasty-recipes-no-ratings-buttons [data-rating]’);
if ( ratings.length {
event.preventDefault();
this.defaultRating = event.target.closest( ‘.checked’ ).dataset.rating;
this.setCheckedStar( event.target );
this.maybeSendRating( this.defaultRating, event.target );
this.setRatingInForm( this.defaultRating );
} );
}
},
closeTooltipWhenClickOutside() {
window.addEventListener( ‘click’, e => {
// Bailout (don’t remove the tooltip) when the clicked element is a rating star, or it’s the tooltip itself.
if ( e.target.closest( ‘.tasty-recipes-rating’ ) || e.target.classList.contains( ‘tasty-recipes-static-tooltip’ ) ) {
return;
}
window.TastyRecipes.staticTooltip.destroy();
} );
},
setRatingInForm( rating ) {
const ratingInput = document.querySelector( ‘#respond .tasty-recipes-rating[value=”‘ + rating + ‘”]’ );
if ( ! ratingInput ) {
return;
}
ratingInput.click();
},
addBodyClassBasedOnSelectedRating() {
const ratingInputs = document.querySelectorAll( ‘input.tasty-recipes-rating’ );
if ( ! ratingInputs ) {
return;
}
for ( const ratingInput of ratingInputs ) {
ratingInput.addEventListener( ‘click’, currentEvent => {
const selectedRating = currentEvent.target.getAttribute( ‘value’ );
this.handleBodyClassByRating( selectedRating );
this.toggleCommentTextareaRequired( selectedRating );
} );
}
},
handleBodyClassByRating( rating ) {
if ( rating < this.minRating ) {
document.body.classList.remove( 'tasty-recipes-selected-minimum-rating' );
return;
}
document.body.classList.add( 'tasty-recipes-selected-minimum-rating' );
},
toggleCommentTextareaRequired( rating ) {
const commentTextarea = document.getElementById( 'comment' );
if ( ! commentTextarea ) {
return;
}
if ( rating {
window.TastyRecipes.staticTooltip.changeMessage( response.data.message );
window.TastyRecipes.staticTooltip.show();
this.updateAverageText( response.data, recipeCardElement );
this.maybeFillCommentForm( response.data );
// Hide the tooltip after 5 seconds.
setTimeout( () => {
this.maybeResetTooltip( recipeCardElement, response.data, rating );
}, 5000 );
},
() => {
this.resetTooltip( recipeCardElement );
}
);
},
updateAverageText( data, recipeCardElement ) {
if ( ! data.average ) {
return;
}
this.setRatingPercent( data );
if ( ! data.count ) {
return;
}
const quickLink = document.querySelector( ‘.tasty-recipes-rating-link’ );
if ( quickLink ) {
this.setTextInContainer( quickLink, data );
this.setPartialStar( quickLink );
}
const cardStars = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
cardStars.dataset.trDefaultRating = data.average;
this.setTextInContainer( recipeCardElement.querySelector( ‘.tasty-recipes-rating’ ), data );
},
setTextInContainer( container, data ) {
if ( ! container ) {
return;
}
if ( data.label ) {
const ratingLabelElement = container.querySelector( ‘.rating-label’ );
if ( ratingLabelElement ) {
ratingLabelElement.innerHTML = data.label;
}
return;
}
const averageElement = container.querySelector( ‘.average’ );
if ( averageElement ) {
averageElement.textContent = data.average;
}
const countElement = container.querySelector( ‘.count’ );
if ( countElement ) {
countElement.textContent = data.count;
}
},
setPartialStar( container ) {
const highestStar = container.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( highestStar ) {
highestStar.dataset.trClip = this.currentRatingPercentage;
}
},
setRatingPercent( data ) {
this.defaultRating = data.average.toFixed( 1 );
const parts = data.average.toFixed( 2 ).toString().split( ‘.’ );
this.currentRatingPercentage = parts[1] ? parts[1] : 100;
if ( this.currentRatingPercentage === ’00’ ) {
this.currentRatingPercentage = 100;
}
},
setCheckedStar( target ) {
const cardRatingContainer = target.closest( ‘.tasty-recipes-ratings-buttons’ );
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( selectedRatingElement ) {
delete selectedRatingElement.dataset.trChecked;
}
const thisStar = target.closest( ‘.tasty-recipes-rating’ );
thisStar.dataset.trChecked = 1;
thisStar.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = 100;
},
maybeFillCommentForm( data ) {
if ( ! data.comment || ! data.comment.content ) {
return;
}
const commentForm = document.querySelector( ‘#commentform’ );
if ( ! commentForm ) {
return;
}
const commentBox = commentForm.querySelector( ‘[name=comment]’ );
if ( ! commentBox || commentBox.value ) {
return;
}
// Add comment details for editing.
commentBox.innerHTML = data.comment.content;
if ( data.comment.name ) {
commentForm.querySelector( ‘[name=author]’ ).value = data.comment.name;
commentForm.querySelector( ‘[name=email]’ ).value = data.comment.email;
}
},
maybeResetTooltip( recipeCardElement, data, rating ) {
if ( this.savingRating === rating ) {
this.resetTooltip( recipeCardElement, data );
}
},
resetTooltip( recipeCardElement, data ) {
window.TastyRecipes.staticTooltip.destroy();
this.savingRating = false;
// Reset the default rating.
const cardRatingContainer = recipeCardElement.querySelector( ‘.tasty-recipes-ratings-buttons’ );
if ( cardRatingContainer ) {
this.defaultRating = ( data && data.average ) ? data.average.toFixed(1) : cardRatingContainer.dataset.trDefaultRating;
cardRatingContainer.dataset.trDefaultRating = this.defaultRating;
this.resetSelectedStar( cardRatingContainer, data );
}
},
resetSelectedStar( cardRatingContainer ) {
const selectedRatingElement = cardRatingContainer.querySelector( ‘[data-rating=”‘ + Math.ceil( this.defaultRating ) + ‘”]’ );
if ( selectedRatingElement ) {
selectedRatingElement.querySelector( ‘[data-tr-clip]’ ).dataset.trClip = this.currentRatingPercentage;
selectedRatingElement.parentNode.dataset.trChecked = 1;
}
const previousSelectedElement= cardRatingContainer.querySelector( ‘[data-tr-checked]’ );
if ( previousSelectedElement ) {
const currentSelectedRating = previousSelectedElement.querySelector(‘[data-rating]’);
if ( currentSelectedRating !== selectedRatingElement ) {
delete previousSelectedElement.dataset.trChecked;
}
}
},
backwardCompFormRatingPosition() {
const ratingsButtons = document.querySelector( ‘#respond .tasty-recipes-ratings-buttons, #tasty-recipes-comment-rating .tasty-recipes-ratings-buttons’ );
if ( ! ratingsButtons ) {
return;
}
const ratingsButtonsStyles = window.getComputedStyle(ratingsButtons);
if ( ! ratingsButtonsStyles.display.includes( ‘flex’ ) ) {
ratingsButtons.style.direction = ‘rtl’;
}
if ( typeof tastyRecipesRating !== ‘undefined’ ) {
// Select the rating that was previously selected in admin.
ratingsButtons.querySelector( ‘.tasty-recipes-rating[value=”‘ + tastyRecipesRating + ‘”]’ ).checked = true;
}
const ratingSpans = ratingsButtons.querySelectorAll( ‘.tasty-recipes-rating’ );
for (const ratingSpan of ratingSpans) {
ratingSpan.addEventListener( ‘click’, event => {
if ( ratingSpan === event.target ) {
return;
}
ratingSpan.previousElementSibling.click();
} );
}
}
};
(function(callback) {
if (document.readyState !== “loading”) {
callback();
} else {
window.addEventListener( ‘load’, callback );
}
})(() => {
window.TastyRecipes.ratings.init( window.trCommon ? window.trCommon.minRating : 4 );
});