Transactional email for vibe-coded apps (Lovable, Bolt, v0, Cursor)

Add password reset, magic link, and receipt email to an AI-built app with Notify — copy-paste builder prompt, server-side send, sandbox/domain verification, and optional notifycx-mcp.

Short answer: Sign up at notify.cx, store a NOTIFY_API_KEY in server secrets only, rehearse with POST /api/email/send/test while the account is sandbox_only, verify your domain (SPF/DKIM), then call POST https://notify.cx/api/email/send with x-api-key and html from your Lovable, Bolt, v0, Cursor, or Replit backend — not the browser. Supabase Auth? Use the Send Email Hook recipe, not Custom SMTP.

You shipped a login screen in an afternoon. The part that still bites is email: password reset, magic link, signup confirm, and the receipt after someone pays. AI app builders (Lovable, Bolt, v0, Cursor, Replit Agent, and similar) can wire the UI fast — but delivery needs a real transactional provider, a verified domain, and secrets that never land in the browser.

Notify is built for that job: one POST /api/email/send with an x-api-key header, HTML you already have, logs in the dashboard, webhooks on Pro. No template studio. Pro is $10 for 10,000 emails/mo (as of Nov 2026) — especially competitive around ~3k–10k/mo; see the pricing comparison before assuming cheapest at ~50k.

What you are adding

FlowWho triggers itWhat Notify does
Password resetUser clicks “Forgot password”Delivers a link or code in HTML you render
Magic link / OTPUser asks to sign in without a passwordDelivers the link or one-time code
Receipt / invoicePayment succeeds (Stripe, Lemon Squeezy, etc.)Delivers receipt HTML from your webhook handler

Notify does not store users, hash passwords, or mint tokens. Your app (or Supabase Auth) owns auth logic; Notify is the delivery pipe.

Sandbox first, production when DNS is ready

New Notify accounts start sandbox_only: you can rehearse the API and run the dashboard guided test, but production from addresses on your domain require domain verification.

  • Rehearse the HTTP contract: POST /api/email/send/test (same JSON as production, non-delivering, logs TEST)
  • Real inbox moment: dashboard guided test to your signup email
  • Production: verify SPF/DKIM (and ideally DMARC), then POST /api/email/send

Details: Sandbox vs production.

Copy-paste prompt for your AI builder

Paste this into Lovable, Bolt, v0, Cursor, or any agent that edits your repo. Adjust stack names if needed.

Add transactional email with Notify (notify.cx) — NOT SMTP, NOT Resend unless I ask.

Requirements:
1. Store NOTIFY_API_KEY only in server secrets / .env (never in client bundles or public env vars).
2. Create a server-only helper that POSTs to https://notify.cx/api/email/send with header x-api-key and JSON body: to, from, subject, html (prefer html; message/text also work).
3. Implement password reset: generate a secure random token, store a hash + expiry in the database, email a link like https://MY_APP/reset?token=RAW_TOKEN using Notify.
4. Implement magic link OR email OTP for sign-in using the same pattern (hashed token, short TTL, rate limit the request endpoint).
5. On payment success (webhook), send a receipt email with order id, amount, and support contact — idempotent on payment id so retries do not duplicate sends.
6. Use a from address on my verified domain once DNS is set; until then document that production sends require Notify domain verification and use send/test for API rehearsal only.
7. Do not add a visual template builder — keep HTML in code or server-rendered strings.

Optional: document how to connect notifycx-mcp in Cursor for domain setup (npx -y notifycx-mcp, NOTIFY_API_KEY) — MCP is for IDE setup, not browser code.

Docs to follow: https://notify.cx/docs/transactional-email-for-vibe-coded-apps
Password reset detail: https://notify.cx/docs/how-to-send-password-reset-emails
Magic link / OTP: https://notify.cx/docs/how-to-send-magic-link-and-otp-emails
Receipts: https://notify.cx/docs/how-to-send-receipt-emails
Stripe recipe: https://notify.cx/docs/recipe-stripe-receipt-email
Supabase Auth hook: https://notify.cx/docs/recipe-supabase-send-email-hook
Pricing (as of Nov 2026): Free 1,000/mo; Pro $10/10k — https://notify.cx/pricing

Minimal send helper (any stack)

export async function sendTransactionalEmail(opts: {
  to: string;
  from: string;
  subject: string;
  html: string;
}) {
  const res = await fetch('https://notify.cx/api/email/send', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'x-api-key': process.env.NOTIFY_API_KEY!
    },
    body: JSON.stringify({
      to: opts.to,
      from: opts.from,
      subject: opts.subject,
      html: opts.html
    })
  });
  if (!res.ok) {
    throw new Error(`Notify send failed: ${res.status} ${await res.text()}`);
  }
}

Same shape with the official SDK:

npm install notifycx
import Notify from 'notifycx';

const notify = new Notify({ apiKey: process.env.NOTIFY_API_KEY! });
await notify.send({
  to: 'user@example.com',
  from: 'Your App <noreply@yourdomain.com>',
  subject: 'Reset your password',
  html: '<p><a href="https://app.example/reset?token=...">Reset password</a></p>'
});

Guide: Official SDK (notifycx).

If your builder used Supabase Auth

Supabase Custom SMTP cannot point at Notify (HTTPS-only API). Use the Send Email Hook → Edge Function → Notify instead. Overview: Supabase Auth emails without SMTP. Step-by-step: Recipe: Supabase Auth → Notify.

MCP in Cursor (setup only)

In Cursor / Claude Code, connect npx -y notifycx-mcp with NOTIFY_API_KEY so the agent can add domains, show DNS records, and send tests — without pasting keys into chat. Production sends still belong in your app code (notifycx or fetch). Install: /mcp · MCP guide.

No dashboard? Agents can bootstrap an API key via email OTP: Recipe: Let your AI agent set up email · Agent bootstrap reference.

Pillar page

Short marketing summary: /transactional-email/vibe-coded-apps.

Related

FAQ

How do I send email from a vibe-coded app?

Add a server-only helper that POSTs to https://notify.cx/api/email/send with x-api-key. Never expose the key in Lovable/Bolt/v0 client bundles. Use the copy-paste builder prompt above for your agent.

Do Lovable or Bolt support Notify directly?

They support whatever server code your agent writes. Point the agent at this doc and Quick start. There is no Notify plugin inside the builder — only your API integration.

Why is my send blocked before DNS?

New accounts are sandbox_only. Production from on your domain requires domain verification. Rehearse with POST /api/email/send/test or the dashboard guided test — Sandbox vs production.

Can I use Supabase Auth with Notify?

Yes, via the Send Email Hook (Edge Function → Notify). Custom SMTP cannot target Notify. Recipe: Supabase Auth → Notify.

Should the AI connect MCP inside my shipped app?

No. notifycx-mcp is for IDE setup (domain, DNS, test send). Production mail belongs in app code via notifycx or fetch. /mcp

How much does Notify cost for a side project?

Free 1,000/mo; Pro $10/10k (as of Nov 2026). Competitive managed pricing around ~3k–10k/mo; not the cheapest at ~50k — see pricing comparison.