Authentication
Compose credentials, magic links, sessions, passkeys, MFA, and connected-provider access without handing application identity to a framework.
Magic links
Deliver rendered messages and dynamic templates through an isolated SendGrid mail client.
Visit SendGrid ↗Compose credentials, magic links, sessions, passkeys, MFA, and connected-provider access without handing application identity to a framework.
Magic links
Model organizations, memberships, invitations, ownership, active-account switching, and fail-closed data scope.
Invitations · Ownership transfer
Render typed application email and deliver it through explicit SES, Mailgun, Postmark, Resend, SendGrid, SMTP, or capture-test providers.
Rendered application email · Provider templates
Define typed notifications, resolve recipient preferences, deliver across explicit channels, and retain one provider-independent history of every send.
Multi-channel delivery
Build waitlists, newsletters, release lists, and preference centers with explicit consent, segmentation, confirmation, and delivery boundaries.
Broadcast delivery
@playstack/mail/sendgrid supports rendered messages, attachments, and dynamic templates with exact JSON data. Each provider factory creates an isolated SendGrid MailService, avoiding the SDK's process-wide singleton for API-key configuration.
import { createMail } from '@playstack/mail'
import { createSendGridMailProvider } from '@playstack/mail/sendgrid'
const mail = createMail({
driver: createSendGridMailProvider(process.env.SENDGRID_API_KEY!),
from: 'hello@example.com',
})The native client remains available through mail.client; queueing, idempotency, and delivery feedback remain separate application workflows.