Gmail to Expensify: The Complete Workflow Guide
A Gmail-specific guide to what actually works with Expensify: manual forwards, Gmail forwarding-address verification, Apps Script, Google Workspace routing caveats, and practical ways to deal with older receipts already buried in your inbox.
By ilios Galil · Founder, Expensent
Published March 27, 2026 · Updated June 24, 2026
TL;DR
Gmail cannot verify receipts@expensify.com, so native auto-forward filters fail at the confirmation step.
Historical backfill is the biggest gap — Gmail rules only apply to new mail going forward.
Expensent connects via OAuth, reviews invoice emails by next action, and forwards to Expensify without relying on Gmail forwarding-address verification.
Skip manual forwarding when you can. If you are reading this because Gmail will not verify receipts@expensify.com, you are not alone — that is a structural limitation, not a setup mistake. Expensent connects to Gmail or Outlook via OAuth, lets you review historical and new invoice emails, and forwards them to Expensify from your authenticated inbox.
In This Guide
- 1. The Gmail → Expensify problem: ongoing plus backfill
- 2. How Expensify receives mail (quick recap)
- 3. Method A — Manual forward
- 4. Method B — Gmail filters: the verification dead end
- 5. Method C — Google Workspace routing rules
- 6. Method D — Apps Script and Gmail API
- 7. Method E — Inbox-aware tools
- 8. Which method for which user
- 9. Backfilling years of historical receipts
- 10. Troubleshooting Gmail-specific quirks
- 11. Frequently Asked Questions
1. The Gmail → Expensify problem: ongoing plus backfill
If you've landed here, you probably already know the destination: receipts@expensify.com. Forwarding a single receipt there is well documented in our main Expensify email receipts guide. What that guide doesn't cover — and what this one does — is the real-world operational problem of connecting Gmail (personal or Google Workspace) to Expensify at scale, on an ongoing basis, and retroactively across years of old mail.
There are two jobs to solve, not one:
- 1.Ongoing: new matching receipts going forward — when Stripe, AWS, Shopify, or your SaaS vendor sends a matching invoice, the workflow should get it to Expensify without relying on memory.
- 2.Backfill: the three years of receipts already in your inbox — the moment you sign up for Expensify, there's a pile of historical invoices already sitting in Gmail that your accountant would love to have.
Native Gmail features are built around job #1 and mostly fail at it. None of them solve job #2 at all. That asymmetry is what this guide exists to untangle.
2. How Expensify receives mail (quick recap)
A two-sentence refresher so the rest of this guide makes sense. Expensify ingests receipts through receipts@expensify.com, and it associates mail with senders whose address is registered as a primary login or verified contact method on an Expensify account. SmartScan then reads clear attached receipt content and turns it into an expense under the sender's account.
3. Method A — Manual forward
The baseline. Open the receipt in Gmail, hit Forward, type receipts@expensify.com, send. SmartScan handles the receipt after it lands in your Expensify account.
Pros: zero setup, no permissions to beg for from IT, works in both personal Gmail and Google Workspace, and each forward is intentional, reducing the chance that you send Expensify something that isn't a receipt. Cons: it depends on you remembering to do it each time, which is exactly the kind of thing humans forget. If you only get a handful of receipts a month and you already live in your inbox, Method A is genuinely fine. Most people need something more durable.
4. Method B — Gmail filters: the verification dead end
A common next attempt is a Gmail filter with Forward it to set to receipts@expensify.com. In theory this is perfect: narrow the filter to from:(billing@stripe.com OR receipts@uber.com), set the action to forward, and you're done. In practice, you will get stuck on the very first step.
The verification dead end, step by step
- 1.Gmail will not let a filter forward to an address that isn't already on your verified list (Settings → Forwarding and POP/IMAP). Google Workspace also publishes limits for account filters that automatically forward messages, so this is not an unlimited automation surface.
- 2.To add
receipts@expensify.com, Gmail sends a confirmation code email to that address and asks you to paste it back into Settings. - 3.
receipts@expensify.comis an ingestion endpoint. There is no inbox to log into, no way to read the code, no human on the other side to forward it back to you. - 4.Dead end. The verification step cannot be completed, so the destination cannot be added, so the filter cannot be created.
This is not a bug, a misconfiguration, or a missing permission. It's how Gmail is designed: the verification handshake exists to prevent malicious filters from silently exfiltrating your mail, and there is no user-facing way to opt out. Every personal @gmail.com account hits this wall.
5. Method C — Google Workspace routing rules
If your Gmail account is actually a Google Workspace account, there is an admin-level mail-routing tool in the Admin Console. It matters enough to mention here, but it is not the clean native answer many people hope it is.
Where it lives
Google Admin Console → Apps → Google Workspace → Gmail → Routing. You need super-admin or delegated Gmail admin permissions. The two rule types worth knowing:
- •Recipient rules can add an envelope recipient to any message matching an address pattern (for example, BCC
receipts@expensify.comon every message delivered tobilling@yourdomain.com). - •Content compliance rules can match on sender, subject, headers, attachment type, or body text, and apply an action like "add more recipients" pointing at
receipts@expensify.com. Useful when a Workspace admin wants to route invoice-like mail, but still not a guaranteed Expensify attribution fix.
The attraction is obvious: no per-user verification handshake, centralised policy management, and routing rules that can scope to a shared billing alias or an entire department. The catch is just as important: sender attribution can vary by routing setup, while Expensify ties emailed receipts to linked sender addresses. That makes Workspace routing a mail admin tool to test carefully, not a clean documented Expensify workaround. It also requires admin access you may not have, and the matching syntax is substring- and regex-based rather than semantic — so a routing rule for subject:invoice will happily forward the marketing email whose subject line is "Invoice your friends for a free month".
receipts@expensify.com, whether a compliance footer is required, and whether the rule needs logging. Also expect to test whether the routed message still lands correctly in Expensify under the right linked sender.Crucially, like every Gmail-native method, routing rules only apply to new mail going forward. They do not retroactively forward the old invoices already in everyone's inbox. Treat Method C as an admin caveat, not the main recommendation.
6. Method D — Apps Script and Gmail API
Method D is the DIY developer option. You write a Google Apps Script that uses GmailApp.search() to find matching messages and MailApp.sendEmail() (or GmailMessage.forward()) to push them to receipts@expensify.com. A time-driven trigger can run the script on a schedule. No Gmail forwarding-address verification handshake is required — the script sends as you, from your own mailbox, so Expensify can match the sender when that address is linked to the account.
Sketch of the script (illustrative, not production)
function forwardReceipts() {
var query = 'label:unprocessed has:attachment ' +
'(subject:invoice OR subject:receipt)';
var threads = GmailApp.search(query, 0, 20);
threads.forEach(function (thread) {
thread.getMessages().forEach(function (msg) {
msg.forward('receipts@expensify.com');
});
thread.removeLabel(GmailApp.getUserLabelByName('unprocessed'));
thread.addLabel(GmailApp.getUserLabelByName('sent-to-expensify'));
});
}Pros: works on personal Gmail (unlike Method C), can handle both ongoing forwards and — with a widened query and a higher batch size — a bounded historical backfill, and costs nothing if you stay inside Google's free quotas. Cons: you are now a script maintainer. When Google deprecates a method, or a vendor changes its subject format, or you hit a quota, the script can throw an exception or stop before the batch is complete.
MailApp.sendEmail() recipients per day; Google Workspace gives most plans around 1,500. Each forwarded receipt counts as one recipient, subject to Google's current published quota. That is fine for day-to-day forwarding; it is a serious limitation for backfilling three years of invoices in one pass. You will have to resume across multiple days if the historical queue is big.The Gmail API route (instead of Apps Script) gives you finer control and cleaner OAuth scopes (gmail.send, gmail.readonly), but the quota and maintenance picture is the same. Method D is a solid fit if you already write code for a living and genuinely enjoy owning one more tiny system. For everyone else, skip to Method E.
7. Method E — Inbox-aware tools (Expensent)
Method E is the practical answer for almost everyone who landed on this page. It's an inbox-aware tool that connects to Gmail via OAuth — not through a Gmail filter — so it does not rely on Gmail's forwarding-address verification flow. It also gives you a cleaner way to review older inbox results than rebuilding filters or scripts from scratch. Expensent is the tool we build; the rest of this section is specific to it.
How Expensent connects Gmail to Expensify
- 1.OAuth into your Gmail account (personal
@gmail.comor Google Workspace). No app password, no filter, no admin ticket. - 2.Paste receipts@expensify.com as the destination. Expensent forwards as you, from your own authenticated address, so SmartScan attaches the expense to your Expensify account.
- 3.Review what it found in the dashboard — grouped by next action: ready to forward, download from portal, needs review, false positive.
- 4.Forward selected invoices with one click, or create a rule from an existing email in one click so a future similar email can be routed with less manual work.
- 5.Review historical inbox results — pick a date range in Expensent and review the older invoice and receipt emails it identifies before forwarding the ones that should reach Expensify. No Apps Script quota to ration across days.
Pros: avoids Gmail forwarding-address verification, works with both personal Gmail and Workspace, supports historical inbox review (the one thing none of Methods A–D can do well), creates rules from real examples, and avoids script maintenance. Cons: it's a third-party tool, it's paid, and it asks for a Gmail OAuth scope to read and send mail on your behalf — the usual trade-off for any OAuth-based inbox tool.
If you want to go deeper, the Expensify integration page walks through the feature set, and our sibling guide on preventing missing receipts in Expensify covers the longer-term habit side of the problem.
8. Which method for which user
Side-by-side, across the five methods:
| Method | Personal Gmail | Workspace | Ongoing | Backfill | Setup |
|---|---|---|---|---|---|
| A. Manual forward | Yes | Yes | Manual only | One by one | None |
| B. Gmail filters | Blocked (verification) | Blocked (verification) | — | — | — |
| C. Workspace routing | No | Yes (admin) | Automatic | No | Admin review |
| D. Apps Script | Yes | Yes | Scheduled runs | Quota-limited | Developer |
| E. Expensent | Yes | Yes | Automatic | Historical review | Focused setup |
Personal Gmail vs. Google Workspace in one line: personal Gmail users have Methods A, D, and E available. Workspace users can also test Method C with admin help, but it is a routing tool with sender-attribution caveats, not a clean documented Expensify fix. Method B fails for direct receipts@expensify.com forwarding because that ingestion address cannot complete Gmail's verification step.
9. Backfilling years of historical receipts
Backfill is the job Gmail itself refuses to do. Filters and routing rules only act on incoming mail; they will not go back and re-send messages you received last year. If you just signed up for Expensify and want the last 24–36 months of receipts to actually live there, here are the realistic options in order of effort.
Step 1 — Find the receipts with a Gmail search
Start with a query like this in the Gmail search box. Tune it for your own senders.
has:attachment filename:pdf (subject:(invoice OR receipt OR "order confirmation") OR from:(billing@ OR invoices@ OR receipts@)) newer_than:3y
Refine until the result set looks mostly like actual receipts. Then you have a choice about how to get them to Expensify.
Step 2 — Pick a backfill method
- •Manual— works, but hundreds of forwards become repetitive quickly. Doable for a small backfill, painful for years of history.
- •Apps Script — can iterate your saved search in batches, but Google's daily send quota (100 recipients/day on consumer Gmail and 1,500 on many Workspace accounts, subject to Google's current limits) can force you to spread the backfill across days. Good for small backfills, bad for big ones.
- •Inbox-aware tool (Expensent) — not bound by Gmail's Apps Script quota, skips messages it has already processed, lets you review candidates before forwarding, and is the only option that pairs backfill with ongoing forwarding out of the box.
- •Hybrid— use the tool for historical review and ongoing forwarding, or pair it with a custom script if you already maintain one.
Whichever method you pick, do the backfill first, then switch on ongoing forwarding second. If you reverse the order, the tool will forward an invoice while it's also being backfilled, and you'll end up chasing duplicates in Expensify. Related reading: SmartScan troubleshooting for when backfilled receipts come through with missing data, and Expensify for accountants if you're doing this on behalf of a client rather than yourself.
10. Troubleshooting Gmail-specific quirks
Forwarded receipt arrives without the original attachment
Cause: forwarding can omit, duplicate, or repackage attachments depending on the client and route. Fix: use the desktop web client, confirm the original PDF or image is still attached, or attach the original receipt PDF directly before sending.
"Message clipped — view entire message"
Cause: very long HTML bodies can be clipped in the Gmail web view, and forwarded content may not preserve the receipt details you expect. Fix: attach the receipt PDF directly instead of relying on inline HTML when the message body is long or heavily formatted.
Receipt lands in Gmail's Promotions tab and gets missed
Cause:Gmail's Categories classifier is not invoice-aware and regularly routes legitimate receipts to Promotions. Fix:either turn off Category tabs entirely (Settings → Inbox → Categories), or create a Gmail filter matching the vendor and set "Never send it to Spam" plus "Categorize as: Primary." Filters can still categorize — they just can't forward to an unverified address.
Expensify returns "unrecognized sender"
Cause: the forward was sent from a Gmail alias, a delegated mailbox, or a Workspace send-as identity that is not registered on your Expensify account. Fix:open Expensify → Settings → Account → Profile → Contact Methods and add the sending address as a secondary login. Verify it, then re-forward.
11. Frequently Asked Questions
Can I forward historical Gmail receipts to Expensify in bulk?
Why won't Gmail let me add receipts@expensify.com as a forwarding address?
Do Google Workspace routing rules require admin access?
What Gmail search operators find invoice and receipt emails?
Does Gmail's "Promotions" tab block receipts from reaching Expensify?
Will Expensify accept receipts forwarded from a Gmail alias (+tag) address?
Does auto-forwarding break SPF/DKIM in a way Expensify cares about?
Can I forward from a delegated Gmail mailbox to Expensify?
What's the daily email quota for a Gmail Apps Script forwarder?
How do I stop forwarding a vendor once I've set up a rule?
Avoid Gmail forwarding-address verification
Connect Gmail to Expensent. Forward selected invoice emails with one click, create a rule so future similar emails can be routed with less manual work, and review older inbox results without relying on Gmail filters, Apps Script, or admin routing.
Get StartedWorks with personal Gmail and Google Workspace. See pricing.