{"id":2978,"date":"2025-10-08T13:28:25","date_gmt":"2025-10-08T11:28:25","guid":{"rendered":"https:\/\/btop.pl\/?p=2978"},"modified":"2025-12-10T08:16:42","modified_gmt":"2025-12-10T07:16:42","slug":"how-to-price-effectively-on-this-calculator-and-guide","status":"publish","type":"post","link":"https:\/\/btop.pl\/en\/how-to-price-effectively-on-this-calculator-and-guide\/","title":{"rendered":"How to price effectively at TEMU: calculator and guide"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><div data-row-text-color=\"dark\" style=\" \" class=\"vc_row wpb_row zolo_wpb_row vc_row-fluid apress_row_class_2157483966ae03f05209f4\"><div class=\"zolo-container zolo_vc_container\"><div class=\"vc_row apcore_vc_row\"><div class=\"wpb_column vc_column_container vc_col-sm-12 apress_col_id_12605559586ae03f0520b6d hover_style_none responsive_block_default\"><div class=\"layer vc_column-inner\"  ><div class=\"wpb_wrapper\"><div class=\"vc_empty_space\"   style=\"height: 80px\"><span class=\"vc_empty_space_inner\"><\/span><\/div>\n\t<div class=\"wpb_text_column wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<p><b>How to price effectively at TEMU: calculator and guide<\/b><\/p>\n<p><span style=\"font-weight: 400;\">On TEMU, the retailer gives you a net base price (think of it as \u201ewholesale\u201d - that's how much you want to sell the goods to TEMU for). It is TEMU that ultimately decides the retail price visible to the customer, and your base price is one of the inputs to their algorithms and campaigns. In the TEMU model, suppliers\/vendors do not have full pricing autonomy and the final price and platform margin are shaped by TEMU (the supplier negotiates the base, the platform shapes the retail). <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Don't have an account yet?<br \/>\n<strong>\ud83d\udc49 <a style=\"color: #1a73e8; text-decoration: underline;\" href=\"https:\/\/seller-eu.temu.com\/registration.html?merchant_exclusive_invitation_code=ufbdc30be1cd6879Zu2d3c06183bc1408\">Click here to register an account with TEMU<\/a>\u00a0<\/strong><\/span><i><\/i><\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"font-weight: 400;\">1) <\/span><b>The basics: what the \u201ebase price\u201d really is at TEMU<\/b><\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3013\" src=\"https:\/\/btop.pl\/wp-content\/uploads\/dasdsad.jpg\" alt=\"\" width=\"1667\" height=\"924\" srcset=\"https:\/\/btop.pl\/wp-content\/uploads\/dasdsad.jpg 1667w, https:\/\/btop.pl\/wp-content\/uploads\/dasdsad-768x426.jpg 768w, https:\/\/btop.pl\/wp-content\/uploads\/dasdsad-1536x851.jpg 1536w\" sizes=\"auto, (max-width: 1667px) 100vw, 1667px\" \/><\/p>\n<p><b>Current working price rule (operational example):<\/b><\/p>\n<blockquote>\n<p><span style=\"font-weight: 400;\">retail price (gross) \u2248 <\/span><b>Base price_net \u00d7 (1 + 11%) \u00d7 (1 + VAT)<\/b><b><br \/>\n<\/b><\/p>\n<\/blockquote>\n<p><span style=\"font-weight: 400;\">In Poland, at VAT 23%, this gives a multiplier of <\/span><b>\u2248 1,3653<\/b><span style=\"font-weight: 400;\">. Attention: <\/span><b>the percentage of TEM surcharge (e.g. 11%) may vary<\/b><span style=\"font-weight: 400;\"> between categories\/periods and is sometimes adjusted with campaigns. (The industry notes the volatility of fees and price management on the TEMU side).<\/span><a href=\"https:\/\/docs-m2.m2epro.com\/docs\/temu-seller-fees-a-complete-guide-for-2025\/?utm_source=chatgpt.com\"> <span style=\"font-weight: 400;\"><br \/>\n<\/span><\/a><\/p>\n<p><b>Why does the base price \u201efloat\u201d?<\/b><b><br \/>\n<\/b><span style=\"font-weight: 400;\">Because participation in campaigns (coupons, bundles, \u201eprice match\u201d), competitive pressures and platform policies influence how TEMU converts and displays retail - and the platform actively advises\/adjusts price levels relative to the market.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><b>2) Why it is not allowed to copy prices from Allegro 1:1<\/b><\/p>\n<p><span style=\"font-weight: 400;\">If you have \u00a3100 gross on Allegro and \u201epaste\u201d this onto TEMU as a base, TEMU will treat \u00a3100 as net, then add its mark-up and VAT. The result: a retail price significantly higher than the market price, a drop in conversions and the risk of lack of exposure in promotions.<\/span><\/p>\n<blockquote>\n<p><span style=\"font-weight: 400;\">Design:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">Estimated retail (gross) = base price_netto \u00d7 (1 + 11%) \u00d7 (1 + 23%)<\/span><\/p>\n<\/blockquote>\n<p><b>Example of error:<\/b><b><br \/>\n<\/b><span style=\"font-weight: 400;\">Base = 100.00 net \u2192 retail \u2248 100 \u00d7 1.3653 = \u00a3136.53 gross (i.e. ~+36.5% vs Allegro).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is the typical reason why it is necessary to count the price on TEMU from zero, rather than mapping the \u201eshop price\u201d. (it is TEMU that is the decider of the retail list price).<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><b>3) Is the \u201ebackward\u201d method of determining the base correct?<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Take, for example, the gross target price from Allegro, e.g. \u00a3100.<br \/>\n<\/span><b>Net = 100 \/ 1.23 = \u00a381.30.<\/b><\/p>\n<p><span style=\"font-weight: 400;\">\u201eRemove\u201d the markup TEMU: base_netto = 81.30 \/ 1.11 = \u00a373.24.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Then TEMU, after adding 11% and VAT, should be back in the region of \u00a3100 gross. This is a good starting point, but remember that TEMU can bump\/lower retail as part of a campaign, market fit or free delivery policy - hence treat this as a price target, not a guarantee. (Mechanism: TEMU controls the retail, the supplier controls the base).<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><b>4) Shipping and the \u201efree delivery\u201d threshold: how not to fall into the \u00a360-\u00a364 trap<\/b><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3019 size-full\" src=\"https:\/\/btop.pl\/wp-content\/uploads\/Zrzut-ekranu-2025-10-8-o-16.19.38.png\" alt=\"\" width=\"854\" height=\"604\" srcset=\"https:\/\/btop.pl\/wp-content\/uploads\/Zrzut-ekranu-2025-10-8-o-16.19.38.png 854w, https:\/\/btop.pl\/wp-content\/uploads\/Zrzut-ekranu-2025-10-8-o-16.19.38-768x543.png 768w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/p>\n<p><strong>Operationally in Poland we often encounter the scenario:<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">&lt; threshold of less than PLN 65: customer pays approx. PLN 12.99 gross; retailer buys InPost label ~\u00a38-8.50 net (example rates from practice).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u2265 threshold (e.g. \u00a365): shipping costs fall on the seller - usually ~\u00a313.50-14.00 gross.<\/span><\/p>\n<blockquote>\n<p>&nbsp;<\/p>\n<p><strong>Risk: If your calculation gives you a retail of ~\u00a360-\u00a364, TEMU's algorithms may \u201epush\u201d the price up to the free delivery threshold for the buyer. Then you cover the shipping and the margin will \u201eeat away\u201d imperceptibly.<\/strong><\/p>\n<\/blockquote>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Thresholds and free delivery policies are sometimes modified by TEMU and depend on the market; official sites generally speak of \u201efree standard shipping\u201d with conditions depending on the country\/period, hence it is worth constantly reviewing the current thresholds and real costs of labels in your integration.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><strong>Practical advice:<\/strong> with low baskets, set the base so that the retailer does not accidentally leave \u2265 the threshold (e.g. \u00a365) unless you plan to finance the shipping from the margin.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><b>5) Invoicing and billing<\/b><\/p>\n<p><span style=\"font-weight: 400;\">It is THEM that invoices the customer (knows at what price it sold the product). You receive the platform's billing\/margin in a separate document (CSV\/PDF report), which Base integrations can automatically retrieve. The logic is that the retailer controls TEMU and the supplier settles with the platform according to the agreed terms.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><b>6) How to count correctly (formulas + checklist)<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Constants (PL example): VAT=23%, surcharge TEMU=11% (variable).<\/span><\/p>\n<p><b>Working patterns:<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Retail (gross) \u2248 Base_netto \u00d7 1.11 \u00d7 1.23 = Base_netto \u00d7 1.3653<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Base_netto (from target retail) \u2248 Target_retail_gross \/ 1.3653<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Base_netto \u201eas Allegro\u201d \u2248 (Allegro_netto \/ 1.23) \/ 1.11<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"font-weight: 400;\">Count the full net cost (purchase + packaging + returns + possible shipping cost if retail \u2265 threshold).<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Set a net margin target and from this set a net base.<\/span><\/li>\n<li><span style=\"font-weight: 400;\">Check that the estimated retail doesn't fall into the \u00a360-\u00a364 band (if you don't want to finance shipping).<\/span><\/li>\n<li><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Simulate campaign variants (coupons, bundles).<\/span><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>\ud83d\udc49 <a style=\"color: #1a73e8; text-decoration: underline;\" href=\"https:\/\/seller-eu.temu.com\/registration.html?merchant_exclusive_invitation_code=ufbdc30be1cd6879Zu2d3c06183bc1408\">Click here to register an account with TEMU<\/a><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><\/div><\/div><div data-row-text-color=\"dark\" style=\" \" class=\"vc_row wpb_row zolo_wpb_row vc_row-fluid apress_row_class_11574348166ae03f0521431\"><div class=\"zolo-container zolo_vc_container\"><div class=\"vc_row apcore_vc_row\"><div class=\"wpb_column vc_column_container vc_col-sm-12 apress_col_id_12610289076ae03f052150e hover_style_none responsive_block_default\"><div class=\"layer vc_column-inner\"  ><div class=\"wpb_wrapper\">\n\t<div class=\"wpb_raw_code wpb_raw_html wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<!doctype html>\n<html lang=\"pl\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\n  <title>TEMU price calculator (with batch sheet)<\/title>\n  <style>\n    :root{\n      --bg: transparent;\n      --card: transparent;\n      --muted:#555555;\n      --fg:#000000;\n      --accent:#22c55e; \/* zielony dla g\u0142\u00f3wnych przycisk\u00f3w *\/\n      --warn:#f59e0b;   \/* pomara\u0144czowy *\/\n      --danger:#ef4444; \/* czerwony *\/\n      --border:#dddddd; \/* obramowania *\/\n      --table:#f5f5f5;  \/* nag\u0142\u00f3wki tabel *\/\n    }\n    *{box-sizing:border-box}\n    body{margin:0; font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Inter,\"Helvetica Neue\",Arial; background:var(--bg); color:#000}\n    .wrap{max-width:1000px; margin:32px auto; padding:0 16px}\n    .title{font-size:clamp(22px,3vw,32px); font-weight:800; letter-spacing:.2px; color:#000}\n    .sub{color:var(--muted); margin-top:4px}\n    .grid{display:grid; grid-template-columns:1fr; gap:16px; margin-top:20px}\n    @media(min-width:900px){.grid{grid-template-columns:1fr 1fr}}\n    .card{background:var(--card); border:1px solid var(--border); border-radius:16px; padding:18px}\n    .card h2{margin:0 0 10px 0; font-size:18px; color:#000}\n    .row{display:grid; grid-template-columns:1fr 160px; gap:10px; align-items:center; margin:10px 0}\n    .row label{font-size:14px; color:#000}\n    input[type=\"number\"], input[type=\"text\"], select{\n      width:100%; background:transparent; color:#000; border:1px solid var(--border);\n      border-radius:10px; padding:10px 12px; font-size:14px\n    }\n    .hint{font-size:12px; color:var(--muted)}\n    .out{\n      display:flex; justify-content:space-between; align-items:center; padding:10px 12px;\n      background:transparent; border:1px dashed var(--border); border-radius:10px;\n      font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; color:#000\n    }\n    .out b{font-weight:700; color:#000}\n    .kpi{display:grid; grid-template-columns:repeat(2,1fr); gap:10px}\n    @media(min-width:520px){.kpi{grid-template-columns:repeat(4,1fr)}}\n    .kpi .tile{background:transparent; border:1px solid var(--border); border-radius:12px; padding:12px}\n    .tile .lbl{font-size:12px; color:var(--muted)}\n    .tile .val{font-size:18px; font-weight:800; color:#000}\n    .badge{\n      display:inline-flex; align-items:center; gap:6px; padding:4px 8px; border-radius:999px;\n      font-size:12px; font-weight:700; background:transparent; color:#000\n    }\n    .ok,.warn,.danger{background:transparent; color:#000}\n    .row .suffix{color:#666; font-size:12px; text-align:right}\n    .flex{display:flex; gap:12px; align-items:center; flex-wrap:wrap}\n    .switch{display:inline-flex; align-items:center; gap:8px; cursor:pointer}\n    .switch input{accent-color:#000}\n    .footer{margin-top:18px; font-size:12px; color:var(--muted)}\n\n    \/* PRZYCISKI: kolorowe, tekst czarny *\/\n    .btn{\n      appearance:none; border:2px solid var(--accent); padding:10px 14px; border-radius:10px;\n      background:var(--accent); color:#000; font-weight:800; cursor:pointer\n    }\n    .btn:hover{filter:brightness(0.95)}\n    \/* warianty *\/\n    .btn-secondary{border-color:#64748b; background:#64748b;}\n    .btn-warning{border-color:var(--warn); background:var(--warn);} \n\n    \/* Tabele \u2013 lekka szaro\u015b\u0107 *\/\n    table{border-collapse:collapse; width:100%}\n    table th, table td{border:1px solid var(--border); padding:8px 10px; color:#000}\n    table thead th{background:var(--table)}\n    table tbody td{background:#fafafa}\n\n    \/* Mini przycisk \"Usu\u0144\" w tabeli *\/\n    .mini-btn{\n      appearance:none; border:2px solid var(--danger); padding:6px 10px; border-radius:8px;\n      background:var(--danger); color:#000; cursor:pointer\n    }\n    .cell-warn{background:rgba(239,68,68,.12)}\n  <\/style>\n<\/head>\n<body>\n  <div class=\"wrap\">\n    <div class=\"title\">TEMU price calculator<\/div>\n    <div class=\"sub\">\n      Recalculate <b>the net base price<\/b>, retail (gross) and margin including the free delivery threshold.\n      <b>Enter target net profit (PLN)<\/b>, that you want to gain from the sale.\n    <\/div>\n\n    <div class=\"grid\">\n      <section class=\"card\">\n        <h2>Inputs (per SKU)<\/h2>\n        <div class=\"row\"><label>Gross purchase price<\/label><input id=\"buyB\" type=\"number\" step=\"0.01\" value=\"18.74\"\/><\/div>\n        <div class=\"row\"><label>Gross packaging cost<\/label><input id=\"packB\" type=\"number\" step=\"0.01\" value=\"6.00\"\/><\/div>\n        <div class=\"row\"><label>Target net profit (PLN)<\/label><input id=\"targetP\" type=\"number\" step=\"0.01\" value=\"5.00\"\/><div class=\"suffix\">e.g. 5.00 = PLN 5 profit<\/div><\/div>\n        <div class=\"row\"><label>VAT (PL)<\/label><input id=\"vat\" type=\"number\" step=\"0.01\" value=\"0.23\"\/><\/div>\n        <div class=\"row\"><label>THEM (markup)<\/label><input id=\"mu\" type=\"number\" step=\"0.01\" value=\"0.11\"\/><\/div>\n        <div class=\"row\"><label>Free delivery threshold (gross)<\/label><input id=\"thr\" type=\"number\" step=\"0.01\" value=\"65.00\"\/><\/div>\n        <div class=\"row\"><label>Shipping cost above threshold (gross)<\/label><input id=\"shipB\" type=\"number\" step=\"0.01\" value=\"13.00\"\/><\/div>\n        <div class=\"flex\" style=\"margin-top:12px\">\n          <label class=\"switch\"><input id=\"cap\" type=\"checkbox\"\/> <span>Force cap retail PLN 64.99<\/span><\/label>\n          <button class=\"btn\" id=\"reset\">Reset to example<\/button>\n        <\/div>\n        <div class=\"footer\">Formulas: retail \u2248 base \u00d7 (1+markup) \u00d7 (1+VAT). Base = cost + profit. Shipping is added when retail \u2265 threshold.<\/div>\n      <\/section>\n\n      <section class=\"card\">\n        <h2>Results<\/h2>\n        <div class=\"kpi\">\n          <div class=\"tile\"><div class=\"lbl\">Net cost<\/div><div class=\"val\" id=\"costNet\">\u2013<\/div><\/div>\n          <div class=\"tile\"><div class=\"lbl\">Net base<\/div><div class=\"val\" id=\"baseNet\">\u2013<\/div><\/div>\n          <div class=\"tile\"><div class=\"lbl\">Retail (gross)<\/div><div class=\"val\" id=\"retailB\">\u2013<\/div><\/div>\n          <div class=\"tile\"><div class=\"lbl\">Net margin<\/div><div class=\"val\" id=\"margin\">\u2013<\/div><\/div>\n        <\/div>\n        <div style=\"margin-top:14px\" class=\"flex\">\n          <span id=\"shipBadge\" class=\"badge ok\">Below the threshold - customer pays shipping<\/span>\n          <span id=\"capInfo\" class=\"badge warn\" style=\"display:none\">CAP 64.99 active<\/span>\n          <span id=\"profitWarn\" class=\"badge danger\" style=\"display:none\">CAP limits profit<\/span>\n        <\/div>\n        <div style=\"margin-top:14px\">\n          <div class=\"out\"><span>Est. shipment (net when \u2265 threshold):<\/span><b id=\"shipNet\">\u2013<\/b><\/div>\n          <div class=\"out\" style=\"margin-top:8px\"><span>Total net cost (including shipping if applicable):<\/span><b id=\"totalCost\">\u2013<\/b><\/div>\n          <div class=\"hint\" style=\"margin-top:8px\">If you turn on CAP and retail &gt; \u00a364.99, the calculator will count the base with CAP. If CAP does not allow you to make a profit, you will see an alert.<\/div>\n        <\/div>\n      <\/section>\n    <\/div>\n  <\/div>\n\n  <div class=\"wrap\" style=\"margin-top:0\">\n    <section class=\"card\" style=\"margin-top:16px\">\n      <h2>Batch sheet - count many products at once<\/h2>\n      <p class=\"hint\" style=\"margin:6px 0 14px 0\">\n        It uses the parameters from the section above (VAT, TEMU markup, threshold, shipping cost and optional CAP 64.99).\n        For each line, enter <b>gross purchase price<\/b>, <b>gross packaging<\/b> i <b>Target net profit (PLN)<\/b>.\n        The rest will be calculated automatically.\n      <\/p>\n\n      <div class=\"flex\" style=\"margin:0 0 10px 0\">\n        <button class=\"btn\" id=\"addRow\">Add line<\/button>\n        <button class=\"btn btn-secondary\" id=\"clearRows\">Clean<\/button>\n        <button class=\"btn btn-warning\" id=\"downloadCsv\">Download CSV<\/button>\n      <\/div>\n\n      <div style=\"overflow:auto\">\n        <table id=\"bulkTable\">\n          <thead>\n            <tr>\n              <th>SKU \/ Name<\/th>\n              <th>Gross purchase<\/th>\n              <th>Gross packaging<\/th>\n              <th>Net profit (PLN)<\/th>\n              <th>Net cost<\/th>\n              <th>Net shipping<\/th>\n              <th>Total net cost<\/th>\n              <th>Net base<\/th>\n              <th>Retail (gross)<\/th>\n              <th>Net margin<\/th>\n              <th>Shipping?<\/th>\n              <th>CAP warning<\/th>\n              <th><\/th>\n            <\/tr>\n          <\/thead>\n          <tbody><\/tbody>\n        <\/table>\n      <\/div>\n      <div class=\"footer\" style=\"margin-top:10px\">Hint: change the parameters above - the sheet will recalculate immediately. You can add as many rows as you like.<\/div>\n    <\/section>\n  <\/div>\n\n  <script>\n    const el = id => document.getElementById(id);\n    const fmt = (n)=> isFinite(n) ? n.toLocaleString('pl-PL',{style:'currency',currency:'PLN'}) : '\u2013';\n    const pct = (n)=> isFinite(n) ? (n*100).toFixed(2).replace('.',',') + '%' : '\u2013';\n    const toNum = (v)=> { const n = parseFloat(v); return isNaN(n)?0:n; };\n\n    const inputs = ['buyB','packB','targetP','vat','mu','thr','shipB','cap'];\n    inputs.forEach(i=> el(i).addEventListener('input', ()=>{ recalc(); recalcBulk(); }));\n    el('reset').addEventListener('click', ()=>{\n      el('buyB').value = 18.74;\n      el('packB').value = 6.00;\n      el('targetP').value = 5.00;\n      el('vat').value = 0.23;\n      el('mu').value = 0.11;\n      el('thr').value = 65.00;\n      el('shipB').value = 13.00;\n      el('cap').checked = false;\n      recalc();\n      recalcBulk();\n    });\n\n    function recalc(){\n      const buyB = toNum(el('buyB').value);\n      const packB = toNum(el('packB').value);\n      const targetProfit = toNum(el('targetP').value);\n      const VAT = toNum(el('vat').value);\n      const MU = toNum(el('mu').value);\n      const THR = toNum(el('thr').value);\n      const shipB = toNum(el('shipB').value);\n      const cap = el('cap').checked;\n\n      \/\/ koszt netto (bez wysy\u0142ki)\n      const costNet = buyB\/(1+VAT) + packB\/(1+VAT);\n\n      \/\/ baza z za\u0142o\u017conym zyskiem, wst\u0119pnie bez wysy\u0142ki\n      let totalCostNet = costNet;\n      let baseNet = totalCostNet + targetProfit;\n      let retailB = baseNet * (1 + MU) * (1 + VAT);\n\n      \/\/ uwzgl\u0119dnij pr\u00f3g \u2013 je\u015bli przekroczony, dolicz wysy\u0142k\u0119 netto i przelicz baz\u0119, by utrzyma\u0107 zysk\n      const needsShip0 = retailB >= THR ? 1 : 0;\n      const shipNet = needsShip0 ? shipB\/(1+VAT) : 0;\n      totalCostNet = costNet + shipNet;\n      baseNet = totalCostNet + targetProfit;\n      retailB = baseNet * (1 + MU) * (1 + VAT);\n\n      \/\/ CAP 64,99 \u2013 je\u015bli aktywny i retail > CAP, policz baz\u0119 z CAP; poka\u017c ostrze\u017cenie, gdy zysk niewystarczaj\u0105cy\n      const CAP_VALUE = 64.99;\n      let capApplied = false;\n      let profitWarn = false;\n      if (cap && retailB > CAP_VALUE){\n        const baseFromCap = CAP_VALUE \/ ((1 + MU) * (1 + VAT));\n        const profitFromCap = baseFromCap - totalCostNet;\n        baseNet = baseFromCap;\n        retailB = CAP_VALUE;\n        capApplied = true;\n        if (profitFromCap + 1e-9 < targetProfit) profitWarn = true;\n      }\n\n      const margin = (baseNet - totalCostNet) \/ baseNet;\n\n      \/\/ render\n      el('costNet').textContent = fmt(costNet);\n      el('baseNet').textContent = fmt(baseNet);\n      el('retailB').textContent = fmt(retailB);\n      el('margin').textContent = pct(margin);\n      el('shipNet').textContent = fmt(shipNet);\n      el('totalCost').textContent = fmt(totalCostNet);\n\n      const badge = el('shipBadge');\n      const needsShip = retailB >= THR ? 1 : 0;\n      if(needsShip){ badge.textContent = '\u2265 pr\u00f3g \u2013 sprzedawca pokrywa wysy\u0142k\u0119'; badge.className = 'badge danger'; }\n      else { badge.textContent = 'Poni\u017cej progu \u2013 klient p\u0142aci wysy\u0142k\u0119'; badge.className = 'badge ok'; }\n\n      el('capInfo').style.display = capApplied ? 'inline-flex' : 'none';\n      const pWarn = el('profitWarn');\n      pWarn.style.display = profitWarn ? 'inline-flex' : 'none';\n      if (profitWarn){ pWarn.textContent = 'CAP ogranicza zysk \u2013 rozwa\u017c podniesienie cap lub zmian\u0119 sk\u0142adu oferty.'; }\n    }\n\n    \/\/ ====== BULK SECTION ======\n    const bulkTbody = document.querySelector('#bulkTable tbody');\n    document.getElementById('addRow').addEventListener('click', ()=> addRow({sku:`SKU-${bulkTbody.children.length+1}`, buy:0, pack:0, profit:5}));\n    document.getElementById('clearRows').addEventListener('click', ()=>{\n      bulkTbody.innerHTML='';\n      addRow({sku:'SKU-1', buy:18.74, pack:6.00, profit:5.00});\n      recalcBulk();\n    });\n\n    function readParams(){\n      return {\n        VAT: toNum(el('vat').value),\n        MU: toNum(el('mu').value),\n        THR: toNum(el('thr').value),\n        shipB: toNum(el('shipB').value),\n        cap: el('cap').checked\n      }\n    }\n\n    function addRow(pref){\n      const tr = document.createElement('tr');\n      tr.innerHTML = `\n        <td><input type=\"text\" value=\"${pref.sku}\"><\/td>\n        <td><input type=\"number\" step=\"0.01\" value=\"${pref.buy}\"><\/td>\n        <td><input type=\"number\" step=\"0.01\" value=\"${pref.pack}\"><\/td>\n        <td><input type=\"number\" step=\"0.01\" value=\"${pref.profit}\"><\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td class=\"out-c\">\u2013<\/td>\n        <td style=\"text-align:center\"><button class=\"mini-btn\">Usu\u0144<\/button><\/td>\n      `;\n      tr.querySelectorAll('input').forEach(inp=> inp.addEventListener('input', ()=> recalcRow(tr)));\n      tr.querySelector('.mini-btn').addEventListener('click', ()=>{ tr.remove(); recalcBulk(); });\n      bulkTbody.appendChild(tr);\n      recalcRow(tr);\n    }\n\n    function parseVal(inp){ const n = parseFloat(inp.value); return isNaN(n)?0:n; }\n\n    function recalcRow(tr){\n      const [skuI,buyI,packI,profitI] = tr.querySelectorAll('input');\n      const out = tr.querySelectorAll('.out-c');\n      const {VAT,MU,THR,shipB,cap} = readParams();\n\n      const buyB = parseVal(buyI);\n      const packB = parseVal(packI);\n      const targetProfit = parseVal(profitI);\n\n      const costNet = buyB\/(1+VAT) + packB\/(1+VAT);\n      let baseNet = costNet + targetProfit;\n      let retailB = baseNet * (1+MU) * (1+VAT);\n\n      const needsShip0 = retailB >= THR ? 1 : 0;\n      const shipNet = needsShip0 ? shipB\/(1+VAT) : 0;\n      const totalCostNet = costNet + shipNet;\n\n      \/\/ zapewnij targetProfit po ewentualnej wysy\u0142ce\n      baseNet = totalCostNet + targetProfit;\n      retailB = baseNet * (1+MU) * (1+VAT);\n\n      \/\/ CAP\n      let capWarn = '';\n      if (cap && retailB > 64.99){\n        const baseFromCap = 64.99 \/ ((1+MU)*(1+VAT));\n        const profitFromCap = baseFromCap - totalCostNet;\n        baseNet = baseFromCap;\n        retailB = 64.99;\n        if (profitFromCap + 1e-9 < targetProfit) capWarn = 'CAP < docelowy zysk';\n      }\n\n      const margin = (baseNet - totalCostNet) \/ baseNet;\n      const needsShip = retailB >= THR;\n\n      const fmtC = (n)=> isFinite(n) ? n.toLocaleString('pl-PL',{style:'currency',currency:'PLN'}) : '\u2013';\n      const fmtP = (n)=> isFinite(n) ? (n*100).toFixed(2).replace('.',',')+'%' : '\u2013';\n\n      out[0].textContent = fmtC(costNet);\n      out[1].textContent = fmtC(shipNet);\n      out[2].textContent = fmtC(totalCostNet);\n      out[3].textContent = fmtC(baseNet);\n      out[4].textContent = fmtC(retailB);\n      out[5].textContent = fmtP(margin);\n      out[6].textContent = needsShip ? 'TAK' : 'NIE';\n      out[7].textContent = capWarn || '\u2013';\n      out[7].classList.toggle('cell-warn', !!capWarn);\n    }\n\n    function recalcBulk(){ bulkTbody.querySelectorAll('tr').forEach(tr=> recalcRow(tr)); }\n\n    function tableToCSV(){\n      const headers = ['SKU','KupnoBrutto','PakowanieBrutto','ZyskNetto','KosztNetto','WysylkaNetto','KosztLacznyNetto','BazaNetto','DetalBrutto','MarzaNetto','WysylkaFlag','CapOstrzezenie'];\n      const rows = [headers];\n      bulkTbody.querySelectorAll('tr').forEach(tr=>{\n        const tds = tr.querySelectorAll('td');\n        const vals = [\n          tds[0].querySelector('input').value,\n          tds[1].querySelector('input').value,\n          tds[2].querySelector('input').value,\n          tds[3].querySelector('input').value,\n          ...Array.from(tds).slice(4,12).map(td=> (td.textContent||'').replace(\/\\s\/g,''))\n        ];\n        rows.push(vals);\n      });\n      return rows.map(r=> r.map(v=> \/[,;\"\\n]\/.test(v)? '\"'+v.replace(\/\"\/g,'\"\"')+'\"' : v).join(';')).join('\\n');\n    }\n\n    document.getElementById('downloadCsv').addEventListener('click', ()=>{\n      const blob = new Blob([tableToCSV()], {type:'text\/csv;charset=utf-8;'});\n      const a = document.createElement('a');\n      a.href = URL.createObjectURL(blob);\n      a.download = 'temu-bulk-calc.csv';\n      document.body.appendChild(a); a.click(); document.body.removeChild(a);\n    });\n\n    \/\/ init\n    (function init(){\n      recalc();\n      addRow({sku:'SKU-1', buy:18.74, pack:6.00, profit:5.00});\n      addRow({sku:'SKU-2', buy:0.00, pack:0.00, profit:5.00});\n      recalcBulk();\n    })();\n  <\/script>\n<\/body>\n<\/html>\n\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><\/div><\/div><div data-row-text-color=\"dark\" style=\" \" class=\"vc_row wpb_row zolo_wpb_row vc_row-fluid apress_row_class_10892353966ae03f0521bb1\"><div class=\"zolo-container zolo_vc_container\"><div class=\"vc_row apcore_vc_row\"><div class=\"wpb_column vc_column_container vc_col-sm-12 apress_col_id_18423471386ae03f0521c69 hover_style_none responsive_block_default\"><div class=\"layer vc_column-inner\"  ><div class=\"wpb_wrapper\">\n\t<div class=\"wpb_text_column wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<p><b>7) A \u201ereal-life\u201d example (numbers close to real)<\/b><\/p>\n<blockquote>\n<p><span style=\"font-weight: 400;\">Purchase cost: PLN 18.74 gross, packaging: PLN 6.00 gross \u2192 net cost = PLN 20.11.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Net margin target: 20%.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Base_netto = 20.11 \/ (1 - 0.20) = \u00a325.14.<\/span><\/p>\n<\/blockquote>\n<p><span style=\"font-weight: 400;\">Retail (gross) \u2248 25.14 \u00d7 1.3653 = \u00a334.3 (below the threshold - the customer pays shipping, you buy the label; the cost of the label does not \u201ego into\u201d your cost unless the threshold is exceeded).<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><strong>If you intend to use promotional campaigns on THEM you need to set a higher margin target!<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p><b>8) The most common mistakes and how to avoid them<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Copying prices from Allegro \u2192 price on TEMU increases by surcharge and VAT. Always count from net base!\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">No control of shipping threshold \u2192 accidental jumping \u2265 threshold and loss of margin on delivery.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Outdated markup \u2192 work on \u201eas of today\u201d parameters; TEMU markup can change per category\/market.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">No campaign simulation \u2192 discounts\/coupons TEMU affect final price and profitability.<\/span><\/p>\n<blockquote>\n<p><b>Practice note: <\/b><span style=\"font-weight: 400;\">Specific values (e.g. \u201e11%\u201d, \u201e\u00a312.99\u201d, \u201e\u00a365 threshold\u201d, InPost label rates) are operational and subject to change. Treat these as a starting point, and include monitoring of current conditions in your TEMU panel and real label costs from your logistics partner in your pricing process.<\/span><\/p>\n<\/blockquote>\n<p>&nbsp;<\/p>\n<blockquote>\n<p><em>Author: Adrian \u015amigiel<br \/>\n<\/em><em>Date of publication: 8.10.2025r.<\/em><\/p>\n<\/blockquote>\n\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><\/div><\/div><div data-row-text-color=\"dark\" style=\" \" class=\"vc_row wpb_row zolo_wpb_row vc_row-fluid apress_row_class_15962063246ae03f052209f\"><div class=\"zolo-container zolo_vc_container\"><div class=\"vc_row apcore_vc_row\"><div class=\"wpb_column vc_column_container vc_col-sm-12 apress_col_id_18013523786ae03f052213a hover_style_none responsive_block_default\"><div class=\"layer vc_column-inner\"  ><div class=\"wpb_wrapper\">\n\t<div class=\"wpb_raw_code wpb_raw_html wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<!-- Elfsight Appointment Booking | bTOP -->\n<script src=\"https:\/\/elfsightcdn.com\/platform.js\" async><\/script>\n<div class=\"elfsight-app-2218fcb6-ef3c-4b36-b4cb-b78c4084e633\" data-elfsight-app-lazy><\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><\/div><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"How to set prices effectively on TEMU: a calculator and guide On TEMU, the seller sets a net base price (think of this as the \u201ewholesale\u201d price \u2013 the price at which you want to sell your goods to TEMU). It is TEMU that ultimately decides the retail price visible to the customer, and your base price is one of the inputs for their algorithms and campaigns. In the TEMU model, suppliers\/sellers do not have full pricing autonomy, and the final price and the platform\u2019s margin are determined by TEMU (the supplier negotiates the base price, whilst the platform<span class=\"read_more_area\"><a class=\"read-more\" href=\"https:\/\/btop.pl\/en\/how-to-price-effectively-on-this-calculator-and-guide\/\"> Read more <\/a><\/span>","protected":false},"author":2,"featured_media":3017,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,67],"tags":[],"class_list":["post-2978","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aktualnosci","category-temu"],"_links":{"self":[{"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/posts\/2978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/comments?post=2978"}],"version-history":[{"count":21,"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/posts\/2978\/revisions"}],"predecessor-version":[{"id":3190,"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/posts\/2978\/revisions\/3190"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/media\/3017"}],"wp:attachment":[{"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/media?parent=2978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/categories?post=2978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/btop.pl\/en\/wp-json\/wp\/v2\/tags?post=2978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}