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
"We saw firsthand how tedious & annoying it is to use existing services for SaaS payments. APIs & abstractions are not tailored to SaaS subscriptions. We were forced to do a lot of undifferentiated heavy lifting, Stigg could have solved for us."
Guy Smoilovsky
Guy Smoilovsky
Co-Founder & CTO @ DAGsHub
"With product-led growth gaining momentum, more and more SaaS companies support a freemium plan or free trial. Setting up the right infrastructure to support full pricing and packaging flexibility is going to be crucial."
Guy Fighel
Guy Fighel
GVP of Product Engineering @ New Relic
"Pricing is hard. It requires product and corporate infrastructure and a lot of experimentation before you get it right. If you are not using Stigg - you are probably leaving money on the table."
Nir Nahum
Nir Nahum
CTO @ WalkMe
"Packaging and pricing is literally the core of a company's growth strategy. But there's a gap today between monetization flexibility and execution. Thanks to Stigg we can finally solve that missing link."
Daniel Kish
Daniel Kish
Director of Pricing & Packaging Strategy @ Gong
"Amazing tool that can accelerate payment rollout for any company. It's simple yet flexible and fits any use case we wanted to test. Help us get better understanding and control in building our pricing model."
Nimrod Popper
Nimrod Popper
Co-Founder & CTO @ Tolstoy
"The customer buying experience is a key part of the overall product experience - Stigg is going to help companies deliver exceptional buying experiences via increased agility & experimentation."
Divy Goel
Divy Goel
Monetization @ Grafana

Launch new pricing

Try Stigg