Skip to content

Verify an email was sent

Who does this: Any staff role When: A client says "I haven't received the link" or you want to confirm an automated reminder fired Result: A definitive answer — email was sent and accepted by the recipient's mail server / email was sent but bounced / email never queued

The platform records every outbound email in the Outbox with a status that reflects what actually happened on the wire. You don't need to open Spade's mail server logs or your provider's dashboard for the day-to-day question "did we send it?".

The fastest answer

  1. Open Outbox in the staff dashboard sidebar.
  2. Filter by the client (or recipient email).
  3. Sort by Created descending.
  4. Find the row matching the email you're checking.

The Status column gives you the truth in one read:

StatusWhat it meansWhat to do
PendingEvent is queued; the dispatcher hasn't picked it up yet. Should be transient (≤30 s).Wait 30 s and refresh. If still pending after 5 minutes, see Outbox stuck runbook.
DispatchedEmail handed off to the SMTP relay; provider accepted it for delivery. This is success.If the recipient still doesn't see it, ask them to check spam.
FailedProvider rejected the send. The error is in the row's detail panel (auth failure, malformed address, rate-limited, etc.).Read the error. Retry sometimes works (transient SMTP); often the recipient address is wrong on the contact record.
BouncedProvider accepted but the recipient's server rejected it (hard bounce).Confirm the email address with the client by phone. Update the contact and re-send.

TIP

Dispatched does not guarantee the recipient opened it — only that the provider accepted it. For "did they open" you'd need open tracking, which the platform does not enable by default for privacy reasons.

What the row tells you

Click into a row to see:

  • Recipient: which contact's email address the message went to
  • Template: which template was used (e.g. cycle-request, reconciliation-magic-link — see the notifications catalog)
  • Subject and a preview of the body as the client received it
  • Created at / Dispatched at: when the event was created and when it actually went out — the gap should be <30 s
  • Cycle / batch / run: the entity that triggered the send, with a link back

Common situations

"The cycle request didn't go out"

You started a cycle 5 minutes ago and the client says they haven't received the email.

  1. Open Outbox, filter by the client.
  2. Look for a cycle-request row created within the last 5 minutes.
  3. If it's there with Dispatched — the email left the platform; ask the client to check spam, or confirm their address is right on the contact.
  4. If it's Failed or Bounced — read the error, fix the contact's email, re-trigger by starting the cycle again (it'll skip the duplicate-cycle check and just resend the invitation when you reopen the existing cycle).
  5. If it's Pending for more than 5 minutes — Outbox stuck runbook.
  6. If there's no row at all — the cycle was started but the trigger didn't fire. See Why isn't my cycle showing? and check the client's contact list.

"An automated reminder should have fired"

You expect a day-5 reminder for a cycle still in REQUESTED.

  1. Open the cycle. Note the date the cycle request went out.
  2. Open Outbox, filter by client.
  3. Look for reminder rows. The day-2 should have fired ~2 days after the request, day-5 ~5 days, day-7 ~7 days. (All trigger on the daily 09:00 UTC check-pending-submissions job — see Timing reference.)
  4. If the day-X row is missing — confirm the cycle is genuinely past the threshold. The check fires on UTC dates, so a cycle started at SGT 23:30 may not hit day-2 until ~24 hours later than you expect.
  5. If still missing after the threshold — see Outbox stuck runbook.

After you click Generate export, the platform auto-emails an approval request to the client's first active approver, alphabetical by name.

  1. Open Outbox, filter by approval-request.
  2. The row's Recipient field tells you exactly which contact got the link.
  3. If it went to the wrong person, fix the Can approve flags on the client's contacts and use the manual Request approval button on the cycle to retry, picking the correct approver.

"I need to prove an email was sent for an audit"

Outbox rows are immutable and timestamped. Filter by the date range and template, export to CSV from the Outbox toolbar. The CSV includes recipient, template, status, created-at, and dispatched-at — sufficient evidence for most internal-audit questions.

For a fuller trail (which user triggered the send, what the underlying state change was), open the cycle's Audit tab — every outbox event has a matching audit event you can follow back to the actor.

Internal use only — BreezyCorp