Skip to main content

App Pricing Models

LaunchMyStore supports multiple pricing models for your app. Choose the model that best fits your value proposition and customer expectations.

Available Models

Free

No charge. Good for lead generation or basic utility apps.

One-Time

Single payment for lifetime access. Good for tools and templates.

Recurring

Monthly or annual subscription. Most common for feature-rich apps.

Usage-Based

Pay per use (API calls, orders, etc.). Good for volume-dependent apps.

Free Apps

Free apps don’t charge merchants but can still generate value:
{
  "pricing": {
    "model": "free"
  }
}
Use cases:
  • Lead generation for your other products
  • Simple utilities that build goodwill
  • Apps funded by other revenue (affiliate, data)
  • Open source projects
Free apps are great for building reputation in the marketplace. Many developers start free and add paid tiers later.

One-Time Purchase

Single payment for permanent access:
{
  "pricing": {
    "model": "one_time",
    "price": 4900,  // $49.00 USD
    "currency": "USD"
  }
}
Use cases:
  • Theme modifications
  • One-time setup tools
  • Templates and presets
  • Migration utilities
Considerations:
  • No recurring revenue
  • Customer expects lifetime updates
  • Lower total revenue per customer
  • No ongoing relationship

Recurring Subscription

Monthly or annual billing, the most common model:
{
  "pricing": {
    "model": "recurring",
    "plans": [
      {
        "id": "basic",
        "name": "Basic",
        "price": 999,      // $9.99/month
        "interval": "month",
        "features": [
          "Up to 100 orders/month",
          "Basic reports",
          "Email support"
        ]
      },
      {
        "id": "pro",
        "name": "Pro",
        "price": 2999,     // $29.99/month
        "interval": "month",
        "features": [
          "Unlimited orders",
          "Advanced analytics",
          "Priority support",
          "Custom branding"
        ]
      },
      {
        "id": "enterprise",
        "name": "Enterprise",
        "price": 9999,     // $99.99/month
        "interval": "month",
        "features": [
          "Everything in Pro",
          "Dedicated account manager",
          "SLA guarantee",
          "Custom integrations"
        ]
      }
    ]
  }
}

Annual Billing

Offer discounts for annual commitment:
{
  "pricing": {
    "model": "recurring",
    "plans": [
      {
        "id": "pro_monthly",
        "name": "Pro Monthly",
        "price": 2999,
        "interval": "month"
      },
      {
        "id": "pro_annual",
        "name": "Pro Annual",
        "price": 29990,    // $299.90/year (2 months free)
        "interval": "year",
        "savings": "Save 17%"
      }
    ]
  }
}

Free Trial

Let merchants try before buying:
{
  "pricing": {
    "model": "recurring",
    "trial": {
      "days": 14,
      "requirePaymentMethod": false
    },
    "plans": [
      {
        "id": "pro",
        "name": "Pro",
        "price": 2999,
        "interval": "month"
      }
    ]
  }
}
Trial options:
OptionDescription
daysTrial duration (7, 14, or 30 days)
requirePaymentMethodRequire card upfront (reduces cancellations)

Usage-Based Pricing

Charge per real-world event — per SMS sent, per AI generation, per shipping label printed. Declared as a usage block on a recurring plan (LaunchMyStore does not have a standalone usage_based model — metered always rides on top of a Stripe subscription, even if the flat monthly price is 0):
{
  "pricing": {
    "model": "recurring",
    "monthlyPrice": 0,
    "currency": "usd",
    "trialDays": 0,
    "usage": {
      "unitName": "SMS",
      "unitAmount": 0.05,
      "cappedAmount": 50,
      "terms": "$0.05 per SMS sent, billed monthly"
    }
  }
}
Cap enforcement (cappedAmount = $50 default monthly limit), idempotent event reporting, and end-of-period invoice handling are wired into the platform. See Usage-Based Billing for the full event → invoice flow and Usage Records API for endpoint references.

Hybrid Models

Combine models for flexibility:

Freemium

Free tier with paid upgrades:
{
  "pricing": {
    "model": "recurring",
    "plans": [
      {
        "id": "free",
        "name": "Free",
        "price": 0,
        "interval": "month",
        "features": [
          "Up to 50 orders/month",
          "Basic features"
        ],
        "limits": {
          "orders": 50
        }
      },
      {
        "id": "pro",
        "name": "Pro",
        "price": 1999,
        "interval": "month",
        "features": [
          "Unlimited orders",
          "All features"
        ]
      }
    ]
  }
}

Base + Usage

Flat monthly subscription plus a per-event metered component — this is the most common shape. Both items appear on one Stripe subscription; the merchant sees a combined invoice each period.
{
  "pricing": {
    "model": "recurring",
    "monthlyPrice": 9.99,
    "currency": "usd",
    "trialDays": 14,
    "usage": {
      "unitName": "SMS",
      "unitAmount": 0.02,
      "cappedAmount": 50
    }
  }
}
Each POST /api/v1/billing/usage call adds one UsageRecord to the Stripe metered item; at period end Stripe sums the records, multiplies by unitAmount, and bills monthlyPrice + total_usage.

Pricing Best Practices

Show a premium tier even if most customers choose the middle option. It makes the mid-tier feel like a good value.
If offering freemium, make sure the free tier has meaningful limits that encourage upgrades as the merchant grows.
15-20% annual discount reduces churn and improves cash flow. Frame it as “2 months free.”
2-3 tiers is ideal. More than 4 creates decision paralysis.
Price based on the value you create, not your costs. A 50/monthappthatsaves50/month app that saves 500/month is a good deal.
A/B test pricing pages. Small changes can significantly impact conversion.

Displaying Pricing

Use the pricing display components in your app listing:
import { PricingTable } from '@launchmystore/app-store-components';

function AppListing() {
  return (
    <PricingTable
      plans={[
        {
          name: 'Basic',
          price: '$9.99/mo',
          features: ['Feature 1', 'Feature 2'],
          cta: 'Start Free Trial'
        },
        {
          name: 'Pro',
          price: '$29.99/mo',
          features: ['All Basic features', 'Feature 3', 'Feature 4'],
          cta: 'Start Free Trial',
          popular: true
        }
      ]}
    />
  );
}

Price Changes

When changing prices for existing customers:
  1. Grandfather existing customers - Keep them on old pricing
  2. Give notice - 30 days minimum for price increases
  3. Explain value - Communicate what’s improved
// Check if customer is on legacy pricing
async function getEffectivePrice(shopId) {
  const subscription = await getSubscription(shopId);
  
  if (subscription.legacyPlan) {
    return subscription.legacyPlan.price;
  }
  
  return currentPricing[subscription.planId].price;
}

Currency Support

LaunchMyStore supports multiple currencies:
{
  "pricing": {
    "model": "recurring",
    "defaultCurrency": "USD",
    "plans": [
      {
        "id": "pro",
        "name": "Pro",
        "prices": {
          "USD": 2999,
          "EUR": 2799,
          "GBP": 2499,
          "INR": 199900
        },
        "interval": "month"
      }
    ]
  }
}
Merchants see prices in their local currency when available.

Revenue Share

LaunchMyStore takes a percentage of app revenue:
App TypeRevenue Share
Public apps20%
First-party apps0%
Private apps0%
Revenue share is calculated on gross revenue before refunds.

See Also