Transactional Email — send as your app
Your Host app sends its own receipts, resets and notifications. Each app has one sending address, and each accepted send is charged in credits to the Solution that owns the app.
Send without any setup
waymaker host email send <app_id> \
--to someone@example.com \
--subject "Your booking is confirmed" \
--text "See you Tuesday at 10am." \
--from bookings
If the app has no sending address yet, the first send gives it one on a domain Waymaker owns:
"<App name>" <bookings@{app-slug}.{org-slug}.waymakermail.com>
You don't need DNS, a domain or a key. The display name is the app's name. --from sets only the
part before the @; the domain is always the app's own, so one app can't send as another.
To see the address before the first send:
waymaker host email domain register <app_id> # no domain = shows the ready-made address
Nothing is created until the app's first send. The response has planned: true and the expected
address. After the first send, domain list shows it:
waymaker host email domain list --app <app_id> --json
kind is default for a ready-made address and custom for your own domain. A brand-new address
can report pending for a minute while its records propagate. The next send or verify checks
again.
Send from your own domain (optional)
waymaker host email domain register <app_id> mail.acme.com
The response's dns_records lists CNAME records only, and each one points at a Waymaker
hostname. Add them at the domain's DNS provider, then:
waymaker host email domain verify <domain_id>
Pick a subdomain the domain doesn't already send mail from, so the records can't clash with existing
mail. Each record carries its own status, so you can tell which one is still missing.
Sending health
waymaker host email health <app_id> [--json]
This returns:
daily: sends and outcomes per day (delivered,hard_bounced,soft_bounced,complained,delayed);window: the 7-day bounce and complaint rates and thevolumethey're measured over;limits: the rates that pause sending automatically;sending_enabled,paused_atandpaused_reason;suppressed_recipients.
Automatic pause. Sending is paused when hard bounces reach 4%, or spam complaints reach
0.1% of delivered mail, over 7 days. It applies only after at least 100 messages, and only when
at least 2 such events have happened. From then on send returns 403. A pause is lifted only by
Waymaker support, never automatically. The rates count from that moment, so the history that caused
the pause doesn't immediately cause another.
Suppression. A hard bounce or a spam complaint stops this app from mailing that address again.
If every recipient of a send is suppressed, send returns 422 and records the attempt with
status: "suppressed". Nothing is sent and nothing is charged. If only some are suppressed, the rest
are sent and the response lists suppressed.
MCP
The same actions are available as MCP tools: host_email_domain_register (domain is optional),
host_email_domain_list, host_email_domain_get, host_email_domain_verify, host_email_send,
host_email_send_status, host_email_quota and host_email_health. Every response includes full ids.
Limits
| Limit | What happens |
|---|---|
| Daily ramp | A new address can send 100 on its first day, doubling each day up to 10,000. Over the limit, send returns 429 with the current cap. |
| Rate | host_email_quota reports the per-second rate. |
| Paused | A paused address returns 403, and nothing is charged. |
| Transactional only | Use it for mail someone expects. Marketing belongs in Journeys. |
Errors
| Status | Meaning |
|---|---|
| 400 | Missing or invalid app_id, to, subject, body or from_local_part |
| 402 | The account that owns the Solution can't send (paid capability) |
| 404 | No such app or domain in your organization |
| 403 | Sending is paused for this app (see Sending health) |
| 409 | The address isn't verified yet. A ready-made one says it's still being set up. |
| 422 | Every recipient is suppressed (bounced or complained before); nothing sent or charged |
| 429 | Over today's sending limit |
| 503 | Sending addresses aren't available right now, or sending capacity is full (contact Waymaker) |