Transactional email
Skill param087/saas-starter-skills/skills/transactional-email
Production-grade full-stack SaaS skills for AI coding agents — Next.js, Postgres/Drizzle, Auth, Stripe & Vercel patterns for Codex, Claude Code, Cursor & OpenCode.
npx -y skills add param087/saas-starter-skills --skill transactional-emailAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when sending product email — wire up Resend (or Postmark/SES) with typed React Email templates, send from background jobs not the request path, and cover deliverability basics like SPF/DKIM and unsubscribe.
SKILL.md
2.9 KB, as published. Nobody here has run it
Transactional Email
Overview
SaaS apps send email constantly: verification, invites, receipts, password resets, alerts. Use a provider built for it (Resend, Postmark, or SES) with React Email for typed, previewable templates. Treat sending as a side effect: trigger it from a background job, not inline in the request, so a slow mail API never blocks the user or fails their action.
When to use
- Sending verification, invite, receipt, reset, or notification emails.
- Building reusable, branded email templates.
- Email sends are slowing requests or failing them.
Template + send
// src/server/email/templates/Invite.tsx
import { Button, Html, Text } from "@react-email/components";
export function InviteEmail({ org, url }: { org: string; url: string }) {
return (
<Html>
<Text>You've been invited to join {org}.</Text>
<Button href={url}>Accept invite</Button>
</Html>
);
}
// src/server/email/send.ts
import "server-only";
import { Resend } from "resend";
import { env } from "@/env";
import { InviteEmail } from "./templates/Invite";
const resend = new Resend(env.RESEND_API_KEY);
export async function sendInvite(to: string, org: string, url: string) {
const { error } = await resend.emails.send({
from: "Acme <[email protected]>",
to,
subject: `Join ${org} on Acme`,
react: InviteEmail({ org, url }),
});
if (error) throw new Error(`Email failed: ${error.message}`);
}
Call sendInvite from a job/queue (see background-jobs), and the action just enqueues it.
Deliverability essentials
- Verify your domain and set SPF + DKIM + DMARC records — without them you land in spam.
- Send from a real domain (
[email protected]), not a free inbox. - Include unsubscribe for anything non-essential; keep transactional and marketing streams separate.
- Idempotency keys on critical sends (receipts) so retries don't double-send.
Pitfalls
- Sending inline in the request — a 3s mail API call becomes a 3s user wait, and a mail outage fails signups. Enqueue it.
- Skipping DKIM/SPF — great templates still hit spam without authenticated domains.
- Hard-coded HTML strings — unmaintainable; use React Email components and preview them.
- Leaking data across tenants — render with explicit, validated recipient + org; never reuse a cached template with stale props.
- No failure handling — log and retry via the job system; surface nothing scary to the user.
Hand-off
Reliable, typed email behind a service. background-jobs runs the actual send off the request path; observability-and-errors tracks failures.