<?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: Martin Valchev</title>
    <description>The latest articles on DEV Community by Martin Valchev (@martinvalchev).</description>
    <link>https://dev.to/martinvalchev</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%2F4167463%2F5ec7c6c6-0ebf-492d-b02b-2b01412d12de.jpg</url>
      <title>DEV Community: Martin Valchev</title>
      <link>https://dev.to/martinvalchev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martinvalchev"/>
    <language>en</language>
    <item>
      <title>I built a pay-to-rank leaderboard in 7 days - here's how the points system works</title>
      <dc:creator>Martin Valchev</dc:creator>
      <pubDate>Tue, 06 Oct 2026 22:26:43 +0000</pubDate>
      <link>https://dev.to/martinvalchev/i-built-a-pay-to-rank-leaderboard-in-7-days-heres-how-the-points-system-works-491m</link>
      <guid>https://dev.to/martinvalchev/i-built-a-pay-to-rank-leaderboard-in-7-days-heres-how-the-points-system-works-491m</guid>
      <description>&lt;p&gt;One evening I noticed sites charging $10k+ for the top spot on a simple "pay to rank" wall. I thought: the idea is fun, but the pricing locks out every indie maker who would actually enjoy it.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://outclimbed.com" rel="noopener noreferrer"&gt;Outclimbed&lt;/a&gt; - a public leaderboard where you list your website or X profile and climb by earning points. It took about 4 days to build and roughly a week to get fully production-ready.&lt;/p&gt;

&lt;p&gt;Here's how it works under the hood and the design decisions behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; - database and auth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; - hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resend&lt;/strong&gt; - transactional email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Umami (self-hosted)&lt;/strong&gt; - privacy-friendly analytics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dodo Payments&lt;/strong&gt; - payments (more on why below)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing exotic. The interesting part was never the stack, it was the ranking logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the points system
&lt;/h2&gt;

&lt;p&gt;The hard problem with any leaderboard: if only money counts, it's boring. If only activity counts, it's easy to game and the top gets stale. I ended up mixing &lt;strong&gt;permanent&lt;/strong&gt; and &lt;strong&gt;decaying&lt;/strong&gt; points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permanent points (paid)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listing costs $10 and gives 10 points&lt;/li&gt;
&lt;li&gt;Extra points are $1 each&lt;/li&gt;
&lt;li&gt;They never decay, and the listing stays forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Earned points (decaying)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every listing gets a personal share link&lt;/li&gt;
&lt;li&gt;1 point per visitor through that link - fades gradually over 30 days&lt;/li&gt;
&lt;li&gt;5 points for every person you refer who lists - fades over 6 months&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Decay was the key decision. Without it, whoever had one viral day would sit on top forever. With it, the board stays alive: you have to keep showing up to keep your spot, while paid points act as a stable floor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Daily boards
&lt;/h2&gt;

&lt;p&gt;The all-time board favours early and big players. So I added &lt;strong&gt;daily boards&lt;/strong&gt;: each UTC day has its own ranking based only on that day's activity, and it closes at midnight UTC.&lt;/p&gt;

&lt;p&gt;Past days stay browsable, so even a small project can "win a day" and point to it. That turned out to be a much better hook than the all-time ranking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding a free tier
&lt;/h2&gt;

&lt;p&gt;Paid-only entry was a real barrier, so I shipped a free option:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Join at 0 points and climb with your share link&lt;/li&gt;
&lt;li&gt;Free listings are removed after 3 months, unless they buy points or get verified&lt;/li&gt;
&lt;li&gt;Verification = placing the Outclimbed badge on your site, which also gives +30 points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The badge does double duty: it rewards the maker and gives the board backlinks and visibility. Win-win instead of a pure paywall.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payments plot twist
&lt;/h2&gt;

&lt;p&gt;My first payment provider turned me down after reviewing the product, classing it as paid advertising / directory placement under their acceptable use policy.&lt;/p&gt;

&lt;p&gt;Lesson for anyone building something similar: &lt;strong&gt;check your payment provider's acceptable use policy before you build&lt;/strong&gt;, especially if you sell placement, ranking or visibility. I migrated to Dodo Payments as merchant of record and everything has worked since.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Think about payment compliance on day 1, not day 5&lt;/li&gt;
&lt;li&gt;Launch the free tier from the start - it's the easiest way to fill an empty board&lt;/li&gt;
&lt;li&gt;Build daily boards early - they give new users a realistic way to win&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you have a side project or an X profile, you can &lt;a href="https://outclimbed.com/free-enter" rel="noopener noreferrer"&gt;join for free&lt;/a&gt; and see how far your share link takes you.&lt;/p&gt;

&lt;p&gt;I'd love feedback on the decay model - would you weight visits and referrals differently? Let me know in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
