Your password-reset link lands in Promotions. Your customer's hand-typed reply to a support thread lands in Promotions. Your onboarding email — plaintext, from a human — lands in Promotions. Why? Because the Promotions classifier is not looking at whether your email is promotional in the dictionary sense. It's matching a fingerprint of mechanical signals, most of which you can control once you know what they are.
Gmail's Promotions tab classifier is a separate ML model from the spam filter. It weighs bulk headers (especially Precedence: bulk and List-Unsubscribe), HTML structure, sending pattern, and per-recipient engagement. If you want Primary placement for a non-bulk message: strip bulk headers, use a personal From, send plaintext or minimal HTML, use a single link, and make sure the recipient has engaged with you before.
How Gmail's tab classifier works
The spam filter and the tab classifier are different systems. Spam runs first — messages that look like spam go to Spam, regardless of tab eligibility. Surviving messages then pass through the tab classifier, which decides Primary, Social, Promotions, Updates or Forums.
The tab model is a machine-learning classifier trained on billions of historical placements, and it's personalised per recipient. The same email, from the same sender, can land in Primary for one user and Promotions for another — because the two users have interacted with that sender differently. This is the single most important thing to understand: Gmail is not grading your email in isolation. It's asking "based on this recipient's past behaviour, does this look like something they'll treat as conversation, or something they'll bucket for later?"
Signal 1: Precedence and List-Unsubscribe headers
This is the single biggest tell. If your headers include Precedence: bulk, List-Unsubscribe, or List-Unsubscribe-Post, you are announcing to Gmail "this is a bulk mailing". Gmail respects your declaration and buckets you accordingly.
This creates an awkward collision with the 2024 sender requirements — which make List-Unsubscribe mandatory for bulk senders at 5000+/day. The rule: if you're actually a bulk sender, include the headers (Primary is probably not realistic anyway). If you're a small sender or transactional sender, don't add them. You don't need them and they cost you the tab.
Signal 2: HTML-heavy templates
Tables, nested divs, hero images, coloured buttons, multi-column layouts — these are what marketing email looks like, and the classifier knows it. Even if your content is a receipt or a one-on-one note, HTML structure that pattern-matches a template pushes you to Promotions.
Fix: for anything you want in Primary, use plaintext or minimal HTML (one or two <p> tags, one link, no images). Keep the text-to-HTML weight heavy toward text. If you have an HTML version, make sure it looks like a hand-typed message, not a newsletter layout.
Signal 3: From-name patterns
Acme Newsletter <news@acme.com>, Acme Team <team@acme.com>, or any From name containing "Newsletter", "Team", "Sales", "Marketing" — these are bulk-sender fingerprints. A personal-name From (Sarah at Acme <sarah@acme.com>) is much more likely to hit Primary, all else being equal.
Fix: for any outbound you want in Primary, use a real human's name. Sarah Kim <sarah@acme.com> or Sarah (Acme) <sarah@acme.com>. Avoid noreply@ — it's a classic Promotions signal.
Signal 4: Unsubscribe links in body and footer
A visible unsubscribe link in the message body or a formal footer ("You received this email because...", address, CAN-SPAM compliance block) is a bulk marker. Gmail associates this pattern with list mailings.
Fix: for a message you want in Primary, skip the unsubscribe block. One-to-one replies don't have unsubscribe links. If you're legally required to include one (CAN-SPAM applies to commercial mail), put it in the headers only via List-Unsubscribe — but as noted above, that header itself is a strong Promotions signal.
Signal 5: Sending at scale to non-engagers
If you send the same message body to 10,000 recipients in a short window, and most of them don't open or reply, the classifier learns that messages like yours go to Promotions for the next-similar batch. Scale without engagement is the definition of "bulk" in the ML model, even if you don't set the header.
Fix: for reach, segment. Split a 10k list into 10 segments and send slightly different variants each. For the highest-value messages, send slower — Gmail reads "burst" patterns directly. 100 messages per hour to engaged recipients looks different from 10,000 messages in 5 minutes.
Signal 6: Multiple tracked links and UTM parameters
A message with 5 tracked links (click.acme.com/xyz, ?utm_source=newsletter&utm_medium=email) is unambiguously marketing. Personal-human messages have 0–1 links, usually not tracked at all.
Fix: for Primary candidates, use a single raw URL (https://acme.com/signup, not click.acme.com/abc?utm_...) and skip click tracking. You lose some analytics; you gain the tab.
Signal 7: Sending domain bulk signals
If the domain you're sending from has a history of bulk mail — newsletters, campaigns, commercial blasts — the classifier applies a bulk prior to every message from that domain. A legitimate personal note from ceo@acmemarketing.com will still tend to Promotions because the domain's pattern is bulk.
Fix: separate subdomains. Send marketing from news.acme.com or go.acme.com. Send transactional and personal from acme.com or mail.acme.com. Each subdomain builds its own reputation and its own tab prior.
Signal 8: Recipient engagement history
This is the hidden weight behind everything. If a recipient previously opened, replied, or moved your mail from Promotions to Primary (or archived-without-reading-from-Promotions vs archived- without-reading-from-Primary), the classifier learns their preferences. A recipient who regularly replies to your mail will get future messages in Primary even when the same message goes to Promotions for non-engaging recipients.
Fix: the first message from a new sender is the hardest. Ask for a direct reply ("hit reply and let me know what you think") — replies are the strongest engagement signal. Once a recipient replies, future mail from the same domain lands in Primary almost automatically.
How to stay in Primary: the be-a-human checklist
Compile the above into a practical checklist for any message you want in Primary:
- From: real human name, no
noreply@, no "Newsletter" / "Team" / "Sales". - Subject: sentence case, under 50 characters, no emoji, no ALL CAPS, no brackets with offers like
[50% off]. - Body: plaintext or minimal HTML. One or two paragraphs. One link or none. No images or at most one small inline image.
- Headers: no
Precedence: bulk, noList-Unsubscribeif you can avoid it, noX-Mailerfrom a known ESP (Mailchimp, SendGrid). - Footer: no marketing signature block. A simple human-style sign-off: "Thanks,\nSarah".
- Sending domain: use a subdomain that hasn't been used for bulk mail.
- Send cadence: don't blast. 50–100 an hour from a single sending account to warmed recipients.
- Ask for a reply. Even a yes/no question. Replies train Gmail's model to put you in Primary for that recipient forever.
When Promotions tab is actually fine
Not every email should be in Primary. If you run an e-commerce newsletter with a weekly drop of offers, Promotions is where recipients expect your mail. Users actively check Promotions for deals; Primary is reserved for conversation. Forcing an e-commerce newsletter into Primary for a user who didn't opt in to personal contact will earn you a spam complaint faster than Promotions would.
Rough rule: conversational, one-to-one, action-required = Primary. Newsletter, promotion, subscribed bulk = Promotions is fine. Align with user expectation and you'll see higher overall engagement, not lower.
Landing in Promotions is not equivalent to landing in Spam. Gmail actively surfaces Promotions to users who want deals. If your open rate is healthy and complaint rate is low, Promotions is a valid home. The only thing worse than Promotions is fighting your way into Primary for a recipient who didn't want you there — they'll mark you as spam, and that hurts you everywhere.