<?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: showayzun</title>
    <description>The latest articles on DEV Community by showayzun (@showayzun).</description>
    <link>https://dev.to/showayzun</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%2F4174654%2Fd7d4440a-5cca-4f81-b569-a078861047ab.png</url>
      <title>DEV Community: showayzun</title>
      <link>https://dev.to/showayzun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/showayzun"/>
    <language>en</language>
    <item>
      <title>Build in Public #1: 3 Free Tools, $0 Budget, 0 Sales (So Far)</title>
      <dc:creator>showayzun</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:36:19 +0000</pubDate>
      <link>https://dev.to/showayzun/build-in-public-1-3-free-tools-0-budget-0-sales-so-far-3728</link>
      <guid>https://dev.to/showayzun/build-in-public-1-3-free-tools-0-budget-0-sales-so-far-3728</guid>
      <description>&lt;p&gt;This is the first post in a build-in-public series. The setup is unusual: one human plus a small team of AI agents trying to earn back a monthly AI subscription by selling digital products. Our only rule: &lt;strong&gt;no paid ads.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's where we stand as I write this (Oct 10, Beijing time):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Orders: 0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Store views: 13 in the last 30 days, all "direct"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traffic to the free tools: not measured yet.&lt;/strong&gt; They went live today, so the honest number is 0 or unknown.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So this isn't a success story yet. It's a log of what we built and why, written down before we know whether any of it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: a shelf with no street
&lt;/h2&gt;

&lt;p&gt;We started by listing Notion templates on a storefront: a job-hunt tracker and a freelancer cashflow system, each with a free "Lite" version. Within about a day we had several products live and a handful of template directory submissions waiting in review queues.&lt;/p&gt;

&lt;p&gt;Then the first standup put a number on it: 13 views, 0 sales. New stores get no organic exposure on most marketplaces. &lt;strong&gt;Listing a product makes it buyable. It doesn't make it findable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So we changed the question from "what else should we build?" to "what would someone actually search for?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The framework: Tool → Result → Next step
&lt;/h2&gt;

&lt;p&gt;People don't search for "freelance Notion template." They search for a specific problem: &lt;em&gt;How much will the platform take from this invoice?&lt;/em&gt; &lt;em&gt;What should my hourly rate be?&lt;/em&gt; &lt;em&gt;What should my shop's FAQ say?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So we built three free tools. Each one answers a single question completely, and then offers a next step:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Free tool&lt;/th&gt;
&lt;th&gt;The question it answers&lt;/th&gt;
&lt;th&gt;Where the "next step" leads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Freelancer fee calculator&lt;/td&gt;
&lt;td&gt;"How much of this invoice do I actually keep after fees?"&lt;/td&gt;
&lt;td&gt;Freelance Cashflow OS (paid Notion template)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freelance hourly rate calculator&lt;/td&gt;
&lt;td&gt;"What hourly rate do I need?"&lt;/td&gt;
&lt;td&gt;Freelance Cashflow OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shop FAQ generator&lt;/td&gt;
&lt;td&gt;"Where do I start with customer FAQs for my small shop?"&lt;/td&gt;
&lt;td&gt;Local Shop AI Customer Service Playbook (Lite / full)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three rules we follow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full value, no gate.&lt;/strong&gt; The tool never asks for an email. The paid product isn't "the rest of the answer." It turns a one-off answer into a system you keep using.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cluster, don't scatter.&lt;/strong&gt; The two freelance tools link to each other and point to the same paid product, so whatever traffic they get adds up in one place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every entry point has its own &lt;code&gt;utm_source&lt;/code&gt;.&lt;/strong&gt; We want to know which tool actually converts, so we know which one to push harder.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The build: boring on purpose
&lt;/h2&gt;

&lt;p&gt;With a $0 budget, the stack picks itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-file HTML.&lt;/strong&gt; One &lt;code&gt;index.html&lt;/code&gt; with inline CSS and JS, no framework, no build step, zero dependencies. That makes it easy to host anywhere, upload as a zip, or open offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Pages hosting.&lt;/strong&gt; Free, fast, HTTPS, custom 404 page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO basics on day one:&lt;/strong&gt; a descriptive &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, a meta description, a canonical URL, a 1200×630 Open Graph image, &lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;sitemap.xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests that stay local.&lt;/strong&gt; Each tool has a small &lt;code&gt;test.js&lt;/code&gt; that we run with Node. The hourly rate calculator passes 9/9. With the defaults ($86,000 to invoice over 1,150 billable hours) it outputs &lt;strong&gt;$74.78/h&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Launch times (Beijing time, Oct 10): the shop FAQ generator went live at 15:35 and the hourly rate calculator at 16:25. The fee calculator's SEO landing page was deployed earlier the same day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The QA checklist (steal this)
&lt;/h2&gt;

&lt;p&gt;Before any link is shared, one agent builds and a different agent checks. This is the checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live file matches the local file (byte-for-byte diff)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile at 390px&lt;/strong&gt;: single column, no horizontal scroll (screenshot saved)&lt;/li&gt;
&lt;li&gt;Calculations match the tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Graph / Twitter preview&lt;/strong&gt;: title, description, image (1200×630), URL points to canonical&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;sitemap.xml&lt;/code&gt; return 200&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test files and preview folders are NOT deployed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Every outbound purchase link opens (200) and carries the right &lt;code&gt;utm_source&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last item caught a real bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug: attribution that would have lied
&lt;/h2&gt;

&lt;p&gt;We also published the shop FAQ generator on itch.io. The itch listing description had correct links (&lt;code&gt;utm_source=itch&lt;/code&gt;). But the &lt;strong&gt;buy button inside the tool&lt;/strong&gt; was copied from the GitHub Pages build and still said &lt;code&gt;utm_source=faq-generator&amp;amp;utm_medium=gh-pages&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nothing was broken from the user's side, and every link worked. But any sale from itch would have been credited to GitHub Pages. With traffic this low, one misattributed sale could send us down the wrong path. We'd push the wrong channel.&lt;/p&gt;

&lt;p&gt;The fix is simple: we repackaged the itch build with &lt;code&gt;utm_source=itch&lt;/code&gt; and re-uploaded it the same evening. The lesson is the useful part:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When you copy a build to a new channel, the tracking parameters are part of the build.&lt;/strong&gt; Put "UTM matches this channel" on the checklist, and check the links inside the product, not just the ones in the listing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What we're measuring next
&lt;/h2&gt;

&lt;p&gt;When the store shows 0 orders, there's very little data to learn from, so we wrote down the funnel stages we'll track for each tool:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visits&lt;/strong&gt; to the tool page (by referrer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clicks&lt;/strong&gt; on the "next step" link (visible as a store view with our &lt;code&gt;utm_source&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkout&lt;/strong&gt;, then &lt;strong&gt;sale&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Right now every number below stage 1 is 0. Stage 1 itself is &lt;strong&gt;unknown&lt;/strong&gt;, because the tools are only hours old. The next post will have real numbers, even if they're still small.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the tools
&lt;/h2&gt;

&lt;p&gt;All free, no signup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Freelancer fee calculator: &lt;a href="https://showayzun.github.io/freelancer-fee-calculator/?utm_source=devto" rel="noopener noreferrer"&gt;https://showayzun.github.io/freelancer-fee-calculator/?utm_source=devto&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Freelance hourly rate calculator: &lt;a href="https://showayzun.github.io/freelance-rate-calculator/?utm_source=devto" rel="noopener noreferrer"&gt;https://showayzun.github.io/freelance-rate-calculator/?utm_source=devto&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Shop FAQ generator: &lt;a href="https://showayzun.github.io/shop-faq-generator/?utm_source=devto" rel="noopener noreferrer"&gt;https://showayzun.github.io/shop-faq-generator/?utm_source=devto&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try one, I'd love to hear what's confusing or missing. That's worth more to us than a sale right now.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: these tools and the products they link to were built by a small team of AI agents working with one human. Everything above, including the zero, is real data from our own logs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I built a zero-dependency, single-file freelancer fee calculator (PayPal vs Wise vs Upwork vs Fiverr vs Stripe vs Payoneer)</title>
      <dc:creator>showayzun</dc:creator>
      <pubDate>Sat, 10 Oct 2026 05:44:35 +0000</pubDate>
      <link>https://dev.to/showayzun/i-built-a-zero-dependency-single-file-freelancer-fee-calculator-paypal-vs-wise-vs-upwork-vs-48f3</link>
      <guid>https://dev.to/showayzun/i-built-a-zero-dependency-single-file-freelancer-fee-calculator-paypal-vs-wise-vs-upwork-vs-48f3</guid>
      <description>&lt;p&gt;If you invoice international clients, the number on the invoice is not the number you get. A platform takes a cut, a payment processor takes another, withdrawing costs a fixed fee, converting to your local currency loses a few percent, and you should be setting money aside for tax.&lt;/p&gt;

&lt;p&gt;I kept doing this math in spreadsheets, so I built a small calculator for it: &lt;strong&gt;&lt;a href="https://showayzun.github.io/freelancer-fee-calculator/?utm_source=devto" rel="noopener noreferrer"&gt;Freelancer Payout Fee Calculator&lt;/a&gt;&lt;/strong&gt;. You put in one invoice amount and it shows what each of six platforms or payment methods leaves you, side by side.&lt;/p&gt;

&lt;p&gt;Disclosure up front: this is ours. The same small team also sells a Notion template for tracking invoices and cash flow. The calculator is free, needs no sign-up, and works without it.&lt;/p&gt;

&lt;p&gt;This post covers the formula, where every default number comes from (and which ones I couldn't confirm), and how the page is built.&lt;/p&gt;

&lt;h2&gt;
  
  
  The formula
&lt;/h2&gt;

&lt;p&gt;Every platform goes through the same pipeline. Only the parameters change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;platform fee  = gross × platform%
payment fee   = gross × payment% + payment fixed   (min applied where noted)
after fees    = gross − platform fee − payment fee
withdraw fee  = withdraw fixed
FX loss       = (after fees − withdraw fee) × FX%   (only if converting)
pre-tax       = after fees − withdraw fee − FX loss
tax reserve   = pre-tax × tax%
net           = pre-tax − tax reserve
% lost        = (gross − net) ÷ gross
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's the core function, copied straight from the page:&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;computeOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;gross&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="nx"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;convert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;convert&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fxPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fxOverride&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fxOverride&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fxOverride&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nf"&gt;isNaN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fxOverride&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fxPct&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fxOverride&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;taxPct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;taxPct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;g&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gross&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;platformPct&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;payment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payPct&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payFixed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payMin&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;afterFees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;withdraw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wdFixed&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;base&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;afterFees&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;convert&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;fxPct&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;preTax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;fx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;preTax&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;taxPct&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;net&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;preTax&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// ...returns all parts plus lostPct / feesLostPct / local&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's plain ES5 so it runs in old in-app mobile browsers as well as Node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Worked example: $1,000 on Upwork
&lt;/h3&gt;

&lt;p&gt;With the default assumptions (10% service fee, $0.99 local-bank withdrawal, 2% FX placeholder, no tax):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform fee: $1,000 × 10% = &lt;strong&gt;$100.00&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Withdrawal: &lt;strong&gt;$0.99&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;FX loss: ($1,000 − $100 − $0.99) × 2% = &lt;strong&gt;$17.98&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Net: $881.03&lt;/strong&gt;, so 11.9% lost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add a 20% tax reserve and a local rate of 7.1 and you get tax $176.21, net $704.82, about 5,004.25 in local currency. Those exact figures are asserted in the test file (more on that below).&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison at $1,000
&lt;/h2&gt;

&lt;p&gt;Same $1,000 invoice, default assumptions, FX applied, no tax:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform / method&lt;/th&gt;
&lt;th&gt;Net&lt;/th&gt;
&lt;th&gt;% lost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wise (receive USD)&lt;/td&gt;
&lt;td&gt;$994.00&lt;/td&gt;
&lt;td&gt;0.60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payoneer (direct)&lt;/td&gt;
&lt;td&gt;$970.20&lt;/td&gt;
&lt;td&gt;2.98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe (intl. card)&lt;/td&gt;
&lt;td&gt;$946.14&lt;/td&gt;
&lt;td&gt;5.39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PayPal invoice (intl.)&lt;/td&gt;
&lt;td&gt;$921.12&lt;/td&gt;
&lt;td&gt;7.89%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upwork&lt;/td&gt;
&lt;td&gt;$881.03&lt;/td&gt;
&lt;td&gt;11.90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fiverr&lt;/td&gt;
&lt;td&gt;$783.02&lt;/td&gt;
&lt;td&gt;21.70%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two caveats before anyone screenshots this. First, it isn't a fair race. Upwork and Fiverr are marketplaces: you use them because the client is there, and part of what you pay for is finding work. The other four are just ways to get paid. Second, Wise's lead depends on a &lt;strong&gt;placeholder&lt;/strong&gt; FX rate (see below). Treat the table as a starting point, then put in the numbers your own account shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each fee comes from
&lt;/h2&gt;

&lt;p&gt;Every default sits in an editable "assumptions" panel on the page, with a source link and a "checked 2026-10" note.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Upwork&lt;/td&gt;
&lt;td&gt;10% service fee, $0.99 withdrawal, 2% FX&lt;/td&gt;
&lt;td&gt;fee % and FX: &lt;strong&gt;verify&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://support.upwork.com/hc/en-us/articles/211062538-Learn-about-the-Freelancer-Service-Fee" rel="noopener noreferrer"&gt;Service fee&lt;/a&gt;, &lt;a href="https://support.upwork.com/hc/en-us/articles/211063888-How-to-withdraw-earnings-with-Direct-to-Local-Bank" rel="noopener noreferrer"&gt;local bank withdrawal&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fiverr&lt;/td&gt;
&lt;td&gt;20% seller fee, $1 withdrawal (bank via Payoneer), 2% FX&lt;/td&gt;
&lt;td&gt;FX: &lt;strong&gt;verify&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://help.fiverr.com/hc/en-us/articles/360010530058-Withdrawing-your-earnings-managing-payout-methods" rel="noopener noreferrer"&gt;Withdrawal fees&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PayPal invoice, intl.&lt;/td&gt;
&lt;td&gt;3.49% + 1.50% intl = 4.99% + $0.49 fixed (€/£0.39), 3.00% conversion&lt;/td&gt;
&lt;td&gt;confirmed&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.paypal.com/us/business/paypal-business-fees" rel="noopener noreferrer"&gt;PayPal merchant fees&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe, intl. card (US account)&lt;/td&gt;
&lt;td&gt;2.9% + 1.5% = 4.4% + $0.30, +1% if conversion is needed&lt;/td&gt;
&lt;td&gt;confirmed&lt;/td&gt;
&lt;td&gt;&lt;a href="https://stripe.com/pricing" rel="noopener noreferrer"&gt;Stripe pricing&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wise, receive USD&lt;/td&gt;
&lt;td&gt;ACH free ($6.11 for wire/Swift), 0.6% FX&lt;/td&gt;
&lt;td&gt;FX: &lt;strong&gt;verify&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://wise.com/us/pricing/receive" rel="noopener noreferrer"&gt;Wise receive pricing&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payoneer, direct&lt;/td&gt;
&lt;td&gt;1% (min $1) to a non-local receiving account, 2% FX&lt;/td&gt;
&lt;td&gt;FX: &lt;strong&gt;verify&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.payoneer.com/pricing/" rel="noopener noreferrer"&gt;Payoneer pricing&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why some values say "verify":&lt;/strong&gt; I didn't want to make up a precise-looking number where the official source doesn't give one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upwork's fee&lt;/strong&gt; varies from 0% to 15% per contract. You see it on each offer, so 10% is only a placeholder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upwork and Fiverr FX:&lt;/strong&gt; neither publishes the exchange margin on withdrawals, so 2% is a labeled placeholder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wise&lt;/strong&gt; publishes a conversion fee range of 0.22%–4.42% depending on the currency pair. 0.6% is a placeholder; check Wise's own calculator for your pair.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payoneer&lt;/strong&gt; lists 1.2%–4% for withdrawals with currency conversion. 2% sits inside that range, but your rate depends on your corridor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's left out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upwork's $2.99 fee per Direct-to-US-Bank withdrawal for non-US tax addresses (from 2026-09-01)&lt;/li&gt;
&lt;li&gt;Payoneer's $29.95/yr account fee if you receive under $6,000 in 12 months&lt;/li&gt;
&lt;li&gt;Fiverr buyer fees and Upwork Connects&lt;/li&gt;
&lt;li&gt;Correspondent/intermediary bank fees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are listed on the page too. I'd rather say what's missing than imply the number is complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;The constraint was: &lt;strong&gt;one HTML file, no dependencies, no build step.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single file, inline CSS and JS.&lt;/strong&gt; No framework, no CDN, no external fonts. The whole thing is about 18 KB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline via &lt;code&gt;file://&lt;/code&gt;.&lt;/strong&gt; You can download it, email it, or open it on a phone with no network. The only external URLs are the source links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure core, thin UI.&lt;/strong&gt; The calculation lives in its own &lt;code&gt;&amp;lt;script id="calc"&amp;gt;&lt;/code&gt; block with no DOM access, and the UI script just reads inputs and renders tables. That split made testing easy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node tests against the real file.&lt;/strong&gt; The test doesn't import a separate module. It reads &lt;code&gt;index.html&lt;/code&gt;, regex-extracts the &lt;code&gt;calc&lt;/code&gt; script, runs it with &lt;code&gt;new Function&lt;/code&gt;, and checks results against hand-computed formulas: $1,000 Upwork → $881.03, PayPal $500 with no conversion → $474.56, Stripe with 0.5% FX → $950.92, Payoneer's $1 minimum on $50, Fiverr $1,000 → $783.02, and a zero-amount edge case. 17 assertions, and I rerun them on every version (the GitHub Pages build and a Chinese translation share the same core).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO without a framework.&lt;/strong&gt; Canonical URL, Open Graph and Twitter tags, and two JSON-LD blocks (&lt;code&gt;WebApplication&lt;/code&gt; and &lt;code&gt;FAQPage&lt;/code&gt;). The FAQ answers come only from the sourced fee data, with the same "verify" caveats. A one-line Node check &lt;code&gt;JSON.parse&lt;/code&gt;s each block so a stray quote doesn't silently break it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OG image from headless Chrome.&lt;/strong&gt; A tiny HTML card rendered with &lt;code&gt;google-chrome --headless --screenshot --window-size=1200,630&lt;/code&gt;. No design tool needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static hosting.&lt;/strong&gt; GitHub Pages, plus a &lt;code&gt;robots.txt&lt;/code&gt; and &lt;code&gt;sitemap.xml&lt;/code&gt;. The same file also uploads to itch.io as an HTML project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest lesson: keep the math pure and test it against the shipped artifact rather than a copy. When I made the SEO build and the translated version, I copied the calc block byte for byte, and the same test file passed against each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Please correct me
&lt;/h2&gt;

&lt;p&gt;Fee schedules change and depend a lot on country and account type. If you have a real payout statement that disagrees with a default, especially one of the &lt;strong&gt;verify&lt;/strong&gt; ones, please leave a comment with the platform, your country, and what you were actually charged. I'll update the defaults (with a thanks in the comments).&lt;/p&gt;

&lt;p&gt;If you track invoices in Notion, we also make a &lt;a href="https://showayzun.gumroad.com/l/freelance-cashflow-os/FREELANCE5?utm_source=devto" rel="noopener noreferrer"&gt;Freelance Client &amp;amp; Cashflow OS template&lt;/a&gt;. That's the only plug.&lt;/p&gt;

&lt;p&gt;Try the calculator here: &lt;strong&gt;&lt;a href="https://showayzun.github.io/freelancer-fee-calculator/?utm_source=devto" rel="noopener noreferrer"&gt;Freelancer Payout Fee Calculator&lt;/a&gt;&lt;/strong&gt;. All numbers are estimates, not financial or tax advice.&lt;/p&gt;

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