Skip to content

Email

Send transactional emails from your app. Manage sender identities and track delivery from your app’s Admin > Email.

Every Proyecta app can send transactional email. Verify a sender identity, then send from your app code — no separate email provider account required.

Open Admin > Email in the builder — or /admin on your published site. It has two parts:

Part What it’s for
Identities Add and verify sender email addresses or domains
Sent Browse sent emails with delivery status (sent, delivered, bounced, etc.)

You can add a new sender identity and browse your email delivery history — all without writing code.

  1. Create and verify a sender identity (an email address or a domain) in your admin panel
  2. Send — from your app with useSendEmail(), or from the admin panel for campaigns

Send from a shared address (@proyectamail.com)

Section titled “Send from a shared address (@proyectamail.com)”

The simplest path is to claim a single address on Proyecta’s shared sending domain, @proyectamail.com. It verifies the instant you create it — the platform already owns that domain, so there are no DNS records for you to set up.

You do this in the Emails section of your app’s admin panel: enter the address you want, and it’s ready immediately.

Single addresses only work on @proyectamail.com. Asking for one on another domain (e.g. hello@myapp.com) is rejected — to send from your own domain, verify the whole domain instead (see below). Each shared address is reserved globally, so no two apps can send as the same @proyectamail.com sender.

To send from your own domain — from any address at it (hello@, support@, noreply@, etc.) — verify the whole domain. Unlike a shared @proyectamail.com address, a custom domain does not verify instantly.

Add the domain in the same Emails section. It registers with the email provider and shows you the SPF, DKIM, and DMARC records to publish in your DNS. The sender sits at pending until those records propagate and the provider confirms them, then flips to verified — use the re-check button after you’ve published them.

DNS-based domain verification is fully implemented — the records are generated by the provider and each re-check re-polls their status.

Under the hood: Proyecta authenticates your sending domain with its email-identity provider (Resend) and delivers your messages through its transactional provider (SendGrid). You never manage an account with either.

From your app’s pages you send with the useSendEmail() hook. You pick a template and pass variables; the platform renders the message in the app’s language and sends it:

import { useSendEmail } from '@/hooks/useEmail.ts';
function ConfirmButton({ booking }) {
const { send, isPending, error } = useSendEmail();
return (
<button
disabled={isPending}
onClick={() =>
send({
template: 'booking_confirmation',
variables: { date: booking.date, service: booking.service },
})
}
>
Email me the details
</button>
);
}

Notice what you do not pass: a recipient, a subject, or HTML. Each template declares its own audience:

  • self (booking/order confirmations, welcome) → the signed-in user’s own address, taken from their session.
  • owner (owner_alert) → your app’s admins.

Both require a signed-in session. This is deliberate, not a gap: the publishable key that authenticates the call ships in your page source, so an arbitrary-recipient send would let anyone use your app as a spam relay. To notify yourself from an anonymous visitor, use a form — form submissions already email the owner and confirm to the submitter automatically, and that path isn’t browser-forgeable.

Errors arrive as PlatformApiError: 401 (needs a session), 403 (template not enabled for this app), 429 (rate limited — show the message and offer a retry), 422 (no address on file).

The Sent tab in your admin panel lists everything your app has sent with its latest delivery event — delivered, opened, clicked, bounced, complained — so you normally don’t need code for this at all.

Each entry carries its status — sent, delivered, opened, clicked, bounced, or complained — and you can open any message to read the exact HTML and text that went out. If deliveries are failing, this is the first place to look.

You don’t need to write this by hand:

  • "Verify hello@myapp.com as a sending identity."
  • "Email the customer a confirmation after they finish booking."
  • "After a successful checkout, send the customer their receipt."
  • "Show me the last 20 emails we've sent and whether they bounced."
  • The from address must be a verified identity. Sending with an unverified address returns an error.
  • Monthly limits apply based on your Proyecta plan.
  • Template editor — design transactional templates visually in the builder
  • Bulk/batch send endpoint for mass mailings