<?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: li yao</title>
    <description>The latest articles on DEV Community by li yao (@li_yao_40ae2d6dca5e2f146f).</description>
    <link>https://dev.to/li_yao_40ae2d6dca5e2f146f</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%2F4206792%2F183bf232-3a36-4e2b-bec7-1196e8c2561f.png</url>
      <title>DEV Community: li yao</title>
      <link>https://dev.to/li_yao_40ae2d6dca5e2f146f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/li_yao_40ae2d6dca5e2f146f"/>
    <language>en</language>
    <item>
      <title>Three Roblox revenue splits, and why almost every tax calculator gets them wrong</title>
      <dc:creator>li yao</dc:creator>
      <pubDate>Mon, 26 Oct 2026 12:18:44 +0000</pubDate>
      <link>https://dev.to/li_yao_40ae2d6dca5e2f146f/three-roblox-revenue-splits-and-why-almost-every-tax-calculator-gets-them-wrong-4ho5</link>
      <guid>https://dev.to/li_yao_40ae2d6dca5e2f146f/three-roblox-revenue-splits-and-why-almost-every-tax-calculator-gets-them-wrong-4ho5</guid>
      <description>&lt;p&gt;I was building a small calculator for Roblox payouts and did what I usually do first: looked at what already existed, to see what the competition got right.&lt;/p&gt;

&lt;p&gt;They disagreed with each other. Same input, different answers — sometimes by more than 2x.&lt;/p&gt;

&lt;p&gt;That's a bad sign for a category of tool whose entire job is arithmetic. So I went to the source: Roblox's creator documentation. It turns out there isn't one "Roblox tax". There are &lt;strong&gt;three separate payout structures&lt;/strong&gt;, plus a fourth layer (the cash-out rate) that most calculators also get wrong.&lt;/p&gt;

&lt;p&gt;Here they are, with the numbers straight from the docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. In-experience items: a flat 30% platform commission
&lt;/h2&gt;

&lt;p&gt;Game passes, developer products, private servers. Roblox takes 30% of the sale, the creator keeps 70%.&lt;/p&gt;

&lt;p&gt;This is the structure everyone means when they say "the Roblox tax", and it's the one where the popular &lt;code&gt;price * 0.7&lt;/code&gt; formula happens to be correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Marketplace avatar items: a progressive revenue share
&lt;/h2&gt;

&lt;p&gt;This is where it falls apart. Avatar items sold on the Marketplace (clothing, accessories, emotes) don't use a flat fee. The creator's share &lt;strong&gt;grows with the price relative to the item type's price floor&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Price vs floor&lt;/th&gt;
&lt;th&gt;Creator share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1×&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.3×&lt;/td&gt;
&lt;td&gt;37%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5×&lt;/td&gt;
&lt;td&gt;41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2×&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3×&lt;/td&gt;
&lt;td&gt;62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4×&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6× and above&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At the floor price, the creator keeps &lt;strong&gt;30%&lt;/strong&gt;, not 70%. A flat-30%-fee calculator overstates a UGC seller's payout by more than double.&lt;/p&gt;

&lt;p&gt;The docs also note that if the item is bought &lt;em&gt;inside&lt;/em&gt; an experience rather than in the Marketplace, the split becomes three ways — 30% creator, 40% experience owner, 30% Roblox.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Limited resales: a four-way split
&lt;/h2&gt;

&lt;p&gt;Reselling a community-created Limited splits the sale price as &lt;strong&gt;50% reseller / 10% original creator / 10% seller-affiliate / 30% Roblox&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This one matters because it kills a specific fantasy: buy at 1,000 and flip at 1,000 and you get 500 back, not 1,000. Any "flipping profit" arithmetic that ignores this is fiction.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The cash-out rate, which has three values
&lt;/h2&gt;

&lt;p&gt;Even after the platform takes its cut, "how much is this worth in dollars" has more than one answer. The Developer Exchange programme currently publishes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;th&gt;Applies to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;0.0038&lt;/code&gt; USD per Earned Robux&lt;/td&gt;
&lt;td&gt;Standard rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0.0054&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;In eligible games, purchases by US players verified 18+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0.0035&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Earned Robux held before 5 Sep 2025, 10am PT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the minimum is 30,000 &lt;strong&gt;Earned&lt;/strong&gt; Robux — where "earned" excludes Robux you bought yourself or got from trading. A wallet full of Robux isn't the same as a wallet full of cashable Robux.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug: one formula, three structures
&lt;/h2&gt;

&lt;p&gt;The failure mode isn't bad arithmetic. It's &lt;strong&gt;wrong premise&lt;/strong&gt;: someone reads the 30% commission rule, writes &lt;code&gt;payout = price * 0.7&lt;/code&gt;, and ships it. That code is correct for exactly one of the three structures and silently wrong for the others.&lt;/p&gt;

&lt;p&gt;Worse, it's &lt;em&gt;plausibly&lt;/em&gt; wrong. A user who sells game passes gets the right answer, tells a friend, and the friend — who sells UGC — gets a number that's off by 130% and assumes it's their own mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix is embarrassingly small
&lt;/h2&gt;

&lt;p&gt;The correct implementation isn't clever math. It's making the user state which structure they're under, then applying a lookup:&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;const&lt;/span&gt; &lt;span class="nx"&gt;SCENARIOS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;inExperience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Game pass / developer product&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;ugcAtFloor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Marketplace item at its floor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;ugcAt2xFloor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Marketplace item at 2× floor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;ugcAt6xFloor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Marketplace item at 6× floor or more&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;limitedResale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Reselling a Limited&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;payout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SCENARIOS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;scenario&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Roblox floors the creator's share&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. One &lt;code&gt;select&lt;/code&gt;, one lookup table, one multiplication. The engineering value isn't in the arithmetic — it's in &lt;strong&gt;refusing to guess which row of the table the user is on&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I also added the reverse direction, because "I want 1,000 Robux after the cut" is the question people actually ask:&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;const&lt;/span&gt; &lt;span class="nx"&gt;requiredPrice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I took away from this
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A tool category where competitors disagree is a signal, not a problem.&lt;/strong&gt; If ten calculators give ten answers, at least nine are wrong, and the tenth probably doesn't say why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copying a competitor's formula is how you inherit its bug.&lt;/strong&gt; The only defensible source was the publisher's own docs — and they were more nuanced than any calculator I found.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every page should state which scenario it applies to.&lt;/strong&gt; "30% tax" isn't a fact; it's a fact &lt;em&gt;conditional on what you're selling&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship the caveat.&lt;/strong&gt; The page states plainly that a 1,000 Robux game-pass sale works out to about $2.66 — not the roughly $10 a player spends to buy that much Robux — and that the figure only holds for the structure you selected. Under-promising on a calculator is what makes people trust the numbers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tool is at &lt;a href="https://gameformulas.com/games/robux-tax-calculator/" rel="noopener noreferrer"&gt;gameformulas.com&lt;/a&gt; if you want to poke at it — it's static HTML with a few lines of vanilla JS, no framework, no backend, no analytics. Every figure on the page links to the documentation it came from and the date it was last checked.&lt;/p&gt;

&lt;p&gt;If you've built something similar: did you handle the UGC progressive share, or did you inherit the flat-30% assumption like I almost did?&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>roblox</category>
    </item>
  </channel>
</rss>
