Source: SaaS/.md/STRIPE_SETUP.md · Rendered 2026-07-17
Created 2026-06-29. Verified against each app's actual code (not marketing) — prices below are what the apps expect. All plans are monthly, USD, no annual (the apps don't reference annual prices). Do this in Stripe Dashboard → Products (use the same Stripe account; live mode for production).
Every app also needs STRIPE_SECRET_KEY and STRIPE_WEBHOOK_SECRET in its deploy env.
⚠️ Three gotchas that will silently break billing if missed
- Env-var names differ per app — Replyee & Assistee use the
STRIPE_PRICE_* prefix; Compliee & Signnee use bare *_PRICE_ID. Don't copy-paste between apps.
- Compliee & Signnee require a
plan metadata key on each Stripe Price (value = the slug). Their customer.subscription.updated handler reads price.metadata.plan; without it, any upgrade/downgrade silently reverts the user to starter.
- Use the internal slug, not the display name, for metadata + env mapping. Assistee's middle tier shows "Professional" but its slug is
pro.
1. Replyee — replyee.online (webhook /api/webhooks/stripe)
| Product (display) | Price/mo | Slug | Map price ID to env var |
| Starter | $25 | starter | STRIPE_PRICE_STARTER |
| Growth | $49 | growth | STRIPE_PRICE_GROWTH |
| Agency | $99 | agency | STRIPE_PRICE_AGENCY |
- Metadata on price: not required (the webhook reverse-maps by price ID via those env vars — but the 3 env vars MUST be set or it falls back to
starter).
- Bot limits enforced in code: 1 / 5 / 999. Conversation caps (500/3,000/∞) are marketing-only, not enforced.
- Checkout sets a 14-day trial and allows promo codes.
- Events:
checkout.session.completed, customer.subscription.updated/deleted.
2. Compliee — compliee.online (webhook /api/stripe/webhook)
| Product (display) | Price/mo | Slug | Map price ID to env var | price.metadata.plan |
| Starter | $19 | starter | STARTER_PRICE_ID | starter |
| Pro | $39 | pro | PRO_PRICE_ID | pro |
| Agency | $99 | agency | AGENCY_PRICE_ID | agency |
- Set
plan metadata on each price (required — see gotcha #2).
- Limits: 1/3/10 sites, 10/50/100 pages per scan, monthly/weekly/daily scans.
- Events:
checkout.session.completed, customer.subscription.updated/deleted.
3. Assistee — assistee.online (webhook /api/stripe/webhook)
| Product (display) | Price/mo | Slug | Map price ID to env var |
| Starter | $10 | starter | STRIPE_PRICE_STARTER |
| Professional | $20 | pro | STRIPE_PRICE_PRO |
| Agency | $40 | agency | STRIPE_PRICE_AGENCY |
- Metadata on price: not required (webhook reads
session.metadata.plan set by checkout).
- Limits: 1/2/4 technicians, 2/4/6 devices.
- Also has
/api/stripe/portal (billing portal). Events: checkout.session.completed, customer.subscription.updated/deleted.
4. Signnee — signnee.online (webhook /api/stripe/webhook)
| Product (display) | Price/mo | Slug | Map price ID to env var | price.metadata.plan |
| Starter | $19 | starter | STARTER_PRICE_ID | starter |
| Growth | $49 | growth | GROWTH_PRICE_ID | growth |
| Agency | $99 | agency | AGENCY_PRICE_ID | agency |
- Set
plan metadata on each price (required — see gotcha #2).
- Limits: 25/150/unlimited docs/mo, 3/20/unlimited templates.
- Events:
checkout.session.completed, customer.subscription.updated/deleted.
One-sitting checklist
For each app: create 3 monthly USD products at the prices above → copy each price ID into the listed env var in the app's deploy env (Vercel for Replyee/Assistee, Coolify for Compliee/Signnee) → for Compliee & Signnee only, add a plan metadata field on each Price → set STRIPE_SECRET_KEY + create a webhook at the listed URL and put its signing secret in STRIPE_WEBHOOK_SECRET.
| App | Prices | Env-var style | Needs price metadata plan? | Webhook URL |
| Replyee | $25/$49/$99 | STRIPE_PRICE_* | No | https://www.replyee.online/api/webhooks/stripe |
| Compliee | $19/$39/$99 | *_PRICE_ID | Yes | https://compliee.online/api/stripe/webhook |
| Assistee | $10/$20/$40 | STRIPE_PRICE_* | No | https://assistee.online/api/stripe/webhook |
| Signnee | $19/$49/$99 | *_PRICE_ID | Yes | https://signnee.online/api/stripe/webhook |