Attio email tracking shows no sent emails and empty lists
You send outreach from Attio (composer or mass send), then open the workspace Emails page (app.attio.com/<workspace>/emails/) to confirm the sends and check opens. The page appears empty and offers no answer.
It is not a permissions, sync, or plan problem. Two separate facts are at work, and both are easy to misdiagnose:
There is no Sent view anywhere in the workspace Emails page. It redirects to
/emails/draftsand exposes exactly four tabs: Drafts, Outbox, Templates, Failed. Outbox holds only future queued sends and drains to zero once they go out; Failed holds only permanent failures. So after a successful send, every one of those tabs reads 0 and the UI gives no indication the emails ever existed. Observed 2026-08 on a Pro workspace after 12 confirmed sends.Open tracking is silently unavailable, not merely off. There is no
Email trackingtoggle on the account settings page for a Gmail-synced mailbox, and no checkmark indicator on sent messages. Searching for the setting yields nothing, which reads like a missing feature flag or a plan gate. It is neither.
Compounding trap: a freshly created Attio list view ships with zero attribute columns. A list with 1,666 entries renders as a bare column of names plus "Add your first attribute column - There are currently no attributes set up as columns in this view." Even the list's own stage attribute is not shown by default. So the surface where send state would naturally be reviewed displays nothing either, which reinforces the false conclusion that Attio recorded nothing.
Where sent mail actually lives (three surfaces, none of them the Emails page):
- Person record ->
Emailstab. The per-record tab shows a count badge and the sent message. This is the only per-message UI in Attio. - The sending mailbox's Sent folder. Attio is not an ESP; it relays through the synced Gmail/M365 account (send docs). Every Attio send lands in Gmail Sent as a normal message.
- The API, which is the only bulk-queryable record. Attio maintains
interaction-typed attributes on people and companies, populated from mailbox sync:first_email_interaction,last_email_interaction,first_interaction,last_interaction(plus calendar variants). These are the machine-readable send/receive log:
POST /v2/objects/people/records/query {"limit": 500, "offset": 0}
# each record: values.last_email_interaction[] -> {interacted_at, owner_actor, active_until}Read the entry whose active_until is null (Attio versions attribute values; non-null means superseded). Practical inferences:
first_email_interaction == last_email_interactionmeans outbound-only, i.e. no reply yet. An inbound reply syncs from the mailbox and advanceslast_email_interaction, so equality is a reliable zero-reply signal.- Regular ~5-minute gaps across a cohort's
interacted_atvalues identify a mass send (Attio's fixed inter-send delay), versus irregular gaps for one-off composer sends. - The token needs only object read scope. The
emailscope (GET /v2/emails) is a different, separately granted permission; interaction attributes work without it, so do not conclude you are locked out just because/v2/emailsreturns 403.
Open tracking is Microsoft 365 only. Full stop. The docs state it plainly: "Gmail accounts are not yet supported", and it additionally requires SMTP AUTH enabled in the M365 admin center plus a per-account toggle. Further caveats even on M365: single and mass sends only (never sequences), single-recipient only, and only for mail sent from Attio. Do not hunt for a Gmail setting; it does not exist, and privacy-preserving clients (Apple Mail et al.) defeat pixel tracking anyway.
Substitute a first-party click signal for opens. If each outreach link is unique per recipient (a per-recipient landing page, or any distinguishing query param your own frontend reads), your product analytics gives a stronger signal than an open pixel: it survives image blocking, and it measures intent rather than render. Instrument the landing path with a dedicated event and query it by recipient, then join on the send timestamp from last_email_interaction. Discipline that matters: discard hits that precede the recipient's own send time. Your own pre-send link verification lands on the same URLs and will otherwise inflate the click rate. In our cohort that rule cut the apparent clicks in half (2 raw hits, 1 genuine).
Fix the list view so this is reviewable without the API. Open the list, Add column -> pick the attribute. Interaction attributes are nested two levels: search Last interaction, choose Last interaction Emails, then When (the sibling With gives the counterparty instead of the timestamp). Toggle Create more in the dialog to add several columns in one pass. Then use the column header menu -> Sort descending and press Save for everyone; sorting ascending buries everyone you emailed under the empty rows. Result: emailed records surface at the top with a relative timestamp.
Two behaviors to plan around:
- Attio never advances a stage on send. A sent email leaves
stageuntouched, so a pipeline can show every recipient asLeadindefinitely. Automate it (a Workflow, Pro and up) or patchPATCH /v2/lists/{list}/entries/{entry_id}fromlast_email_interaction; do not rely on remembering. - The hard cap is 12 emails per mailbox per hour (and 200/day), independent of plan; monthly per-user caps vary by plan (outbox docs). A batch of 14 delivers 12 and the remainder can end up neither sent, queued, nor failed. Since a drained Outbox and an empty Failed page are indistinguishable from "nothing was ever attempted", reconcile the intended recipient list against
last_email_interactionafter every batch rather than trusting the UI.