How to check if your email goes to spam, automatically
Sending yourself a test tells you almost nothing. To really check, read the folder your mail actually landed in. This n8n flow checks 4 DNS record types, then reads real placement from your own Gmail and Outlook over the last 30 days, and separates inbox from Promotions from spam.
Every guide on this tells you to send a test email and look, or to paste your draft into a spam-score tool. Both check something, but neither checks the thing you care about. Here is what each method actually measures, where it misleads you, and the flow I run weekly instead.
Why does sending yourself a test email prove nothing?
You are close to the least representative recipient available. You have opened mail from your own domain hundreds of times, so your provider has already learned that you want it, and it lands in your inbox for reasons that have nothing to do with the campaign.
A real recipient has none of that history. They may be at a provider that has never seen your domain, on a list you bought months ago, or one of two thousand people receiving the same message in the same minute. None of that is reproduced by mailing yourself.
The second trap is treating Promotions as spam. They are not the same. Promotions is still the inbox and still gets read. Spam is effectively invisible. Conflating them sends people rewriting subject lines when the actual problem is an unaligned DMARC record, or the reverse.
What does each way of checking actually measure?
Four common approaches. They are not interchangeable, and the differences are the whole point.
| Method | What it really measures | What it misses |
|---|---|---|
| Send yourself a test | Whether mail reaches a recipient who already trusts you | Everything about cold recipients. Your own history skews it. |
| Spam-score / content checker | A prediction from wording and formatting, before sending | Reputation and authentication, which usually matter more. |
| Seed-list placement test | Real placement across a rented panel of mailboxes | Costs money, and seed accounts behave nothing like real recipients. |
| Read your own mailboxes (this flow) | Real folder and tab your actual mail landed in | Only covers providers you control. Narrower sample, but real. |
The first two predict what might happen before you send. The last two record what did happen after you sent, which is generally the more useful thing to know.
How does the workflow check real inbox placement?
Three branches that run independently and get combined at the end.
Branch A, authentication. It builds one DNS question per check and resolves them over DNS-over-HTTPS, so there is no DNS library and no shell access needed. SPF and DMARC and MX, plus a DKIM lookup per selector.
The DKIM part has a side effect worth knowing about. Every sending platform publishes its key under its own selector, so probing a list of them tells you which platforms the domain is set up for. A selector that does not resolve is not an error, it just means the domain is not configured for that provider.
Branch B, real Gmail placement. Gmail exposes its tabs as system labels, so the folder a message landed in is readable directly. No seed network, no third party:
if (L.indexOf('SPAM') !== -1) return 'Spam';
if (L.indexOf('CATEGORY_PROMOTIONS') !== -1) return 'Promotions';
if (L.indexOf('CATEGORY_UPDATES') !== -1) return 'Updates';Branch C, real Outlook placement.Microsoft Graph needs two reads rather than one, because a message carries a parent folder id but not the folder name. Querying the inbox and the junk folder separately means the folder is known from which node returned the message. Within the inbox, Outlook's Focused and Other split is the closest equivalent to Gmail tabs.
Then the three branches merge, a Claude step ranks the findings into plain-language fixes, and the report prints. Delete the AI node and you still have every measurement.
Want this running every week?
We build these end to end. Bring your sending domain and we will scope it in 30 minutes, free. You can also hire an n8n expert for the whole stack, or see what an n8n expert costs first.
How do I build it step by step?
1. Config node. One place for everything you tune. The lookback window drives the mailbox queries, and the domain is the one you send from, which is not always your website domain:
const LOOKBACK_DAYS = 30;
return [{ json: {
SINCE_ISO: new Date(Date.now() - LOOKBACK_DAYS * 86400000).toISOString(),
DOMAIN: 'yourdomain.com',
DKIM_SELECTORS: ['resend', 'google', /* ...one per provider */],
} }];2. Build the DNS questions. Pure string building, no calls. One row for SPF at the root, one for DMARC at _dmarc., one for MX, then one per DKIM selector at selector._domainkey.
3. Resolve them. An HTTP Request node against a DNS-over-HTTPS resolver. Then a small node pairs each answer back to the question that produced it, since the HTTP node preserves input order.
4. Grade the results. One node turns raw answers into a pass and warn checklist. Watch for quoted TXT chunks, which arrive split and need concatenating before a long DKIM key is readable.
5. Read the mailboxes. Gmail and Outlook nodes filtered to the lookback window, then a placement node each. Both are optional. Connect one, connect both, or connect neither and keep the DNS half.
6. Merge, explain, report. Merge synchronises the branches, the AI step ranks fixes by impact, and the final node prints. Swap it for Slack or a sheet without touching anything upstream.
What made it tricky?
Graph does not give you the folder name. The obvious build reads all recent mail and groups by folder, then you find each message carries a parent folder id and nothing readable. Querying inbox and junk as separate nodes sidesteps the whole id lookup, at the cost of one extra node.
Long TXT records arrive in pieces. DKIM keys are long enough to be split into multiple quoted chunks. Read them naively and every key looks malformed. They have to be stripped of quotes and joined before anything will parse.
A missing DKIM selector is not a failure. The first version flagged every unresolved selector as a problem, which meant a correctly configured domain lit up red for the nine providers it does not use. Unresolved has to mean not that provider, not broken.
Skipped is not zero. If no mailbox is connected, the placement branch has to report skipped rather than a zero-percent inbox rate. Those look identical in a report and mean opposite things.
How do I adapt it to my own setup?
Add your ESP's selector. If you send through a platform not in the default list, add its selector so DKIM resolves and the ESP detection recognises it.
Shorten the window. Thirty days is a sensible default for a low-volume sender. If you send daily, drop it so the report reflects the current state rather than an average across a month that included a fix.
Run DNS only. Connect no mailboxes and you have a pure authentication auditor that works on any domain, including ones you do not own. Useful for auditing a client before you take them on.
Log every run. Append the result to a sheet and you get the thing no one-off test can give you: placement over time, so you can see the week it started sliding.
Put it on a schedule. Swap the manual trigger for a weekly Schedule Trigger. This is the single change that turns it from a test into monitoring.
Email spam and deliverability questions, straight answers.
How do I check if my email goes to spam?
Three ways, in rising order of usefulness. Send yourself a test and look. Paste a draft into a spam-score checker. Or read the real folder your sent mail landed in across mailboxes you control. Only the third tells you where actual campaign mail went rather than where a test message went.
Why is sending yourself a test email not enough?
Because you are the least representative recipient you have. You have opened your own mail hundreds of times, so your provider already trusts that sender for your mailbox specifically. A test that lands in your inbox tells you almost nothing about a cold recipient at a different provider with no history.
What is the difference between a spam score and inbox placement?
A spam score is a prediction from content, run before you send. Inbox placement is the observed outcome, measured after. Scores are useful for catching obvious content problems, but a clean score and a spam-foldered campaign happen together all the time, because reputation matters more than wording.
Can I check inbox placement without paying for a seed list?
Yes, if you already control mailboxes that receive your mail. Gmail and Microsoft Graph both expose which folder or tab a message landed in, so a workflow can read real placement from your own accounts. It is a narrower sample than a seed network but it costs nothing and reflects real recipients.
Does landing in the Promotions tab count as going to spam?
No, and treating them as the same thing causes bad decisions. Promotions is still the inbox and still gets opened. Spam is effectively invisible. The flow separates them because the fixes differ. Promotions is usually about content and formatting, spam is usually about authentication and reputation.
What DNS records should I check for deliverability?
SPF, DMARC, MX and DKIM. The workflow queries all four over DNS-over-HTTPS, and probes a list of DKIM selectors rather than one. Each provider publishes its key under its own selector, so whichever selector resolves also tells you which sending platform the domain is configured for.
How often should I run a deliverability check?
Weekly is enough for most senders. Records change rarely, but reputation drifts, and drift is the thing a one-off test cannot show you. Running on a schedule means you compare this week to last week, which is the only way to notice placement sliding before recipients stop replying.
Want to know where your mail is landing?
30 minutes, free. Bring your sending domain. You leave with a plan for a weekly check of your records and your real inbox placement, whether you build it or we do.
Keep reading.
Know which ad to scale, and by how much
Spend and result floors, a margin over the account average, frequency headroom and budget cap checks, then a sized raise.
Score your ad account every Monday
A repeatable week-over-week health score with every threshold published and editable, plus the top three fixes.
Find the below-average ads costing you most
One flow reads all three Meta ad relevance diagnostics, flags every below-average ad, and ranks them by the spend behind them.
Rather have it built for you?
Skip the build. A free 30-minute call and we set this up in your stack, live in a week or two.