What happens if…
Sending, templates and the Inbox: each case, what Gemmein does and what you do.
Sending
For notify(). A relay's email_person rides the same caps. The
purchase email and Development's daily budget have their own sections:
The purchase email and
Development sends.
| If… | What happens | What you do |
|---|---|---|
| Your domain is not verified for email yet | 409 sender_domain_required. Nothing leaves, nothing is recorded and no cap is spent | Verify the domain on the Domains page. The same key then sends once |
| The person id is unknown, belongs to another environment, or the person is suspended | 404 not_a_customer. Nothing is sent | Send to a person id from the same environment as your key |
You retry with the same key | One email leaves. The retry answers deduped: true with the first send's id and spends no cap | Nothing |
Two people get the same key | Both are sent. A key is scoped to its person | Nothing |
Two sends with the same key arrive at once | The second answers 409 in_flight. Once the first finishes, the same key answers deduped: true | Retry after a moment |
| A person has had 5 emails today and you send another | 429 notify_capped with resetAt. Sends with kind: "account" are outside this cap | Wait for resetAt. Send sign-in, access and billing notices as kind: "account" |
| Your app has sent 200 emails this hour | The next answers 429 notify_capped with resetAt, whatever its kind | Wait for resetAt |
| Your mail provider fails or refuses your address | 502 send_failed. Nothing is sent from a Gemmein address instead, and the cap is handed back | Retry with the same key |
| Sends are switched off on the Emails page | Every notify() answers 403 sends_disabled. Switching them back on restores sends, and Logs records each change | Switch sends on on the Emails page |
| The subject, the text or the person is missing | 400 no_subject, no_text or no_person. A kind other than event or account is 400 invalid_kind | Fix the call |
| A subject contains line breaks | They are removed before sending, so a subject cannot add mail headers | Nothing |
| Receiving is not verified yet | The email is sent with replyRail: false. A reply has no path back to your Inbox | Verify receiving on the Domains page, or tell people where to write |
| A person is erased | Their sends are removed from your records. Other people's sends are untouched | Nothing |
| The person's address bounced for good, or they marked your mail as spam | 200 with sent: false, notSent: "address_bounced" or "address_complained" and a message. Nothing leaves and no cap is spent. A relay's email_person and the purchase email skip it the same way. Each skip is counted and on Logs, and the person's page says why | Don't retry. To mail them again, turn their email back on from their page |
| 10 of your customers' addresses have bounced or reported spam | Errors warns you, and again at 20, 30 and so on | Check how addresses are collected and what your emails say |
| Your domain is not verified and someone signs in | The sign-in code arrives from <App name> (via Gemmein), with the footer Sent by Gemmein on behalf of <App name>. From a verified domain it arrives from account, with Powered by Gemmein | Verify a domain for email |
| Your provider refuses your domain for a sign-in code | The code is sent again from Gemmein's shared address with the shared footer, so the person can still sign in. Sign-in codes are the only email with this fallback | Check the domain on the Domains page |
Templates
| If… | What happens | What you do |
|---|---|---|
| A template uses a variable its email does not have | Sync refuses that file with 400 unknown_variable and names the variables it has. The other files still sync | Use only the listed variables |
| A file's name is not one of the seven | It is refused with unknown_template and never synced | Rename it |
There is a sign-in.html | It is never synced. The sign-in email takes no HTML | Write sign-in.json |
sign-in.json has another key, a greeting or app name with a digit or an address, a colour that is not #rrggbb or is too light, or a logo that is not https: | 400 invalid_brand with the reason | Fix the value |
| The logo cannot be fetched when you save: not a PNG, JPEG, GIF or WebP, over 200 KB, a redirect, or an error | 400 logo_unavailable with the reason. Nothing is saved | Fix the address or the image, then save again |
| A template is over 100 KB | 400 template_too_large | Host images at https: addresses and trim the HTML |
A template holds a script, a form, an event handler, CSS maths or an http: image | It is saved with those removed, and sync lists what was removed | Nothing, or remove them from the file |
inbox-reply.html has no {{content}}, or more than one | 400 content_slot | Put it in once |
| An email has no template, or its template cannot be read or rendered | It is sent in Gemmein's plain design | Nothing |
| You save a template in Live | 409 templates_live_refused | Save it in Development; go-live or promote copies it into Live |
| Your app has saved templates 60 times, or previewed them 120 times, this hour | 429 templates_capped with resetAt | Preview locally with npx gemmein emails preview, which has no limit |
| You send a test | One email, subject [Test] …, to the address you are signed in with and no one else. It counts toward Development's 20 a day per app and 50 per account | Past that, wait for resetAt |
You delete a file from gemmein/emails/ | The cloud keeps the template. In npx gemmein dev it is removed at once | Run npx gemmein emails remove <name> |
In the Inbox
| If… | What happens | What you do |
|---|---|---|
| A person replies | The reply lands in the same conversation. A subject starting Re: or Fwd: joins the conversation it answers | Nothing |
| You open a conversation and do not reply | It is marked read and still needs a reply. Only your reply answers it | Reply |
| You close a conversation and they write again | It reopens, with the new message unread | Nothing |
| A person has waited 12 hours for your reply | Gemmein emails your owners and admins once for that wait. If you answer and they write again, a new wait starts | Reply. To stop these emails, switch the alert off on Settings → Notifications; the Inbox still shows the conversation waiting |
| A message's body cannot be fetched from the mail provider | The message shows without a body and says so | Choose Try again on the message |
| A person attaches a file | The message shows the file's name. The file itself is not kept | Ask them to send it another way if you need it |
| You start a conversation with someone who has not signed in | It is refused, and nothing is sent. The Inbox writes only to people who have signed in to your app | Ask them to sign in first |
| You start a conversation under a subject they are already waiting on | It is refused, and nothing is sent | Reply in that conversation |
| You have started 30 conversations in the last hour | The next new conversation is refused, and nothing is sent | Wait, then send it |
| Your domain is not verified for email | New conversation and Reply both say so, with a link to the Domains page, and send nothing. They never send from a Gemmein address | Verify the domain on the Domains page |
| Your provider refuses your address on a reply or a new conversation | Nothing is sent and nothing is recorded | Try again in a minute |
| A person is erased | Their conversation stays in your Inbox with their email address removed. Other people's conversations are untouched | Nothing |
| You reply to, or start a conversation with, an address that bounced or reported your mail as spam | It is refused with 409 address_suppressed, and nothing is sent | Reach them another way |
| One sender emails your Inbox more than 20 times in an hour, or more than 300 emails in an hour arrive from people who are not your customers | The rest are dropped as spam, not stored, and counted. Errors says how many. Your customers and people you already have a conversation with still get through, each still at most 20 an hour | Nothing. It is usually a mail loop or spam |
Was this page helpful?
Thanks for telling us.
Thanks for telling us.
Last updated