<?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: Russel Dsouza</title>
    <description>The latest articles on DEV Community by Russel Dsouza (@russel_dsouza_bd584a3cb2a).</description>
    <link>https://dev.to/russel_dsouza_bd584a3cb2a</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%2F3939420%2F1d36f555-5b2b-48e8-a97c-2acbb7603dbd.png</url>
      <title>DEV Community: Russel Dsouza</title>
      <link>https://dev.to/russel_dsouza_bd584a3cb2a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/russel_dsouza_bd584a3cb2a"/>
    <language>en</language>
    <item>
      <title>3 Pricing Page Rewrites: What Finally Converted</title>
      <dc:creator>Russel Dsouza</dc:creator>
      <pubDate>Tue, 19 May 2026 10:07:20 +0000</pubDate>
      <link>https://dev.to/russel_dsouza_bd584a3cb2a/3-pricing-page-rewrites-what-finally-converted-1olm</link>
      <guid>https://dev.to/russel_dsouza_bd584a3cb2a/3-pricing-page-rewrites-what-finally-converted-1olm</guid>
      <description>&lt;p&gt;We rewrote the Applighter pricing page three times in eleven months. Here is what each version was, why it failed (or worked), and the structure we kept.&lt;/p&gt;

&lt;p&gt;For context: we sell production-ready React Native templates. Each one is a full Expo app with a Supabase backend, NativeWind styling, AI integration where relevant, and a Stripe-powered license grant on purchase. Pricing is one-time, $79 per template, no subscription. That detail matters because two of our three rewrites pretended otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1: the SaaS-tier menu
&lt;/h2&gt;

&lt;p&gt;The first page was the one every founder builds in week one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Starter $79  | Pro $79      | Team $79     |
|--------------|--------------|--------------|
| ✓ Source     | ✓ Source     | ✓ Source     |
| ✓ Backend    | ✓ Backend    | ✓ Backend    |
|              | ✓ Most       |              |
|              |   Popular    |              |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three columns. "Most Popular" badge. Monthly/annual toggle (we don't sell monthly anything). It looked professional. It looked familiar.&lt;/p&gt;

&lt;p&gt;Conversion was bad. Support email volume was worse. The questions were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Is the $79 per template or for the whole library?"&lt;/li&gt;
&lt;li&gt;"Do I have to pay every month?"&lt;/li&gt;
&lt;li&gt;"If I pay $79, do I get the source code or just access to a dashboard?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The page was telling buyers a SaaS story. The product was a zip of TypeScript and a Supabase project. Mismatch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Don't borrow the pricing UX of a different business model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 2: the comparison wall
&lt;/h2&gt;

&lt;p&gt;When buyers are confused, every founder's reflex is &lt;em&gt;give them more information&lt;/em&gt;. We built a 32-row feature matrix comparing Applighter to "DIY," "UI templates," and "marketplace bundles."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;featureMatrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TypeScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="na"&gt;applighter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;diy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;depends&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="na"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Supabase backend&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="na"&gt;applighter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;diy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="na"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="na"&gt;applighter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;diy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;build it&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mock&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Commercial license&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;applighter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;diy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;n/a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ext&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ext&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 28 more rows&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Session recordings: median scroll-past in under three seconds.&lt;/p&gt;

&lt;p&gt;The table was answering questions nobody was asking. The questions buyers actually had — &lt;em&gt;can I use this commercially, what happens after I pay, what if it doesn't work for my project&lt;/em&gt; — were buried in a footer FAQ link nobody clicked.&lt;/p&gt;

&lt;p&gt;Worse, the comparison framed the product as defensive. Buyers don't pay $79 to validate your competitive position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Read your support inbox before you read CRO articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 3: one product, three license sizes
&lt;/h2&gt;

&lt;p&gt;The current page is shorter than either previous version. Top to bottom:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hero with the product, not the price.&lt;/strong&gt; Screenshot of the template running on an iPhone. The price exists, but it isn't the headline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License picker, not a tier ladder.&lt;/strong&gt; Single / Multiple / Enterprise — described by &lt;em&gt;who is buying&lt;/em&gt;, not by features unlocked. Every license includes the same source code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's included, plainly.&lt;/strong&gt; Six bullets. No checkmarks. No comparisons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refund policy next to the buy button.&lt;/strong&gt; Seven-day, no-questions. The single biggest move on V3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQ above the fold of the second screen.&lt;/strong&gt; Pulled directly from real support tickets, in the buyer's own words.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One soft secondary path: browse other templates.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/buy/page.tsx (sketch)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;BuyPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tiers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getLicenseTiers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Hero&lt;/span&gt; &lt;span class="na"&gt;product&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LicensePicker&lt;/span&gt; &lt;span class="na"&gt;tiers&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;tiers&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;RefundLine&lt;/span&gt; &lt;span class="na"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"7-day money-back"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BuyButton&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Faq&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;faqJson&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;RelatedTemplates&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;License tiers are stored in Postgres and read at request time, so we can adjust per-template without a deploy. The FAQ is read from &lt;code&gt;data/faq.json&lt;/code&gt; and used on both the homepage and the buy page so the messaging stays consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What conversion actually moved
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pricing page&lt;/th&gt;
&lt;th&gt;Layout&lt;/th&gt;
&lt;th&gt;Optimized for&lt;/th&gt;
&lt;th&gt;What buyers did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V1: SaaS tier menu&lt;/td&gt;
&lt;td&gt;Starter / Pro / Team&lt;/td&gt;
&lt;td&gt;Looking like a "real" company&lt;/td&gt;
&lt;td&gt;Asked support if it was a subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V2: Comparison wall&lt;/td&gt;
&lt;td&gt;32-row feature matrix&lt;/td&gt;
&lt;td&gt;Defending against alternatives&lt;/td&gt;
&lt;td&gt;Scrolled past in 3 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V3: License picker&lt;/td&gt;
&lt;td&gt;Hero → license sizes → FAQ → refund&lt;/td&gt;
&lt;td&gt;Removing friction the buyer named&lt;/td&gt;
&lt;td&gt;Bought, or refunded inside 7 days (rarely)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;V1 → V2 made things &lt;strong&gt;worse&lt;/strong&gt;. More info to a confused buyer = more confusion.&lt;/li&gt;
&lt;li&gt;V2 → V3 was the largest jump. Refund line + license picker carried most of it.&lt;/li&gt;
&lt;li&gt;Refund rate dropped after V3, not V2. Refunds correlate with surprise.&lt;/li&gt;
&lt;li&gt;Support ticket volume on pricing questions fell roughly in half.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We did not run A/B tests. Traffic on a $79 product wasn't high enough for significance in a useful timeframe. We talked to buyers, watched email, and changed the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five lessons that survived
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Match the pricing UX to the business model.&lt;/strong&gt; A one-time digital product is not a SaaS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The buyer's questions are not your competitor's questions.&lt;/strong&gt; Read the inbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The refund policy is part of the offer.&lt;/strong&gt; Surface it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less ships faster than more.&lt;/strong&gt; Every rewrite removed something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship a page, don't ship an A/B test.&lt;/strong&gt; At our volume, ten buyer conversations beat a multivariate framework.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What we would do differently
&lt;/h2&gt;

&lt;p&gt;Skip V1 and V2. Start at V3. The shape of the right page was sitting in the support inbox the whole time.&lt;/p&gt;

&lt;p&gt;If you want to see the structure in production, the &lt;a href="https://www.applighter.com/apps?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=pricing-page-3-rewrites" rel="noopener noreferrer"&gt;Applighter template catalog&lt;/a&gt; is built on the V3 pattern — same hero-then-license-picker-then-refund-line shape on every product page.&lt;/p&gt;

&lt;p&gt;For the React Native + Supabase + Expo stack underneath, the relevant docs are &lt;a href="https://docs.expo.dev/" rel="noopener noreferrer"&gt;Expo&lt;/a&gt;, &lt;a href="https://supabase.com/docs" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;, and &lt;a href="https://docs.stripe.com/payments/checkout" rel="noopener noreferrer"&gt;Stripe Checkout&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;If you've rewritten your own pricing page and learned something the slow way — especially if you sell a one-time digital product — drop a comment with what moved the needle for you. Curious whether the "refund line next to CTA" pattern holds for other indie devs or whether it's specific to our buyer.&lt;/p&gt;

</description>
      <category>pricing</category>
      <category>conversion</category>
      <category>reactnative</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
