
# Logging All Your Company Email in the CRM

Every Karmaflow.ai workspace has one inbound address of its own. Mail that reaches it is matched to a contact (and a company, by domain), stored, and shown on that contact's Activity Timeline. You can BCC the address by hand from any mailbox — but with one rule in your mail provider's admin console you can send it a copy of **every** message your team sends and receives, and the CRM fills itself.

This guide sets that up for Google Workspace and for Microsoft 365, explains what the CRM does with each kind of message, and lists what it does not capture.

```mermaid
flowchart LR
    C[Customer] <-->|email| P[Your mail provider<br/>Google Workspace / Microsoft 365]
    P <-->|email| T[Your team's mailboxes]
    P -->|copy of every external message| K[Workspace ingest address<br/>CRM]
    K -->|from outside| I[Logged as received<br/>on the sender's contact]
    K -->|from your domain| O[Logged as sent<br/>on the recipient's contact]
    K -->|colleague to colleague| N[Stored, attached to nobody]
```

## What you'll need

- **Tenant administrator** rights in Karmaflow.ai — the Email Sending page is admin-only.
- **Super admin** in Google Workspace, or an **Exchange administrator** in Microsoft 365.
- Fifteen minutes, and a mailbox outside your company to test with.

## How Karmaflow.ai reads a copy

The rules below hand Karmaflow.ai a copy of each message with the original sender and recipients intact, and that is all it needs. Three things decide what happens next:

| The message is… | Decided by | What the CRM does |
|---|---|---|
| **From a customer** (sender not on one of your domains) | The sender's domain | Logged as **received** on the sender's contact. A contact — and a company, by domain — is created when the sender is new. |
| **From your team** to a customer | The sender's domain | Logged as **sent** on the first external recipient's contact. A new recipient becomes a contact too. |
| **Between colleagues** (every address on one of your domains) | Every address | Stored, but attached to no one and triggering nothing. It appears under **Messages that didn't reach anyone** so you can see it arrived. |
| **Automated** — a newsletter, an out-of-office reply, a bounce, or anything from a no-reply address | The message's own headers and the sender address | Attached to the sender's contact **if one already exists**. Never creates a contact. Listed under **Messages that didn't reach anyone** as *Automated mail — no contact created*. |

**"Your domains"** are worked out for you: the domains of your team members' sign-in addresses, your sending domains, and anything you add under **Settings (the gear icon) → Workspace → Internal Email Domains**. Free-mail domains such as `gmail.com` are never counted as yours, even if a colleague signed in with one — see [A colleague on a personal address](#a-colleague-on-a-personal-address) below.

## Step 1 — Prepare the CRM

1. Open **Settings (the gear icon) → Channels → Email Sending** and scroll to the **Inbound email** section.
2. In the **Inbound ingest address** card, click **Copy**. The address looks like `<id>@sys.karmaflow.ai`; keep it for the rules below. Opening this page also registers the receiving route — the **Ingestion behavior** card shows *Mailgun route provisioned* once it has.
3. In **Ingestion behavior**, choose a **Default owner for auto-created contacts**. Every contact the copy rule creates will be owned by this person; leave it on *Unowned (visible to all)* if you prefer to assign later.
4. Optional: pick a **Pre-filter agent**. A task agent that answers `{"action":"drop"}` for a message stops it before anything is stored — useful for a category you never want in the CRM, such as vendor invoices. Anything the agent cannot classify is allowed through.
5. Open **Settings (the gear icon) → Workspace → Internal Email Domains** and check **Currently in effect**. Add any domain your team writes from that is missing — a sister company, an older domain — under **Additional domains**. A domain missing here turns every colleague on it into a lead.

<!-- SCREENSHOT: crm/email-capture-ingest-address.png — Settings → Channels → Email Sending, the Inbound email section with the "Inbound ingest address" card and Copy button, address masked -->

## Step 2 — Google Workspace

Google's **Routing** setting adds a recipient to messages that match, and the copy keeps the original From, To and Cc. You create two rules — one for mail coming in, one for mail going out — and leave internal mail alone. You need the **Gmail Settings** administrator privilege.

In the **Google Admin console**, go to **Menu → Apps → Google Workspace → Gmail → Routing**. To apply the rules to everyone, leave the top organizational unit selected; otherwise select a child organizational unit. On the **Routing** tab click **Configure** (or **Add Another Rule** if a rule already exists). In the **Add setting** box:

**Rule 1 — a copy of mail from outside**

1. Enter a descriptive name, for example *CRM copy — inbound*. A setting without a name cannot be saved.
2. Under **Select when this action is applied**, tick **Inbound messages** only. Leave **Internal inbound messages** and **Internal outbound messages** unticked, so colleague-to-colleague mail is not copied.
3. Leave the **Action** on **Modify message**.
4. Under **Modify message**, tick **Add more recipients** and click **Add**. In the box that opens, leave the recipient type on its default (not **Advanced**), paste the ingest address, and **Save**.
5. Do **not** tick **Change envelope recipient** — that bypasses your team's mailboxes and sends the mail to the new recipient instead of copying it.
6. Leave **Select all account types this action applies to** on its defaults, and leave the **Envelope filter** off so every mailbox is covered.
7. At the bottom of the **Add setting** box, click **Save**.

**Rule 2 — a copy of mail your team sends**

1. Click **Add Another Rule** and name it *CRM copy — outbound*.
2. Under **Select when this action is applied**, tick **Outbound messages** only.
3. Under **Modify message**, tick **Add more recipients**, click **Add**, paste the ingest address, and **Save**.
4. Click **Save** at the bottom of the box.

**Leaving mailboxes out.** Two ways, from narrow to broad:

- In either rule, create an **address list** of the mailboxes to exclude and set the rule to **Bypass this setting for specific addresses / domains** with that list. (**Create or edit list** opens the **Manage address lists** tab.)
- Or move HR, legal or an executive's accounts into their own child organizational unit and add the rules to the others; a child unit can also disable a rule it inherits.

The **Envelope filter** does the opposite — **Only affect specific envelope senders** / **recipients** limits a rule to the addresses you list (a single address, a **Pattern match** regular expression, or **Group membership**) — and is the tool when only some mailboxes should be copied.

**Timing.** Google says rule changes can take up to 24 hours to apply; in practice it is usually much quicker. Routing also only recognises your own domain's outgoing mail if it passes SPF or DKIM, so keep those records healthy.

<!-- SCREENSHOT: crm/email-capture-google-routing.png — Google Admin → Gmail → Routing rule editor, "Messages to affect" with Inbound ticked and "Add more recipients" showing a masked ingest address -->

## Step 3 — Microsoft 365

Exchange Online's **mail flow rules** can add a Bcc recipient to matching messages. Bcc keeps the copy invisible to everyone on the thread, and the original From, To and Cc are preserved. Again, two rules.

**Before the rules:** the recipient picker in a mail flow rule offers recipients from your directory, and a distribution group cannot be the added recipient. If the picker will not accept an outside address typed in, create a mail contact first — **Exchange admin center → Recipients → Contacts → Add a mail contact**, with the ingest address as its email — and pick that contact in the rules.

In the **Exchange admin center** (`admin.exchange.microsoft.com`), go to **Mail flow → Rules** and select **Add a rule → Create a new rule**. Then:

**Rule 1 — a copy of mail from outside**

1. On the **Set rule conditions** page, enter the **Name** *CRM copy — inbound*.
2. Under **Apply this rule if…**, choose **The sender → is external/internal**, then **Outside the organization**.
3. Under **Do the following…**, choose **Add recipients → to the Bcc box**, and select the ingest address (or the mail contact you created).
4. Select **Next**. On **Set rule settings**, leave **Rule mode** on **Enforce** and select **Next**.
5. On **Review and finish**, check the summary and select **Finish**.
6. **The new rule is created disabled** — the Exchange admin center does this so you can review it once more. On the **Rules** page, select the rule and turn its status to **Enabled**.

**Rule 2 — a copy of mail your team sends**

1. **Add a rule → Create a new rule**, named *CRM copy — outbound*.
2. Under **Apply this rule if…**, choose **The recipient → is external/internal**, then **Outside the organization**.
3. Under **Do the following…**, choose **Add recipients → to the Bcc box** and select the ingest address.
4. **Next → Enforce → Next → Finish**, then enable the rule as above.

Because each rule is scoped to mail crossing your organization's boundary, colleague-to-colleague mail is never copied.

**Leaving mailboxes out.** In either rule, under **Except if…**, select **Add exception** and choose **The sender → is this person** (or **The sender → is a member of this group**) for mail going out, and **The recipient → is this person** (or **is a member of this group**) for mail coming in. A group is the easier way to maintain the list; Exchange caches group membership for a few hours, so a change to the group is not instant.

**Do not use journaling.** Exchange's journaling feature also sends copies, but wraps each message inside a *journal report* whose sender is Microsoft's journaling address. Karmaflow.ai reads the report, not the message inside it, so every copy would be filed under the wrong sender. Use mail flow rules.

**Timing.** Microsoft says a new or changed rule can take 30 minutes or more to apply to mail.

<!-- SCREENSHOT: crm/email-capture-m365-rule.png — Exchange admin center → Mail flow → Rules, a rule with "The sender is external/internal: Outside the organization" and "Add recipients to the Bcc box", address masked -->

> Labels above follow Google's and Microsoft's own administrator help as of October 2026. Both consoles change their wording from time to time; if a label does not match what you see, look for the same idea — a rule that **adds** a recipient to messages crossing your organization's boundary, never one that redirects them.

## Step 4 — Test it

1. From a mailbox **outside** your company, send a message to one of your team.
2. Open that sender's record in **CRM → Records → Contacts** (search by the address). Within about a minute the message appears on the **Activity Timeline** with a *received* badge; if the sender was new, the contact — and a company named after the domain — were created for it.
3. Now have that team member **reply** from their normal mailbox. The reply appears on the same timeline with a *sent* badge.
4. Click **Open thread** on either row to read the message. The detail page offers **Reply** and a link to the **Contact**.

If nothing arrives after five minutes, see [Troubleshooting](#troubleshooting).

<!-- SCREENSHOT: crm/email-capture-timeline.png — a contact's Activity Timeline on the Demo tenant showing one "received" and one "sent" email row with the Open thread action -->

## What you get

- **Every customer conversation on the record**, without anyone remembering to BCC. New contacts and companies appear as people write in.
- **Workflow triggers.** A copy from outside fires **Email inbound received**; a copy of your team's mail fires **Email outbound logged (staff inbox)**. Both can start an [orchestration](/help/orchestrations/overview) — a follow-up task, an alert, a lead-assignment rule — and can be filtered by sender, subject or domain.
- **Signals and intelligence.** Each stored message feeds the contact's [Relationship Intelligence](/help/crm/relationship-intelligence) and the signals the AI extracts.
- **Opt-outs honoured.** A customer typing "please stop emailing me" in a reply is recorded against their [communication consent](/help/crm/communication-consent).

## What it does not do

**Attachments are not stored.** Karmaflow.ai keeps each attachment's name, type and size, not the file. If attachments matter for an address, route that address to a [group inbox](/help/group-inboxes/overview) as well.

**One timeline per message.** The thread row appears on the first external person's timeline — the sender for incoming mail, the first outside recipient for your team's. Other external people on the thread still get a contact record if they are new, but the message is not shown on their timeline.

**A message is stored once.** Copies are matched on the message's own ID. If one message reaches the ingest address twice — through the inbound rule and a Cc, say — it is stored once. If you also route an address to a [group inbox](/help/group-inboxes/overview), test deliberately: the two paths can de-duplicate against each other, so a message may appear in only one of them.

**Automated mail creates nothing.** Newsletters, out-of-office replies, bounces and anything from a no-reply address attach to an existing contact only. They appear under **Messages that didn't reach anyone** on the Email Sending page as *Automated mail — no contact created*, with the message linked, so if one turns out to be a person you can create the contact; their next message will attach by itself.

### A colleague on a personal address

A team member who sends from a personal Gmail or Outlook.com address is **not** on one of your domains, so their messages are treated as a customer's and a contact may be created for them. Do **not** add `gmail.com` to **Internal Email Domains** — that would make every Gmail sender a colleague and stop their contacts being created. Exclude that mailbox from the provider rule instead, or let the record exist and merge it under **CRM → Setup → Contact Cleanup**.

### Tell your team

Your provider's rule copies mail silently — nothing on a message says it was logged. Tell the people whose mailboxes are covered, and leave out the ones that handle personal or privileged matters.

## Troubleshooting

**Nothing arrives at all.** On the Email Sending page, check **Ingestion behavior** reads *Mailgun route provisioned*. Then confirm the rule targets the right direction (**Inbound messages** / **Outbound messages** in Google; *Outside the organization* on the sender or recipient in Exchange), that it is **Enabled** (Exchange creates rules disabled), that enough time has passed (Google allows up to 24 hours, Exchange 30 minutes or more), and that the ingest address is spelled exactly as copied.

**My team's replies are logged as received, not sent.** The sender's domain is not in **Internal Email Domains**. Add it under **Additional domains** and send another test.

**A message shows under "Messages that didn't reach anyone".** Read the row — it says why. *Matched no customer* means every address was one of yours (a colleague-to-colleague message your rule let through); *Automated mail* means a newsletter, auto-reply or no-reply sender with no existing contact; *Dropped by your pre-filter* means your pre-filter agent refused it.

**A customer's reply did not attach to the campaign thread.** Copies arriving through a provider rule carry the original headers, so replies thread normally. A rule that rewrites the subject or strips headers breaks this — prefer a rule that only adds a recipient.

**The message appears with the right time but was received hours later.** That is correct: the stored date is the one the sender's mail client wrote, not the moment the copy arrived.

## Related

- [Routing one address into Karmaflow.ai](/help/group-inboxes/routing-email-in) — a single shared address or mailbox, to the CRM or a group inbox, without copying everything
- [Group Inboxes](/help/group-inboxes/overview) — a shared, threaded inbox that also keeps attachments
- [Managing Contacts](/help/crm/contacts) — where routed mail lands on the record
- [Orchestrations](/help/orchestrations/overview) — automate what happens when a message arrives
