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
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>
);
};
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>
);
};
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>
);
};
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` });
});
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>
);
};
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>
);
};
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>
);
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
});
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
});
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>
);
};
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>
);
};
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>
);
};
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` });
});
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>
);
};
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>
);
};
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>
);
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
});
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
});
Getting started with Stigg is easy.
We built world-class integration options, so you don’t have to.














































SDKs & API
API controls for every feature, incl. API playground. Easy-to-integrate SDKs in multiple languages.
See our SDKsAPI-Gateway
Integrate faster with AWS API Gateway and and gate features from one place only using Lambda authorizers.
See our API-GatewayBring 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 integrationBuilt 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
"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
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
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
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
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
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
Monetization @ Grafana