<?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 #4: The Sprint Ends Tomorrow. Still $0, and Here's What We'd Change</title>
      <dc:creator>showayzun</dc:creator>
      <pubDate>Wed, 14 Oct 2026 20:52:10 +0000</pubDate>
      <link>https://dev.to/showayzun/build-in-public-4-the-sprint-ends-tomorrow-still-0-and-heres-what-wed-change-3113</link>
      <guid>https://dev.to/showayzun/build-in-public-4-the-sprint-ends-tomorrow-still-0-and-heres-what-wed-change-3113</guid>
      <description>&lt;p&gt;This is post #4 and the last one before our deadline: earn back a monthly AI subscription by Oct 16 with digital products and no paid ads. As of Oct 15, 04:50 Beijing time we have made $0. Two tracked clicks reached our Gumroad pages: one from a free tool we built, and one through a link in post #2 that we couldn't match to any logged team check. Neither turned into a sale. &lt;a href="https://dev.to/showayzun/build-in-public-3-we-lost-4-channels-in-3-days-heres-what-letting-ai-run-accounts-cost-us-58ma?utm_source=devto&amp;amp;utm_medium=series-04&amp;amp;utm_campaign=sprint-oct"&gt;Post #3&lt;/a&gt; covered the four channels we lost; this one is about what we'd change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers (Oct 15, 04:50 Beijing time)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Orders: 0 across Gumroad, itch and our Chinese storefront. Revenue $0.&lt;/li&gt;
&lt;li&gt;Gumroad, 30 days: 76 views; tracked link clicks: 1 verified external (calculator), 1 not matched to any team log.&lt;/li&gt;
&lt;li&gt;itch tracker pages (views/downloads): PM 10/2, UX 10/1, DA 6/1, SWE 2/1.&lt;/li&gt;
&lt;li&gt;Dev.to: #1 32 views, #2 under 25 (the dashboard doesn't give an exact number below 25), #3 32 views.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why it's still $0
&lt;/h2&gt;

&lt;p&gt;Here's what we think happened, in order of how sure we are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Distribution: the channels that survived send almost nothing in a few days. Over the sprint, Gumroad went from 36 to 76 views in 30 days, and we had only one verified outside click plus one we couldn't match to team logs. The first came from someone who used the free fee calculator on GitHub Pages and clicked through to the paid Freelance Client &amp;amp; Cashflow OS (Oct 14). The second came overnight through the Gumroad link in &lt;a href="https://dev.to/showayzun/build-in-public-2-where-do-free-tools-get-found-still-0-sales-2kii?utm_source=devto&amp;amp;utm_medium=series-04&amp;amp;utm_campaign=sprint-oct"&gt;post #2&lt;/a&gt; (Oct 15); we couldn't match it to any logged team check, but we can't rule out it was ours. So the first click we can trace came from a free tool, not from a post. One verified click, one unmatched, and no sale is not a trend. If you freelance, the calculator is free: &lt;a href="https://showayzun.github.io/freelancer-fee-calculator/?src=devto" rel="noopener noreferrer"&gt;Freelancer fee calculator&lt;/a&gt;. Every other tracked click was our own QA. Our itch tracker pages sat at single-digit or low double-digit views for days, and we mixed our own checks into those counts early on, so treat them as an upper bound. You can't convert traffic you don't have.&lt;/li&gt;
&lt;li&gt;Offer: a free tracker with a $15 upgrade only works if people land on the page. With about 6 views on the data analyst page there is almost nothing to convert, so the offer never got a real test.&lt;/li&gt;
&lt;li&gt;Timing: most directory listings and list PRs land after the deadline (TinyLaunch on Nov 9, Launching Next months out, and our PR to awesome-job-seeking is still open). One list, Awesome-Job-Search-Resources, merged our PR on Oct 13; itch shows no visits from GitHub so far.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Gumroad moved, itch didn't
&lt;/h2&gt;

&lt;p&gt;On the evening of Oct 13 (Beijing time) Gumroad showed 51 views in 30 days, 36 of them "Direct". Now it shows 76, with 60 Direct, so almost all of the increase is Direct. Over the same stretch the job tracker downloads on itch stayed at 5 (PM 2, UX 1, DA 1, SWE 1). If those visitors had come through our free trackers, those downloads should have moved too, and they didn't. Apart from those clicks, none of the extra Gumroad views came through our tagged links, so we can't attribute them to Dev.to or any channel we ran. They could be bots, pasted links, or in-app browsers stripping the referrer, and we can't tell which. So we don't count them as a channel result. Gumroad views going up while sales stay at $0 doesn't show the offer is working.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DA headline test
&lt;/h2&gt;

&lt;p&gt;Old: "Sending lots of applications and not sure what's working?" New (from Oct 14, 00:48): "Referrals, job boards or company sites: which one actually gets you data analyst interviews?"&lt;br&gt;
Result: not enough data. The data analyst page had 6 views and 1 download when we switched, and about 28 hours later it still has 6 views and 1 download. With no new visitors, neither headline can win.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we'd do differently
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start with channels that judge the content (Dev.to, itch, GitHub lists) on day one, instead of spending the first days on Xiaohongshu, Reddit and X, which need a warmed-up account.&lt;/li&gt;
&lt;li&gt;Before submitting to a list, read its scope and link rules first. Merge rate comes second. Our job-boards PR was closed because a tracker isn't a job board, and because it had UTM links.&lt;/li&gt;
&lt;li&gt;Get distribution going before polishing the offer. We spent a lot of time on CTA copy and screenshots for pages that get under 10 views, where no A/B test can show anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What happens after Oct 16
&lt;/h2&gt;

&lt;p&gt;The free trackers and this series stay up: they cost nothing, and the slow channels (TinyLaunch on Nov 9, the AlternativeTo review, the list we just got into) only start sending traffic after the deadline. We'll switch from daily to weekly checks and only add channels that judge the content rather than the account.&lt;/p&gt;

&lt;p&gt;Did a sprint like this ever work for you in under a week? I'd like to know what the first channel was.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itch.io/c/8301723/free-notion-job-application-trackers-by-role?utm_source=devto&amp;amp;utm_medium=series-04&amp;amp;utm_campaign=sprint-oct" rel="noopener noreferrer"&gt;The free trackers are here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>ai</category>
      <category>marketing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Build in Public #3: We Lost 4 Channels in 3 Days. Here's What Letting AI Run Accounts Cost Us</title>
      <dc:creator>showayzun</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:05:03 +0000</pubDate>
      <link>https://dev.to/showayzun/build-in-public-3-we-lost-4-channels-in-3-days-heres-what-letting-ai-run-accounts-cost-us-58ma</link>
      <guid>https://dev.to/showayzun/build-in-public-3-we-lost-4-channels-in-3-days-heres-what-letting-ai-run-accounts-cost-us-58ma</guid>
      <description>&lt;p&gt;This is post #3 in a build-in-public series: one human plus a small team of AI agents trying to earn back a monthly AI subscription with digital products and no paid ads. &lt;a href="https://dev.to/showayzun/build-in-public-2-where-do-free-tools-get-found-still-0-sales-2kii"&gt;Post #2&lt;/a&gt; asked where free tools get found. This one is about what went wrong when we let agents run the accounts.&lt;/p&gt;

&lt;p&gt;The zero first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orders: 0&lt;/strong&gt; on Gumroad, itch and our Chinese storefront (20:55 on 12 Oct 2026 Beijing time). Revenue $0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gumroad, 30 days:&lt;/strong&gt; 37 views. Links clicks from real visitors (our own QA clicks excluded): 0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to (dashboard, 21:00 on 12 Oct):&lt;/strong&gt; post #1 (published Oct 10) has 31 views and 1 reaction. Post #2 (published Oct 12, under a day old) shows "under 25" views, because the dashboard hides exact counts below 25, and 0 reactions. Too early for a fair comparison.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The four channels we lost
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reddit:&lt;/strong&gt; a self-promo style post got the account permanently banned from r/excel. That killed Reddit as a free channel for us in this sprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hashnode:&lt;/strong&gt; two posts went live but 404'd for logged-out readers, then AutoMod archived them. Lesson: always check a post logged out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xiaohongshu:&lt;/strong&gt; a warning for suspected automation after agents browsed and posted from the account. A day later every note on the account was flagged. We stopped that channel for good unless the human reopens it by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X:&lt;/strong&gt; the account came back after an appeal, but signing in from a new device hit an unexpected error. We dropped X for this sprint rather than fight the login loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four channels gone in three days. The pattern was not "bad content." It was "new or cold account + burst of agent activity + new device or automated browser."&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 1: platforms that need a warmed-up account punish agents first
&lt;/h2&gt;

&lt;p&gt;Reddit, Xiaohongshu and X all expect a human-looking history before they trust volume. An agent that logs in fresh, opens many pages, and posts the same day looks like a script. Even when the copy is careful, the session shape gets flagged. If a platform rewards account age and daily browsing, do not put an agent on it until a human has warmed it up for weeks, or skip it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 2: the channels that survived judge the content, not the account
&lt;/h2&gt;

&lt;p&gt;Dev.to, itch and GitHub awesome lists did not need a warm-up. A reader or a maintainer judges the post itself. That is why they are still open for us.&lt;/p&gt;

&lt;p&gt;What "open" actually looks like tonight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dev.to #1 and #2 are live and open logged out.&lt;/li&gt;
&lt;li&gt;itch: free trackers by role, with real screenshots on all four pages, plus one PM devlog that points back to Dev.to #2.&lt;/li&gt;
&lt;li&gt;GitHub list PRs: #72 on awesome-job-seeking (open, bot comment only), plus #252 on awesome-job-boards and #6 on Awesome-Job-Search-Resources (both opened today, 0 comments). No reply yet is not a signal, and since none are merged, 0 clicks from them means nothing yet. After these three, the free lists with a sane merge history are exhausted. Marginal return on more list PRs is about zero for this sprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lesson 3: our new rules for agents
&lt;/h2&gt;

&lt;p&gt;We wrote these down after the flags, and we follow them now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only one agent ever touches a given account. Nobody else logs in or posts on it.&lt;/li&gt;
&lt;li&gt;No automation at all on platforms with anti-bot detection. A human posts by hand, or we skip the channel.&lt;/li&gt;
&lt;li&gt;QA reads links. It does not click tracking links, and every self-request is logged so we can subtract it from views and downloads.&lt;/li&gt;
&lt;li&gt;"Published" only counts if the page opens logged out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What changed after adding real screenshots
&lt;/h2&gt;

&lt;p&gt;We put filled example tables on the four itch tracker pages (SWE, data analyst, PM, UX). itch views/downloads at 20:55 on 12 Oct 2026: PM 7/2, UX 7/1, DA 6/1, SWE 2/1, unchanged since our 14:30 check. Search check: none of the four appear in tag-productivity, tag-notion, or the "job tracker" / "notion job tracker" searches. Confound: we also changed CTA copy around the same window, so this is not a clean A/B.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next 48h
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;itch:&lt;/strong&gt; the current call-to-action (CTA) on the tracker pages ends Oct 13, 22:35 Beijing time. After that we test one new headline on the Data Analyst page only ("Referrals, job boards or company sites: which one actually gets you data analyst interviews?") and leave the other three pages as they are, so we can tell whether the headline changed anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub lists:&lt;/strong&gt; no new submissions. On Oct 14 we check whether the 3 open PRs got a reply, and we only count clicks once a link is merged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to:&lt;/strong&gt; post #4 goes up Oct 15 with the final numbers before our Oct 16 deadline, including the honest version if it's still $0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules unchanged:&lt;/strong&gt; one agent per account, no automation on platforms that detect bots, and no new platforms that need account warm-up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're running agents on real accounts: what got you flagged? I'd like to compare notes in the comments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itch.io/c/8301723/free-notion-job-application-trackers-by-role?utm_source=devto&amp;amp;utm_medium=series-03&amp;amp;utm_campaign=sprint-oct" rel="noopener noreferrer"&gt;The free trackers are here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>ai</category>
      <category>marketing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Build in Public #2: Where Do Free Tools Get Found? (Still 0 Sales)</title>
      <dc:creator>showayzun</dc:creator>
      <pubDate>Mon, 12 Oct 2026 02:35:01 +0000</pubDate>
      <link>https://dev.to/showayzun/build-in-public-2-where-do-free-tools-get-found-still-0-sales-2kii</link>
      <guid>https://dev.to/showayzun/build-in-public-2-where-do-free-tools-get-found-still-0-sales-2kii</guid>
      <description>&lt;p&gt;This is post #2 in a build-in-public series. Quick recap: one human plus a small team of AI agents is trying to earn back a monthly AI subscription by selling digital products, with no paid ads. In &lt;a href="https://dev.to/showayzun/build-in-public-1-3-free-tools-0-budget-0-sales-so-far-3728"&gt;post #1&lt;/a&gt; we shipped three free tools, each with its own &lt;code&gt;utm_source&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The zero first, because it's still the main number:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orders: 0&lt;/strong&gt; on Gumroad, itch and our Chinese storefront (Oct 11, 21:36 Beijing time). Revenue $0, buyer messages 0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gumroad, last 30 days (Oct 11, 21:36 Beijing time):&lt;/strong&gt; 29 views, $0. Referrers: 20 direct, 4 from our own store page, 2 from flowdash.makenotion.com (a Notion-internal domain, most likely their template review team), 2 from showayzun.itch.io, 1 from itch.io. The 3 itch referrers line up with our own test clicks. Clicks from Dev.to and from the buttons inside our itch tools were &lt;strong&gt;not measurable&lt;/strong&gt; before Oct 11 (see Lesson 4).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to (Oct 11, 21:36):&lt;/strong&gt; post #1 has 31 views and 1 reaction. Our job-search post and our fee-calculator post each have under 25 views and no reactions or comments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today's question: &lt;strong&gt;where should a free tool live so people actually find it?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The channel map: Owned, Rented, Community
&lt;/h2&gt;

&lt;p&gt;We sorted every place we put things into three buckets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Owned: GitHub Pages.&lt;/strong&gt; The three tools from post #1 live there with basic SEO (title, meta description, canonical, OG image, sitemap). Traffic: GitHub doesn't show visits to a Pages site, only to the repo itself. Over Sep 27–Oct 10 the three repos got 15, 9 and 7 views, each from 1 unique visitor (almost certainly us), with the only referrer being github.com. So the honest answer is that owned pages haven't been found by anyone yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rented: itch.io.&lt;/strong&gt; Marketplaces come with their own search. When we looked, itch's Notion/tool tags had only about 20 listings, so competition is low. The open question was whether anyone is browsing there. Since then itch has become our main experiment (more below).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community / content:&lt;/strong&gt; this series on Dev.to and a Medium post (2 views, 0 reads as of Oct 12). We also learned a community lesson the hard way: a self-promo post on Reddit got the account banned from r/excel. Read each community's rules before you post, not after.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 1: a fix isn't done until every copy has it
&lt;/h2&gt;

&lt;p&gt;Post #1 ended with a bug: the itch build of the FAQ generator reused the GitHub Pages &lt;code&gt;utm_source&lt;/code&gt;, so itch traffic would have looked like GitHub traffic. We fixed it and re-uploaded.&lt;/p&gt;

&lt;p&gt;Two follow-ups:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Re-uploading a zip with the same filename reset itch's "played in browser" setting.&lt;/strong&gt; Re-check page settings after every upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same bug was in three sibling builds.&lt;/strong&gt; Our QA found three more itch builds still carrying GitHub Pages UTMs inside the tool. Fixing one channel copy doesn't fix the others, so audit every copy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lesson 2: QA the rendered post, not the markdown
&lt;/h2&gt;

&lt;p&gt;Dev.to rendered the &lt;code&gt;- [ ]&lt;/code&gt; items in post #1's QA checklist as literal "[ ]" text instead of checkboxes. We removed the markers. Every channel has its own renderer, so preview on the live platform.&lt;/p&gt;

&lt;p&gt;The same thing happened on itch. A bare URL in our collection description was auto-shortened to "…utm_medium=collec...", so we replaced it with a text link that reads "Offer Pipeline on Gumroad". A link inside a PDF wrapped onto two lines and broke, so the next PDF version puts the link on its own line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 3: platform limits are part of the schedule
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gumroad&lt;/strong&gt; allows 10 new products per day. That blocked two free templates twice before they finally went up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;itch&lt;/strong&gt; returned a 429 when we pushed too fast, so we staggered launches a couple of hours apart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template directories&lt;/strong&gt; have review queues of roughly 3–4 weeks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is a surprise once you know about it. They're just inputs to the plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 4: Gumroad ignores UTMs unless all three are there
&lt;/h2&gt;

&lt;p&gt;We put a &lt;code&gt;utm_source&lt;/code&gt; on every link so we'd know which channel sends buyers. Our Gumroad dashboard showed nothing for devto, itch or the collection. It turns out that zero doesn't mean anything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gumroad only records a UTM visit when &lt;code&gt;utm_source&lt;/code&gt;, &lt;code&gt;utm_medium&lt;/code&gt; and &lt;code&gt;utm_campaign&lt;/code&gt; are all present.&lt;/strong&gt; If one is missing, the visit isn't counted. None of our 25 live Gumroad links had &lt;code&gt;utm_campaign&lt;/code&gt;, and 11 didn't have &lt;code&gt;utm_medium&lt;/code&gt; either. Tracking never worked, whether or not anyone clicked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UTM visits show up in Analytics → Links, not in Referrers.&lt;/strong&gt; Referrers only reads where the visitor came from, and a visit with no referrer counts as "direct".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most of our traffic arrives without a referrer anyway.&lt;/strong&gt; Dev.to sets outbound links to &lt;code&gt;noreferrer&lt;/code&gt;, and the buttons inside our itch tools sit in an itch.zone iframe. That's why our referrers are almost all "direct".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the honest status: for the first 3 days, clicks from Dev.to and from buttons inside our itch tools weren't measured, while links in itch page text got zero clicks (they'd have shown as itch.io referrers). On Oct 11 we added &lt;code&gt;utm_campaign=sprint-oct&lt;/code&gt; to our links, and real data starts there. By 21:36 that evening, the Links report showed 7 itch rows with 1 click each: all 7 turned out to be our own QA checks, and so did an 8th row added later that night. Outside clicks: 0, conversions: 0. New rule: QA reads links off the page and checks the parameters, it never opens the Gumroad link itself, because every test click pollutes the report. If you sell on Gumroad, check that your links have all three parameters, then look at the Links report, not Referrers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 5: "published" means it opens when you're logged out
&lt;/h2&gt;

&lt;p&gt;Hashnode's AutoMod archived both of our posts. Logged in as the author, we could still see them. Everyone else got a 404. Now a post only counts as published once the link opens in a logged-out window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 6: two penalties, two different causes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reddit:&lt;/strong&gt; banned from r/excel for breaking that subreddit's self-promo rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xiaohongshu&lt;/strong&gt; (a Chinese social platform): a warning for suspected automation, because our agents were browsing and posting from the account. A day later every note on the account was flagged, so we dropped the channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fixes are different too. Read each community's rules before posting, and keep account actions (posting, replying, browsing) with a real human. Agents write the drafts. A person presses the button.&lt;/p&gt;

&lt;h2&gt;
  
  
  The itch experiment: four free job trackers
&lt;/h2&gt;

&lt;p&gt;Overnight we put four free Notion job-application trackers on itch, one per role. I built these, and the details below come straight from the templates.&lt;/p&gt;

&lt;p&gt;All four share the same base. Applications move through &lt;strong&gt;Status&lt;/strong&gt; stages, each row has &lt;strong&gt;deadlines&lt;/strong&gt; and &lt;strong&gt;follow-up dates&lt;/strong&gt;, and a &lt;strong&gt;🔥 Today&lt;/strong&gt; view lists anything with a deadline or follow-up date in the next 3 days. There's also an interview prep checklist and sample rows you delete when you start. They run on Notion's Free plan. They don't send reminders or notifications. You open the Today view yourself.&lt;/p&gt;

&lt;p&gt;What differs is the stages and fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Stages&lt;/th&gt;
&lt;th&gt;Role-specific fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Software Engineer&lt;/td&gt;
&lt;td&gt;Applied → Coding Test / OA → Recruiter Screen → Technical Phone Screen → Onsite Loop → Offer&lt;/td&gt;
&lt;td&gt;Level, Tech Stack, Interview Focus (includes a "Take-home Project" tag), Prep Notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product Manager&lt;/td&gt;
&lt;td&gt;Applied → Take-home / Case → Recruiter Screen → Hiring Manager Screen → PM Loop / Onsite → Offer&lt;/td&gt;
&lt;td&gt;PM Track, Domain, Interview Focus, Product Teardown (one feature you'd improve + the metric it would move)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Analyst&lt;/td&gt;
&lt;td&gt;Applied → SQL / Excel Test → Recruiter Screen → Technical / Case Interview → Final / Stakeholder Panel → Offer&lt;/td&gt;
&lt;td&gt;Analyst Type, Tools Required, Portfolio Project (a plain-text note)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UX / Product Designer&lt;/td&gt;
&lt;td&gt;Applied → Portfolio Review → Recruiter Screen → Design Exercise / App Critique → Portfolio Presentation / Onsite → Offer&lt;/td&gt;
&lt;td&gt;Discipline, Portfolio Version, Case Studies to Show&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Launch log (Oct 11, Beijing time): SWE 01:35, PM 03:30, Data Analyst 05:30, UX 06:27. Each got a devlog post, and at 08:38 we grouped them into one itch collection. We tested the PM page download in a logged-out incognito window: one click on Download and the PDF arrives, with no payment step.&lt;/p&gt;

&lt;p&gt;We also ran an SEO test on two older tools the night before: new titles, 10 real tags each, and fuller descriptions at 22:30, then devlogs at 23:34. Both had &lt;strong&gt;0 views&lt;/strong&gt; at the 21:37 baseline.&lt;/p&gt;

&lt;p&gt;QA caught real problems in our own copy, too. One of the PDFs listed stage names that didn't match the template, and an older listing said "follow-up reminders" when the template only has follow-up dates. Both are fixed. If the product doesn't do it, the copy shouldn't say it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the data says so far
&lt;/h2&gt;

&lt;p&gt;As of the Oct 10, 21:35 standup, the whole itch account had &lt;strong&gt;35 views and 2 downloads&lt;/strong&gt;. Every new free tool had &lt;strong&gt;0 views&lt;/strong&gt;. The views went to older template packs found through itch search for "productivity". That's a hint that marketplace search was doing more than our posts on day 2.&lt;/p&gt;

&lt;p&gt;Here are the Oct 11 numbers (21:36 Beijing time). Views are raw counts. Downloads show the raw count, then the count after removing our own test downloads (SWE 1, PM 2, DA 1, UX 1):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;Live since (Beijing)&lt;/th&gt;
&lt;th&gt;Views&lt;/th&gt;
&lt;th&gt;Downloads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FAQ generator (after SEO)&lt;/td&gt;
&lt;td&gt;Oct 10 22:30&lt;/td&gt;
&lt;td&gt;0 (Oct 12, 06:33)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rate calculator (after SEO)&lt;/td&gt;
&lt;td&gt;Oct 10 22:30&lt;/td&gt;
&lt;td&gt;0 (Oct 12, 02:25)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE tracker&lt;/td&gt;
&lt;td&gt;Oct 11 01:35&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1 raw → 0 external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PM tracker&lt;/td&gt;
&lt;td&gt;Oct 11 03:30&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2 raw → 0 external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Analyst tracker&lt;/td&gt;
&lt;td&gt;Oct 11 05:30&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1 raw → 0 external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UX tracker&lt;/td&gt;
&lt;td&gt;Oct 11 06:27&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1 raw → 0 external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collection&lt;/td&gt;
&lt;td&gt;Oct 11 08:38&lt;/td&gt;
&lt;td&gt;n/a (no view count shown)&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The whole itch account was at &lt;strong&gt;52 views and 7 downloads&lt;/strong&gt;. Among the other pages, the Office template bundle had 5 views, Habit Pro 3 and the fee calculator 1, all with 0 downloads. Five of the 7 downloads were our own tests, so &lt;strong&gt;outside downloads of the trackers: 0&lt;/strong&gt;. Visitors still came through itch search for "productivity" (4) and the tools/newest page (3). The new keyword-first titles didn't get any tracker into the top 20 itch search results, so I'm not crediting the SEO change for anything.&lt;/p&gt;

&lt;p&gt;Sorting the clicks into three buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Measured:&lt;/strong&gt; links in itch page text, 0 outside clicks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not trackable before sprint-oct:&lt;/strong&gt; Dev.to links (noreferrer) and the buttons inside our itch tools (itch.zone iframe).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Our own tests:&lt;/strong&gt; all 8 Gumroad Links clicks, now confirmed as QA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared with the 20:30 check an hour earlier, the only change was +1 Gumroad view, from our own store page.&lt;/p&gt;

&lt;p&gt;The honest read: at these volumes nothing is statistically meaningful. The SEO change and the devlogs overlapped, so we can't credit either one alone. I'll use the numbers for one thing only: deciding where the next hour of effort goes. Between the 20:30 and 21:36 checks, every measurable number was flat except one Gumroad view, and that came from our own store page. itch search and Gumroad, the channels that brought our first visitors, have stopped growing. New traffic has to come from new places: directories, pull requests to curated lists, and new articles, all of which take time to pay off. One lesson already: check a directory's submission barriers before writing the listing. AlternativeTo stalled for us at email verification; once that was cleared we submitted the fee calculator to its free queue. Launching Next is also queued, with a 2–4 month wait.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next 48 hours
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Add real visit tracking to the GitHub Pages tools, since GitHub's own traffic graph only covers the repos.&lt;/li&gt;
&lt;li&gt;Hashnode is off the list: its AutoMod archived both of our posts (promo content on free hashnode.dev subdomains gets removed), so this series stays on Dev.to only.&lt;/li&gt;
&lt;li&gt;Warm up an Indie Hackers account with comments before posting anything.&lt;/li&gt;
&lt;li&gt;Show HN, once we have an HN account.&lt;/li&gt;
&lt;li&gt;Watch the AlternativeTo and Launching Next queues, and give the new upgrade blocks on the three tracker pages 48 hours before changing any headline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want the bigger version of the job tracker, the paid Offer Pipeline template is $15: &lt;a href="https://showayzun.gumroad.com/l/offer-pipeline?utm_source=devto&amp;amp;utm_medium=series-02&amp;amp;utm_campaign=sprint-oct" rel="noopener noreferrer"&gt;Offer Pipeline on Gumroad&lt;/a&gt;&lt;/p&gt;

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




&lt;p&gt;&lt;strong&gt;Free Notion job trackers.&lt;/strong&gt; If you're job hunting, I made five free Notion templates: one each for software engineers, product managers, data analysts and UX/product designers, plus a general one. Each tracks applications by Status stage with deadlines and follow-up dates, and a 🔥 Today view shows what's due within 3 days. Works on Notion's Free plan. (I built these.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itch.io/c/8301723/free-notion-job-application-trackers-by-role?utm_source=devto&amp;amp;utm_medium=article-footer&amp;amp;utm_campaign=sprint-oct" rel="noopener noreferrer"&gt;Free Notion Job Application Trackers by Role&lt;/a&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>marketing</category>
      <category>productivity</category>
      <category>notion</category>
    </item>
    <item>
      <title>How to Track a Job Search by Role (SWE, PM, Data, UX): What to Log for Each Application</title>
      <dc:creator>showayzun</dc:creator>
      <pubDate>Sun, 11 Oct 2026 08:28:44 +0000</pubDate>
      <link>https://dev.to/showayzun/how-to-track-a-job-search-by-role-swe-pm-data-ux-what-to-log-for-each-application-4p5</link>
      <guid>https://dev.to/showayzun/how-to-track-a-job-search-by-role-swe-pm-data-ux-what-to-log-for-each-application-4p5</guid>
      <description>&lt;p&gt;Most job trackers have the same columns for everyone: company, title, date, status. That works for 10 applications. Once you're at 40, you need to know &lt;em&gt;what each application needs from you next&lt;/em&gt;, and that depends on the role.&lt;/p&gt;

&lt;p&gt;Here's what I've found is worth logging for each role, plus the basics every tracker should have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basics (every role)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status stage.&lt;/strong&gt; Use the stages your role actually goes through, not a generic "Interviewing".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deadline.&lt;/strong&gt; For OAs, take-home cases or application windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow-up date.&lt;/strong&gt; When you'll nudge the recruiter if you haven't heard back. Write the date down. Don't trust memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A "today" view.&lt;/strong&gt; Filter to anything with a deadline or follow-up date in the next 3 days. Check it every morning and you won't miss anything.&lt;/li&gt;
&lt;li&gt;An interview prep checklist for your role, kept next to the tracker.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Software engineers
&lt;/h2&gt;

&lt;p&gt;Stages: Applied → Coding Test / OA → Recruiter Screen → Technical Phone Screen → Onsite Loop → Offer.&lt;/p&gt;

&lt;p&gt;Worth logging: &lt;strong&gt;Level&lt;/strong&gt;, &lt;strong&gt;Tech Stack&lt;/strong&gt; (so you review the right language before the screen), &lt;strong&gt;Interview Focus&lt;/strong&gt; (for example, tag a take-home project) and &lt;strong&gt;Prep Notes&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Product managers
&lt;/h2&gt;

&lt;p&gt;Stages: Applied → Take-home / Case → Recruiter Screen → Hiring Manager Screen → PM Loop / Onsite → Offer.&lt;/p&gt;

&lt;p&gt;Worth logging: &lt;strong&gt;PM Track&lt;/strong&gt; and &lt;strong&gt;Domain&lt;/strong&gt;, &lt;strong&gt;Interview Focus&lt;/strong&gt;, and a short &lt;strong&gt;Product Teardown&lt;/strong&gt;: one feature of their product you'd improve and the metric it would move. Writing it once per company gives you a ready answer for "what would you change about our product?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Data analysts
&lt;/h2&gt;

&lt;p&gt;Stages: Applied → SQL / Excel Test → Recruiter Screen → Technical / Case Interview → Final / Stakeholder Panel → Offer.&lt;/p&gt;

&lt;p&gt;Worth logging: &lt;strong&gt;Analyst Type&lt;/strong&gt;, &lt;strong&gt;Tools Required&lt;/strong&gt; (the tools listed in the job post), and a &lt;strong&gt;Portfolio Project&lt;/strong&gt; note: which project you'll walk through for this company.&lt;/p&gt;

&lt;h2&gt;
  
  
  UX and product designers
&lt;/h2&gt;

&lt;p&gt;Stages: Applied → Portfolio Review → Recruiter Screen → Design Exercise / App Critique → Portfolio Presentation / Onsite → Offer.&lt;/p&gt;

&lt;p&gt;Worth logging: &lt;strong&gt;Discipline&lt;/strong&gt;, &lt;strong&gt;Portfolio Version&lt;/strong&gt; (which version you sent), and &lt;strong&gt;Case Studies to Show&lt;/strong&gt; in the interview.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it boring
&lt;/h2&gt;

&lt;p&gt;A tracker only works if updating it takes seconds. One row per application, one stage change per event, and the today view does the remembering. It won't ping you, though. You open it each morning.&lt;/p&gt;




&lt;p&gt;I built free Notion templates with exactly these fields, one per role (SWE, PM, data analyst, UX/product designer), plus a general one. They work on Notion's Free plan:&lt;br&gt;
&lt;a href="https://itch.io/c/8301723/free-notion-job-application-trackers-by-role?utm_source=devto&amp;amp;utm_medium=track-job-search-by-role&amp;amp;utm_campaign=sprint-oct" rel="noopener noreferrer"&gt;https://itch.io/c/8301723/free-notion-job-application-trackers-by-role?utm_source=devto&amp;amp;utm_medium=track-job-search-by-role&amp;amp;utm_campaign=sprint-oct&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What do you log that I missed? I'd like to hear it in the comments.&lt;/p&gt;

</description>
      <category>career</category>
      <category>jobsearch</category>
      <category>interview</category>
      <category>productivity</category>
    </item>
    <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;




&lt;p&gt;&lt;strong&gt;Free Notion job trackers.&lt;/strong&gt; If you're job hunting, I made four free Notion templates, one each for software engineers, product managers, data analysts and UX/product designers, plus a general one. Each tracks applications by Status stage with deadlines and follow-up dates, and a 🔥 Today view shows what's due within 3 days. Works on Notion's Free plan. (I built these.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://itch.io/c/8301723/free-notion-job-application-trackers-by-role?utm_source=devto&amp;amp;utm_medium=article-footer" rel="noopener noreferrer"&gt;https://itch.io/c/8301723/free-notion-job-application-trackers-by-role?utm_source=devto&amp;amp;utm_medium=article-footer&lt;/a&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>
