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 August 3, 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 through OAuth, finds current and historical invoice emails, and routes them to Expensify without relying on Gmail forwarding-address verification.

Skip manual forwarding when you can. Expensent connects to Gmail or Outlook through OAuth, finds current and historical receipt emails, and routes them to Expensify from the authenticated mailbox without relying on Gmail forwarding-address verification.

Expensify integration details·Skip to Expensent workflow

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. 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. 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.

Gmail filters focus on new messages and require a verified forwarding destination. Historical receipts need a separate catch-up path.

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.

Full walkthrough of the single-receipt flow: prerequisites, file format and size limits, Copilot delegation, and the step-by-step forward are all in How to email receipts to Expensify. This page assumes you already have that basic forwarding working and want to scale it up.

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.

Pro tip: turn on Gmail's keyboard shortcuts (Settings → See all settings → General → Keyboard shortcuts on), then use f to forward the open message. It turns forwarding into a keyboard workflow instead of a mouse-heavy detour.

Method B: Gmail filters and destination verification

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.

Why destination verification stops this setup

  1. 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. 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. 3.receipts@expensify.com is 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. 4.The verification step cannot be completed, so the destination cannot be added and 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.

Mark this one as "does not work" and move on. Generic Gmail-filter advice often skips this requirement. Test it before building a receipt workflow around it, because the verification step blocks this setup for an ingestion address you cannot open.

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.com on every message delivered to billing@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".

Corporate IT note: routing rules are considered a mail compliance control and usually require a change ticket. Expect your IT team to ask who owns 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.

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.

Quota warning: consumer Gmail gives Apps Script roughly 100 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.

Method E: Inbox-aware tools (Expensent)

Expensent connects to Gmail through OAuth, finds current and historical receipt emails, and routes selected messages to receipts@expensify.com. Confirmed sender-and-subject patterns can then handle new recurring receipts automatically without Gmail's forwarding-address verification flow.

How Expensent connects Gmail to Expensify

  1. 1.OAuth into your Gmail account (personal @gmail.com or Google Workspace). No app password, no filter, no admin ticket.
  2. 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. 3.See what it found in the dashboard — grouped by next action: ready to forward, download from portal, needs review, false positive.
  4. 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. 5.Find historical inbox receipts : pick a date range in Expensent, recover older invoice and receipt emails, and route them to Expensify without an Apps Script quota.

This route avoids Gmail forwarding-address verification, works with personal Gmail and Workspace, recovers historical inbox documents, creates rules from real examples, and avoids script maintenance. Expensent is a paid tool and uses Gmail OAuth permissions to find and send the relevant messages.

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.

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, and pairs historical catch-up with ongoing recurring forwarding.
  • 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.

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.

Frequently asked questions

Can I forward historical Gmail receipts to Expensify in bulk?

Not with a native Gmail forwarding rule. Gmail filters and Workspace routing act on new mail, not the backlog already in the inbox. Expensent can search a chosen historical period and route the receipt emails that still need to reach Expensify.

Why won't Gmail let me add receipts@expensify.com as a forwarding address?

Gmail's Settings → Forwarding and POP/IMAP flow requires you to add a destination address and then confirm a code that Gmail emails to that destination. receipts@expensify.com is an ingestion endpoint — it accepts mail but there is no human inbox you can log in to in order to retrieve the verification code. That is why the forwarding setup fails at the confirmation step. The same restriction applies to any Gmail filter whose action is "Forward it to" — Gmail only lets you pick from addresses that have already been verified.

Do Google Workspace routing rules require admin access?

Yes. Recipient and content compliance rules live under Admin Console → Apps → Google Workspace → Gmail → Routing, and only Workspace super admins or delegated Gmail admins can create them. They may help with mail routing, but sender attribution can vary by routing setup and should be tested before you rely on it as an Expensify sender-matching fix. Personal @gmail.com accounts have no admin console and cannot use this approach at all.

What Gmail search operators find invoice and receipt emails?

A good starting query is has:attachment filename:pdf (invoice OR receipt OR "order confirmation" OR statement) newer_than:3y. You can tighten it with from: clauses for known billing senders (for example from:(stripe.com OR paypal.com OR intuit.com)), or widen it with subject:(invoice OR receipt). Save the query as a Gmail search URL so you can re-run it before each backfill pass. Keep in mind that these operators search Gmail, not Expensify — you still have to get the matching messages into receipts@expensify.com somehow.

Does Gmail's "Promotions" tab block receipts from reaching Expensify?

Not directly. Gmail's Category tabs (Primary, Promotions, Updates, etc.) are purely a display grouping in the Gmail UI — they do not change what filters, routing rules, or OAuth-connected apps can see. An Apps Script using GmailApp.search() or an inbox-aware tool using the Gmail API will read messages regardless of which tab they land in. The only time tabs matter is when you are manually forwarding and simply do not notice a receipt because it was routed to Promotions. A quick fix is to create a filter that marks receipts as Primary.

Will Expensify accept receipts forwarded from a Gmail alias (+tag) address?

Expensify ties forwarded receipts to the sender's registered login. Register your base address (user@gmail.com) as a primary or verified contact method before forwarding — Gmail's plus-addressing is not officially documented by Expensify. If you rely on plus-addressing to segment work from personal mail, add the plus variant as a secondary login in Account Settings → Profile → Contact Methods before you start forwarding.

Does auto-forwarding break SPF/DKIM in a way Expensify cares about?

Gmail auto-forwarding and routing can affect message headers and sender attribution, but Expensify does not publicly document the exact rules at its inbound endpoint. Test the exact forwarding route with a real receipt before relying on it. Where it can matter is duplicate detection — if the same receipt arrives via both the vendor and your forward, Expensify may create two expense records.

Can I forward from a delegated Gmail mailbox to Expensify?

Gmail delegation (Settings → Accounts → Grant access to your account) lets a delegate read and send mail on behalf of the owner, including forwarding. The forwarded message is sent from the owner's address, so Expensify will attribute the receipt to the owner's login, not the delegate's. If you want the delegate (for example, an external bookkeeper) to be the submitter, use Expensify's Copilot feature, which gives them delegated access to your Expensify account directly — see Expensify's Copilot documentation for the current setup path.

What's the daily email quota for a Gmail Apps Script forwarder?

Google publishes a MailApp.sendEmail() daily quota of 100 recipients per day for consumer @gmail.com accounts and 1,500 recipients per day for most Google Workspace plans, subject to Google's current documented limits. An Apps Script counts each forwarded receipt against that quota one recipient at a time, so a busy inbox on a consumer account can hit the ceiling quickly. Quotas reset on a rolling 24-hour window. If your backfill exceeds the quota, the script throws an exception mid-run and you will need to resume the next day — which is why scripts are not a great fit for bulk historical imports.

How do I stop forwarding a vendor once I've set up a rule?

It depends on which method you picked. For Gmail filters, open Settings → Filters and Blocked Addresses and delete the filter. For Google Workspace routing, open Admin Console → Apps → Gmail → Routing and remove the rule, then allow time for propagation. For an Apps Script, disable or delete the time-driven trigger in the script editor. For Expensent, open the forwarding rule in the dashboard and delete or pause it so future matching invoices are no longer forwarded by that rule.

Route Gmail receipts to Expensify

Connect Gmail to Expensent, send receipts already in the inbox, and automate future recurring matches without Gmail filters or Apps Script.

Get Started

Works with personal Gmail and Google Workspace. See pricing.