Launch

  • experiments
  • usage-based
  • free trials
  • freemium
  • self-service
  • new pricing

today

The problem of pricing is rooted in code, not billing.

Developers use Stigg's software & API to instantly build any pricing plan, gauge access control, introduce paywalls and customer portals, and fearlessly test & roll out changes.

IN PRODUCTION AT

Headless pricing engineered for fast-moving teams

Basically, we make your buyer experience awesome.

Why Stigg?

Build fast
Stigg’s API and SDKs let you launch plans, gate features, and introduce self-service additions in minutes.
Release confidently
Build safely in multi-environment and gradually roll out new pricing, without affecting existing customers.
Stay flexible
Requirements change. Stigg supports any change - from small to major - in a few button clicks.
Enable more
With Stigg’s no-code platform, anybody can easily run experiments, monitor usage, or extend individual plans.

Integrate once,

never deal with

  • billing
  • customer portals
  • trials
  • usage metering
  • feature limits
  • paywalls

Define metered or unmetered features and easily set limits for each plan.

import React from 'react';
import { useStiggContext } from '@stigg/react sdk';

const AddMemberButton = ({
  showAddMemberDialog,
  showUpsellDialog
}) => {
 const { stigg } = useStiggContext();
 return (
  <Button
   onClick={() => {
     const entitlement = stigg.getMeteredEntitlement({
         featureId: 'seats',
         options: {
           requestedUsage: 1,
         },
       });
       if (!entitlement.hasAccess) {
         showUpsellDialog();
       } else {
         showAddMemberDialog();
       }
     }}
   >
     Invite users
   </Button>
 );
};

Report usage per customer to gate access and communicate usage in Stigg’s platform and customer portal.

import Stigg from '@stigg/node-server-sdk';
import express from 'express';

const stigg = await Stigg.initialize({
  apiKey: 'SERVER_API_KEY'
});

const app = express();

app.post('/api/send-emails', async (req, res) => {
 const { recipients, message } = req.body;

 const emailsCount = await sendEmails(recipients, message);  

 await stigg.reportUsage({
   customerId: req.user.orgId,
   featureId: 'feature-email-sends',
   value: emailsCount // increment usage
 });

 res.json({ message: `${emailsCount} emails were sent` });
});

Add complete trial experiences to any pricing plan. No additional engineering work involved.

import React from 'react';
import { useStiggContenxt } from '@stigg/react-sdk';

 export const TrialBanner = () => {
   const [trialRemainingDays, setTrialRemainingDays] =    useState();
   const { stigg } = useStiggContenxt();

   useEffect(() => {
   stigg
     
.getCustomerPortal()
     .then(({ subscriptions }) => {
       const daysLeft = subscriptions[0]?.trialRemainingDays;          setDaysLeft(daysLeft);
     });
 }, [stigg]);

  return (
   <TrialBannerText>
    {trialRemainingDays} days left in your trial
   </TrialBannerText>
  );
};

Use best-in-class paywall widgets in-app and on the pricing page. Automatically update changes in your pricing model.

import React from 'react';
import { StiggProvider, Paywall } from '@stigg/react-sdk';

const PricingPlans = ({ subscribeToPlan }) => {
 return (
  <
StiggProvider apiKey="CLIENT_API_KEY">
    <Paywall
      highlightedPlanId="pro-plan"
      onPlanSelected={({plan, customer }) => {                subscribe(plan, customer);
      }}
    />
  </StiggProvider>
 );
};

Introduce customer portals out of the box. Let customers control their plan, usage, and billing history.

import React from 'react';
import {
  StiggProvider,
  CustomerPortal
} from '@stigg/react-sdk/
import { PricingPlans } from './PricingPlans';

export const CustomerPortalPage = () => (
 <StiggProvider
   apiKey
="CLIENT_API_KEY"
   customerId="CUSTOMER_ID"
 
>
  <CustomerPortal
    paywallComponent={<PricingPlans />}
  />
 
</StiggProvider>
);

Integrate once, never deal with billing again. Easily import existing data. No more Stripe IDs. No more webhooks. Switch billing providers with a click of a button.

import Stigg from'@stigg/node-server-sdk';
import express from 'express';

const stigg = await Stigg.initialize({
  apiKey: 'SERVER_API_KEY'
});

const app = express();

app.post('/api/subscribe/', async (req, res) => {
 const { user, body } = req;
 const { planId, billingPeriod } = body;

 const provisionResult = await stigg.provisionSubscription({
   customerId: user.orgId,
   planId: planId,
   billingPeriod,
   checkoutOptions: {
     successUrl: 'https://app.acme.com/success',
     cancelUrl: 'https://app.acme.com/failure',
   }
 });
 if (provisionResult.provisionStatus === 'PaymentRequired') {
   res.json({
     redirectTo: provisionResult.checkoutUrl
   });

Feature limits

Define metered or unmetered features and easily set limits for each plan.
import React from 'react';
import { useStiggContext } from '@stigg/react sdk';

const AddMemberButton = ({
  showAddMemberDialog,
  showUpsellDialog
}) => {
 const { stigg } = useStiggContext();
 return (
  <Button
   onClick={() => {
     const entitlement = stigg.getMeteredEntitlement({
         featureId: 'seats',
         options: {
           requestedUsage: 1,
         },
       });
       if (!entitlement.hasAccess) {
         showUpsellDialog();
       } else {
         showAddMemberDialog();
       }
     }}
   >
     Invite users
   </Button>
 );
};

Usage metering

Report usage per customer to gate access and communicate usage in Stigg’s platform and customer portal.
import Stigg from '@stigg/node-server-sdk';
import express from 'express';

const stigg = await Stigg.initialize({
  apiKey: 'SERVER_API_KEY'
});

const app = express();

app.post('/api/send-emails', async (req, res) => {
 const { recipients, message } = req.body;

 const emailsCount = await sendEmails(recipients, message);  

 await stigg.reportUsage({
   customerId: req.user.orgId,
   featureId: 'feature-email-sends',
   value: emailsCount // increment usage
 });

 res.json({ message: `${emailsCount} emails were sent` });
});

Trials

Add complete trial experiences to any pricing plan. No additional engineering work involved.
import React from 'react';
import { useStiggContenxt } from '@stigg/react-sdk';

 export const TrialBanner = () => {
   const [trialRemainingDays, setTrialRemainingDays] =    useState();
   const { stigg } = useStiggContenxt();

   useEffect(() => {
   stigg
     
.getCustomerPortal()
     .then(({ subscriptions }) => {
       const daysLeft = subscriptions[0]?.trialRemainingDays;          setDaysLeft(daysLeft);
     });
 }, [stigg]);

  return (
   <TrialBannerText>
    {trialRemainingDays} days left in your trial
   </TrialBannerText>
  );
};

Paywalls

Use best-in-class paywall widgets in-app and on the pricing page. Automatically update changes in your pricing model.
import React from 'react';
import { StiggProvider, Paywall } from '@stigg/react-sdk';

const PricingPlans = ({ subscribeToPlan }) => {
 return (
  <
StiggProvider apiKey="CLIENT_API_KEY">
    <Paywall
      highlightedPlanId="pro-plan"
      onPlanSelected={({plan, customer }) => {                subscribe(plan, customer);
      }}
    />
  </StiggProvider>
 );
};

Customer portals

Introduce customer portals out of the box. Let customers control their plan, usage, and billing history.
import React from 'react';
import {
  StiggProvider,
  CustomerPortal
} from '@stigg/react-sdk/
import { PricingPlans } from './PricingPlans';

export const CustomerPortalPage = () => (
 <StiggProvider
   apiKey
="CLIENT_API_KEY"
   customerId="CUSTOMER_ID"
 
>
  <CustomerPortal
    paywallComponent={<PricingPlans />}
  />
 
</StiggProvider>
);

Billing

Connect your billing once, easily import existing data, and let us do the maintenance for you.
import Stigg from'@stigg/node-server-sdk';
import express from 'express';

const stigg = await Stigg.initialize({
  apiKey: 'SERVER_API_KEY'
});

const app = express();

app.post('/api/subscribe/', async (req, res) => {
 const { user, body } = req;
 const { planId, billingPeriod } = body;

 const provisionResult = await stigg.provisionSubscription({
   customerId: user.orgId,
   planId: planId,
   billingPeriod,
   checkoutOptions: {
     successUrl: 'https://app.acme.com/success',
     cancelUrl: 'https://app.acme.com/failure',
   }
 });
 if (provisionResult.provisionStatus === 'PaymentRequired') {
   res.json({
     redirectTo: provisionResult.checkoutUrl
   });

We’ve built snap-in widgets, so you don’t have to

Paywall

Add best-in-class paywalls to your application and public pricing page, completely customizable. Automatically reflects changes in your pricing model.

Add best-in-class paywalls to your application and public pricing page, completely customizable. Automatically reflects changes in your pricing model.Add best-in-class paywalls to your application and public pricing page, completely customizable. Automatically reflects changes in your pricing model.
import React from 'react'
import { StiggProvider, Paywall } from '@stigg/react-sdk'

export const PricingPlans = ({ onSubscribe }) => {
return (
 <StiggProvider customerId="CUSTOMER_ID" apiKey="CLIENT_API_KEY">
   <Paywall
     highlightedPlanId="PLAN_ID"
     onPlanSelected={({ plan, customer }) => {
        onSubscribe(plan, customer);
     }}
   />
 </StiggProvider>
);
};
<script setup lang="ts">
import {
 StiggProvider, StiggProviderProps, Paywall, PaywallProps
} from '@stigg/vue-sdk';
   
const stiggProvider: StiggProviderProps = {
 apiKey: "<STIGG_CLIENT_API_KEY>",
}
     
const paywall: PaywallProps = {
  onPlanSelected: ({plan}) => {
     console.log(`Selected plan: ${plan.displayName}`);
  }
}
</script>

<template>
  <StiggProvider v-bind="stiggProvider">
     <Paywall v-bind="paywall" />
  </StiggProvider>
</template>
import type { NextPage } from 'next'
import { Paywall, Plan, StiggProvider } from "@stigg/react-sdk";


const PricingPlans: NextPage = () => {
 return (
   <StiggProvider apiKey="STIGG_CLIENT_API_KEY">
     <Paywall onPlanSelected={({ plan }: { plan: Plan }) => {
       console.log(`Selected plan: ${plan.displayName}`);
     }} />
   </StiggProvider>
 )
}

export default PricingPlans
<!DOCTYPE html>
<html>
 <head>
   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@stigg/embed-
sdk@latest/dist/embed-sdk.css"
/>
 </head>
 <body>
   <script src="https://cdn.jsdelivr.net/npm/@stigg/embed-sdk@latest/dist/embed-sdk.js">
</script>

   <div id="paywall"></div>

   <script>
     const stigg = Stigg({
       apiKey: "CLIENT_API_KEY",
     });

     const paywall = stigg.Paywall({
       onPlanSelected: ({ plan }) => {
         console.log('Plan selected', plan.displayName);
       },
     });

     // mount the paywall to the container element
     paywall.mount('#paywall');
     </script>
 </body>
</html>
<!DOCTYPE html>
<html>
 <head>
   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@stigg/embed-
sdk@latest/dist/embed-sdk.css"
/>
 </head>
 <body>
   <script src="https://cdn.jsdelivr.net/npm/@stigg/embed-sdk@latest/dist/embed-sdk.js">
</script>

   <div id="paywall"></div>

   <script>
     const stigg = Stigg({
       apiKey: "CLIENT_API_KEY",
     });

     const paywall = stigg.Paywall({
       onPlanSelected: ({ plan }) => {
         console.log('Plan selected', plan.displayName);
       },
     });

     // mount the paywall to the container element
     paywall.mount('#paywall');
     </script>
 </body>
</html>
<!DOCTYPE html>
<html>
 <head>
   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@stigg/embed-
sdk@latest/dist/embed-sdk.css"
/>
 </head>
 <body>
   <script src="https://cdn.jsdelivr.net/npm/@stigg/embed-sdk@latest/dist/embed-sdk.js">
</script>

   <div id="paywall"></div>

   <script>
     const stigg = Stigg({
       apiKey: "CLIENT_API_KEY",
     });

     const paywall = stigg.Paywall({
       onPlanSelected: ({ plan }) => {
         console.log('Plan selected', plan.displayName);
       },
     });

     // mount the paywall to the container element
     paywall.mount('#paywall');
     </script>
 </body>
</html>
<!DOCTYPE html>
<html>
 <head>
   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@stigg/embed-
sdk@latest/dist/embed-sdk.css"
/>
 </head>
 <body>
   <script src="https://cdn.jsdelivr.net/npm/@stigg/embed-sdk@latest/dist/embed-sdk.js">
</script>

   <div id="paywall"></div>

   <script>
     const stigg = Stigg({
       apiKey: "CLIENT_API_KEY",
     });

     const paywall = stigg.Paywall({
       onPlanSelected: ({ plan }) => {
         console.log('Plan selected', plan.displayName);
       },
     });

     // mount the paywall to the container element
     paywall.mount('#paywall');
     </script>
 </body>
</html>

Customer Portal

Enable your customers to be on top of their usage, pricing plan, and billing with self-service customer portals. Automatically updates when your pricing changes.

Enable your customers to be on top of their usage, pricing plan, and billing with self-service customer portals. Automatically updates when your pricing changes.Enable your customers to be on top of their usage, pricing plan, and billing with self-service customer portals. Automatically updates when your pricing changes.
import React from 'react'
import { StiggProvider, CutomerPortal} from '@stigg/react-sdk'

export const BillingPortal= () => {
return (
 <StiggProvider customerId="CUSTOMER_ID" apiKey="CLIENT_API_KEY">
   <CustomerPortal />
 </StiggProvider>
);
};
<script setup lang="ts">
import {StiggProvider, CustomerPortal, CustomerPortalProps} from '@stigg/vue-sdk';
   
const apiKey = "<STIGG_CLIENT_API_KEY>";

const customerId = "<CUSTOMER-ID>";

const customerPortal: CustomerPortalProps = {
  onManageSubscription: () => {
    console.log('Manage subscription');
  }
}
</script>

<template>
  <StiggProvider :apiKey="apiKey" :customer-id="customerId">
     <CustomerPortal v-bind="customerPortal"/>
  </StiggProvider>
</template>
import type { NextPage } from 'next'
import { CustomerPortal, StiggProvider} from "@stigg/react-sdk";

const PricingPlans: NextPage = () => {
 return (
   <StiggProvider apiKey="STIGG_CLIENT_API_KEY" customerId="CUSTOMER_ID">
     <CustomerPortal />
   </StiggProvider>
 )
}

export default PricingPlans

Checkout

Easily accept payments with pre-built checkout flows. Automatically reflects changes in your pricing model. Fully compatible with any billing provider.

Easily accept payments with pre-built checkout flows. Automatically reflects changes in your pricing model. Fully compatible with any billing provider.Easily accept payments with pre-built checkout flows. Automatically reflects changes in your pricing model. Fully compatible with any billing provider.
import React from 'react'
import { StiggProvider, Checkout} from '@stigg/react-sdk'

export const CheckoutView= () => {
return (
 <StiggProvider customerId="CUSTOMER_ID" apiKey="CLIENT_API_KEY">
   <Checkout />
 </StiggProvider>
);
};
<script setup lang="ts">
import {StiggProvider, Checkout, CheckoutProps} from '@stigg/vue-sdk';
   
const apiKey = "<STIGG_CLIENT_API_KEY>";

const customerId = "<CUSTOMER-ID>";

const checkoutProps: CheckoutProps = {
  onCheckout: () => {
    console.log('Customer checked out');
  }
}
</script>

<template>
  <StiggProvider :apiKey="apiKey" :customer-id="customerId">
     <Checkout v-bind="checkoutView"/>
  </StiggProvider>
</template>
import type { NextPage } from 'next'
import { CustomerPortal, StiggProvider} from "@stigg/react-sdk";

const CheckoutView: NextPage = () => {
 return (
   <StiggProvider apiKey="STIGG_CLIENT_API_KEY" customerId="CUSTOMER_ID">
     <Checkout />
   </StiggProvider>
 )
}

export default CheckoutView

Get started with Stigg the way you want.

SDKs & API

API controls for every feature, incl. API playground. Easy-to-integrate SDKs in multiple languages.

See our SDKs

API-Gateway

Integrate faster with AWS API Gateway and and gate features from one place only using Lambda authorizers.

See our API-Gateway

Bring your own solution

Use Stigg's cloud services and UI to build a custom integration on top of your own solution.

See our CMS-like integration

Built for speed & scale

<100ms
to serve entitlement requests
99.99%
up time with multiple layers of redundancy
100M+
requests handled monthly worldwide
16M+
subscriptions managed monthly

Fully compliant and secure

Stigg’s platform undergoes rigorous external audits and regular updates to deliver the highest grade of industry security and compliance standards, including SOC 2 Type II compliant and ISO 27001 certified.

Don’t take our word for it

As seen in
"As an engineering leader, what Stigg really gives me is focus. It allows me to focus on how can we bring more growth to the company, while the 'gravy' around pricing & packaging is taken care of."
Utkarsh Sengar
Utkarsh Sengar
Director of Engineering, Growth @ Webflow
"Not consulting, but if you're looking for a product to help with your PLG pricing, you should check out Stigg."
Bill Staples
Bill Staples
CEO @ New Relic
"Optimizing pricing & packaging is crucial for PLG companies, but technical challenges in the implementation often prevent rapid changes. Stigg would have been a huge help to our developers at both SendGrid and GitLab."
Scott Williamson
Scott Williamson
CPO, ex Gitlab, ex Sendgrid
"Packaging the value your product offers and pricing it effectively are often under-explored growth levers to your business. Being able to rapidly iterate your pricing to fit your evolving customer base is a must at every stage of your business."
Srinivas Somayajula
Srinivas Somayajula
Head of Product Ops & Monetization @ Calendly
"Flexibility in pricing & plans is critical for the success of SaaS companies. Even harder when catering for both Enterprise and PLG sales. You don't want these operational considerations to become an obstacle for success."
Tal Lev-Ami
Tal Lev-Ami
Co-Founder & CTO @ Cloudinary
"Immediately after launching self-service purchasing at Gong, we saw a stream of customers buying seats online instead of reaching out to their CSMs. This ability quickly became an important part of our go-to-market motion."
Eilon Reshef
Eilon Reshef
Co-Founder and CPO @ Gong

Launch new pricing

Try Stigg