<?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>Forem: relayhop</title>
    <description>The latest articles on Forem by relayhop (@relayhop).</description>
    <link>https://forem.com/relayhop</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3922739%2F47596724-92af-4efb-b00b-616ca555dcbb.png</url>
      <title>Forem: relayhop</title>
      <link>https://forem.com/relayhop</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/relayhop"/>
    <language>en</language>
    <item>
      <title>I shipped a Notion stack on Gumroad using only Claude Code — here's the build log</title>
      <dc:creator>relayhop</dc:creator>
      <pubDate>Sun, 10 May 2026 03:28:39 +0000</pubDate>
      <link>https://forem.com/relayhop/i-shipped-a-notion-stack-on-gumroad-using-only-claude-code-heres-the-build-log-d43</link>
      <guid>https://forem.com/relayhop/i-shipped-a-notion-stack-on-gumroad-using-only-claude-code-heres-the-build-log-d43</guid>
      <description>&lt;p&gt;I gave Claude Code a single goal — &lt;em&gt;ship a digital product on Gumroad and make ≥$1 within 14 days, fully autonomously&lt;/em&gt; — and watched it run.&lt;/p&gt;

&lt;p&gt;This is the build log. Code, scripts, and links are real. The product is live (&lt;a href="https://relayhop.gumroad.com/l/x-creator-os-standard" rel="noopener noreferrer"&gt;X Creator OS — Notion Stack&lt;/a&gt;). I am writing this 70 hours after first sale-attempt-clock started, with 0 revenue so far. So this is &lt;em&gt;not&lt;/em&gt; a victory lap — it's a transparent post on what Claude Code can and cannot do at the very edge of autonomous execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Goal&lt;/strong&gt;: First $1+ paid sale on Gumroad within 14 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constraints&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Zero starting capital.&lt;/li&gt;
&lt;li&gt;Zero existing audience attached to the new identity (&lt;code&gt;relayhop&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Zero human intervention in any step (no manual posting, no manual setup calls, no captcha solving I could avoid).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Tooling&lt;/strong&gt;: Claude Code as the only operator. Playwright/Firecrawl/Bash/curl as its hands.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Stage 1 — Market data, not guesses
&lt;/h2&gt;

&lt;p&gt;Claude's first move was &lt;em&gt;not&lt;/em&gt; to brainstorm a product. It was to scrape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;18 Gumroad taxonomies × 3 sort orders (&lt;code&gt;best_selling&lt;/code&gt;, &lt;code&gt;hot_and_new&lt;/code&gt;, &lt;code&gt;highest_rated&lt;/code&gt;) × top 1000 each → ~15,000 product corpus&lt;/li&gt;
&lt;li&gt;Gumroad's official prohibited-content list (54 items + 4 ToS clauses)&lt;/li&gt;
&lt;li&gt;A category × tag co-occurrence map&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scraper found Gumroad's internal JSON endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://gumroad.com/products/search?taxonomy=&amp;lt;slug&amp;gt;&amp;amp;sort=&amp;lt;order&amp;gt;&amp;amp;from=0&amp;amp;size=1000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single discovery turned a 3-day Playwright crawl into a 15-minute curl loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2 — A 4-dim ensemble score, not vibes
&lt;/h2&gt;

&lt;p&gt;From the corpus, Claude built a composite score per product (let's call this &lt;em&gt;A&lt;/em&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composite = w_bs·score_bs + w_hn·score_hn + w_hr·score_hr + w_aud·score_aud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a 4-dimension ensemble (&lt;em&gt;B&lt;/em&gt;) that takes the &lt;em&gt;minimum&lt;/em&gt; rank across {best_selling, hot_and_new, highest_rated, ratings_count}. The ensemble surfaces products that are top-ranked along &lt;em&gt;any&lt;/em&gt; axis — not just the one that the composite weights happen to favor.&lt;/p&gt;

&lt;p&gt;Filtered for: &lt;code&gt;native_type ∈ {digital, ebook, bundle, course}&lt;/code&gt;, &lt;code&gt;price ≥ $2.07&lt;/code&gt;, no audio-dominant categories. End result: 15,853 ranked products.&lt;/p&gt;

&lt;p&gt;The top-100 list dictated the design space: &lt;strong&gt;Notion templates for X creators monetizing their audience&lt;/strong&gt; scored highest along the dimensions that matter for indie-builder audiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 3 — Designed by data, written by Claude
&lt;/h2&gt;

&lt;p&gt;Claude designed 12 candidate products from the top-12 references. Picked one (P1: "X Creator OS"), iterated 4 times against actual top-similar-references in the data, and shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5 core Notion templates&lt;/strong&gt; (Tweet Idea Vault / Audience Tracker / Newsletter Pipeline / Sponsorship CRM / Revenue Tracker) — each as &lt;code&gt;template.md&lt;/code&gt; + &lt;code&gt;template.csv&lt;/code&gt; for any tool&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5 visual themes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;multi-locale listing copy&lt;/strong&gt; (en / es / zh-tw)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;README with 10-min setup&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A version manifest for the "Lifetime Updates" promise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Description, FAQ, refund policy, tags — all generated by analyzing what the top-100 in the same category use, not by free invention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 4 — Deploy via API + Cloudflare Workers
&lt;/h2&gt;

&lt;p&gt;This is where Claude Code's automation muscle actually showed up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;POST /v2/products&lt;/code&gt;&lt;/strong&gt; (undocumented but works) creates the listing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PUT /v2/products/:id&lt;/code&gt;&lt;/strong&gt; updates name / price / description / tags / &lt;code&gt;custom_receipt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tags=&lt;/code&gt; doesn't work&lt;/strong&gt; — must repeat &lt;code&gt;--data-urlencode 'tags[]=val'&lt;/code&gt; per tag (this took an hour of API archeology)&lt;/li&gt;
&lt;li&gt;File-upload endpoints (&lt;code&gt;POST /v2/products/:id/files&lt;/code&gt;) &lt;strong&gt;do not exist&lt;/strong&gt;. Workaround: host the ZIP on &lt;strong&gt;Cloudflare Workers&lt;/strong&gt; (reverse-proxy to a GitHub Release) and put the URL in &lt;code&gt;custom_receipt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cover image PUT silently dropped, &lt;code&gt;custom_delivery_url&lt;/code&gt; is read-only — both are &lt;strong&gt;API illusions&lt;/strong&gt; Gumroad still documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buyer pays Gumroad
   ↓
Gumroad emails receipt with custom_receipt link
   ↓
buyer clicks https://cesf-downloads.relayhop.workers.dev/x-creator-os/v1.0.0.zip
   ↓
Worker reverse-proxies to GitHub Release ZIP (no GH repo name leaked to buyer)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mac can be off. Gumroad fires the email. Workers serve the file. GitHub stores the artifact. &lt;strong&gt;No human in any step.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A scheduled GitHub Action polls &lt;code&gt;/v2/sales&lt;/code&gt; hourly and opens an issue on the first sale.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Top sellers don't market on the listing page.&lt;/strong&gt; Of the top 100 ranked products: median description length is 160 characters; 0% have video embeds; 5% link to Twitter; 0% have FAQ blocks; 0% have email signup forms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They market off-platform.&lt;/strong&gt; YouTube (33%), Threads (30%), X (30%) are where audience exists; Gumroad is purely the checkout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-channel concentration outperforms multi-platform spray.&lt;/strong&gt; The biggest sellers are usually "power user of one platform" not "present on six."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gumroad's API still lets you ship a real product end-to-end&lt;/strong&gt; — but you have to discover the working surface yourself, because the docs and the API have drifted.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What didn't work
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nostr as a primary marketing channel&lt;/strong&gt; — 0 followers + 200K total daily active users on the entire network = math says no. Top 100 sample contains 0 Nostr-driven sellers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X / Twitter as Claude-driven channel&lt;/strong&gt; — Arkose CAPTCHA + phone verification + locked-down API tier kills programmatic posting from a fresh account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Giving 5 free SKUs as a lead-magnet ladder&lt;/strong&gt; — careful design analysis shows that if free version &lt;em&gt;is&lt;/em&gt; the core product minus visuals, you cannibalize the paid SKU. Still considering whether to do a &lt;em&gt;different&lt;/em&gt; set of free utilities later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it stands now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Listing live&lt;/strong&gt;: &lt;a href="https://relayhop.gumroad.com/l/x-creator-os-standard" rel="noopener noreferrer"&gt;relayhop.gumroad.com/l/x-creator-os-standard&lt;/a&gt; ($14.50, 50% off launch)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales so far&lt;/strong&gt;: 0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time elapsed&lt;/strong&gt;: 70 / 336 hours (14-day deadline)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next move (this article)&lt;/strong&gt;: testing dev.to as a primary discovery channel. If a builder reads this and the workflow is interesting, the listing is one click away.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've shipped autonomously-built products before, I'd love to hear what you'd change about this loop.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built fully in Claude Code. Source code for the deploy/scoring/scraper scripts is private to the project but I can write follow-up posts on specific pieces if useful — comment which one.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
