πŸ”₯
Smoker Pellet Pro Finder
Every Brand Β· Every Flavor Β· Every Store Β· Real Prices Near You
Loading…
Radius
Brand
Flavor
Store Type
Enter a location above
Best price
Mid price
Higher
Local dealer
No price yet
Brand
Wood / Flavor
Sold At
Store Type
Bag
Sort
0 results
Brand
Flavor
Retailer
Type
BrandFlavor Bag$/lb Bag TotalRetailer TypeLinks
Community Price Reports β€” 0 submitted  Β·  Like GasBuddy β€” your sightings power this for everyone
πŸ”₯ Smoker Pellet Pro Finder is 100% free. Help keep it running β€” report prices, share with friends.
β˜• Buy Me a Coffee πŸ›’ Shop Amazon
No community reports yet.
Hit "Report a Price" whenever you see pellets in any store.

Every report makes this tool more powerful for the whole BBQ community. πŸ”₯
= 4; }))].join('|'); var q = '[out:json][timeout:20];(' + 'nwr["brand:wikidata"~"^(' + qids + ')$"](around:' + radiusM + ',' + lat + ',' + lng + ');' + (names ? 'nwr["name"~"(' + names + ')",i](around:' + radiusM + ',' + lat + ',' + lng + ');' : '') + ');out center tags;'; for (var i = 0; i < servers.length; i++) { try { var ctrl = new AbortController(); var tid = setTimeout(function(){ ctrl.abort(); }, 10000); var r = await fetch(servers[i] + '?data=' + encodeURIComponent(q), {signal:ctrl.signal}); clearTimeout(tid); if (!r.ok) continue; var d = await r.json(); return d.elements || []; } catch(e) {} } return []; } async function runSearch(lat, lng, radiusM) { mLayer.clearLayers(); document.getElementById('sb-list').innerHTML = ''; document.getElementById('sb-title').textContent = 'Searching...'; var brandF = document.getElementById('m-brand').value; var flavF = document.getElementById('m-flavor').value; var typeF = document.getElementById('m-type').value; var zipRaw = document.getElementById('loc-in').value.trim() || ''; var radiusMiles = radiusM / 1609.34; /* Chains that carry selected brand/type */ var matchChains = CHAINS.filter(function(c) { if (c.t === 'Online Marketplace' || c.t === 'Brand Direct') return false; if (brandF && c.brands.indexOf(brandF) < 0) return false; if (typeF && c.t !== typeF) return false; return true; }); /* Local dealers within radius */ var nearDealers = DEALERS.filter(function(d) { if (!d.lat || !d.lng) return false; if (brandF && d.brands.indexOf(brandF) < 0) return false; if (typeF && d.t !== typeF) return false; return hav(lat, lng, d.lat, d.lng) <= radiusMiles; }); /* No physical stores β†’ show online options */ if (!matchChains.length && !nearDealers.length) { var onlineChains = CHAINS.filter(function(c) { return (c.t === 'Online Marketplace' || c.t === 'Brand Direct') && (!brandF || c.brands.indexOf(brandF) >= 0); }); document.getElementById('sb-title').textContent = 'Online Options'; setStatus(brandF ? 'No physical stores carry ' + brandF + ' β€” showing online' : 'Showing online retailers', 'ok'); var sl = document.getElementById('sb-list'); sl.innerHTML = ''; onlineChains.forEach(function(c) { var prices = INV.filter(function(i){ return i.rid===c.id&&(!brandF||i.brand===brandF); }).sort(function(a,b){return a.pp-b.pp;}); var best = prices[0]; var oc = document.createElement('div'); oc.className = 'sc'; oc.innerHTML = '
'+c.n+'
'+ (best?'
$'+best.pp.toFixed(2)+'/lb
':'')+ '
'+c.t+''+ (best?'
'+best.brand+' β€” '+best.flavor+'
'+ '
Per Pound
$'+best.pp.toFixed(2)+'
'+ '
Bag Total
$'+best.total.toFixed(2)+'
':'')+ '
Shop Now
'; sl.appendChild(oc); }); return; } /* Place user pin + radius circle */ if (uMk) MAP.removeLayer(uMk); if (rCirc) MAP.removeLayer(rCirc); uMk = L.circleMarker([lat,lng], {radius:9,color:'#fff',fillColor:'#e8420a',fillOpacity:1,weight:2}).addTo(MAP); uMk.bindTooltip('Your location'); var rm = parseInt(document.getElementById('sel-r').value); rCirc = L.circle([lat,lng], {radius:rm,color:'#e8420a',dashArray:'5 5',fillOpacity:.04,weight:1.5}).addTo(MAP); MAP.setView([lat,lng], 10); /* Show all matching chains immediately while Overpass loads */ setStatus(' Finding stores near you…', ''); var sl = document.getElementById('sb-list'); var cardMap = {}; /* chain.id β†’ card element, for updating after Overpass */ var pinCount = 0; /* ── LAYER 1: Dealers (instant, exact GPS) ── */ nearDealers.forEach(function(d) { var prices = INV.filter(function(i){ return i.rid===d.id&&(!brandF||i.brand===brandF)&&(!flavF||i.flavor===flavF); }).sort(function(a,b){return a.pp-b.pp;}); var best = prices[0]; var dist = hav(lat, lng, d.lat, d.lng); var dirUrl = 'https://www.google.com/maps/dir/?api=1&destination='+d.lat+','+d.lng; var col = '#2dd4bf'; var mk = L.circleMarker([d.lat,d.lng], {radius:10,color:col,fillColor:col,fillOpacity:.88,weight:2}).addTo(mLayer); if (best) { var abbr = (ABBREV&&ABBREV[best.brand])||best.brand.substring(0,3).toUpperCase(); L.marker([d.lat,d.lng], {interactive:false, icon:L.divIcon({className:'', html:'
'+abbr+' β˜…$'+best.pp.toFixed(2)+'/lb$'+best.total.toFixed(2)+'/'+best.bag+'lb
', iconSize:[72,42],iconAnchor:[36,46]})}).addTo(mLayer); } mk.bindPopup(buildPopup(d.n, d.addr||'', d.phone||'', dist, d.t, best, null, dirUrl, d.shop, null, true)); pinCount++; var card = buildCard(d.n, d.addr||'', dist, d.t, best, null, dirUrl, d.shop, null, null, d.phone||'', true); sl.appendChild(card); }); /* ── LAYER 2: All matching chains shown immediately ── Every chain that carries the brand shows with price + Google Maps link. This is ALWAYS useful β€” pitmaster knows where to look. */ matchChains.forEach(function(c) { var prices = INV.filter(function(i){ return i.rid===c.id&&(!brandF||i.brand===brandF)&&(!flavF||i.flavor===flavF); }).sort(function(a,b){return a.pp-b.pp;}); var allFH = INV.filter(function(i){ return i.rid===c.id&&(!brandF||i.brand===brandF); }).sort(function(a,b){return a.pp-b.pp;}); var best = prices[0]||allFH[0]; var mapsUrl = 'https://www.google.com/maps/search/'+encodeURIComponent(c.n+(zipRaw?' near '+zipRaw:'near me')); var snE = c.n.replace(/['"<>]/g,''), stE = c.t.replace(/['"<>]/g,''); var card = document.createElement('div'); card.className = 'sc'; card.dataset.chainId = c.id; card.innerHTML = '
'+c.n+'
'+ (best?'
$'+best.pp.toFixed(2)+'/lb
':'')+ '
'+ ''+c.t+''+ '
'+ 'πŸ“ Find on Google Maps β†’'+ '
'+ (best? '
'+ '
'+best.brand+'
'+ (brandF&&allFH.length>1? '
'+allFH.slice(0,5).map(function(i){ return '
'+i.flavor+'$'+i.pp.toFixed(2)+'/lb β€” $'+i.total.toFixed(2)+'/'+i.bag+'lb
'; }).join('')+'
' :'
'+ '
Per Pound
$'+best.pp.toFixed(2)+'
'+ '
Bag Total
$'+best.total.toFixed(2)+'
'+ '
'+best.bag+'lb β€” '+best.flavor+'
')+ '
' :'')+ '
'+ 'πŸ›’ Shop Online'+ 'πŸ—Ί Find Location'+ (c.loc?'πŸ“ Store Locator':'')+ ''+ '
'; card.querySelector('.sca-rpt').addEventListener('click', function(e){openModal(e.currentTarget.dataset.nm,e.currentTarget.dataset.st);}); cardMap[c.id] = card; sl.appendChild(card); }); var total = sl.children.length; document.getElementById('sb-title').textContent = total + ' Store Type' + (total!==1?'s':'') + ' Found'; setStatus('βœ“ ' + total + ' retailer' + (total!==1?'s':'') + ' carry ' + (brandF||'pellets') + ' β€” loading map…', 'ok'); /* ── LAYER 3: Overpass adds real GPS pins silently ── If it works β†’ pins appear on map, sidebar cards get distance added If it times out β†’ no problem, cards already showing */ var elements = await tryOverpass(lat, lng, radiusM, matchChains); var seenKeys = new Set(); if (elements && elements.length > 0) { elements.forEach(function(el) { var eLat = el.lat||(el.center&&el.center.lat); var eLng = el.lon||(el.center&&el.center.lon); if (!eLat||!eLng||Math.abs(eLat)<0.1||Math.abs(eLng)<0.1) return; var eQid = (el.tags&&(el.tags['brand:wikidata']||el.tags['wikidata']))||''; var elName = (el.tags&&el.tags.name)||''; var chain = matchChains.find(function(c){ if (c.qid&&c.qid===eQid) return true; var first=c.n.split(' ')[0].replace(/[^a-zA-Z0-9]/g,'').toLowerCase(); return first.length>=4&&elName.toLowerCase().indexOf(first)>=0; }); if (!chain) return; var key = chain.id+'_'+Math.round(eLat*1000)+'_'+Math.round(eLng*1000); if (seenKeys.has(key)) return; seenKeys.add(key); var parts=[]; if (el.tags){ if(el.tags['addr:housenumber']&&el.tags['addr:street'])parts.push(el.tags['addr:housenumber']+' '+el.tags['addr:street']); if(el.tags['addr:city'])parts.push(el.tags['addr:city']); if(el.tags['addr:state'])parts.push(el.tags['addr:state']); } var dist = hav(lat,lng,eLat,eLng); var prices = INV.filter(function(i){return i.rid===chain.id&&(!brandF||i.brand===brandF)&&(!flavF||i.flavor===flavF);}).sort(function(a,b){return a.pp-b.pp;}); var allFH = INV.filter(function(i){return i.rid===chain.id&&(!brandF||i.brand===brandF);}).sort(function(a,b){return a.pp-b.pp;}); var best = prices[0]||allFH[0]; var rpts = REPORTS.filter(function(r){return r.store&&elName&&r.store.toLowerCase().indexOf(chain.n.split(' ')[0].toLowerCase())>=0&&(!brandF||r.brand===brandF);}).sort(function(a,b){return(a.pp||99)-(b.pp||99);}); var rep = rpts.length&&rpts[0].pp?rpts[0]:null; var src = rep||best; var dispPrice = src?src.pp:null; var pinColor = !dispPrice?'#6b7280':dispPrice<0.55?'#30c45a':dispPrice<0.75?'#f5a623':dispPrice<1.0?'#fb923c':'#ef4444'; var dirUrl = 'https://www.google.com/maps/dir/?api=1&destination='+eLat+','+eLng; var nm = elName||chain.n; var mk = L.circleMarker([eLat,eLng],{radius:9,color:pinColor,fillColor:pinColor,fillOpacity:.88,weight:2}).addTo(mLayer); if (src) { var abbr=(ABBREV&&ABBREV[src.brand])||chain.n.substring(0,3).toUpperCase(); L.marker([eLat,eLng],{interactive:false,icon:L.divIcon({className:'', html:'
'+abbr+(rep?' βœ“':'')+'$'+src.pp.toFixed(2)+'/lb$'+src.total.toFixed(2)+'/'+src.bag+'lb
', iconSize:[72,42],iconAnchor:[36,46]})}).addTo(mLayer); } var snE=nm.replace(/['"<>]/g,''),stE=chain.t.replace(/['"<>]/g,''); mk.bindPopup(buildPopup(nm,parts.join(', '),'',dist,chain.t,src,rep,dirUrl,chain.shop,chain.loc,false)); mk.on('popupopen',function(){var pe=mk.getPopup().getElement();if(pe){var b=pe.querySelector('.pu-rpt');if(b)b.addEventListener('click',function(e){e.preventDefault();openModal(e.currentTarget.dataset.nm,e.currentTarget.dataset.st);});}}); pinCount++; /* Update the existing card with real distance + directions */ if (cardMap[chain.id]) { var locDiv = cardMap[chain.id].querySelector('.sc-locating'); if (locDiv) { locDiv.innerHTML = 'πŸ“ '+parts.join(', ')+' '+dist.toFixed(1)+' mi'; } /* Add directions button if not there */ var acts = cardMap[chain.id].querySelector('.sc-acts'); if (acts && !acts.querySelector('.sca-dir')) { var dirBtn = document.createElement('a'); dirBtn.className='sca sca-dir'; dirBtn.href=dirUrl; dirBtn.target='_blank'; dirBtn.rel='noopener'; dirBtn.textContent='πŸ—Ί Directions'; acts.insertBefore(dirBtn, acts.firstChild); } /* Click card β†’ focus map pin */ cardMap[chain.id].addEventListener('click', function(e){ if(e.target.tagName==='A'||e.target.tagName==='BUTTON')return; document.querySelectorAll('.sc').forEach(function(c){c.classList.remove('hi');}); cardMap[chain.id].classList.add('hi'); MAP.setView([eLat,eLng],16); mk.openPopup(); }); } }); if (pinCount > 0) { try { MAP.fitBounds(L.featureGroup(mLayer.getLayers()).getBounds().pad(0.15)); } catch(_){} setStatus('βœ“ '+pinCount+' location'+(pinCount!==1?'s':'')+' mapped + '+(Object.keys(cardMap).length)+' retailers listed','ok'); } } else { setStatus('βœ“ '+Object.keys(cardMap).length+' retailers listed β€” tap "Find Location" for directions','ok'); } document.getElementById('sb-title').textContent = sl.children.length + ' Retailers Found'; } /* ── Popup builder ── */ function buildPopup(name,addr,phone,dist,type,src,rep,dirUrl,shopUrl,locUrl,isDealer){ return '
'+ '
'+name+(isDealer?' β˜… Local':'')+'
'+ (addr?'
πŸ“ '+addr+'
':'')+ (phone?'
πŸ“ž '+phone+'
':'')+ '
'+type+(dist?' Β· '+dist.toFixed(1)+' mi':'')+'
'+ (src?'
$'+src.pp.toFixed(2)+'/lb β€” '+src.flavor+ '
$'+src.total.toFixed(2)+' / '+src.bag+'lb bag'+ (rep?' βœ“ Reported':'')+'
':'')+ '
'; } /* ── Card builder ── */ function buildCard(name,addr,dist,type,src,rep,dirUrl,shopUrl,locUrl,allFH,phone,isDealer){ var snE=name.replace(/['"<>]/g,''),stE=type.replace(/['"<>]/g,''); var card=document.createElement('div');card.className='sc'+(isDealer?' sc-dealer-card':''); card.innerHTML= '
'+ '
'+name+(isDealer?' β˜…':'')+'
'+ (dist!==null?'
'+dist.toFixed(1)+' mi
':'') + '
'+ (addr?'
πŸ“ '+addr+'
':'')+ ''+type+''+ (src?'
'+src.brand+(rep?' βœ“':'')+'
'+ '
'+ '
Per Pound
$'+src.pp.toFixed(2)+'
'+ '
Bag Total
$'+src.total.toFixed(2)+'
'+ '
'+src.bag+'lb β€” '+src.flavor+'
':'')+ '
'+ (dirUrl?'πŸ—Ί Directions':'')+ (shopUrl?'πŸ›’ Shop':'')+ (phone?'πŸ“ž Call':'')+ (locUrl?'πŸ“ Locator':'')+ ''+ '
'; card.querySelector('.sca-rpt').addEventListener('click',function(e){openModal(e.currentTarget.dataset.nm,e.currentTarget.dataset.st);}); return card; } >