Building n8n workflows around parsed inbound email
React to parsed inbound email in n8n with the n8n-nodes-hidemy community node: triggers, branching on extracted fields, sheet and CRM writes, failure alerts.
Why n8n and parsed email fit together
n8n is where a lot of small automation ends up: self-hostable, visual enough to hand to a teammate, and happy to talk to a few hundred services. Email is where a lot of real-world events still arrive: invoices, orders, applications, alerts from tools with no API.
The friction sits in the middle. n8n's built-in IMAP trigger hands you something close to raw MIME: encoded bodies, multipart trees, and a subject line to string-match. Workflows built on that spend most of their nodes cleaning up instead of deciding.
The better division of labor: let an email pipeline do the receiving, filtering, and field extraction, and let n8n start from clean JSON. Every node then operates on named fields like extracted.total, and the workflow reads like the business rule it implements.
Install the community node
The integration is a community node, package name n8n-nodes-hidemy. On a self-hosted n8n, open Settings, then Community Nodes, choose Install, and enter the package name. Once the install finishes, the HideMy nodes show up in the node picker like any built-in.
Credentials are one API key: create one in your HideMy.world account (keys look like hm_live_...), paste it into a new HideMy credential in n8n, and every workflow on the instance can use it. API access is part of the Pro plan.
Docker setups need nothing special; community nodes install into the instance's data volume and survive restarts. If the nodes do not appear after installing, check that your instance's environment configuration permits community nodes, then reload the editor.
The trigger: a new processed email
The trigger fires when a pipeline finishes processing an email: rules have admitted it and the transformer has extracted its fields. What reaches n8n is the versioned JSON payload, never the raw message.
Versioned deserves a pause: the version is a date string, and changes within a version are additive, so a field added upstream will not move or rename anything your expressions reference. A payload looks like this:
Everything downstream references these fields with ordinary n8n expressions, for example {{ $json.extracted.total }} or {{ $json.from.email }}.
{
"version": "2026-06-01",
"id": "em_4b91c2a7",
"address": "invoices@yournick.hidemy.world",
"from": { "name": "Acme Cloud", "email": "billing@acme-cloud.example" },
"subject": "Invoice AC-2026-4471",
"auth": { "spf": "pass", "dkim": "pass", "dmarc": "pass" },
"extracted": {
"invoice_number": "AC-2026-4471",
"total": "42.90",
"currency": "EUR",
"due_date": "2026-10-05"
}
}Branch on extracted fields, not subject lines
Use IF and Switch nodes on the extracted fields. An invoice workflow might branch on {{ Number($json.extracted.total) }}, routing amounts above 500 to an approval step and the rest straight to the ledger. A hiring workflow might switch on extracted.role to notify the right interviewer.
Resist re-implementing filtering inside n8n. Deciding whether an email matters is the pipeline's job: classic field rules and AI rules run before delivery, so by the time the trigger fires, the email is already the kind you want. n8n should branch on what to do, never on whether to care.
One upstream signal is worth a branch anyway: the auth block. Routing anything where {{ $json.auth.dmarc }} is not pass away from money-touching paths costs one IF node, and rules can also gate on these results before anything fires at all.
If a field needs normalizing (totals as numbers, dates as ISO strings), do it once in a Set node right after the trigger and let every later node consume the normalized shape. Scattering Number() casts across twelve expressions is how workflows become unreviewable.
Write to a sheet or a CRM
The classic endpoint is a spreadsheet: an append-or-update row mapped from extracted fields gives the finance folder a ledger that fills itself. Map the email id or the invoice number into a key column and use update mode, so a re-run of the workflow cannot create a second row.
CRMs follow the same rule: upsert a contact or deal keyed on something from the email itself (applicant email address, order number) rather than blind-creating records. Idempotent writes make workflow retries and manual re-executions boring, which is exactly what you want them to be.
If a human should glance at each event, fan out: the same trigger can feed a Slack or Telegram message and the sheet row in parallel branches.
Mind per-service quotas too. A burst of twenty invoices will hit a sheet API within seconds; n8n's batch settings, or a short Wait node between writes, keeps the workflow under rate limits on its busiest day.
Notify on failures
Workflows fail. A sheet gets renamed, a CRM token expires, an API has a bad day. n8n's answer is the error workflow: a second workflow starting with the Error Trigger node that runs whenever a production workflow fails.
Keep it blunt: a Telegram or Slack message carrying the workflow name, the execution URL, and the error text. The execution URL drops you into n8n's execution view, where you can inspect the data that failed and re-run from the failed node once the cause is fixed.
Failures before n8n have their own safety net. If you feed your instance through a webhook channel, failed deliveries retry with exponential backoff, every attempt is logged, and a delivery can be replayed manually. If n8n was down for an hour, you replay deliveries; nobody has to re-send emails.
Keep workflows testable
Use pinned data while building: run the trigger once, pin the payload, and iterate on branching and mapping without waiting for new mail. For realistic payloads before any real sender is connected, upload a saved .eml file to the pipeline and let the transformer produce exactly what n8n will receive.
Keep one workflow per concern (invoices, applications, alerts) instead of one mega-workflow with twelve branches. Small workflows fail small, and the error workflow then tells you which concern broke instead of pointing at everything.
Name each workflow after its concern and its trigger address (invoices via invoices@, applications via jobs@), because six months from now the address on an incoming email is how you will find the workflow that handles it.
From there the pattern compounds quietly: each new email source is one address, one rule, one transformer, and one more small workflow. None of the steps is clever, and that is the point.