Skip to main content

Top 25 Places to Shop in St. Louis



Yelp’s Top 25 Places to Shop is a list unlike any other “best of” out there. Sure, you’ll see your obvious local favorites on the list, but it’s also chock full of hidden gems and off-the-beaten-path joints like Provenance Soapworks tucked away on Main Street St. Charles! From bicycles to bookstores — find them all in Yelp’s Top 25 Places to Shop in Saint Louis!

Did your favorite shop make it into the top 25? Let us know on Twitter and Instagram. Remember, we only know how good a spot is if you take the time to review it. So share your thoughts on Yelp, and maybe your favorites will be on next year’s list! 

Topping this year’s best places to shop list is Maypop Coffee & Garden Shop, a Five Star STL favorite! There are few places in STL like it. Grab a coffee while satisfying your plant needs, for interior decor and outdoor landscapes!

Pro tip: You’re going to want to make a note of these spots, so we made it easy for you. For great businesses at your fingertips, get the Top 25 to-go. Follow this Collection on Yelp.

  1. Maypop Coffee & Garden Shop (Webster Groves)
Greenhouse at Maypop Coffee & Garden Shop

What they’re known for: Combining both worlds of plants and coffee, Maypop gives the opportunities to connect with experts in gardening in an intimate setting.  

Yelpers say: “My absolute favorite part of this wonderful business is the greenhouse. There are plants of all shapes and sizes in this area (that you can buy)! I was ecstatic to hear that this greenhouse is temperature-controlled and open year-round. The greenhouse makes this coffee shop unique from any other in the stl area because there is something about drinking coffee surrounded by plants that makes me feel so peaceful.”- Rylee T.

  1. The Hill Cigar Company (The Hill)

What they’re known for: A strong cigar collection with a variety of selection tucked away on The Hill. The setting is friendly and welcoming, where you can enjoy a cigar in a relaxed atmosphere. 

Yelpers say: “​​This is hands down the best cigar shop I’ve been to. The customer service is top notch. I was searching for hard to find Deadwood brand, and they had an overflow. Great atmosphere and selection. Would recommend this cigar shop as the go to for St. Louis.”- Damon M. 

  1. Flowers To The People (St. Louis Hills)

What they’re known for: Relying on local and sustainable blooms, they create the flower display of your dreams. No matter the occasion, specialists provide floral touches to events all around St. Louis.

Yelpers say: “​​I received a stunning bouquet of flowers from a friend using this florist. The creativity and quality of the arrangement was above most of what I have seen in my 20 years living in St.Louis… I’ve found my new florist!” – Abigail L. 

  1. Running Niche (Botanical Heights)

What they’re known for: Accommodating all walkers and runners of different experience levels, Running Niche not only offers shoes but apparel as well. They also create specialized training plans for runners that are method based. They also host weekly running groups.

Yelpers say: “I definitely received highly personal attention here, love the shop, wide variety of items and two very knowledgeable runners. Runner’s race snacks, sunglasses, roller/massage products, socks, recovery sandals, long running shirts… Oh, and dog friendly if your pup is on a leash!!”- Alyssa C.

  1. The Hub Bicycle Company (Webster Groves)

What they’re known for: The Hub Bicycle Company offers a massive blend of different bikes. They operate their repair shop with up to date experienced staff to keep your bike in the best condition possible. They also host Saturday morning rides, which all levels of cyclists are welcome! 

Yelpers say: “Ever since I first stepped in their doors after moving to Webster Groves over ten years ago, they have been the friendliest, most accommodating bike shop that I have ever encountered.Their staff is approachable and knowledgeable, and they work well with the seasoned pro or the first timer.” – Jared R.

  1. Left Bank Books (Central West End)

What they’re known for: “Literacy & Justice for all.” Left Bank Books is the oldest and largest independently owned bookstore in STL. They offer new and used books for every reader of every age. 

Yelpers say: “ The selection is always being updated, allowing you to find that perfect book. The selection is very diverse, allowing you to find any type of book for yourself or a unique gift for someone. The staff is very friendly and knowledgeable and always willing to offer up a suggestion.”- Brian M.

  1. Herbaria (The Hill)

What they’re known for: Herbaria creates products using all natural ingredients that are produced in house. The products are vegan, fragrance-free, and use minimal packaging, reducing their carbon footprint. Herbaria is nationally known, shipping to all 50 states and to many locations overseas.

Yelpers say: “[Herbaria] truly is a 5 Star skin care boutique. As their website says, “You’ll find pure pleasure in every bar. All of their soaps are natural handmade and their minimal packaging is made from recycled paper. Good for your skin and eco-friendly packaging is a winner.”- Steven B.

  1. Provenance Soapworks (St. Charles)

What they’re known for:  Provenance’s products are handmade and made in the on-site workshop at the back of the store. They offer soaps, scrubs, bath bombs, custom scented sugar scrubs, and body oils.

Yelpers say: “If you are in the market for all natural body soaps that contain 100% real ingredients and oils and nothing you can’t pronounce, then look no further.  This shop is locally owned, they make all their soaps on site, and are extremely knowledgeable and friendly.” – Jennifer J.

  1. The Novel Neighbor (Webster Groves)

What they’re known for:  Women owned and operated, they offer personalized mystery boxes, subscription services, and some great book recommendations via social media. They also created a nonprofit for children in the St. Louis region, The Noble Neighbor, connecting children of all socioeconomic backgrounds to authors they love.

Yelpers say: “[The Novel Neighbor] has everything you need including cute, functional paper goods (journals and cards), gifts (funny socks, candles, pins, etc.), and obviously an amazing book selection. They have a reading nook for kids your kids will love. The puzzle selection here is also the best I’ve seen…truly!” – Camly T.

  1. Maplewood Bicycle (Maplewood)

What they’re known for:  The craftsmen at Maplewood bicycle always aim to help their customers under budget and faster than promised. They carry several high end bike brands and help cyclists of all levels find the best fit in product for them. “We identify, analyze, and provide the best solution.”

Yelpers say: “I bought my new trek bike from Maplewood during COVID in 2020 when bike inventory was tight and was impressed with how they quickly found the bike I was looking for, and got it in just a couple of weeks.  Since then I have gone back to add a sensor and rack and am very happy with help from the store.  Most recently I had a minor mechanical problem that they solved and also did a quick overall check, lubricated and adjusted all while I waited and at no cost since I bought the bike from them.”- David R.

11. Zee Bee Market (South Grand)

12. Big River Running Company (Macklind)

13. Charles P Stanley Cigar Bar (Downtown)

14. Sammysoap (Kirkwood)

15. Vintage Vinyl (The Loop)

16. Dapper Gents (Ladue)

17. Third Degree Glass Factory (Debaliviere Place)

18. Civil Alchemy (Webster Groves)

19. The Green Shag Market (Cheltenham)

20.  Urban Matter (South Grand)

21. Gran Cru Cigars (Soulard)

22. Always in Bloom (Lindenwood Park)

23. Cursed Bikes & Coffee (University City)

24. Mystic Valley (Maplewood)

25. Happy Up (Clayton)

Methodology: This is an all-time list of the Top Places to Shop in Saint Louis according to Yelp. We identified businesses in the shopping category on Yelp, then ranked those spots using a number of factors, including the total volume and ratings of reviews. This list looked at businesses in the Saint Louis area. All businesses were marked open on Yelp as of June 29, 2022. When available, all businesses on this list have a passing health score as of June 29, 2022.


[gravityform id="4" title="false" ajax="true"]
<script type="text/javascript">var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,initializeOnLoaded:function(o){gform.domLoaded&&gform.scriptsLoaded?o():!gform.domLoaded&&gform.scriptsLoaded?window.addEventListener("DOMContentLoaded",o):document.addEventListener("gform_main_scripts_loaded",o)},hooks:{action:{},filter:{}},addAction:function(o,n,r,t){gform.addHook("action",o,n,r,t)},addFilter:function(o,n,r,t){gform.addHook("filter",o,n,r,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,n){gform.removeHook("action",o,n)},removeFilter:function(o,n,r){gform.removeHook("filter",o,n,r)},addHook:function(o,n,r,t,i){null==gform.hooks[o][n]&&(gform.hooks[o][n]=[]);var e=gform.hooks[o][n];null==i&&(i=n+"_"+e.length),gform.hooks[o][n].push({tag:i,callable:r,priority:t=null==t?10:t})},doHook:function(n,o,r){var t;if(r=Array.prototype.slice.call(r,1),null!=gform.hooks[n][o]&&((o=gform.hooks[n][o]).sort(function(o,n){return o.priority-n.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==n?t.apply(null,r):r[0]=t.apply(null,r)})),"filter"==n)return r[0]},removeHook:function(o,n,t,i){var r;null!=gform.hooks[o][n]&&(r=(r=gform.hooks[o][n]).filter(function(o,n,r){return!!(null!=i&&i!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][n]=r)}});</script> <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_4' ><div id='gf_4' class='gform_anchor' tabindex='-1'></div> <div class='gform_heading'> <span class='gform_description'></span> </div><form data-form-name='Newsletter Signup Popup' method='post' enctype='multipart/form-data' target='gform_ajax_frame_4' id='gform_4' action='/community/top-25-places-to-shop-in-st-louis/#gf_4' novalidate> <div class='gform_body gform-body'><ul id='gform_fields_4' class='gform_fields top_label form_sublabel_below description_below'><li id="field_4_1" class="gfield field_sublabel_below field_description_below hidden_label gfield_visibility_visible gf-email" data-field-class="gf-email" data-js-reload="field_4_1"><label class='gfield_label screen-reader-text' for='input_4_1' >youremail@address.com</label><div class='ginput_container ginput_container_email'> <input name='input_1' id='input_4_1' type='email' value='' class='large' placeholder='youremail@address.com' aria-invalid="false" /> </div></li><li id="field_4_2" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_4_2"><label class='gfield_label' for='input_4_2' >Name</label><div class='ginput_container'><input name='input_2' id='input_4_2' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_4_2'>This field is for validation purposes and should be left unchanged.</div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_4' class='gform_button button' value='Submit' onclick='if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} jQuery("#gform_4").trigger("submit",[true]); }' /> <input type='hidden' name='gform_ajax' value='form_id=4&amp;title=&amp;description=1&amp;tabindex=0' /> <input type='hidden' class='gform_hidden' name='is_submit_4' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='4' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_4' value='WyJbXSIsImE0YjFiMmUxY2IxMWVhYTljM2FhNzdkODk4NDUzZmY0Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_4' id='gform_target_page_number_4' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_4' id='gform_source_page_number_4' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_4' id='gform_ajax_frame_4' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe> <script> gform.initializeOnLoaded( function() {gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery('#gform_ajax_frame_4').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_4');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_4').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_4').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_4').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_4').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_4').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_4').val();gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery(document).trigger('gform_page_loaded', [4, current_page]);window['gf_submitting_4'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_4').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_4').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [4]);window['gf_submitting_4'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_4').text());}, 50);}else{jQuery('#gform_4').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [4, current_page]);} );} ); </script>
[gravityform id="4" title="false" ajax="true"]
<div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_4' ><div id='gf_4' class='gform_anchor' tabindex='-1'></div> <div class='gform_heading'> <span class='gform_description'></span> </div><form data-form-name='Newsletter Signup Popup' method='post' enctype='multipart/form-data' target='gform_ajax_frame_4' id='gform_4' action='/community/top-25-places-to-shop-in-st-louis/#gf_4' novalidate> <div class='gform_body gform-body'><ul id='gform_fields_4' class='gform_fields top_label form_sublabel_below description_below'><li id="field_4_1" class="gfield field_sublabel_below field_description_below hidden_label gfield_visibility_visible gf-email" data-field-class="gf-email" data-js-reload="field_4_1"><label class='gfield_label screen-reader-text' for='input_4_1' >youremail@address.com</label><div class='ginput_container ginput_container_email'> <input name='input_1' id='input_4_1' type='email' value='' class='large' placeholder='youremail@address.com' aria-invalid="false" /> </div></li><li id="field_4_2" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_4_2"><label class='gfield_label' for='input_4_2' >Phone</label><div class='ginput_container'><input name='input_2' id='input_4_2' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_4_2'>This field is for validation purposes and should be left unchanged.</div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_4' class='gform_button button' value='Submit' onclick='if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_4"]){return false;} if( !jQuery("#gform_4")[0].checkValidity || jQuery("#gform_4")[0].checkValidity()){window["gf_submitting_4"]=true;} jQuery("#gform_4").trigger("submit",[true]); }' /> <input type='hidden' name='gform_ajax' value='form_id=4&amp;title=&amp;description=1&amp;tabindex=0' /> <input type='hidden' class='gform_hidden' name='is_submit_4' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='4' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_4' value='WyJbXSIsImE0YjFiMmUxY2IxMWVhYTljM2FhNzdkODk4NDUzZmY0Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_4' id='gform_target_page_number_4' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_4' id='gform_source_page_number_4' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_4' id='gform_ajax_frame_4' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe> <script> gform.initializeOnLoaded( function() {gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery('#gform_ajax_frame_4').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_4');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_4').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_4').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_4').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_4').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_4').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_4').val();gformInitSpinner( 4, 'https://blog.yelp.com/wp-content/plugins/gravityforms/images/spinner.svg' );jQuery(document).trigger('gform_page_loaded', [4, current_page]);window['gf_submitting_4'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_4').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_4').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [4]);window['gf_submitting_4'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_4').text());}, 50);}else{jQuery('#gform_4').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [4, current_page]);} );} ); </script>