For anyone adding paid plans to a SaaS, with or without a coding agent
Stripe subscriptions in your SaaS. No webhook code.
When someone pays you through Stripe, your app has to find out, and keep finding out as they upgrade, stop paying, or cancel. That usually means writing and running code that receives Stripe's messages, called webhooks.
Strent does that part. Stripe charges your customers, Strent keeps track of which plan each one has, and your app decides what they can use.
export async function userHasPro(user: AppUser): Promise<boolean> {
const customer = await getStripeCustomerId(user.id);
if (!customer) return false;
return strent.activeItems.hasProduct({
customer,
product: process.env.STRIPE_PRO_PRODUCT_ID!,
});
} Checkpoint
After the user pays on Stripe's payment page,
userHasPro returns
true and Export PDF unlocks.
Adding subscriptions takes more than a payment page.
Say you sell a Pro plan that unlocks Export PDF. Here is what happens when a user buys it.
-
Your user pays on Stripe's page
They select Subscribe in your app and pay on Stripe Checkout, a payment page Stripe hosts.
-
Stripe tells Strent
Stripe sends Strent a message, a webhook, about the new subscription. You write no code to receive it.
-
Your app asks Strent
Before showing a paid feature, such as Export PDF, your app asks Strent whether the user has the Pro plan.
When the user later changes plans, stops paying, or cancels, Stripe tells Strent again, and the answer your app gets follows. Here is every part of it, and who does each one. The guide walks you through every row.
-
Plans and prices
Who does it: Stripe
You create them in your Stripe account.
-
The payment page
Who does it: Stripe
Stripe Checkout, a page Stripe hosts.
-
Plan changes and cancellations
Who does it: Stripe
The Stripe Customer Portal, another page Stripe hosts.
-
Linking each of your users to a Stripe customer
Who does it: Your app
The guide gives you the code.
-
Receiving Stripe's webhooks and remembering each customer's plan
Who does it: Strent
You paste a Strent web address into Stripe once and write no webhook code.
-
What each plan unlocks
Who does it: Your app
One call to Strent's Node.js library, then your own rules.
Your plans stay in Stripe. Works with any login and any database.
Plans set up once, in Stripe
You create your plans and prices in your own Stripe account. Strent reads them from there, so you never copy them into another tool or keep two lists in sync.
Any login
Strent needs only the ID Stripe gives each customer, not your users' accounts, so it works with whatever signs your users in: Supabase Auth, Auth.js, Better Auth, or your own.
Any database
Strent keeps track of each customer's subscriptions, so your app stores one value per user, their Stripe customer ID, in whatever database it already uses: Postgres, MySQL, MongoDB, or Firebase.
One guide. Seven checkpoints.
Every step ends with what you should see in Stripe, in Strent, or in your app. If it does not match, you know which step to fix before you move on.
- Create the Pro plan in Stripe
- Set up Strent
- Install the SDKs and create the clients
- Store each user's Stripe customer
- Check access to the paid feature
- Sell the plan with Checkout
- Cancel from the Customer Portal
Building with a coding agent? Paste the guide's prompt into it. The agent writes the code and asks you for the few steps that happen in Stripe and in Strent.
See what each customer has, what changes next, and why.
Strent Admin shows each customer's current plan, the next change already scheduled in Stripe, and when Strent last read the customer from Stripe.
When Strent can't read a customer from Stripe, it tries again on its own and shows you what still fails, so you can fix it and retry. Every customer is re-read from Stripe once a day, so a missed change is corrected within about a day. When support asks why a customer has access, the answer is on one page.
cus_R8mT2kQ4vXa9Lp
Last verified from Stripe 2 hours ago
Current access
Pro · $20/month · Active since
Scheduled changes
Pro · $20/month
Switches to Starter · $10/month on
Activity
Subscription schedule created in Stripe
Other ways to add subscriptions, compared honestly.
Strent is one option. Here is what each path leaves to you, and when Strent is the wrong one.
-
Write the webhook code yourself, or with a coding agent
You own the code that receives Stripe's messages, your own copy of each subscription, retrying what fails, and noticing when your copy no longer matches Stripe.
-
A library that copies Stripe into your database
You run it and host the copy, and you still write the logic that decides whether a customer has access.
-
Billing built into your login provider
Your plans live in that provider instead of Stripe, and billing is tied to its login.
-
Strent
Your plans stay in Stripe and any login works. Strent keeps each customer's plan current and answers your app's access checks.
Strent is not for you if you need
- Pricing by usage or credits, such as per API call or per AI token.
- A merchant of record outside Stripe: a company that sells on your behalf and handles sales tax for you.
- An app builder that already handles Stripe payments for you.
- Server code that doesn't run on Node.js: Strent's library is Node.js only.
Can't my coding agent write the webhooks?
It can, quickly. Writing that code is the easy part. Knowing it keeps giving the right answer as customers upgrade, stop paying, and cancel, noticing when it fails, and fixing it is the part that keeps costing, and the part Strent keeps doing for you. If you don't read the code your agent writes, it is also the part you can't check.
What if a customer pays and still can't use what they bought?
When the customer comes back from paying, your page makes one call that has Strent read them from Stripe before it checks access, so access doesn't wait for Stripe's webhook. If that call takes too long, the page says the payment is still being confirmed while Strent keeps reading. A read that fails is retried on its own.
What happens when Strent is down?
Your app checks access by asking Strent, not Stripe, so Strent is a service your app depends on. Strent's library plans for it being unavailable. It reuses a “yes” for up to 5 minutes, so removing access can take that long to reach your app. During an outage it uses a saved “yes” up to an hour old, with a warning, so removing access can take up to an hour then. It never reuses a “no”. That memory lives in each running copy of your server, so it covers an outage only in part. When Strent cannot answer, your app decides whether to deny, allow, or show an error. cache: false turns the reuse and the saved answers off.
Does Strent handle checkout or payments?
No. Stripe charges your customers and hosts Checkout and the Customer Portal. Strent only reads your customers' subscriptions, with a read-only Stripe key, and never moves money.
Priced by how many of your customers pay you.
A fixed monthly price per plan, free until you have real customers. Every plan has every feature, and Strent takes no share of your revenue.
-
Free
Up to 10 paying customers
$0 /month
-
Launch
Up to 100 paying customers
$9 /month
-
Growth
Up to 500 paying customers
$49 /month
-
Scale
Up to 1,000 paying customers
$99 /month
-
Established
Up to 2,500 paying customers
$199 /month
-
Above Established
More than 2,500 paying customers
Strent is free during the beta. No fee applies until at least 30 days after we tell you by email.
A paying customer is a real customer, in Stripe's live mode rather than its test mode, with an active subscription at a price above zero, counted once across your projects. Trials and free plans do not count.
Over your plan's limit, you get a warning and 30 days in which access checks and syncing with Stripe keep working. Strent never upgrades your plan for you. Prices are in USD and exclude VAT.
Sell your first plan.
Free while you validate. Paid once your SaaS has real customers.