How It Works

From Zero to Paywall in 5 Minutes

PaywallOS makes monetization simple. Define verbs, map to tiers, add attributes. Done.

1

Create Your App

Sign up for PaywallOS and create your first app. You'll get an API key and App ID instantly.

# Install PaywallOS SDK
npm install @paywallos/sdk

# Or with other package managers
pnpm add @paywallos/sdk
yarn add @paywallos/sdk
2

Define Your Verbs

Create an OpenVerb library describing what users can do in your app. Use our AI assistant or write it yourself.

{
  "namespace": "myapp.core",
  "verbs": [
    {
      "name": "export_data",
      "category": "file_system",
      "description": "Export user data to CSV"
    },
    {
      "name": "generate_report",
      "category": "analysis",
      "description": "Generate analytics report"
    }
  ]
}
3

Create Pricing Tiers

Set up your pricing tiers (Free, Pro, Enterprise, etc.) and add your Stripe Price IDs.

Free
$0
  • • Basic features
  • • 10 exports/month
Popular
Pro
$29
  • • All features
  • • 100 exports/month
Enterprise
$299
  • • Unlimited everything
  • • Priority support
4

Map Verbs to Tiers

Assign which verbs are available in each tier. Set usage limits if needed.

export_dataPro & above
generate_reportPro & above
ai_suggestionsEnterprise only
5

Add to Your App

Wrap your app with PaywallOSProvider and add verb= attributes. That's it!

import { PaywallOSProvider } from '@paywallos/sdk'

function App() {
  return (
    <PaywallOSProvider 
      apiKey="pk_..."
      userId={user.id}
      appId="app_..."
    >
      {/* Your app */}
      <button verb="export_data">Export</button>
      <button verb="generate_report">Reports</button>
    </PaywallOSProvider>
  )
}

Done! 🎉

PaywallOS now automatically:

  • Intercepts clicks on elements with verb= attributes
  • Checks user's subscription tier
  • Allows or blocks action in <10ms
  • Shows upgrade modal when blocked

How It Works Under the Hood

User clicks <button verb="export_data">
         ↓
PaywallOS intercepts click (capture phase)
         ↓
POST /api/openverb/check
  {
    verbId: "export_data",
    userId: "user_123",
    appId: "app_456"
  }
         ↓
Database queries:
  1. Get user's subscription tier
  2. Check if verb enabled for tier
  3. Check usage limits (if any)
         ↓
Response (~10ms):
  {
    allowed: true,
    userTier: "pro",
    message: "Access granted"
  }
         ↓
If allowed: Original action proceeds
If blocked: Show upgrade modal

Ready to Get Started?

Build your first paywall in 5 minutes