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
"Frequent changes in pricing & packaging are crucial for high-growth SaaS companies. We need a better way to implement iterations than occupying our R&D teams and slowing down product innovations."

Ofer Smadari
CEO @ Torq
"One of the most overlooked yet critical levers in business growth is pricing & packaging. But executing change is hard and slow. This is where Stigg comes in increasing speed of execution and evolving pricing into an iterative process."

Fessal Rahman
VP Global Monetization, Ex-Cloudinary
"Managing Pricing and Packaging has long been a source of frustration for companies large and small. Stigg offers a solution to help companies embrace Product Lead Growth and increase value realization."

Sam Lee
Director of Pricing & Monetization @ Snowflake
"Stigg is a true game changer for monetization teams! By unlocking 'commercial agility' through Packaging & Pricing. Finding the right price model no longer means compromises, months of implementation, and dependencies on scarce engineering resources."

Manuel Litz
Advisor, Ex-Contentful, Ex-Simon-Kucher