Why isn't Gmail recognizing Customer.io unsubscribe links and what makes an unsubscribe link compliant?
Published 28 Jul 2025
Updated 8 Oct 2026
11 min read
Summarize with

Updated on 8 Oct 2026: We clarified Customer.io unsubscribe testing and how Gmail reports one-click compliance.
Gmail is not judging the footer unsubscribe link by itself. For senders Gmail classifies as bulk senders, Gmail looks for RFC 8058 one-click unsubscribe in marketing and subscription messages delivered to personal Gmail accounts. Gmail's compliance dashboard evaluates production traffic, while the visible Gmail unsubscribe button has separate eligibility checks. A Customer.io email can have a working footer link and still fail Gmail's view if the production message lacks the right headers, the headers are not DKIM-signed, the HTTPS endpoint does not accept the one-click POST, or only some campaigns include the unsubscribe tag.
Customer.io's built-in unsubscribe tags enable its default one-click functionality. Test a real production send, inspect the raw headers, and confirm every active marketing layout includes {% unsubscribe %} or {% unsubscribe_url %}. A template preview or ad hoc test alone does not establish that the recipient-specific headers in production are correct.
Why Gmail doesn't recognize an unsubscribe link
A technically compliant promotional message has one List-Unsubscribe field containing an HTTPS unsubscribe URL, one List-Unsubscribe-Post field containing List-Unsubscribe=One-Click, a valid DKIM signature whose h= list covers both headers, and an endpoint that processes the POST without asking the user to log in, confirm, visit a preference page, or click again.
If Gmail's compliance dashboard says Customer.io unsubscribe links are not compliant, the first check is the raw delivered headers for the exact production message Gmail received, not the visible link. The visible footer link is still needed for users and Gmail's body-link requirement, but Gmail's one-click rule is header-based.
Footer links and one-click headers
A footer unsubscribe link that opens a preference center is not the same thing as RFC 8058 one-click unsubscribe. Gmail requires the header version for bulk marketing and subscription messages. The body link can still point to preferences, but the header URL must let Gmail submit the one-click POST and remove the recipient from the mailing list associated with the message.
- Real send: Use a delivered production message, not a template preview or ad hoc test send, because production headers are the evidence Gmail sees.
- Both headers: The message needs List-Unsubscribe and List-Unsubscribe-Post in the final headers.
- POST behavior: The HTTPS URL must accept the one-click POST and suppress the recipient without a second action.
- Gmail display: The Gmail unsubscribe button does not always appear, even when the headers are correct, because Gmail applies automated eligibility checks.
What makes one-click unsubscribe compliant
A compliant one-click unsubscribe setup has two layers. The first layer is the clearly visible unsubscribe link in the message body. The second layer is the header-based instruction that Gmail and Yahoo can use to unsubscribe the recipient without sending them to a web page. Gmail's sender guidelines require both layers for marketing and subscription mail from bulk senders.

Gmail one-click unsubscribe checks: email headers, DKIM signature, HTTPS POST, and suppression.
Compliant one-click headerstext
List-Unsubscribe: <mailto:unsubscribe@example.com>, <https://example.com/u/abc123> List-Unsubscribe-Post: List-Unsubscribe=One-Click
The mailto address in this example is optional. A mailto-only List-Unsubscribe header does not satisfy Gmail's one-click requirement, as explained in Google's sender FAQ.
Expected one-click POSThttp
POST /u/abc123 HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 26 List-Unsubscribe=One-Click
For a custom endpoint, put enough information in an opaque, hard-to-forge URI token to identify the recipient and mailing list. Accept application/x-www-form-urlencoded and multipart/form-data POST bodies. Do not rely on cookies, HTTP authentication, or browser session context, and do not redirect the POST. The same URL can display a confirmation or preference page on GET, but the one-click POST must unsubscribe without that page. Avoid click-tracking redirects in the header URL. These mechanics are defined in RFC 8058.
|
|
|
|---|---|---|
Headers | Both headers with the correct one-click value | Missing header or incorrect POST value |
URL | One HTTPS unsubscribe endpoint | mailto-only header or browser-only page |
Action | POST suppresses the recipient within 48 hours | Additional action or delayed suppression |
DKIM | Valid signature covers both fields in h= | Failed signature or unsigned fields |
Scope | Every marketing and subscription stream | Only selected templates or campaigns |
One-click unsubscribe compliance checks for delivered messages.
Gmail also expects the rest of the sender setup to be healthy. That means authenticated mail, a valid DMARC policy, low user-reported spam, and clean formatting. Gmail's broader sender requirements include temporary and permanent rejections for certain failures. Missing one-click unsubscribe alone does not automatically cause rejection or spam placement, but it makes bulk senders ineligible for delivery mitigation. Correct one-click headers do not offset broken authentication or other sender requirement failures. Google explains the enforcement distinction in its sender FAQ.
Which messages need one-click unsubscribe
Gmail's bulk-sender rules apply when a primary domain sends close to 5,000 or more messages to personal Gmail accounts in 24 hours. Messages from the same primary domain count together, and Gmail keeps the bulk-sender classification after a domain qualifies. The one-click requirement applies to marketing and subscription messages, not every email a company sends. Personal Gmail accounts end in @gmail.com or @googlemail.com; these sender requirements do not apply to mail received by Google Workspace accounts.
- Marketing and subscription mail: Include RFC 8058 one-click headers and a clearly visible body unsubscribe link for marketing mail, newsletters, and recurring notification subscriptions.
- Transactional mail: Password resets, purchase receipts, and one-time passwords are excluded when the message only supports the requested transaction.
- Mixed-purpose mail: Treat a message as marketing when promotional content changes its primary purpose, even if a transaction triggered it.
- List identity: Give each subscription list a human-readable List-ID header or a unique From address, and use different From addresses for subscription and non-subscription mail.
Gmail's subscription guidance also calls for recipients to confirm their email address after signing up. Confirmed opt-in (double opt-in), clear list identity, and separate sending addresses do not replace RFC 8058, but they help Gmail and recipients understand which subscription the one-click action controls.
How Customer.io generates unsubscribe headers
Customer.io has two unsubscribe paths that matter here. Its built-in unsubscribe functionality implements RFC 8058 automatically when you use Customer.io unsubscribe links. Custom unsubscribe links are different because your own system must accept and process the RFC 8058 POST, and you must add the required custom headers to every applicable email. Customer.io's custom unsubscribe docs explain that split.

Customer.io email editor showing Liquid unsubscribe tags in a marketing email footer.
Default Customer.io links
- Setup: Use Customer.io's built-in unsubscribe tags in the real email layout. Keep the footer outside conditional Liquid that hides it for some recipients.
- Headers: Customer.io appends the required unsubscribe headers when its unsubscribe links are present.
- Best use: This is the direct path for teams that do not need custom processing.
Custom unsubscribe links
- Setup: Your application owns the one-click HTTPS POST endpoint.
- Headers: Add the correct custom headers to every applicable email in the workspace.
- Best use: Use this when your own preference system must process the unsubscribe.
Customer.io's global unsubscribe docs explain the unsubscribed attribute. Its built-in List-Unsubscribe action globally unsubscribes the person, rather than changing one topic, as confirmed in its subscription FAQ. A body link can send the person through subscription topic or preference controls. Global unsubscribe also affects other supported messaging channels. Review sending overrides so promotional messages cannot bypass the stored unsubscribe status.
How to test Customer.io unsubscribe headers
Test with a real send to a mailbox that receives the same production headers as a subscriber. Inspect the raw message, trigger the HTTPS endpoint with the expected POST payload in a controlled way, and check that the recipient is suppressed from the mailing list associated with that email. In Gmail, open the message menu and select "Show original". Confirm DKIM passes, then inspect the h= tag of that passing signature for both unsubscribe fields.
Suped's email tester lets you send a real message and review the delivered authentication and header details in one place. Use it to inspect the final Customer.io message before testing the unsubscribe action.
Email tester
Send a real email to this address. Suped shows a results button when the test is ready.
?/43tests passed

Email tester sample report showing total score, email preview, issue summary, and per-section results
After the header check, check domain authentication too. One-click unsubscribe is part of the bulk sender rules, but Gmail evaluates it beside SPF, DKIM, DMARC, spam rate, and message quality. Suped's domain health checker can catch obvious DNS and authentication problems before you spend time debugging the unsubscribe endpoint.
For a controlled seed recipient, copy the HTTPS URL in List-Unsubscribe and use it in this command in place of the example URL. The POST performs an unsubscribe, so use a seed profile prepared for that action.
Test the one-click POST for a seed recipientbash
curl -i --request POST \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data 'List-Unsubscribe=One-Click' \ 'https://example.com/u/abc123'
Check the response and stored subscription state; a successful HTTP status alone does not prove suppression. For Customer.io's built-in action, verify unsubscribed is true on the seed profile. For a custom endpoint, verify suppression for the associated list and confirm subsequent marketing sends exclude the recipient.
- Send: Send the real Customer.io campaign or broadcast to a controlled seed address.
- Inspect: Open the raw message and confirm both unsubscribe headers exist.
- Verify: Confirm a valid DKIM signature lists both unsubscribe fields in its h= tag.
- Suppress: Confirm the one-click action removes the person from the associated mailing list within 48 hours.
- Compare: Repeat the check across older journeys, broadcasts, regional workspaces, and templates with promotional content. Keep purely transactional mail on a separate From address.
Why Postmaster Tools still shows 'Needs work'
A single delivered message can pass every one-click test while Postmaster Tools still shows 'Needs work'. The dashboard uses a rolling average across the primary domain and its subdomains. Google says messages without one-click unsubscribe that recipients mark as spam can explain this status. One compliant sample does not prove all production streams are compliant. See Google's dashboard guidance.
Gmail user-reported spam rate
Aim below 0.10% and avoid reaching 0.30%. This daily rate measures recipient spam reports, not Gmail's automatic spam classification.
Target
Under 0.10%
Keep user-reported spam very low.
Watch
0.10% to under 0.30%
Investigate list source and unsubscribe friction.
Problem
0.30%+
Expect delivery and mitigation issues.
Common causes include mixed sending streams, old templates, conditional footers that omit unsubscribe tags, custom endpoints that show a preference page instead of processing the POST, or authentication problems that invalidate the header instruction. For the separate display question, the explanation of Gmail button behavior covers why the visible Gmail control is not guaranteed for every valid message.
Allow time for compliance status to change
After fixing every affected marketing stream, recheck the dashboard after seven days. Google says compliance changes can take that long to appear. Low sending volume can produce 'No data found'; it does not confirm compliance.
Check the separate 'Honor unsubscribe' status too. If it shows 'Needs work', inspect processing and suppression logs, including firewall or bot-protection blocks. Requests must be honored within 48 hours even when infrastructure prevents them reaching your application. The one-click requirements explain how Gmail and Yahoo treat this requirement.
How DKIM and DMARC affect unsubscribe compliance
One-click unsubscribe is not a DMARC record setting, and DMARC does not validate the unsubscribe endpoint. Gmail separately requires SPF, DKIM, and DMARC for bulk senders, with p=none accepted as the minimum DMARC policy, while RFC 8058 relies on a valid DKIM signature that covers the List-Unsubscribe and List-Unsubscribe-Post fields. Both checks matter, but they prove different things. These are separate checks in Google's sender guidelines.
Suped's DMARC monitoring shows sending sources and their DMARC authentication results. Use those reports to find authentication failures, then inspect delivered messages for unsubscribe headers. DMARC aggregate reports do not contain List-Unsubscribe fields or prove that the POST endpoint works.
DMARC record detail view showing SPF, DKIM, DMARC, rDNS diagnostics, and DNS records
- SPF: Make sure Customer.io is authorized for the envelope sender domain used by the mail stream.
- DKIM: Confirm the final delivered message has a valid signature and both unsubscribe headers appear in its h= list.
- DMARC: Confirm SPF or DKIM passes with its authenticated domain matching the visible From domain under the configured DMARC matching mode.
- Reporting: Track authentication by source so old or forgotten senders do not distort compliance signals.
Fix the Customer.io sending source
If a delivered Customer.io marketing message has the correct RFC 8058 headers, a working suppression endpoint, and a passing DKIM signature covering both fields, that message passes the technical checks. Audit the remaining production streams before attributing a dashboard warning to reporting delay.
If any of those checks fail, fix the message source first. In Customer.io, add a missing built-in unsubscribe tag to the shared layout, replace header URLs that cannot process the POST, or fix the custom endpoint to accept the exact one-click payload. Then resend a production message and test the final delivered copy again.
Suped's platform supports this workflow by combining DMARC source reporting with SPF and DKIM diagnostics and delivered-message testing. Use DMARC reports to identify active sending sources, then use the email tester on each marketing stream to confirm the final unsubscribe headers. This keeps unsubscribe failures separate from authentication and source-inventory problems.

