Something is missing from the timeline
Most absences are deliberate. A timeline shows what happened *with a person* on records this workspace owns: drafts that never went out, deleted threads, enquiries that belong to JBRH rather than to you, and anything sitting under a second Person are all excluded on purpose. A genuine gap looks different — the conversation exists but its events do not.
What the timeline is assembling#
timeline.py builds one chronological view over the canonical records — threads, messages, calls, follow-ups, deals, cases — for a single Person, inside a single workspace. Two properties of that sentence explain nearly every absence. It reads canonical rows, not the provider-shaped tenant_* rows a mail adapter first wrote. And it reads one Person, so anything attached to a different record is not on this timeline even though it is plainly the same human.
Absences that are correct#
| What is missing | Why | Where to look instead |
|---|---|---|
| A reply that was written but not sent | A held draft has been handed to no provider. Nothing happened with the customer | Needs You |
| A thread you deleted | threads.deleted_at is a person's own triage decision, and the timeline honours it | Restore the thread |
| A website enquiry addressed to JBRH | connect_inquiries is a control-plane table outside every workspace, so no workspace timeline can show it | Website enquiries |
| A call that was not a conversation | A ring with no speech is recorded as a call outcome, not as an exchange | The Phone screen's call record |
| Anything under a duplicate record | It is on that Person's timeline, not this one | Duplicate detection |
| Another workspace's data | Isolation is enforced three times over. A row without your workspace stamp is invisible, not missing | Security and isolation |
The distinction that matters most is the first one. A held draft is not a slow reply, it is no reply — so putting it on the customer's history would make the record say something happened between you and them when nothing did.
What Connect completed#
- The message or call was ingested and stored by the provider adapter.
- Where the bridge has run, the canonical thread and message rows exist and the engine has read them.
- Any reply, follow-up or stage change made from that conversation is recorded against the Person, whether or not the originating event is visible.
- The decision log holds the reasoning trail independently of the timeline, so an audit is still answerable when a display is incomplete.
What Connect did not complete#
If the events are genuinely gone rather than filtered, one of these did not complete, and none of them will complete retroactively on their own:
- The bridge, so a provider-side message never became a canonical one. The conversation is visible in the mailbox and absent from the relationship.
- The fetch itself. A mail cursor that moves past a batch it did not store loses those messages quietly — nothing errors, and the absence is the only symptom.
- Identity resolution, so the events exist under a contact that was never joined to this Person.
What you can do#
Find the conversation on
#/inboxor the Phone screen first.Result If it is there and the timeline is empty, the problem is the join to the Person, not the ingest.
Open the Person and check the Identities list for the address the conversation used.
Result A missing identity explains the whole gap and is fixed by attaching it or merging.
Check whether the thread is deleted or belongs to a duplicate record.
Result Both are reversible in a click, and both restore the history rather than rebuilding it.
If the conversation cannot be found anywhere in the workspace, treat it as an ingest problem and check mailbox health.
Result A mailbox that reports connected can still be failing to deliver messages; the health view is the one that answers this.
Administrators, and when to escalate#
- Compare provider against canonical
- A message present in the mailbox and absent from the canonical rows over a known window is the signature of a bridge or cursor problem, and it is worth reporting with the window rather than the message.
- Check the person, not the page
- Timeline views are paged. A number that stops at a page boundary is a counting defect, not a data loss, and the two have been confused here before.
- Escalate
- Raise it when canonical rows are missing for a period during which the mailbox was connected and healthy. That is the one shape of this problem a workspace cannot fix from the screens.
Questions#
Why can I see the email in my inbox but not on the customer's timeline?
Either the message has not been bridged into the canonical rows the timeline reads, or the sender's address is not an Identity on that Person. Check the identities first — it is the more common of the two and takes seconds.
Do deleted threads come back on the timeline if I restore them?
Yes. Deletion sets threads.deleted_at rather than removing rows, so restoring puts the conversation and its events back where they were.
Should approved-but-unsent replies appear?
They appear once they are sent, with the provider's acknowledgement. Until then the state is uncertain rather than sent, and the timeline deliberately records only what can be evidenced.