<?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: faheemsayeed</title>
    <description>The latest articles on DEV Community by faheemsayeed (@faheemsayeed).</description>
    <link>https://dev.to/faheemsayeed</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%2F4153636%2F1eb7337e-6cff-44d7-8628-8aaf23e3565d.jpg</url>
      <title>DEV Community: faheemsayeed</title>
      <link>https://dev.to/faheemsayeed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/faheemsayeed"/>
    <language>en</language>
    <item>
      <title>I read Gumroad's source code. Discover ranks products by the fees Gumroad earns, not by your sales.</title>
      <dc:creator>faheemsayeed</dc:creator>
      <pubDate>Thu, 01 Oct 2026 05:36:17 +0000</pubDate>
      <link>https://dev.to/faheemsayeed/i-read-gumroads-source-code-discover-ranks-products-by-the-fees-gumroad-earns-not-by-your-sales-2aff</link>
      <guid>https://dev.to/faheemsayeed/i-read-gumroads-source-code-discover-ranks-products-by-the-fees-gumroad-earns-not-by-your-sales-2aff</guid>
      <description>&lt;p&gt;Gumroad open-sourced its code, so I stopped guessing how its marketplace (Discover) works and read it. I do technical SEO for a living, and I wanted the same thing I want from any search engine: the actual ranking signals, not folklore.&lt;/p&gt;

&lt;p&gt;Below are 8 things the code says. Every one links to the exact lines, pinned to a commit from 30 September 2026 so the links don't drift. The code changes often, so check the current version before you bet a launch on any of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Trending" sorts by the fees Gumroad earned from your product
&lt;/h2&gt;

&lt;p&gt;The default Discover sort is not sales count and not revenue. It is &lt;code&gt;total_fee_cents&lt;/code&gt;, the fee Gumroad earned from your product over the last 3 months, with sales volume only as a tie-breaker.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/antiwork/gumroad/blob/445ebebbf9a1831de673a6fa0b17cf048705711a/app/modules/product/searchable.rb#L354-L359" rel="noopener noreferrer"&gt;searchable.rb, sort block&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A direct sale costs you 12.9% + $0.80. That fixed $0.80 means cheap products climb faster per dollar:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;$100 of sales at...&lt;/th&gt;
&lt;th&gt;Fee Gumroad earns (= rank score)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$1 each (100 sales)&lt;/td&gt;
&lt;td&gt;$92.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$10 each (10 sales)&lt;/td&gt;
&lt;td&gt;$20.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$49 each (≈2 sales)&lt;/td&gt;
&lt;td&gt;$14.53&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same revenue, 4.4x the rank for the $1 product versus the $10 one. Best Sellers uses the same idea over 12 months (&lt;code&gt;past_year_fee_cents&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Above $4.68, a Discover sale lifts your rank more than a direct sale
&lt;/h2&gt;

&lt;p&gt;A sale that comes through Discover pays a flat 30%. A direct sale pays 12.9% + $0.80. The two are equal at $4.68. Above that price, each Discover sale adds more to your rank score than a sale you brought in yourself; below it, your own traffic counts for more.&lt;/p&gt;

&lt;p&gt;It also means every sale you drive from your own audience feeds your Discover rank. External traffic and Discover are not separate games.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. There is a hard gate, and most "no views" products never pass it
&lt;/h2&gt;

&lt;p&gt;A product only appears in Discover if all of these are true (&lt;a href="https://github.com/antiwork/gumroad/blob/445ebebbf9a1831de673a6fa0b17cf048705711a/app/modules/product/recommendations.rb#L12-L27" rel="noopener noreferrer"&gt;product/recommendations.rb&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;published and not archived&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ratings displayed&lt;/strong&gt; (turn off "Display your product's 1-5 star rating" and you disappear)&lt;/li&gt;
&lt;li&gt;not sold out&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;a category is set&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;at least one sale that counts toward volume&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the seller needs (&lt;a href="https://github.com/antiwork/gumroad/blob/445ebebbf9a1831de673a6fa0b17cf048705711a/app/modules/user/recommendations.rb#L11-L18" rel="noopener noreferrer"&gt;user/recommendations.rb&lt;/a&gt;): a name, a payout method, and a "compliant" risk state. That last one is set by a person at Gumroad, and the help center says the review happens after roughly $10 in genuine sales.&lt;/p&gt;

&lt;p&gt;So "Gumroad has zero organic discovery" is often literally true for a new store: with zero sales, none of your products are eligible. Uploading 20 more products doesn't change that. One real sale on one product does.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. A ~50-word keyword list can hide you
&lt;/h2&gt;

&lt;p&gt;Gumroad runs an adult-keyword detector over product text and over your name, username and bio (&lt;a href="https://github.com/antiwork/gumroad/blob/445ebebbf9a1831de673a6fa0b17cf048705711a/app/services/adult_keyword_detector.rb" rel="noopener noreferrer"&gt;adult_keyword_detector.rb&lt;/a&gt;). It splits CamelCase, so a word hiding inside a longer token still counts. In product text, a match blocks the save. Innocent listings hit this: lingerie photo presets, "uncensored" prompts, a boudoir Lightroom pack.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Search is literal: every word must match, and plurals don't
&lt;/h2&gt;

&lt;p&gt;Discover search runs &lt;code&gt;simple_query_string&lt;/code&gt; with &lt;code&gt;default_operator: and&lt;/code&gt; over four fields: name, creator name, description and tags (&lt;a href="https://github.com/antiwork/gumroad/blob/445ebebbf9a1831de673a6fa0b17cf048705711a/app/modules/product/searchable.rb#L198-L203" rel="noopener noreferrer"&gt;searchable.rb&lt;/a&gt;). The standard analyzer does no stemming.&lt;/p&gt;

&lt;p&gt;In practice: if a buyer types "notion templates" and your listing only says "template", you are not in the results. Every word they type has to appear somewhere in those four fields. Write the plural and singular forms of your main noun into the description.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Logged-out searchers see the fee sort, not relevance
&lt;/h2&gt;

&lt;p&gt;When someone searches while not signed in, results are ordered by the same fee-based Trending sort, not by how well the text matches. I checked this live with a search for "seo". Relevance ordering (&lt;code&gt;_score&lt;/code&gt;) is only used for the curated sort that signed-in users with purchase history get.&lt;/p&gt;

&lt;p&gt;So for most first-time visitors, matching the query gets you &lt;em&gt;in&lt;/em&gt;, and sales get you &lt;em&gt;up&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. "Hot &amp;amp; New" is a 90-day window, and the bar is low
&lt;/h2&gt;

&lt;p&gt;Hot &amp;amp; New is limited to products created in the last 90 days (&lt;a href="https://github.com/antiwork/gumroad/blob/445ebebbf9a1831de673a6fa0b17cf048705711a/app/modules/product/searchable.rb#L70" rel="noopener noreferrer"&gt;searchable.rb&lt;/a&gt;) and sorted by sales volume. I pulled the top 9 across a set of popular tags: 73% had one rating or fewer. In a tag like "claude", 28.2% of listed products were under 90 days old; in "notion template", 0.8%. Newer niches are where a new seller can actually be seen.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Tags: 10 per product, and hyphens break filtering
&lt;/h2&gt;

&lt;p&gt;You can add 10 tags (2–20 characters each), and the Discover sidebar shows the top 9 for any result set. One bug worth knowing: the tag filter converts hyphens in the URL to spaces (&lt;a href="https://github.com/antiwork/gumroad/blob/445ebebbf9a1831de673a6fa0b17cf048705711a/app/controllers/concerns/search_products.rb#L47-L52" rel="noopener noreferrer"&gt;search_products.rb&lt;/a&gt;), so a tag saved as &lt;code&gt;self-improvement&lt;/code&gt; can't be selected as a filter; you get &lt;code&gt;self improvement&lt;/code&gt;, a different tag. I'm reporting it to Gumroad. Until it's fixed, use spaces in tags, not hyphens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: Gumroad is building Google landing pages from category + tag
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/antiwork/gumroad/pull/7996" rel="noopener noreferrer"&gt;A PR merged on 26 September&lt;/a&gt; adds curated SEO descriptions to category + tag pages. The PR mentions one such page drawing 132,355 Google impressions in 7 days. Pick tags that match real category pages and you may get Google traffic from Gumroad's pages, not only from Discover.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do with a new product
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Set a category, keep ratings visible, add a payout method.&lt;/li&gt;
&lt;li&gt;Put every word a buyer would type (including plurals) into the title, description or tags.&lt;/li&gt;
&lt;li&gt;Get one genuine sale from anywhere: a friend who actually wants it, a forum reply, a newsletter.&lt;/li&gt;
&lt;li&gt;Price above $4.68 if you want Discover sales to lift you.&lt;/li&gt;
&lt;li&gt;Launch into a tag where Hot &amp;amp; New isn't crowded.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I turned the eligibility gate and the keyword list into a free offline checker (one HTML file, runs in your browser, nothing uploaded): &lt;a href="https://safahim.gumroad.com/l/discover-checker" rel="noopener noreferrer"&gt;Discover Eligibility Checker&lt;/a&gt;. The full write-up with every rule and line reference is a paid guide on my profile, but everything in this post stands on its own.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with Gumroad. All of this comes from their public repo; if they change the code, the rules change.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gumroad</category>
      <category>seo</category>
      <category>ecommerce</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
