GROWTH PATTERN

Adding Freemium Gating to Next.js + NextAuth + Stripe Apps

The Next.js + NextAuth + Stripe + Stripe setup processes payments, but there's no automated connection between feature usage and subscription limits.

Next.js + NextAuth + Stripe

Last updated:

What's Missing in Standard Next.js + NextAuth + Stripe Architecture

Stripe webhooks tell you about payment events, but they don't track whether a paying customer is actually using your product. You need separate infrastructure to monitor usage and enforce subscription limits.

Standard Next.js + NextAuth + Stripe Flow vs Optimized Skene Flow

Standard Flow
1

User subscribes via Stripe

2

Subscription status stored in your database

3

Features accessible but no usage limits enforced

Skene Flow
1

Track usage in your database 'subscriptions' and 'usage' tables

2

Detect when free tier user hits limit (e.g., 100 API calls)

3

Block feature access and trigger upgrade prompt email

4

Track conversion from free to paid

Visual comparison of the flows:

Loading diagram...

How Skene Fixes This

We created a Skene configuration that monitors your database usage metrics and Stripe subscriptions. It automatically blocks features for free users who exceed limits and triggers conversion-focused email sequences.

Implementation Comparison

Using Skene Infrastructure

Install via Prompt

cursor.mdc
@task: Initialize Skene.
@action: Analyze my local code, validating subscription via `npx skene login`, and generate `skene.config.ts` to implement the Freemium Gating pattern for Next.js + NextAuth + Stripe.

Copy Skene Prompt for Cursor

Generated skene.config.ts

skene.config.ts
// skene.config.ts - The Automated Way
import { defineLoop } from '@skene/sdk';

export default defineLoop({
  type: 'freemium',
  opinion: 'Enforce usage limits for free tier users and trigger upgrade prompts',
  steps: [
    {
      trigger: {
        type: 'api',
        endpoint: '/api/features/*',
        method: 'POST'
      },
      condition: {
        type: 'usage',
        limit: {
          free: 100,
          paid: Infinity
        },
        period: '30d'
      },
      action: {
        type: 'block',
        message: 'You've reached your free tier limit. Upgrade to continue.',
        upgradePrompt: {
          type: 'email',
          provider: 'resend',
          template: 'upgrade_prompt'
        }
      }
    }
  ],
  recovery: {
    retries: 0 // No retries for blocking actions
  }
});

Frequently asked questions