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>
);
};
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>
);
};
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>
);
};
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
});
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>
);
};
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>
);
};
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
});
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 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
"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
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
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
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
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
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
Co-Founder and CPO @ Gong