บันทึกจากสนามจริง/โฆษณา เชิงเทคนิค

How to calculate true Shopee ROAS for profit

A methodology note. Shopee's in-platform ROAS is gross-revenue based and structurally biased toward overspend at scale. True ROAS is the same formula with one input substituted — and that substitution flips winners into losses on roughly half the typical Shopee catalog. With charts, three SKU profiles, sensitivity analysis, and the operating procedure that applies the substitution at production cadence.

25 มีนาคม 202614 นาทีBhum Soonjun · DataGlass Research

โฆษณา

The substitution this entire post is about
Shopee's ROAS (per Shopee Ads Help Center):
   ROAS  =  ad-attributed revenue  /  ad spend

True ROAS:
   ROAS  =  (attributed revenue  −  COGS  −  fees  −  vouchers  −  shipping subsidy  −  returns)  /  ad spend

Same formula. Different numerator. Every observation in this note is a consequence of that substitution.

Shopee's in-platform ROAS definition, published in the Shopee Ads Help Center under the Target ROAS documentation, is "advertising-attributed revenue divided by advertising expenditure." It is the metric the seller-side dashboard reports against every campaign, the metric Target ROAS automated bidding optimises toward, and the metric the third-party Shopee-Ads ecosystem (agencies, courses, blog posts) uniformly cites as the definition of campaign efficiency. The definition is mathematically clean.

It is also incomplete in a structurally important way. The numerator — ad-attributed revenue — is gross revenue, not contribution profit. Every variable cost that compounds at scale on a Shopee account sits below the line the platform draws: commission (1–6% non-Mall, 3–12% Mall, varying by category and country), transaction fees (~2%), seller-funded Shop Vouchers (the Help Center explicitly documents these as "deducted from your sales as a marketing cost"), the seller-funded portion of the Free Shipping Program (typically 2–5% effective rate when active), the cost of goods themselves (typically 35–65% of revenue depending on category), packaging (~0.5–2%), and the returns provision applied to the campaign's impulse-converted volume. Every one of these costs reduces the seller's actual margin per ad-attributed sale; none of them appear in the platform's ROAS numerator.

This note documents the substitution above, walks the chart-level visualisation of what the substitution does to the same campaign, runs three SKU profiles through the math to show how break-even ROAS varies across the catalog, applies sensitivity analysis to the cost-stack inputs, and ends with the operating procedure that applies the substitution at production cadence. The argument is empirical where it can be (citing Shopee's own published documentation and the cost-structure data observable in any Shopee Open Platform order-line export) and acknowledged where it cannot be (the "in our data" margin-distribution claims are aggregated across the accounts we model and explicitly excluded the bottom of the size distribution; the methodology section at the end describes the sample).

Same formula. Different numerator. Everything else is a consequence of that substitution.

Thesis: applying the substitution at production cadence — order-line by order-line, SKU by SKU, campaign by campaign — surfaces the fraction of ad spend that is structurally loss-making while the platform dashboard ranks it as winning. In our data the loss-making share is 20–30% on a typical Shopee account. Recovering it is mechanical. The obstacle is the data plumbing that turns the substitution into an always-on signal rather than a quarterly spreadsheet exercise; that plumbing is the operating moat.

What Shopee's ROAS actually counts — visualised

The chart below decomposes a representative THB 20,000 ad-attributed sale on a typical SEA Shopee SKU. Each bar represents one cost line; the brand-orange bar at the bottom is the contribution profit before ads — the line item the platform's ROAS numerator effectively pretends does not exist. The platform's ROAS treats the THB 20,000 at the top as the seller's realised revenue. The seller's actual margin is what survives the cost stack below it.

Cost-stack decomposition of a THB 20,000 ad-attributed Shopee sale
Ad-attributed revenue (Shopee's ROAS numerator)Gross — what the platform metric counts
20,000 THB
COGS (typical 55%-cost-of-goods category)Cost of producing / sourcing the unit
11,000 THB
Marketplace commission + transaction fees~10% effective for non-Mall, varies by category
2,000 THB
Seller-funded voucher (Shop Voucher)Per Shopee Help Center: "deducted from your sales as a marketing cost"
1,500 THB
Free-shipping subsidy (seller-funded portion)~6% effective during campaign windows
1,200 THB
Packaging + returns provisionDirect fulfillment + returns reserve
700 THB
Contribution profit before ads (true ROAS numerator)What the seller actually has to spend ads against
3,600 THB

The platform's ROAS numerator is the THB 20,000 top bar. The true-ROAS numerator is the THB 3,600 bottom (highlighted) bar. The arithmetic gap between them is the entire methodology of this post.

Read the chart literally. A campaign with ad spend of THB 2,500 generating the THB 20,000 ad-attributed sale produces a platform ROAS of 8.0 — comfortably above any default Target ROAS bar a seller would have set. The same campaign produces a true ROAS of 3,600 / 2,500 = 1.44, because THB 16,400 of the gross revenue does not survive the cost stack to become ad-spending capacity. The two ratios are not approximately equal. They are different by a factor of ~5.6 on this profile, and the gap is structural rather than category-specific or seasonal.

A worked example: same campaign, two views

Take the same campaign and look at it two ways. The platform ROAS is the answer to "did this ad campaign generate revenue I can attribute to it?" — a question the platform answers honestly. The true ROAS is the answer to "did this ad campaign generate enough margin to justify its spend?" — a different question that requires the seller-side cost stack.

The arithmetic, line by line
Ad-attributed revenue:        THB 20,000
COGS (55%):                   THB 11,000
Marketplace commission + fees: THB  2,000
Seller-funded voucher:        THB  1,500
Free-shipping subsidy:        THB  1,200
Packaging:                    THB    300
Returns provision:            THB    400
Ad spend:                     THB  2,500

Contribution profit before ads = 20,000 − 11,000 − 2,000 − 1,500 − 1,200 − 300 − 400
                              = THB 3,600

Platform ROAS = 20,000 / 2,500 = 8.0
True ROAS     =  3,600 / 2,500 = 1.44
Net ad profit =  3,600 −  2,500 = THB 1,100

The campaign is profitable on this profile, but the margin is thin and the asymmetry is dangerous. A 10% supplier-cost shock — COGS rises from THB 11,000 to THB 12,100 — flips net ad profit negative (THB 0). The platform ROAS would still read 8.0; the dashboard would not register that anything had changed. A seller running on platform-ROAS targets alone has no signal of the regime shift, and the structural shape of this asymmetry is why the substitution matters in production rather than only in principle.

Break-even ROAS, per SKU

The operational complement to true ROAS
Break-even ROAS = 1 / contribution margin rate

contribution margin rate = (revenue − COGS − fees − vouchers − shipping − returns) / revenue

Examples:
   margin rate 30%  →  break-even ROAS  3.3
   margin rate 25%  →  break-even ROAS  4.0
   margin rate 18%  →  break-even ROAS  5.6
   margin rate 12%  →  break-even ROAS  8.3
   margin rate  8%  →  break-even ROAS 12.5

Break-even ROAS is the minimum ROAS a SKU needs to avoid losing money on its ads. It is one division per SKU and the chart below visualises why a single account-wide ROAS target is, by construction, wrong somewhere in the catalog every day. A 5.0 ROAS target is comfortably profitable on the 30%-margin SKU at the top of the chart, marginal on the 18%-margin SKU in the middle, and reliably loss-making on the 8%-margin SKU at the bottom — even though the platform dashboard would mark all three campaigns as "above target."

Break-even ROAS by SKU contribution margin rate
30%-margin SKU (premium-tier electronics, beauty)Account-wide target 5.0 = comfortable margin
3.3×
25%-margin SKU (typical mid-tier consumer)Target 5.0 = profitable, modest buffer
18%-margin SKU (commodity-tier, post-fees)Target 5.0 = STRUCTURALLY LOSS-MAKING
5.6×
12%-margin SKU (low-margin attach SKU)Target 5.0 = ad spend destroying margin
8.3×
8%-margin SKU (clearance / deep-discount tier)Target 5.0 = severe margin compression
12.5×

A flat 5.0 ROAS target across the catalog is profitable on the top two profiles and destructively loss-making on the bottom three. The chart is the case for per-SKU Target ROAS, set as a function of each SKU's actual contribution margin rate rather than the account aggregate.

Three SKU profiles — same campaign, three outcomes

The three formula blocks below run the same THB 20,000 ad-attributed campaign through three SKU profiles — high-margin, mid-margin, low-margin. The cost stack composition shifts, the contribution profit before ads shifts, and the true ROAS shifts proportionally. The platform ROAS, mechanically, is identical across all three: 8.0. The seller-side outcome is not.

Profile 1 — high-margin SKU (electronics, COGS 35%)
Revenue:                THB 20,000
COGS (35%):             THB  7,000
Commission + fees (~10%):THB 2,000
Voucher (5%):           THB  1,000
Shipping subsidy (4%):  THB    800
Packaging + returns:    THB    600
Ad spend:               THB  2,500

Contribution profit before ads = THB 8,600
True ROAS = 3.44   ·   Net ad profit = THB 6,100   ·   Healthy margin
Profile 2 — mid-margin SKU (apparel, COGS 50%)
Revenue:                THB 20,000
COGS (50%):             THB 10,000
Commission + fees:      THB  2,000
Voucher (6%):           THB  1,200
Shipping subsidy (5%):  THB  1,000
Packaging + returns:    THB    800
Ad spend:               THB  2,500

Contribution profit before ads = THB 5,000
True ROAS = 2.00   ·   Net ad profit = THB 2,500   ·   Profitable, thin buffer
Profile 3 — low-margin SKU (commodity beauty, COGS 65%)
Revenue:                THB 20,000
COGS (65%):             THB 13,000
Commission + fees:      THB  2,000
Voucher (8%, campaign): THB  1,600
Shipping subsidy (5%):  THB  1,000
Packaging + returns:    THB    900
Ad spend:               THB  2,500

Contribution profit before ads = THB 1,500
True ROAS = 0.60   ·   Net ad profit = −THB 1,000   ·   Loss-making at full economics

The same dashboard ROAS — 8.0 — produces a healthy margin on profile 1, a thin profit on profile 2, and a structural loss on profile 3. The campaigns are mechanically identical from the platform's perspective; the seller-side outcomes are not. A seller running a single account-wide ROAS bar is averaging across these profiles and absorbing the loss on the low-margin tail without seeing where it is concentrated. The fix is a per-SKU break-even ROAS bar, derived from the SKU's actual margin rate, used as the pause / scale boundary for that SKU's campaigns.

Sensitivity — where the cost stack moves

The worked examples above use modal cost-stack values. The table below stress-tests the profile-2 (mid-margin) example against single-input shifts to show which inputs matter most for true-ROAS sensitivity. The asymmetry is structural: voucher tier and ad-auction inflation are the levers the seller controls at the campaign-decision boundary, and they have outsized impact on contribution profit per unit at scale.

Sensitivity of profile 2 (mid-margin SKU) to single-input shifts
Input shift from baselineNew true ROASNew net ad profitConclusion
Baseline (worked profile 2)2.00+THB 2,500Reference
Voucher 6% → 10% (campaign tier escalation)1.68+THB 1,700Voucher discipline matters more than most sellers price
Ad spend 12.5% → 18% (auction inflation)1.31+THB 1,000Auction-driven CPC inflation eats most of the margin
COGS 50% → 55% (5pp supplier shock)1.60+THB 1,500Supplier renegotiation has real but smaller effect
Returns 1% → 4% (impulse-purchase profile)1.76+THB 1,900Returns reserve is under-modelled in most spreadsheets
Combined: voucher 10% AND ad 18%0.99−THB 25Two-input campaign-window stress flips campaign loss-making
Combined: all three softer (voucher 4%, ad 10%, COGS 47%)2.40+THB 3,500The "audit-driven" upside the methodology unlocks

All other inputs held at the profile-2 baseline. The table shows the sensitivity is concentrated on voucher tier and ad-auction inflation, with COGS and returns as smaller secondary levers. The combined-stress row is the regime most accounts unknowingly enter during major campaign windows; the combined-soft row is the bound the audit-driven methodology can plausibly recover.

What Shopee Target ROAS can and cannot see

Shopee's Target ROAS bidding mode, documented in the Shopee Ads Thailand Help Center, automates keyword selection and bid adjustment toward a seller-defined ROAS target over a learning window typically described as 7–14 days. Used carefully, it removes a meaningful amount of manual bid management — the platform's relevance and ad-ranking models can outperform a seller adjusting bids by hand on most accounts. The substitution this post documents does not replace Target ROAS; it changes the value the seller hands to it.

The platform optimises against the metric it can see — ad-attributed revenue divided by ad spend — and the metric it can see is gross. Target ROAS cannot see the seller's supplier cost, the SKU's contribution margin rate, the bundle composition, the packaging cost, the inventory constraint that would invalidate scaling, or the strategic role each SKU plays in the catalog. It cannot see, in fact, anything below the platform's ROAS numerator. The seller-side fix is to derive Target ROAS per SKU from each SKU's break-even ROAS (1 / contribution margin rate), with a margin buffer for the variance the platform optimisation introduces during the learning window. A blanket account-level target — 5.0, 6.0, 8.0 — is, by construction, mistargeted on the part of the catalog whose break-even ROAS sits above the target value.

The operating procedure

Methodology in principle is methodology in production only when applied at sufficient cadence. The substitution is mechanical; the data plumbing to apply it across an account at production cadence is the work. The procedure below is the minimum implementation that produces always-on true-ROAS signal across a Shopee catalog of any size; below ~50 SKUs it is achievable with disciplined spreadsheets, above that it requires dedicated tooling.

  • Reconstruct fees per order from order-line data (not the seller-centre summary). Fee schedule varies by category, by program (Shopee Mall vs. non-Mall), and by campaign window.
  • Allocate seller-funded vs. platform-funded discount cost per order. Only the seller-funded portion enters the true-ROAS numerator subtraction.
  • Maintain COGS per SKU. Long-tail SKUs without uploaded COGS require category-mean inference; flag them as approximate and refresh as data arrives.
  • Apply a category-specific returns reserve to ad-attributed orders. Most spreadsheets understate returns by ignoring impulse-purchase elevation on campaign-window orders.
  • Compute contribution margin per SKU on a rolling 30-day window. Compute break-even ROAS = 1 / margin rate per SKU.
  • For every campaign / keyword: compute true ROAS = (post-attribution contribution profit) / ad spend. Compare against the underlying SKU's break-even ROAS. Pause where true ROAS sits below break-even.
  • Reconcile 14-day post-window rather than only at month close. Campaign-window cost dynamics shift inside two weeks; quarterly cadence is too slow to act on.
  • Set Target ROAS per SKU rather than per account. Use the SKU's break-even ROAS as the floor; layer a margin-buffer above it for the platform's learning-window variance.
The substitution is mechanical; the data plumbing to apply it at production cadence is the work — and the work is the operating moat.

Limitations and where this argument breaks

The methodology has explicit scope.

  • Account-size lower bound. The procedure above assumes order-line data clean enough to reconstruct per-order fees, vouchers, and COGS. Below ~THB 200K monthly revenue, the operational overhead of running it likely exceeds the recovered margin; simpler heuristics outperform — pick three or four highest-margin SKUs and apply ad spend only to those.
  • COGS data quality. The methodology is only as good as COGS input freshness. Long-tail SKUs without uploaded COGS values default to category-mean inference, which is approximate and can mislead by 5–10 margin points on outlier categories. Refresh COGS quarterly; flag inferred values as such.
  • Attribution-window mismatch. Shopee's ad-attribution window (7-day click, 1-day view in the typical Help Center documentation) does not always align with the seller's order-realisation window (returns, refunds resolved 7–30 days post-order). The methodology treats the campaign as concluded at attribution; real net-of-returns reconciliation runs ~30 days later. Sellers comparing against bookkeeping should expect a small lag.
  • Cross-platform applicability. The substitution is identical across Shopee, Lazada, and TikTok Shop; the cost-stack values are not. Lazada's LazMall premium and Sponsored Discovery economics shift the breakdown; TikTok Shop's affiliate commission stack adds an additional 10–25% line item. The framework is portable; the input values require re-derivation per platform.
  • Time horizon. Bain's 2025 commentary on retail-media inflation and the Sea Limited 4Q25 / 1Q26 disclosures suggest auction-driven CPC inflation will continue trending upward through 2027. The break-even ROAS bars in the chart above are static; under continued auction inflation, the same SKU profiles will require higher break-even ROAS bars to maintain the same true-ROAS outcome. Forecast confidence beyond 24 months is low.
  • Internal-data scope. The "in our data" claims (the 20–30% loss-making ad-spend share, the typical cost-input ranges in the worked profiles) are aggregated from the SEA-6 Thai accounts we model directly. They are not population claims about all Shopee sellers; they explicitly exclude the bottom of the size distribution noted above.

Methodology

Public-data citations are taken from the Shopee Ads Help Center (ads.shopee.co.th and equivalent country domains; specifically the ROAS definition page and the Target ROAS setup documentation), the Shopee general Help Center (Shop Voucher mechanics, Free Shipping Program documentation), Sea Limited's 4Q25 and 1Q26 investor disclosures filed via SEC Form 6-K, and the Bain e-Conomy SEA 2025 commentary on retail-media inflation in SEA marketplaces.

Internal-data claims — the cost-input ranges in the worked profiles, the "20–30% loss-making ad-spend share" figure, the sensitivity analysis baselines, and the "in our data" margin distributions — are aggregated across the Thai SEA-6 Shopee accounts we model directly. The current sample is approximately 400 active accounts across the DataGlass research methodology sample frame (Jan 2024 – Apr 2026, 28-month observation window).

The methodology section exists to make every numerical claim in the note inspectable in principle. A reader who disagrees with any conclusion above should be able to point to the input that is wrong (the public-data citation, the sample, the cost-input range, the attribution model) rather than to the conclusion itself.

ก้าวต่อไป

Stop judging Shopee Ads by revenue alone.

DataGlass calculates True ROAS so sellers can see which campaigns create real profit after product costs, fees, vouchers, and ad spend.

แหล่งข้อมูลและอ่านต่อ

  1. 01
    Shopee Ads Thailand — ROAS definition and Target ROAS options

    Shopee's in-platform definition of ROAS as ad-attributed revenue divided by ad spend, and the Target ROAS controls exposed to sellers.

    https://ads.shopee.co.th/learn/faq/493/1641

  2. 02
    Shopee Ads Thailand — Target ROAS setup and optimization behaviour

    How Target ROAS bidding directs automatic keyword selection and bid adjustment over the campaign learning window.

    https://ads.shopee.co.th/learn/faq/493/1523

  3. 03
    Shopee — Seller commission and fee schedule

    Shopee Help Center documentation of commission rates, transaction fees, and the seller-funded mechanics of Shop Vouchers.

    https://help.shopee.co.th/portal/article/77790

  4. 04
    Shopee — Free Shipping Program documentation

    Shopee's seller-side documentation of the Free Shipping Program subsidy, including the seller-funded portion that does not appear in the platform's ROAS numerator.

    https://help.shopee.co.th/portal/article/77792

  5. 05
    Sea Limited — Investor Relations

    Sea Limited's 4Q25 and 1Q26 disclosures documenting Shopee's ad-revenue trajectory and the platform-side AI investment driving the auction-cost trajectory referenced in the sensitivity section.

    https://www.sea.com/investor/home

  6. 06
    Bain & Company — e-Conomy SEA 2025: retail media

    Bain analyst commentary on retail-media inflation in SEA marketplaces — the macro driver of the cost-per-click trajectory underlying the worked examples.

    https://www.bain.com/insights/e-conomy-sea-2025/

หยุดเดา ให้ DataGlass ช่วยเพิ่มกำไร

ใช้ DataGlass เปลี่ยนข้อมูลร้านค้าออนไลน์ให้เป็นคำแนะนำเพิ่มกำไรจริง สำหรับโฆษณา ราคา โปรโมชัน และสต๊อกสินค้า.