Back to blog
pricingsaasstrategygrowthstriperevenue

SaaS Pricing Strategies: The Complete Handbook for Founders

By SaaS Masters13 maart 20268 min read
SaaS Pricing Strategies: The Complete Handbook for Founders

Pricing strategy is one of the most underestimated growth levers for SaaS companies. You can build the best product in the world, but with the wrong pricing you'll leave revenue on the table — or drive customers away. In this article, we'll deep-dive into the most effective pricing models, how to implement them, and which psychological principles you can leverage to boost conversion and retention.

Why pricing matters so much

Research from OpenView Partners shows that a 1% improvement in pricing yields an average of 12.7% more profit. By comparison, 1% more customers yields only 3.3% more profit. Yet most founders spend less than 6 hours on their pricing strategy before launching.

Pricing touches everything: your positioning, your target market, your churn rate, your CAC payback period, and ultimately your company valuation. Let's walk through the most important models.

The five key SaaS pricing models

1. Flat-rate pricing

The simplest model: one price, one package, all features.

When to choose this?

  • Your product solves one specific problem
  • Your target audience is homogeneous (similar company size and needs)
  • You want to make the decision as simple as possible

Example: Basecamp charges a flat monthly fee regardless of team size.

Advantage: No decision fatigue for the customer, easy to communicate. Disadvantage: You leave money on the table with large customers and can't differentiate.

2. Tiered pricing (packages)

By far the most popular model. You offer 2-4 packages with increasing features and limits.

Best practices for tiers:

  • 3 packages is the sweet spot (Good-Better-Best)
  • The middle package should be your "desired" choice
  • Use anchoring: make the most expensive package deliberately premium so the middle one feels reasonable
┌─────────────┬─────────────┬─────────────┐
│   Starter   │    Growth   │  Enterprise │
│  €49/month  │  €149/month │  €449/month │
├─────────────┼─────────────┼─────────────┤
│ 5 users     │ 25 users    │ Unlimited   │
│ 10GB storage│ 100GB       │ 1TB storage │
│ Email support│ Priority   │ Dedicated   │
│             │ API access  │ SLA & SSO   │
└─────────────┴─────────────┴─────────────┘

3. Usage-based pricing (pay-as-you-go)

The customer pays based on consumption: API calls, storage, messages, transactions.

When to choose this?

  • Your value scales directly with usage
  • Your customers vary significantly in volume
  • You want to keep the barrier to entry as low as possible

Example: Twilio charges per SMS, Stripe per transaction, AWS per compute hour.

Implementation tip: Always combine with a base price (platform fee). Pure usage-based makes your revenue unpredictable:

interface PricingCalculation {
  baseFee: number;        // €29/month platform fee
  includedUnits: number;  // 1000 API calls included
  overageRate: number;    // €0.002 per extra call
  
  calculate(usage: number): number {
    const overage = Math.max(0, usage - this.includedUnits);
    return this.baseFee + (overage * this.overageRate);
  }
}

4. Per-seat pricing (per user)

Price scales with the number of users. Simple to understand, predictable for both parties.

When to choose this?

  • Your product becomes more valuable as more team members use it
  • You sell to teams/companies (B2B)
  • You want upsell tied to organic growth at the customer

Watch out: Per-seat pricing can slow adoption. Teams start sharing accounts or limiting licenses. Consider variants:

  • Per active user (Slack model): only pay for active users
  • Banded pricing: 1-10 users = €X, 11-50 = €Y (less friction during growth)

5. Hybrid pricing

Most successful SaaS companies combine models. For example: tiered pricing with a usage component, or per-seat with feature gates.

Example architecture:

// Prisma schema for flexible pricing
model Subscription {
  id              String   @id @default(cuid())
  organizationId  String
  tier            Tier     @default(GROWTH)
  seatCount       Int      @default(1)
  usageCredits    Int      @default(0)
  
  // Monthly calculation
  // basePrice(tier) + (seatCount * seatPrice(tier)) + usage overage
}

enum Tier {
  STARTER
  GROWTH
  ENTERPRISE
}

Psychological pricing principles that work

Anchoring effect

Always show your most expensive package first (or make it visually prominent). This "anchors" the customer's perception. If the Enterprise package costs €449, Growth at €149 feels like a bargain.

Decoy effect

Add a package that's deliberately less attractive to make your desired package score better. If Starter offers 5 users at €49 and Growth offers 25 users at €99, add a "Pro" at €89 with 10 users. Suddenly Growth is a no-brainer.

Annual discount

Offer 15-20% discount on annual payments. This improves your cash flow, reduces churn (commitment effect), and increases LTV. Show it as "2 months free" instead of a percentage — that feels more concrete.

Free tier vs. free trial

StrategyBest forConversionRisk
Free trial (14 days)Complex B2B products15-25%Time pressure can scare off
FreemiumProducts with network effects2-5%Many free users who never convert
Reverse trialBest of both10-20%More complex to implement

Reverse trial is the emerging winner: give new users 14 days of access to all premium features, then they fall back to free. They've experienced the value and want it back.

Implementing pricing in your SaaS

Feature gating

// Middleware for feature checks
export function requireFeature(feature: string) {
  return async (req: Request, res: Response, next: NextFunction) => {
    const org = await getOrganization(req.user.orgId);
    const plan = PLAN_FEATURES[org.subscription.tier];
    
    if (!plan.features.includes(feature)) {
      return res.status(403).json({
        error: 'upgrade_required',
        message: \`This feature is available from the \${plan.upgradeTarget} plan.\`,
        upgradeUrl: \`/settings/billing?highlight=\${feature}\`
      });
    }
    
    next();
  };
}

// Feature definition per tier
const PLAN_FEATURES = {
  STARTER: {
    features: ['basic_reports', 'email_support', 'api_readonly'],
    limits: { seats: 5, storage_gb: 10, api_calls_month: 1000 }
  },
  GROWTH: {
    features: ['basic_reports', 'advanced_reports', 'api_full', 
               'priority_support', 'webhooks', 'custom_branding'],
    limits: { seats: 25, storage_gb: 100, api_calls_month: 50000 }
  },
  ENTERPRISE: {
    features: ['*'], // all features
    limits: { seats: -1, storage_gb: 1000, api_calls_month: -1 }
  }
};

Usage tracking

// Redis-based usage tracking for real-time limits
import Redis from 'ioredis';

const redis = new Redis(process.env.REDIS_URL);

export async function trackUsage(orgId: string, metric: string, amount = 1) {
  const key = \`usage:\${orgId}:\${metric}:\${getCurrentMonth()}\`;
  const current = await redis.incrby(key, amount);
  
  // Set expiry on first use (45 days for overlap)
  if (current === amount) {
    await redis.expire(key, 45 * 24 * 60 * 60);
  }
  
  // Check limit
  const limit = await getUsageLimit(orgId, metric);
  if (limit > 0 && current > limit) {
    await notifyUsageExceeded(orgId, metric, current, limit);
    // Soft limit: warn but don't block immediately
    // Hard limit: throw new UsageLimitExceeded()
  }
  
  return { current, limit, percentage: limit > 0 ? (current / limit) * 100 : 0 };
}

Stripe integration for multiple pricing models

// Hybrid pricing with Stripe
async function createSubscription(orgId: string, tier: string, seats: number) {
  const prices = {
    STARTER: { base: 'price_starter_base', seat: 'price_starter_seat' },
    GROWTH: { base: 'price_growth_base', seat: 'price_growth_seat' },
    ENTERPRISE: { base: 'price_enterprise_base', seat: 'price_enterprise_seat' },
  };
  
  const subscription = await stripe.subscriptions.create({
    customer: org.stripeCustomerId,
    items: [
      { price: prices[tier].base },                    // Base platform fee
      { price: prices[tier].seat, quantity: seats },    // Per-seat component
    ],
    // Report usage-based component via metered billing
    payment_behavior: 'default_incomplete',
    expand: ['latest_invoice.payment_intent'],
  });
  
  return subscription;
}

Testing and optimizing your pricing

Cohort analysis

Don't just measure conversion, also track:

  • Time-to-value: how quickly does a new customer reach the "aha moment"?
  • Expansion revenue: how much does a customer grow in revenue after the initial purchase?
  • Price sensitivity: test with A/B tests on the pricing page (note: do this ethically and legally!)

Pricing page optimization

  1. Show value, not features — "Save 10 hours per week" hits harder than "Automated workflows"
  2. Social proof per tier — "Most popular" or "Chosen by 500+ teams"
  3. Monthly/annual toggle — default to annual with the monthly price crossed out
  4. FAQ at the bottom — address objections directly on the pricing page
  5. CTA differentiation — "Start free" for Starter, "Contact us" for Enterprise

Common mistakes

  1. Launching too cheap — you can always go down, but raising prices is painful
  2. Never revisiting your prices — review at least twice a year
  3. Hiding your prices — transparency builds trust
  4. No annual discount — you're leaving cash flow and retention on the table
  5. Feature overload in the cheapest plan — give enough to show value, but save differentiators for higher tiers

Conclusion

The perfect pricing strategy doesn't exist — but the wrong one does. Start with a model that fits your product and target audience, implement it solidly with feature gating and usage tracking, and continuously optimize based on data. Your pricing isn't a one-time decision; it's an ongoing experiment.

Start simple, measure everything, and don't be afraid to raise your prices if you're delivering value. Most SaaS founders underprice themselves — and that's a problem you want to have, because it's easy to fix.