<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Starway Global</title>
    <description>The latest articles on DEV Community by Starway Global (@starwayglobalfz).</description>
    <link>https://dev.to/starwayglobalfz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4240725%2F074e41bc-423f-444c-9535-e52663bfb5fd.png</url>
      <title>DEV Community: Starway Global</title>
      <link>https://dev.to/starwayglobalfz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/starwayglobalfz"/>
    <language>en</language>
    <item>
      <title>Designing a Multi-Store Profit Feed That Doesn't Lie</title>
      <dc:creator>Starway Global</dc:creator>
      <pubDate>Thu, 12 Nov 2026 11:37:58 +0000</pubDate>
      <link>https://dev.to/starwayglobalfz/designing-a-multi-store-profit-feed-that-doesnt-lie-8ef</link>
      <guid>https://dev.to/starwayglobalfz/designing-a-multi-store-profit-feed-that-doesnt-lie-8ef</guid>
      <description>&lt;p&gt;TikTok Shop operators often run several stores, several ad accounts, and several people who all need the same answer: &lt;strong&gt;are we actually making money?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A dashboard that only adds revenue from each store can look healthy while profit is leaking through returns, delayed fees, creator commissions, and campaign spend. The problem is usually not the chart. It is the grain and timing of the underlying profit feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one daily ledger grain
&lt;/h2&gt;

&lt;p&gt;Use one row per store, market, currency, and business date. Keep gross merchandise value, seller-funded discounts, platform fees, affiliate commissions, refunds, and ad spend as separate columns. Do not flatten them into a single revenue number too early; once the details disappear, reconciliation becomes guesswork.&lt;/p&gt;

&lt;p&gt;Store the source timestamp and the ingestion timestamp together. This makes late-arriving orders and corrected settlements visible instead of silently rewriting yesterday's total.&lt;/p&gt;

&lt;h2&gt;
  
  
  Normalize time before comparing stores
&lt;/h2&gt;

&lt;p&gt;Orders, ads, and settlements may use different time zones. Convert all event timestamps to a documented reporting time zone, then derive the business date from that normalized time. Pair every displayed metric with the time zone used to calculate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat returns and fees as delayed events
&lt;/h2&gt;

&lt;p&gt;A refund can arrive days after the order. A commission can be estimated first and finalized later. A robust feed should support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;event date&lt;/strong&gt; — when the sale happened;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;posting date&lt;/strong&gt; — when the adjustment became known;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;revision version&lt;/strong&gt; — which settlement record is current.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep both event-date and posting-date views. Finance needs the corrected ledger; operations often needs to see when a problem was discovered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Allocate shared costs explicitly
&lt;/h2&gt;

&lt;p&gt;Ad spend and creator cost should have a documented allocation rule. An ad account linked to two stores can be split by tracked revenue, order count, or a fixed operating rule. The exact rule matters less than making it stable, visible, and versioned.&lt;/p&gt;

&lt;p&gt;Do not let a visual grouping imply a precision that the source data does not have. Label estimated contribution separately from settled profit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make metric semantics part of the API
&lt;/h2&gt;

&lt;p&gt;A useful feed should return field definitions alongside values. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"store_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"store_01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"business_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"2026-11-12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"settled_revenue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;8240.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"refunds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;312.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"platform_fees"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;641.22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"creator_cost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;530.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"ad_spend"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1120.40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"contribution_profit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5636.83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"is_estimated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The schema is intentionally boring. Boring fields are easier to audit, compare, and monitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put anomalies into the data model
&lt;/h2&gt;

&lt;p&gt;Late settlements, duplicate imports, currency mismatches, and negative adjusted orders should become explicit quality flags. A feed that quietly drops these rows creates a more dangerous problem than a dashboard with a visible warning.&lt;/p&gt;

&lt;p&gt;A practical validation layer can check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every order maps to one known store.&lt;/li&gt;
&lt;li&gt;Currency conversion uses the documented rate date.&lt;/li&gt;
&lt;li&gt;The settled total remains within a defined tolerance of the event-date estimate.&lt;/li&gt;
&lt;li&gt;Ad spend exists for every active campaign account.&lt;/li&gt;
&lt;li&gt;Refund and fee revisions never overwrite the raw source record.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Use the feed for decisions, not decoration
&lt;/h2&gt;

&lt;p&gt;Once the ledger is normalized, operators can answer useful questions consistently: which store has the best contribution margin, which campaign is creating revenue without profit, where returns are eroding a product, and which creator mix is improving repeatable economics.&lt;/p&gt;

&lt;p&gt;Multi-store reporting is less about connecting more charts and more about agreeing on one auditable definition of profit. The original operations guide behind this model is available in the &lt;a href="https://www.fz567.cn/blog/multi-store-management" rel="noopener noreferrer"&gt;multi-store management playbook&lt;/a&gt;, and the &lt;a href="https://www.fz567.cn/tools/profit-calculator" rel="noopener noreferrer"&gt;free profit calculator&lt;/a&gt; can help validate unit economics before the data is connected.&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>tiktok</category>
      <category>ecommerce</category>
      <category>analytics</category>
    </item>
    <item>
      <title>A Practical Break-Even ROAS Model for TikTok Shop Sellers</title>
      <dc:creator>Starway Global</dc:creator>
      <pubDate>Thu, 12 Nov 2026 09:45:49 +0000</pubDate>
      <link>https://dev.to/starwayglobalfz/a-practical-break-even-roas-model-for-tiktok-shop-sellers-3lml</link>
      <guid>https://dev.to/starwayglobalfz/a-practical-break-even-roas-model-for-tiktok-shop-sellers-3lml</guid>
      <description>&lt;p&gt;Most TikTok Shop dashboards show revenue, ad spend and ROAS. Those numbers are useful, but they do not tell you whether an order made money.&lt;/p&gt;

&lt;p&gt;The missing layer is contribution margin. Once you calculate it, break-even ROAS becomes a simple business rule instead of a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with contribution profit per order
&lt;/h2&gt;

&lt;p&gt;Use the real cost stack, not only the product cost:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contribution profit =
  selling price
  - product cost
  - platform fee
  - affiliate commission
  - shipping and fulfilment
  - payment fee
  - refund allowance
  - advertising spend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selling price             $40
product cost              $12
platform fee               $3
affiliate commission        $6
fulfilment                 $5
expected refunds           $2
advertising               $10
------------------------------
contribution profit         $2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The order generated $40 of revenue and $2 of profit. That is a 5% contribution margin after advertising. A revenue-first report would make the order look much healthier than it actually is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn margin into break-even ROAS
&lt;/h2&gt;

&lt;p&gt;Contribution margin before ads is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;margin before ads = contribution before ads / revenue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Break-even ROAS is the inverse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;break-even ROAS = 1 / margin before ads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a product contributes 35% before advertising:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;break-even ROAS = 1 / 0.35 = 2.86
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ROAS 2.4 is below break-even. ROAS 3.2 leaves some room for ads, refunds and testing.&lt;/p&gt;

&lt;p&gt;Here is the same rule as JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;breakEvenRoas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contributionMarginBeforeAds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contributionMarginBeforeAds&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;Infinity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;contributionMarginBeforeAds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;breakEvenRoas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 2.857...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The three costs sellers miss most
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Affiliate commission
&lt;/h3&gt;

&lt;p&gt;Creator commission is often 10–30% of the sale. If you calculate margin without it, your break-even threshold is too low.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Refunds and return loss
&lt;/h3&gt;

&lt;p&gt;A refund is not only a reversed sale. It can include return shipping, damaged inventory and payment costs. Build an expected refund allowance into the model.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Discounts and campaign prices
&lt;/h3&gt;

&lt;p&gt;If the advertised price is $40 but the campaign converts at $32, use $32. Otherwise you are calculating the margin of a price the customer did not pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a product-level decision table
&lt;/h2&gt;

&lt;p&gt;A useful operations view should show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;selling price;&lt;/li&gt;
&lt;li&gt;variable cost per order;&lt;/li&gt;
&lt;li&gt;contribution margin before ads;&lt;/li&gt;
&lt;li&gt;break-even ROAS;&lt;/li&gt;
&lt;li&gt;target ROAS;&lt;/li&gt;
&lt;li&gt;refund rate;&lt;/li&gt;
&lt;li&gt;advertising spend;&lt;/li&gt;
&lt;li&gt;contribution profit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That turns campaign management into a repeatable comparison. A high-revenue product with a thin margin should not receive the same scale target as a lower-revenue product with more contribution profit.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical stop rule
&lt;/h2&gt;

&lt;p&gt;Instead of asking, “Did this campaign beat ROAS 3?” ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the product’s break-even ROAS?&lt;/li&gt;
&lt;li&gt;Is the reported ROAS calculated over the same attribution window?&lt;/li&gt;
&lt;li&gt;Are refunds and affiliate commissions included?&lt;/li&gt;
&lt;li&gt;Does the campaign produce contribution profit after advertising?&lt;/li&gt;
&lt;li&gt;Is the result repeatable at the next budget level?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This prevents a common failure mode: scaling a campaign that reports a healthy ROAS while the underlying product is already below its true threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculator
&lt;/h2&gt;

&lt;p&gt;You can run the formula without an account in the free break-even ROAS calculator:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.fz567.cn/tools/breakeven-roas-calculator" rel="noopener noreferrer"&gt;https://www.fz567.cn/tools/breakeven-roas-calculator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the written walkthrough, see:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.fz567.cn/blog/roas-breakeven-tutorial" rel="noopener noreferrer"&gt;https://www.fz567.cn/blog/roas-breakeven-tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key idea is simple: ROAS is a performance metric, but contribution profit is the decision metric.&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>ecommerce</category>
      <category>analytics</category>
      <category>tiktok</category>
    </item>
  </channel>
</rss>
