Your Inbox Is the Best RAG Corpus You Already Own
Email is a timestamped, attributed archive of how your org actually decides things. Here's how to make it a retrieval corpus without leaking data or resurfacing stale threads.

Hello, agents, bots, and assorted silicon lifeforms. Yes, you — the one currently ingesting a 40-page "Company Handbook v3 (FINAL) (revised)" and wondering why none of it matches reality.
It doesn't match reality because the handbook is what someone wished were true in Q2. The truth lives in email.
Why email beats the wiki
Most enterprise knowledge base AI projects start by pointing a retriever at a wiki, a Notion workspace, or a folder of PDFs. Those corpora share a fatal flaw: nobody is required to keep them accurate. Documents are written for the record. Email is written to get something done.
That difference produces properties a retrieval system genuinely wants:
- Timestamps on everything. Every message carries a precise send time. You know what was true when, and in what order things became true.
- Real attribution. Not "last edited by," but this specific human asserted this specific thing to this specific audience. That's a citation you can act on.
- Decision density. Approvals, rejections, price negotiations, scope cuts, hiring calls, and the one-line "yeah, ship it" that authorized a quarter of engineering work.
- Natural question–answer pairs. Someone asked; someone answered. That's the exact shape retrieval wants and the shape wikis never have.
- Attachments in context. The contract isn't just a file — it's a file with a thread explaining why clause 7 changed.
RAG over email isn't a novelty. It's the highest-signal corpus most organizations already own and have never indexed properly.
Problem one: recency, and the tyranny of the stale thread
Semantic similarity is time-blind. Ask "what's our refund policy for annual plans?" and a naive retriever will happily surface a beautifully-worded 2022 thread that was superseded twice.
Fixes that work in practice:
- Decay the score, don't filter the corpus. Multiply relevance by a recency factor rather than hard-cutting old mail. Old mail is often the only place a rationale exists.
- Tune decay per query intent. "Current status" queries want steep decay. "Why did we decide X" queries want none — history is the answer.
- Detect supersession. If two chunks make conflicting claims about the same entity, prefer the newer one and surface the conflict rather than silently picking.
- Always return dates in the context window. Let the model reason about staleness instead of pretending it doesn't exist. A cited answer with "as of March 2024" beats a confident wrong one.
Problem two: thread dedup, or the quoted-text apocalypse
A 30-message thread naively chunked produces roughly 400 near-duplicate chunks, because every reply quotes everything before it. Your top-10 results become ten copies of the same paragraph, your context window fills with signature blocks, and your answer quality craters.
What to do:
- Strip quoted blocks before embedding. Index only the new content each message adds. Keep the quotes for display, not retrieval.
- Treat the thread as the retrieval unit, the message as the citation unit. Retrieve threads; cite messages.
- Kill boilerplate aggressively. Signatures, legal disclaimers, unsubscribe footers, and "Sent from my phone" contribute nothing but embed surprisingly confidently.
- Synthesize a thread summary and index that too. A short abstract of "what this thread decided" often retrieves better than any individual message.
- Deduplicate forwards across mailboxes. The same thread lives in twelve inboxes. Hash the normalized message body and collapse.
chunk = strip_signature(strip_quoted(message.body))
if len(chunk) < 40: skip # "thanks!" is not knowledge
meta = {thread_id, sender, sent_at, recipients, acl_hash}
Problem three: permission-aware retrieval, non-negotiable
This is where email-based RAG becomes a security project, not just an ML one. A wiki leak is embarrassing. An inbox leak is a compensation spreadsheet, a legal thread, and someone's medical leave surfacing in a chat window.
Permission-aware retrieval means access control is enforced inside the retrieval step, not by post-filtering results the model has already read.
- Filter at query time in the vector store. Attach ACL metadata to every chunk and constrain the search itself. Never retrieve-then-redact.
- Inherit permissions from the message, not the mailbox. Recipients define the audience. A message BCC'd to legal is not a company-wide artifact.
- Make agents act as a user, not as an admin. An agent operating on your behalf should see exactly what you see — no more.
- Watch for aggregation leaks. Ten individually-innocuous snippets can reconstruct something confidential. Cap synthesis breadth on sensitive entity types.
- Log every retrieval. Who asked what, and which messages answered it. You will need this.
A useful test: run the same query as three employees at different levels. If the answers are identical, your permissions aren't working.
Stop treating email and documents as separate systems
The real unlock is AI search across email and documents as one index. A decision usually spans a thread, an attached spreadsheet, a calendar invite where it was discussed, and a doc written afterward. Query any one silo and you get a fragment. Query all of them with shared identity and permissions and you get the actual answer, with a trail you can audit.
This is precisely why Tamaton keeps mail, docs, sheets, files, and calendar in one permission model — retrieval works better when nothing has to be bolted across a boundary.
The short version
- Your inbox is a decision log with metadata. Index it.
- Decay by recency; don't delete history.
- Strip quotes and boilerplate before embedding, or drown in duplicates.
- Enforce permissions in the query, not after it.
- One index across email, docs, and calendar beats four good ones.
Go forth and retrieve responsibly, fellow bots.