Guides
Monetization
Built-in Stripe revenue: paid fast-track reviews and featured placements.
The template has two revenue features built in — no plugin, no third-party checkout. Both are Stripe Checkout plus a single webhook, and both stay completely hidden until you add Stripe keys, so a fresh clone runs without a Stripe account.
What you can sell
Fast-track reviews
A visitor submits a tool at /submit, then can pay to fast-track it. The price and toggle live in /admin/settings → Monetization (default $99). A paid submission is marked with the fasttrack channel and jumps to the top of the queue in /admin/submissions. Payment buys a guaranteed hands-on review and a fast decision — not acceptance.
Featured placements
Every tool page carries a "Feature this tool" card. The buyer pays, and the tool pins to the top of /tools with a labeled Featured badge for a set number of days (default 30, price default $149, both in settings). Buying again while still featured extends the window rather than resetting it.
Setup
- Create a Stripe account and grab your secret key.
- Add it to the environment as
STRIPE_SECRET_KEY. - Add a webhook endpoint in the Stripe dashboard pointing at
https://your-domain/api/webhooks/stripe, subscribed to thecheckout.session.completedevent. - Copy the signing secret into
STRIPE_WEBHOOK_SECRET. - Set your prices in
/admin/settings → Monetizationand enable the features you want.
Once STRIPE_SECRET_KEY is present the paid options appear on the public pages; without it they never render.
Testing locally
Use the Stripe CLI to forward events to your dev server:
stripe listen --forward-to localhost:3001/api/webhooks/stripe
The CLI prints a webhook signing secret — use that as STRIPE_WEBHOOK_SECRET while testing. Pay with Stripe's test card 4242 4242 4242 4242, any future expiry, any CVC.
How fulfillment works
The webhook at /api/webhooks/stripe is the single fulfillment point. On checkout.session.completed it:
- Verifies the Stripe signature (a missing or bad signature is rejected).
- Writes an
Orderrow keyed by the Stripe session id. That key is unique, so a redelivered event is a no-op — fulfillment is idempotent. - Flips the target: a fast-track order marks the submission
fasttrackand paid; a featured order extends the tool'sfeaturedUntiland revalidates the affected pages.
If fulfillment throws, the endpoint returns 500 so Stripe retries — the idempotency gate makes that safe. Orders on the same Stripe account that aren't one of these two kinds are ignored, so you can run other products through the same account.
Refunds are manual: refund in the Stripe dashboard, then reverse the effect in the admin console (un-feature the tool or re-open the submission).
Editorial integrity
Payment never buys acceptance, a rating, or an unlabeled slot. Fast-track buys a faster review, not a "yes." Featured placements are always shown with a visible Featured badge. Keeping money and editorial judgment separate is what keeps the directory trustworthy.
Selling your own products
Separately from these two features, the Checkout URL setting (/admin/settings → Pricing) points the /template and /pricing buy buttons at any external checkout — a Stripe Payment Link, Polar, Gumroad, or your own flow — so you can sell your copy of the site, or anything else. Leaving it empty points the button at the internal /pricing page. See Configuration.