Selling it as SaaS
Plans and feature keys, connecting Stripe, PayPal and Razorpay for subscriptions, what happens after a payment, and which licence you need to charge customers.
8 min readUpdated Oct 17, 2026Applies to LinkNest 1.0.0
On this page
LinkNest can run as a multi-tenant service: creators sign up, each gets a page, and they pay you monthly for a plan. Everything on this page is optional if you run it for yourself.
Important
Check your licence first. On CodeCanyon, the Regular License covers one end product whose end users are not charged. If your customers pay to use what you build with LinkNest (a subscription, a paid plan, any fee), you need the Extended License. Read Envato's licence terms for the authoritative wording; this note is a summary, not legal advice. The documentation/index.html help file in the package describes the Regular License more loosely; Envato's page is what counts.
Plans
Three plans are created by the migrations. Every new page starts on Free.
| Plan | Price | Button | Feature keys |
|---|---|---|---|
| Free | $0 | Start free | links, themes_basic, analytics, emails |
| Pro (featured) | $6 / month | Go Pro | Free's keys plus themes_all, fonts, custom_bg, hide_branding, inbox, shop, schedule, share_kit, tips, locks, now, live_status, copilot, experiments, custom_domain, broadcasts |
| Premium | $12 / month | Talk to us | Pro's keys plus faces, face_schedule, team, guests, letter, place, place_commerce |
Under Admin → Plans you can edit each plan's name, monthly price in USD, blurb, button label, featured flag, whether it is shown on /pricing, its feature keys and an optional gateway price ID, and add new plans. Deleting a plan moves its pages to Free; the Free plan cannot be deleted.
Note
The module keys (live_status, copilot, experiments, custom_domain, broadcasts, and on Premium faces, face_schedule, place and place_commerce) are added by migration 0015, to the plans with the IDs pro and premium only. It adds keys and never removes any, so keys you ticked yourself stay, and it also runs when you update an existing install: a key you had deliberately left off Pro or Premium is now on it. Review Admin → Plans after updating. Plans you created yourself are not touched.
There are no usage limits in plans (no caps on links, views or pages). The only built-in limit is the co-pilot's 40 runs per page.
Feature keys
Ticking a key in a plan unlocks something for the pages on that plan. Seven keys are checked on the server, marked "Server" below. The others are checked only in the studio's interface, or not at all; those that are not checked are labels on the pricing page until the code uses them.
| Key | Admin label | Checked | What it unlocks |
|---|---|---|---|
links |
Links | No | Every page can add links. |
themes_basic |
Core themes | No | The first 6 themes are always available. |
themes_all |
All themes | Studio | All 18 themes on Look |
fonts |
All typefaces | Studio | All 9 typefaces on Look |
custom_bg |
Background photo | Studio | The background photo on Look |
analytics |
Analytics | No | Insights is open to every plan. |
hide_branding |
Hide LinkNest mark | Public page | Removes the platform mark from the public page |
inbox |
Inbox | Studio | The Inbox screen and the message form on the public page |
shop |
Shop / products | No | Products live under Earn, which needs tips. |
schedule |
Scheduled links | No | Every page can schedule links. |
share_kit |
QR + story cards | Studio | The Business cards tool |
tips |
Support button | Studio | The Earn screen |
locks |
Locked links | No | Every page can lock links. |
now |
Now pin | No | Every page can pin a link. |
emails |
Collect emails | No | Every page can collect emails. |
faces |
Extra pages | No | Every page can add faces. |
face_schedule |
Face campaign schedules | Server | The campaign schedule on each face, and whether the public page follows it |
live_status |
Live status strip | Server | Publishing a live status, and showing it on the public page |
copilot |
AI page co-pilot | Server | The Co-pilot screen: running, reading usage and applying plans |
team |
Team seats | No | Every page can list teammates. |
guests |
Guest page | No | Every page can create guest pages. |
letter |
Weekly letter | No | Every page can turn on the weekly letter. |
place |
Place mode | Studio | The Place screen (as does place_commerce) |
place_commerce |
Place specials + table QR | Server | Specials and table QR stations, and showing specials on the public page |
experiments |
Link A/B tests | Server | A/B title tests, and splitting visitors between titles on the public page |
custom_domain |
Custom domain | Server | Saving and verifying a custom domain, and serving the page on it |
broadcasts |
Email broadcasts | Server | Sending broadcasts and listing past ones |
"Studio" keys are checked in the browser only: a creator who calls the server functions directly can use them without the key. hide_branding is applied when the public page is drawn from the plan's keys, so it holds. Where a server check fails, the creator sees a message such as "Email broadcasts is not on your plan. Upgrade to use it."
Warning
Twenty of the 27 keys have no server check, and twelve of them (links, themes_basic, analytics, emails, shop, schedule, locks, now, faces, team, guests, letter) are not checked anywhere. Treat those parts of a plan as packaging for honest customers, and see Known limitations.
The pricing page
/pricing lists every plan marked as shown, in the order of the admin list, with prices in whole US dollars and one checkout button per connected gateway. A visitor who is not signed in is asked to sign up first. A creator can also reach it from Settings → Change plan.
Setting up the gateways
Connect at least one under Admin → Payment settings, use Test connection, then register the webhook shown on that screen with the provider. Without a verified webhook, cancellations and renewals are not seen.
Stripe
- Paste the publishable key, secret key and, after step 2, the webhook signing secret.
- In Stripe, add a webhook endpoint at
https://<your-domain>/api/stripe/webhookfor these events:checkout.session.completed(subscriptions, tips and products)customer.subscription.updatedcustomer.subscription.deleted
- Turn on the customer portal in Stripe (Settings, Billing, Customer portal) so Manage card works.
- Optional: create a recurring price per plan in Stripe and paste its ID (
price_…) into the plan. Without one, checkout creates a monthly USD price from the plan's price, with the product named "LinkNest" plus the plan name.
Use test keys first; Stripe's test card 4242 4242 4242 4242 completes a checkout. When the creator returns, /dashboard/settings?billing=success checks Stripe and switches the plan straight away; the webhook keeps it in sync afterwards.
PayPal
- Create a REST app in the PayPal developer dashboard and paste its client ID and secret.
- Add a webhook at
https://<your-domain>/api/paypal/webhookforBILLING.SUBSCRIPTION.ACTIVATED,BILLING.SUBSCRIPTION.CANCELLED,BILLING.SUBSCRIPTION.EXPIREDandBILLING.SUBSCRIPTION.SUSPENDED, plusCHECKOUT.ORDER.APPROVEDandPAYMENT.CAPTURE.COMPLETEDif you take tips through PayPal. - Paste the webhook ID PayPal shows. It is required: without it every PayPal webhook is refused with 503, and each event is verified with PayPal before it is used.
- Switch off Sandbox when you move to live credentials. It is on by default.
Each PayPal checkout creates a new PayPal product and billing plan for that subscription, at the plan's price in USD. Gateway price IDs are not used for PayPal.
Razorpay
- Paste the key ID and key secret, and choose the currency: USD (default) or INR. For INR, also enter INR per 1 USD, for example
83.5. - Add a webhook at
https://<your-domain>/api/razorpay/webhookwith a secret, and paste the secret. Events:subscription.activated,subscription.cancelledandsubscription.completed, pluspayment_link.paidif you take tips through Razorpay. - Each checkout creates a Razorpay plan and subscription and sends the creator to Razorpay's hosted page.
Every price in LinkNest (plans, tips and products) is stored in US dollars. Razorpay charges it in USD unless you choose INR and save a rate; then the amount is converted at that rate and charged in rupees. A $6 plan at 83.5 is charged ₹501. The rate is a fixed number you set: LinkNest does not update it, so review it from time to time. If INR is chosen but the rate is empty, Razorpay charges USD. The rate must be a positive number; anything else is refused when you save.
Important
Before relying on the USD default, check with Razorpay that your account can accept USD (international payments) for subscriptions and payment links. If you used the old workaround of entering plan prices in rupees (499 for ₹499), change the prices back to dollars and set a rate after updating, or Razorpay will charge 499 US dollars, or 499 times your rate in rupees.
What happens after a payment
| Event | Result |
|---|---|
| Checkout completed, subscription active | The page moves to the plan, its status is "active", and a row is written to the payment ledger in Admin → Finance. |
| Subscription cancelled, expired or unpaid | The page moves back to Free. |
| Stripe subscription past due | The page moves back to Free with the status "past_due". There is no grace period. |
| Plan changed under Admin → People | Applied at once, recorded with the provider "admin". The gateway is not told, and its next webhook wins. |
The ledger records the plan's list price, not the amount the gateway actually charged, and it is not reconciled against the gateway. Estimated MRR in Finance is the sum of the list prices of every page on a paid plan, including ones you set by hand.
Before you launch a SaaS
- Buy the right licence (see the top of this page).
- Set
ADMIN_EMAILSand register every listed address on the live site before you share the URL (Admins). - Set
SETTINGS_ENCRYPTION_KEYbefore you save payment keys, and keep it (Encrypted payment secrets). - Review the feature keys on each plan, set prices in US dollars and, if you charge INR through Razorpay, set the rate.
- Unpublish or delete the four sample pages (Admin).
- Set the brand, SEO text and share image under Admin → Brand, and replace
public/og.jpg. - Read Earn and payouts before you let creators take tips: the money comes to you.
- Set a spending limit on your xAI account if the co-pilot is on.
- Read Known limitations so your own sales pages promise only what the product does.