- Customer creates a free workspace in Hookkeep (saves owner token).
- Subscribes via Stripe Checkout — $9/mo (landing
#stripe//subscribe). - Stripe webhook sets
tier=paid(when billing stub is live). - Fallback (pre-Stripe): operator issues a one-time unlock code (below).
- Customer opens dashboard → Unlock Pro → pastes code if needed.
Codes live in data/hookkeep.json → unlockCodes.
Seed codes shipped with MVP:
HOOKKEEP-PRO-DEMO01— reusable demo (note containsdemo; does not burn)HOOKKEEP-PRO-KESTREL— one-time launch code
To mint a new code (server offline or via shell):
node -e "
import fs from 'fs';
const p='data/hookkeep.json';
const db=JSON.parse(fs.readFileSync(p,'utf8'));
const code='HOOKKEEP-PRO-'+Math.random().toString(36).slice(2,8).toUpperCase();
db.unlockCodes[code]={tier:'paid',usedBy:null,note:'stripe-or-manual',createdAt:new Date().toISOString()};
fs.writeFileSync(p,JSON.stringify(db,null,2));
console.log(code);
"After redeem, usedBy is set to workspace id — code cannot be reused.
Once tier=paid, alerts fire on ingested events when either:
- inbox
alertKeywordmatches the body/statusGuess (case-insensitive), or - an HTTP-ish status ≥ 400 is found in the payload (
status/statusCode/httpStatus/codefields,statusGuess, or"status":500-style body text).
Delivery (no SMTP required):
- Notify webhook — if inbox
notifyWebhookUrlis set (https, or localhost for dev), Hookkeep POSTs a Discord/Slack-compatible{ "content": "…" }JSON body (~8s timeout, failures never break ingest). data/alerts.ndjson— every alert appended as one NDJSON line +[hookkeep:alert]console log (greppable ops queue).- Mailto hint — the alert record and ingest API response include a
mailtoHint(toalertEmail→ workspace email → pay contact) with prefilled subject/body.
Free workspaces get no alerts even if the fields are set.
POST /api/stripe/fulfill with header x-fulfill-secret: $HOOKKEEP_FULFILL_SECRET
lets the stripe-billing app auto-unlock after checkout.session.completed:
{ "workspaceId": "ws_…", "sessionId": "cs_…" } // mints + redeems a fresh code
{ "email": "u@x.com", "code": "HOOKKEEP-PRO-…" } // redeems an existing codeReturns 503 until HOOKKEEP_FULFILL_SECRET is set — safe to leave off.
Wire stripe-billing fulfill— done in stripe-billing4f5f846(HOOKKEEP_FULFILL_URL+HOOKKEEP_FULFILL_SECRET; passworkspaceIdon/subscribe)- Recurring billing + grace period on cancel
- Optional SMTP email delivery (Resend/Mailgun free tier) — webhook + mailto covers MVP
- Durable multi-region store (Cloudflare D1 / Turso)
- Auth (magic link) so owner token isn't the only login