📦
FBA Scout UK
by VelantoHub · 2026 Fees
🇬🇧 UK Market
2026 Fees
Live
Step 1 — Enter Amazon ASIN
⚡ Auto-fetches weight, dimensions, category & 90-day average buybox price via Keepa API. You can edit price after.
Category (auto-detected from Keepa, or select manually)
Beauty & Personal Care
Health & Vitamins
Baby Products
Clothing & Accessories
Electronics
Computers & Accessories
Cameras & Photo
Mobile Phones & Accessories
Home & Garden
Toys & Games
Sports & Outdoors
Grocery & Gourmet Food
Pet Supplies
Automotive
DIY & Tools
Jewellery
Watches
Musical Instruments
Books
Music
DVD & Video
Video Games
Other / General (15%)
💡 FBA tier auto-detected. Low-Price FBA applied automatically when sell price ≤ £20.
📊 90-Day Avg
🏷️ Buybox Price
✏️ Manual
Profit per Unit
£0.00
Enter product details to begin
Breakdown
Visual
VAT Detail
📊 Seller Board
// Price data stored from Keepa
let _avgPrice = null;
let _bbxPrice = null;
let _priceSource = 'man'; // 'avg' | 'bbx' | 'man'
// ── FBA FEE TABLES (2026 UK) ──────────────────────────
const FBA_STD = {
lenv20:1.83, lenv40:1.93, senv60:1.97, senv80:2.13, senv100:2.19,
senv210:2.24, senv460:2.56, lenv:3.14, xlenv:3.37,
sp150:3.37, sp400:3.45, sp1k:4.50, sp2k:5.42,
lp1k:5.50, lp2k:6.50, lp5k:8.60, lp10k:12.50
};
const FBA_LP = {
lenv20:1.463, lenv40:1.500, senv60:1.516, senv80:1.670, senv100:1.703,
senv210:1.731, senv460:1.875, lenv:2.418, xlenv:2.653,
sp150:2.674, sp400:2.705, sp1k:3.20, sp2k:4.10,
lp1k:4.20, lp2k:5.30, lp5k:7.00, lp10k:10.50
};
const TNAME = {
lenv20:'Light Envelope ≤20g', lenv40:'Light Envelope ≤40g',
senv60:'Std Envelope ≤60g', senv80:'Std Envelope ≤80g',
senv100:'Std Envelope ≤100g', senv210:'Std Envelope ≤210g',
senv460:'Std Envelope ≤460g', lenv:'Large Envelope ≤960g',
xlenv:'XL Envelope ≤960g', sp150:'Small Parcel ≤150g',
sp400:'Small Parcel ≤400g', sp1k:'Std Parcel ≤1kg',
sp2k:'Std Parcel ≤2kg', lp1k:'Large Parcel ≤1kg',
lp2k:'Large Parcel ≤2kg', lp5k:'Large Parcel ≤5kg',
lp10k:'Large Parcel ≤10kg'
};
function detectTier(wg,l,w,h){
const [lo,mi,sh]=[l,w,h].sort((a,b)=>b-a);
if(lo<=33&&mi<=23&&sh<=2.5){
if(wg<=20) return 'lenv20'; if(wg<=40) return 'lenv40';
if(wg<=60) return 'senv60'; if(wg<=80) return 'senv80';
if(wg<=100) return 'senv100'; if(wg<=210) return 'senv210';
if(wg<=460) return 'senv460';
}
if(lo<=33&&mi<=23&&sh<=4&&wg<=960) return 'lenv';
if(lo<=33&&mi<=23&&sh<=6&&wg<=960) return 'xlenv';
if(lo<=35&&mi<=25&&sh<=12){
if(wg<=150) return 'sp150'; if(wg<=400) return 'sp400';
}
if(wg<=1000) return 'sp1k'; if(wg<=2000) return 'sp2k';
if(wg<=10000) return 'lp1k'; return 'lp10k';
}
function getRefAmt(cat, price, isPrime){
const MIN=0.25;
switch(cat){
case 'beauty': case 'baby': return Math.max(price*(price<=10?.08:.15), MIN);
case 'clothing':
if(isPrime&&price>40) return Math.max(40*.15+(price-40)*.07, MIN);
return Math.max(price*(price<=15?.05:price<=20?.10:.15), MIN);
case 'grocery': case 'pet': case 'vitamins': return Math.max(price*(price<=10?.05:.15), MIN);
case 'home_products': return Math.max(price*(price<=20?.08:.15), MIN);
case 'electronics': return Math.max(price*.08, MIN);
default: return Math.max(price*.15, MIN);
}
}
function getRefLabel(cat, price, isPrime){
switch(cat){
case 'beauty': case 'baby': return price<=10?'8%':'15%';
case 'clothing':
if(isPrime&&price>40) return 'Prime Tiered';
return price<=15?'5%':price<=20?'10%':'15%';
case 'grocery': case 'pet': case 'vitamins': return price<=10?'5%':'15%';
case 'home_products': return price<=20?'8%':'15%';
case 'electronics': return '8%';
default: return '15%';
}
}
// ══════════════════════════════════════════════════════
// MAIN CALCULATE — 100% AMZ Scout formula
// Revenue = Price × (1 − VAT%)
// Referral = Price × rate% (on gross)
// Profit = Revenue − Referral − FBA − all costs
// Margin = Profit / Price × 100
// ROI = Profit / COGS × 100
// ══════════════════════════════════════════════════════
function calc(){
const price = +gi('priceI').value||0;
const cogs = +gi('cogsI').value ||0;
const vatPct = +gi('vatR').value;
const vatR = vatPct/100;
const ship = +gi('shipI').value ||0;
const cpc = +gi('cpcI').value ||0;
const stor = +gi('storI').value ||0;
const othr = +gi('othrI').value ||0;
const cat = gi('catS').value;
const fbaT = gi('fbaT').value;
const wg = +gi('wgtI').value ||10;
const l = +gi('dL').value ||7.9;
const w = +gi('dW').value ||1.5;
const h = +gi('dH').value ||1.5;
const haz = gi('hazI').checked;
const clos = gi('closI').checked;
const prime = gi('primeI').checked;
const tier = detectTier(wg,l,w,h);
gi('szBadge').textContent = '📏 '+TNAME[tier];
// ── AMZ Scout exact formula ──
const revenue = price*(1-vatR);
const vatAmt = price-revenue;
const refAmt = getRefAmt(cat,price,prime);
const refLbl = getRefLabel(cat,price,prime);
const tbl = fbaT==='lp'?FBA_LP:FBA_STD;
let fbaFee = tbl[tier]||tbl['sp400'];
if(haz) fbaFee=+(fbaFee+.10).toFixed(2);
if(clos) fbaFee=+(fbaFee+.50).toFixed(2);
const totalFBA = refAmt+fbaFee;
const profit = revenue-refAmt-fbaFee-cogs-ship-cpc-stor-othr;
const margin = price>0?(profit/price)*100:0;
const roi = cogs>0?(profit/cogs)*100:0;
// ── Hero update ──
const pa=gi('phAmt');
pa.textContent=(profit>=0?'+£':'-£')+Math.abs(profit).toFixed(2);
pa.className='phamt'+(profit<0?' loss':'');
gi('pBar').className='pbar'+(profit<0?' loss':'');
gi('phSub').textContent = profit>=0
? `Profit £${profit.toFixed(2)} · ${margin.toFixed(1)}% net margin`
: `Loss £${Math.abs(profit).toFixed(2)} — review costs or raise price`;
sm('mMgn', margin.toFixed(2)+'%', margin>=20?'g':margin>=8?'o':'r');
sm('mROI', roi.toFixed(2)+'%', roi>=50?'g':roi>=20?'o':'r');
sm('mFBA','£'+totalFBA.toFixed(2),'o');
sm('mRev','£'+revenue.toFixed(2),'b');
sm('mBEP',bep>0?'£'+bep.toFixed(2):'—','');
// ── Breakdown ──
const pct=v=>price>0?(Math.abs(v)/price*100).toFixed(1)+'%':'—';
const rows=[
{sec:'Revenue'},
{n:'Sale Price (inc. VAT)', v:price, cls:'dim', dot:'#2563eb', pct:'100%'},
{n:`VAT on Sale (${vatPct}%) → HMRC`,v:-vatAmt, cls:'neg', dot:'#b45309', pct:pct(vatAmt)},
{n:'Net Revenue (ex-VAT)', v:revenue, cls:'pos', dot:'#059669', pct:pct(vatAmt)+' net', bold:true},
{sec:'Amazon Fees'},
{n:`Referral Fee (${refLbl})`, v:-refAmt, cls:'neg', dot:'#dc2626', pct:pct(refAmt)},
{n:`FBA Fulfilment (${TNAME[tier]})`,v:-fbaFee, cls:'neg', dot:'#7c3aed', pct:pct(fbaFee)},
haz ?{n:'Hazmat Surcharge', v:-.10, cls:'neg', dot:'#ef4444', pct:pct(.10)}:null,
clos ?{n:'Closing Fee (Media)', v:-.50, cls:'neg', dot:'#ef4444', pct:pct(.50)}:null,
{n:'Total FBA Fee', v:-totalFBA,cls:'neg', dot:'#dc2626', pct:pct(totalFBA), bold:true},
{sec:'Your Costs'},
{n:'Product Cost (COGS)', v:-cogs, cls:'neg', dot:'#475569', pct:pct(cogs)},
ship>0?{n:'Shipping Cost', v:-ship, cls:'neg', dot:'#94a3b8', pct:pct(ship)}:null,
cpc>0 ?{n:'CPC / Ad Spend', v:-cpc, cls:'neg', dot:'#94a3b8', pct:pct(cpc)}:null,
stor>0?{n:'Monthly Storage', v:-stor, cls:'neg', dot:'#94a3b8', pct:pct(stor)}:null,
othr>0?{n:'Other Costs', v:-othr, cls:'neg', dot:'#94a3b8', pct:pct(othr)}:null,
].filter(Boolean);
let bh='';
rows.forEach(r=>{
if(r.sec){bh+=`${r.sec}
`;return}
bh+=`
${r.v>=0?'£':'-£'}${Math.abs(r.v).toFixed(2)}
`;
});
bh+=`
Profit per Unit
${profit>=0?'+£':'-£'}${Math.abs(profit).toFixed(2)}
`;
gi('bkL').innerHTML=bh;
// ── Visual ──
const vd=[
{l:'Sale Price', a:price, c:'#2563eb'},
{l:'VAT→HMRC', a:-vatAmt, c:'#b45309'},
{l:'Referral', a:-refAmt, c:'#dc2626'},
{l:'FBA Fee', a:-fbaFee, c:'#7c3aed'},
{l:'COGS', a:-cogs, c:'#475569'},
...(ship>0?[{l:'Shipping',a:-ship,c:'#94a3b8'}]:[]),
...(cpc>0 ?[{l:'CPC', a:-cpc, c:'#94a3b8'}]:[]),
...(stor>0?[{l:'Storage',a:-stor,c:'#94a3b8'}]:[]),
{l:'Profit', a:profit, c:profit>=0?'#059669':'#dc2626'},
];
gi('visL').innerHTML=vd.map(d=>{
const pw=price>0?Math.max(0,Math.min(Math.abs(d.a)/price*100,100)):0;
return `
${d.l}
${d.a>=0?'+£':'-£'}${Math.abs(d.a).toFixed(2)}
`;
}).join('');
// ── VAT Detail ──
const vatOnRef=refAmt*.20, vatOnFBA=fbaFee*.20;
gi('vatL').innerHTML=`
VAT on Your Sale Price
Sale Price (VAT-inclusive) £${price.toFixed(2)}
VAT Rate Applied ${vatPct}%
VAT Amount → HMRC -£${vatAmt.toFixed(2)}
Net Revenue (ex-VAT) £${revenue.toFixed(2)}
Amazon Charges 20% VAT on Their Own Fees
Referral Fee (base) -£${refAmt.toFixed(2)}
↳ 20% VAT on Referral -£${vatOnRef.toFixed(2)}
FBA Fulfilment (base) -£${fbaFee.toFixed(2)}
↳ 20% VAT on FBA Fee -£${vatOnFBA.toFixed(2)}
Total Fee VAT -£${(vatOnRef+vatOnFBA).toFixed(2)}
ℹ️ Non-VAT-registered sellers: set VAT rate to 0% . Your sale price is VAT-inclusive — the VAT amount is what you owe to HMRC, not additional income.
Formula (matches AMZ Scout exactly):
Revenue = Price × (1 − VAT%)
Referral = Full Price × Rate%
Profit = Revenue − Referral − FBA − All Costs
Margin = Profit ÷ Price × 100 | ROI = Profit ÷ COGS × 100
`;
}
// ══ PRICE SOURCE ══════════════════════════════════════
function setPriceSource(src){
_priceSource=src;
['avg','bbx','man'].forEach(s=>{
gi('ps'+s.charAt(0).toUpperCase()+s.slice(1)).classList.toggle('active',s===src);
});
if(src==='avg'&&_avgPrice!==null){
gi('priceI').value=_avgPrice.toFixed(2);
gi('priceNote').textContent='📊 90-day average buybox price from Keepa';
gi('priceNote').className='price-note avg';
} else if(src==='bbx'&&_bbxPrice!==null){
gi('priceI').value=_bbxPrice.toFixed(2);
gi('priceNote').textContent='🏷️ Current buybox price from Keepa';
gi('priceNote').className='price-note bbx';
} else if(src==='man'){
gi('priceNote').textContent='✏️ Manually entered price';
gi('priceNote').className='price-note';
}
calc();
}
function onPriceManual(){
_priceSource='man';
['avg','bbx','man'].forEach(s=>{
const el=gi('ps'+s.charAt(0).toUpperCase()+s.slice(1));
if(el) el.classList.toggle('active',s==='man');
});
gi('priceNote').textContent='✏️ Manually entered price';
gi('priceNote').className='price-note';
calc();
}
// ══ KEEPA FETCH ════════════════════════════════════════
async function fetchK(){
const asin=gi('asinI').value.trim().toUpperCase();
if(!asin||asin.length<10){showMsg('err','⚠️ Enter a valid 10-character ASIN');return}
if(!KEEPA_KEY){demoFetch(asin);return}
const btn=gi('fetchBtn');
btn.classList.add('ld'); hideMsg();
try{
// Request stats=1 for 90-day avg, history=1 for price history
const r=await fetch(`https://api.keepa.com/product?key=${KEEPA_KEY}&domain=2&asin=${asin}&stats=90&history=0`);
const d=await r.json();
if(!d.products?.length){showMsg('err','❌ Product not found. Check the ASIN.');return}
applyKeepa(d.products[0]);
}catch(e){
showMsg('err','❌ Keepa API error. Check your key or network connection.');
}finally{btn.classList.remove('ld')}
}
function applyKeepa(p){
const title=p.title||'Unknown Product';
gi('aTitle').textContent=title;
// Category
const catStr=(p.categoryTree?.[0]?.name||'').toLowerCase();
gi('aCat').textContent=p.categoryTree?.[0]?.name||'—';
mapCat(catStr);
// Weight (grams — Keepa gives grams directly)
if(p.packageWeight){
const wg=Math.round(p.packageWeight);
gi('wgtI').value=wg; gi('aWgt').textContent=wg+'g';
}
// Dimensions mm→cm
if(p.packageLength&&p.packageWidth&&p.packageHeight){
const [l,w,h]=[p.packageLength/10,p.packageWidth/10,p.packageHeight/10].map(x=>+x.toFixed(1));
gi('dL').value=l; gi('dW').value=w; gi('dH').value=h;
gi('aDims').textContent=`${l}×${w}×${h}cm`;
}
// ── PRICE: 90-day average buybox (primary) + current buybox (secondary) ──
// Keepa stats object with stats=90: stats.avg[10] = 90-day avg buybox new (in pence)
// stats.current[10] = current buybox new (in pence)
_avgPrice=null; _bbxPrice=null;
if(p.stats){
// 90-day average — stats.avg array, index 10 = BUY_BOX_NEW
if(p.stats.avg&&p.stats.avg[10]&&p.stats.avg[10]>0){
_avgPrice=p.stats.avg[10]/100;
}
// Current buybox
if(p.stats.current&&p.stats.current[10]&&p.stats.current[10]>0){
_bbxPrice=p.stats.current[10]/100;
}
}
// Fallback: try min/max avg fields
if(!_avgPrice&&p.stats?.avg90&&p.stats.avg90[10]>0){
_avgPrice=p.stats.avg90[10]/100;
}
// Set default price = 90-day average (preferred) or buybox
const usePrice=_avgPrice||_bbxPrice||null;
if(usePrice){
gi('priceI').value=usePrice.toFixed(2);
gi('priceSourceRow').style.display='flex';
_priceSource=_avgPrice?'avg':'bbx';
if(_avgPrice){
gi('psAvg').classList.add('active');
gi('psBbx').classList.remove('active');
gi('psMan').classList.remove('active');
gi('aAvg').style.display='inline';
gi('aAvg').textContent=`📊 £${_avgPrice.toFixed(2)} 90d avg`;
gi('priceNote').textContent=`📊 90-day average buybox price — edit if needed`;
gi('priceNote').className='price-note avg';
}
if(_bbxPrice){
gi('aBbx').textContent=`🏷️ £${_bbxPrice.toFixed(2)} Buybox`;
}
}
// ── Product hero card ──────────────────────────────
// Thumbnail in ASIN card
gi('aThumb').innerHTML = '📦 ';
gi('aPrev').classList.add('show');
// Big product hero card
gi('prodHeroTitle').textContent = title;
gi('prodAmazonLink').href = `https://www.amazon.co.uk/dp/${p.asin||''}`;
// Product image from Keepa (imagesCSV contains image IDs)
const imgEl = gi('prodImgEl');
const imgPh = gi('prodImgPh');
if(p.imagesCSV){
const firstImg = p.imagesCSV.split(',')[0].trim();
if(firstImg){
const imgUrl = `https://images-na.ssl-images-amazon.com/images/I/${firstImg}._AC_SX180_.jpg`;
imgEl.src = imgUrl;
imgEl.style.display = 'block';
imgPh.style.display = 'none';
imgEl.onerror = ()=>{ imgEl.style.display='none'; imgPh.style.display='block'; };
// Also update thumb in asin card
gi('aThumb').innerHTML = ` `;
}
}
// Meta grid
const meta = [];
if(p.packageWeight) meta.push({l:'Weight', v:Math.round(p.packageWeight)+'g', c:'var(--text)'});
if(p.packageLength && p.packageWidth && p.packageHeight){
const [l,w,h]=[p.packageLength/10,p.packageWidth/10,p.packageHeight/10].map(x=>+x.toFixed(1));
meta.push({l:'Dimensions', v:`${l}×${w}×${h}cm`, c:'var(--text)'});
}
if(_avgPrice) meta.push({l:'90d Avg Price', v:'£'+_avgPrice.toFixed(2), c:'var(--green)'});
if(_bbxPrice) meta.push({l:'Buybox Price', v:'£'+_bbxPrice.toFixed(2), c:'var(--blue)'});
if(p.stats?.current?.[3]>0) meta.push({l:'BSR', v:'#'+p.stats.current[3].toLocaleString(), c:'var(--amber)'});
if(p.categoryTree?.[0]) meta.push({l:'Category', v:p.categoryTree[0].name, c:'var(--text2)'});
gi('prodMetaGrid').innerHTML = meta.map(m=>
``
).join('');
// Rating
const rating = p.stats?.current?.[16];
const reviewCount = p.stats?.current?.[17];
if(rating && rating > 0){
const stars = rating/10;
const fullStars = Math.floor(stars);
const halfStar = stars%1>=0.5;
gi('prodStars').textContent = '★'.repeat(fullStars)+(halfStar?'½':'')+'☆'.repeat(5-fullStars-( halfStar?1:0))+` ${stars.toFixed(1)}`;
if(reviewCount>0) gi('prodReviews').textContent = reviewCount.toLocaleString()+' reviews';
if(p.stats?.current?.[3]>0) gi('prodBSR').textContent = 'BSR #'+p.stats.current[3].toLocaleString();
gi('prodRating').style.display='flex';
}
gi('prodHeroCard').style.display='block';
const priceInfo=_avgPrice?` · 90d avg £${_avgPrice.toFixed(2)}`:'';
showMsg('ok',`✅ Loaded: ${title.substring(0,70)}${priceInfo}`);
calc();
}
// Demo mode (no API key)
function demoFetch(asin){
const btn=gi('fetchBtn');
btn.classList.add('ld'); hideMsg();
const demos={
'B09YQRR8WS':{t:'Ilia Beauty | Fullest Volumizing Mascara | 4ml',cat:'beauty',wg:10,l:7.9,w:1.5,h:1.5,avg:20.79,bbx:21.49},
'B0B2WQLHBK':{t:'CeraVe Skin Renewing Night Cream 48g',cat:'beauty',wg:185,l:8.2,w:6.1,h:5.8,avg:12.49,bbx:12.99},
'B07XVKRBDR':{t:'GuruNanda Whitening Toothbrush',cat:'beauty',wg:40,l:22,w:3,h:2,avg:4.65,bbx:4.80},
};
const d=demos[asin]||{t:`Demo Product (${asin})`,cat:'other',wg:350,l:20,w:15,h:10,avg:19.49,bbx:19.99};
setTimeout(()=>{
btn.classList.remove('ld');
gi('aTitle').textContent=d.t;
gi('aCat').textContent=d.cat;
gi('aWgt').textContent=d.wg+'g';
gi('aDims').textContent=`${d.l}×${d.w}×${d.h}cm`;
gi('wgtI').value=d.wg; gi('dL').value=d.l; gi('dW').value=d.w; gi('dH').value=d.h;
gi('catS').value=d.cat;
_avgPrice=d.avg; _bbxPrice=d.bbx; _priceSource='avg';
gi('priceI').value=d.avg.toFixed(2);
gi('priceSourceRow').style.display='flex';
gi('psAvg').classList.add('active'); gi('psBbx').classList.remove('active'); gi('psMan').classList.remove('active');
gi('aAvg').style.display='inline'; gi('aAvg').textContent=`📊 £${d.avg.toFixed(2)} 90d avg`;
gi('aBbx').textContent=`🏷️ £${d.bbx.toFixed(2)} Buybox`;
gi('priceNote').textContent=`📊 90-day average buybox price — edit if needed`;
gi('priceNote').className='price-note avg';
gi('aPrev').classList.add('show');
// Show demo hero card
gi('prodHeroTitle').textContent = d.t;
gi('prodAmazonLink').href = `https://www.amazon.co.uk/s?k=${asin}`;
gi('prodImgPh').style.display='block';
gi('prodImgEl').style.display='none';
gi('prodMetaGrid').innerHTML = [
{l:'Weight',v:d.wg+'g',c:'var(--text)'},
{l:'Dimensions',v:`${d.l}×${d.w}×${d.h}cm`,c:'var(--text)'},
{l:'90d Avg',v:'£'+d.avg.toFixed(2),c:'var(--green)'},
{l:'Buybox',v:'£'+d.bbx.toFixed(2),c:'var(--blue)'},
].map(m=>``).join('');
gi('prodRating').style.display='none';
gi('prodHeroCard').style.display='block';
showMsg('ok',`✅ Demo loaded · 90-day avg £${d.avg.toFixed(2)} set as default · Add Keepa API key for live data`);
calc();
},750);
}
function mapCat(s){
const sel=gi('catS');
if(s.includes('beauty')||s.includes('health')) sel.value='beauty';
else if(s.includes('cloth')||s.includes('fashion')) sel.value='clothing';
else if(s.includes('grocery')||s.includes('food')) sel.value='grocery';
else if(s.includes('kitchen')||s.includes('home')) sel.value='home';
else if(s.includes('electron')||s.includes('computer')) sel.value='electronics';
else if(s.includes('book')) sel.value='books';
else if(s.includes('toy')) sel.value='toys';
else if(s.includes('sport')) sel.value='sports';
else if(s.includes('pet')) sel.value='pet';
else if(s.includes('vitamin')||s.includes('supplement')) sel.value='vitamins';
else if(s.includes('baby')) sel.value='baby';
else if(s.includes('automotive')||s.includes('car')) sel.value='automotive';
}
function syncVat(){const v=gi('vatR').value;gi('vatNum').textContent=v+'%';calc()}
function bTab(name,btn){
document.querySelectorAll('.btab').forEach(b=>b.classList.remove('active'));
document.querySelectorAll('.bpanel').forEach(p=>p.classList.remove('active'));
btn.classList.add('active'); gi('bp-'+name).classList.add('active');
}
function sm(id,val,cls){
const el=gi(id); el.textContent=val; el.className='mval '+(cls||'');
el.classList.remove('flashed'); void el.offsetWidth; el.classList.add('flashed');
}
function showMsg(t,m){const e=gi('aMsg');e.className=`amsg ${t} show`;e.textContent=m}
function hideMsg(){gi('aMsg').classList.remove('show')}
function gi(i){return document.getElementById(i)}
// ══ MODAL CONTENT ══════════════════════════════════════
const MODALS = {
privacy:{
title:'Privacy Policy',
body:`1. Information We Collect
This FBA Calculator tool does not collect, store, or transmit any personal data. All calculations are performed locally in your browser. No ASIN search data, pricing data, or product information is stored on our servers.
2. Keepa API Usage
When you use the Keepa API feature, your ASIN queries are sent directly to Keepa's servers using your own API key. We do not intercept, store, or log these requests. Please refer to Keepa's Privacy Policy for details.
3. Cookies
This tool does not use cookies or any local storage to track users. Your settings are not saved between sessions.
4. Third-Party Services
We use Google Fonts (Inter) for typography. Google may collect standard web font usage data. No advertising or tracking scripts are included.
5. Data Security
Since no data is transmitted to our servers, your product research remains entirely private. Your Keepa API key is used only in your browser and is never sent to VelantoHub servers.
6. Contact
For privacy concerns, contact us at VelantoHub.site
Last updated: March 2026 · VelantoHub.site
`
},
terms:{
title:'Terms of Use',
body:`1. Acceptance of Terms
By using the FBA Scout UK Calculator ("the Tool"), you agree to these Terms of Use. If you do not agree, please do not use the Tool.
2. License
This tool is provided for personal and commercial use by Amazon FBA sellers. You may not reproduce, resell, or redistribute this tool or its code without written permission from VelantoHub.
3. Intellectual Property
© 2026 VelantoHub.site — All Rights Reserved. Developed by Kashif Bilal. The FBA Scout UK branding, design, and code are proprietary to VelantoHub.
4. Accuracy Disclaimer
Fee calculations are based on Amazon UK's publicly available 2026 fee schedule and are cross-verified with AMZ Scout methodology. However, Amazon may update fees without notice. Always verify with Amazon Seller Central.
5. Prohibited Uses
Scraping or automated access to this tool
Using the tool for misleading advertising claims
Reverse-engineering or copying the calculation logic for competing products
6. Governing Law
These terms are governed by applicable law. Disputes shall be resolved through good faith negotiation.
Last updated: March 2026 · © VelantoHub.site
`
},
disclaimer:{
title:'Disclaimer',
body:`Accuracy of Calculations
The FBA Scout UK Calculator provides profit estimates based on Amazon UK's 2026 fee schedule. While we strive for accuracy, this tool is for informational purposes only and should not be used as the sole basis for business decisions.
Fee Changes
Amazon regularly updates its fee structures. Referral fees, FBA fulfilment fees, and other charges may change with 30-days' notice. Always verify current fees in Amazon Seller Central before making purchasing decisions.
VAT
VAT calculations shown are estimates. If you are VAT-registered, consult a qualified accountant for accurate VAT accounting. Non-VAT-registered sellers should set VAT rate to 0%.
Keepa Data
Product data, prices, and dimensions fetched via Keepa API are provided by Keepa and may not always reflect real-time Amazon data. VelantoHub is not responsible for inaccuracies in Keepa's data.
No Financial Advice
This tool does not constitute financial, tax, or legal advice. Always conduct your own due diligence before sourcing products.
Limitation of Liability
VelantoHub and Kashif Bilal shall not be liable for any losses arising from reliance on calculations produced by this tool.
© 2026 VelantoHub.site · Developed by Kashif Bilal · All Rights Reserved
`
}
};
function openModal(type){
const m=MODALS[type]; if(!m) return;
gi('modalTitle').textContent=m.title;
gi('modalBody').innerHTML=m.body;
gi('modal').classList.add('open');
document.body.style.overflow='hidden';
}
function closeModal(){
gi('modal').classList.remove('open');
document.body.style.overflow='';
}
document.addEventListener('keydown',e=>{if(e.key==='Escape') closeModal()});
window.addEventListener('load', calc);