<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Remint]]></title><description><![CDATA[In my audits I often find DTC brands leaving 30-50% of email revenue on the table. Remint shows where it leaks: flows, deliverability, copy, automation, AI that actually pays, and how to recover. 15 years of audits, flow building, design and development.]]></description><link>https://tips.remint.email</link><image><url>https://substackcdn.com/image/fetch/$s_!24xZ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7427920-260f-42d9-b197-5833922a2119_256x256.png</url><title>Remint</title><link>https://tips.remint.email</link></image><generator>Substack</generator><lastBuildDate>Sat, 25 Jul 2026 06:47:30 GMT</lastBuildDate><atom:link href="https://tips.remint.email/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Christian Lundgren]]></copyright><language><![CDATA[en-gb]]></language><webMaster><![CDATA[remintemail@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[remintemail@substack.com]]></itunes:email><itunes:name><![CDATA[Christian Lundgren]]></itunes:name></itunes:owner><itunes:author><![CDATA[Christian Lundgren]]></itunes:author><googleplay:owner><![CDATA[remintemail@substack.com]]></googleplay:owner><googleplay:email><![CDATA[remintemail@substack.com]]></googleplay:email><googleplay:author><![CDATA[Christian Lundgren]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Generate-and-send demos beautifully.]]></title><description><![CDATA[Generate-and-send is one crash from a half-written campaign. Queue Claude's drafts, let a git commit trigger delivery, and make the human gate real.]]></description><link>https://tips.remint.email/p/generate-and-send-demos-beautifully</link><guid isPermaLink="false">https://tips.remint.email/p/generate-and-send-demos-beautifully</guid><dc:creator><![CDATA[Christian Lundgren]]></dc:creator><pubDate>Mon, 13 Jul 2026 12:47:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/51120b14-c4f8-4830-9b2e-0d169a518ea2_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A client brought us in to fix an AI email workflow that had started drifting: the copy was changing tone between runs, small facts were sliding, the usual signs of a prompt nobody was governing. What the audit turned up was worse than the drift. Their pipeline generated the copy and handed it straight to the send API in one uninterrupted step, and a few days before I looked, a Claude session had died mid-run halfway through a re-engagement sequence, leaving three of five emails written and two that didn't exist yet. Under that design the crash wasn't supposed to matter, because by the time generation failed the half-finished work would already be on its way to real subscribers.</p><p>It didn't send that day, and the only reason was luck about where in the run the session happened to die. Leaning on that kind of luck isn't a system at all, just a coin toss nobody has noticed they're flipping. The instinct after a near miss like that is to make generation more reliable: better error handling, a retry, a longer timeout, a validation pass. All of that is the wrong fix. You can't make the model reliable enough to be trusted with the send button, because generation and delivery aren't the same job and they don't fail for the same reasons.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Generation and delivery fail differently</h3><p>Generation fails because a session drops, a token limit cuts the output short, the model returns something malformed, or the draft is simply wrong in a way no schema catches. Delivery fails because an API key expired, a rate limit hit, the list reference went stale, or the send provider had an outage. Those are two different failure surfaces sitting on two different timelines. Generation is messy and slow, and it's supervised by a person who's watching the output appear. Delivery, by contrast, is fast and unattended and completely unforgiving, because on the other side of it are real inboxes and there's no recall.</p><p>When you couple them into one "generate and send" step, every failure in either half becomes a failure that can put bad mail in front of customers. A dropped session ships a half-written campaign, and a malformed or simply wrong draft ships in exactly the state the model left it. There's no point in the run where the work stops, sits still, and waits for a person to say yes. All of the risk comes from treating one brittle job and one irreversible job as a single uninterrupted action.</p><h3>Decouple them with a pending queue</h3><p>The fix is to separate the two into a queue with a human commit standing in the middle. Claude doesn't send anything. It writes a structured JSON brief to a <code>pending/</code> directory and stops there. That file is a proposal, not a send. It sits in the queue until a person looks at it, and nothing downstream knows or cares whether the session that produced it is still alive.</p><p>The release decision is a git commit. A human reviews the file in <code>pending/</code>, and committing it is the APPLY signal, the exact same gate as typing APPLY to a governed prompt, except here it's version control doing the gating. The push triggers a CI workflow. CI reads the committed file, calls the send API, and on success moves the file from <code>pending/</code> to <code>sent/</code>. Nothing reaches a subscriber until a person has committed the file that describes the send.</p><p>Here is the brief Claude writes to the queue. It's plain data, the full description of one send, with nothing executable in it.</p><pre><code>{
  "to": "list@client.com",
  "from": "Brand &lt;sends@client.com&gt;",
  "subject": "Morning brief, 27 May",
  "text": "Full email body here...",
  "digest_type": "daily-news"
}</code></pre><p>That structure is the entire interface between the two halves. Generation's only job is to produce a valid file like this and drop it in <code>pending/</code>. Delivery's only job is to read a committed file and call the API. Neither half knows or cares about the other's failures. Claude dying mid-session never kills a queued send, because the queue holds files, not live processes. The send API failing never forces a regeneration, because the brief is already written and committed and can simply be retried against the same file.</p><h3>What the CI step actually does</h3><p>The delivery half is deliberately small, because small is what makes it trustworthy. On every push, the workflow globs the <code>pending/</code> directory for JSON files that were part of the commit, and for each one it does four things and nothing else: validate the file against the schema, call the send API with the exact payload in the file, check the response, and on a success code move the file to <code>sent/</code> with the commit already attached to its history. On a non-success code it leaves the file in <code>pending/</code> and fails the run loudly, so the send is retried on the next commit rather than silently lost.</p><p>The thing worth noticing is what's missing from that list. The CI step doesn't write copy, doesn't decide what goes out, and doesn't improvise if the file looks odd. It's a dumb, auditable executor of a decision a human already made by committing, and that's the point. You want the irreversible half of the pipeline to be the boring half, the one with no judgment in it, because judgment is exactly where things go wrong when nobody is watching.</p><h3>The directories are the audit log</h3><p>Because every send is a committed file that moves from one directory to another, the send history writes itself. A file in <code>pending/</code> is a proposed send nobody has approved yet. Move it to <code>sent/</code> and it becomes a send that happened, with a commit timestamp and an author attached to it. You don't build a separate logging system, because the queue is the log. You can read exactly what went out, when, who committed it, and what was sitting unapproved at any point, by reading the git history of two folders.</p><p>A bad draft has a safe failure mode under this design. It sits in <code>pending/</code> until someone corrects it or deletes it. It can't leak out, because the only path to the send API runs through a commit, and nobody commits a draft they haven't read. The human gate stops being a polite intention you hope the operator remembers and becomes a structural fact of the pipeline. A pending file with no commit can't send. There's no override that skips the gate, because the gate is the mechanism, not a checkbox layered on top of it.</p><h3>Where this is worth it, and where it is not</h3><p>I want to be honest about the cost, because the pattern isn't free. You're trading immediacy for safety. A send that could have gone out the second the copy was written now waits for a person to review and commit, and that person has to be comfortable with git and with reading a CI log when a run fails. For a solo sender firing off one newsletter to their own list, that overhead isn't worth it, and I wouldn't set it up. The coin toss is fine when you're the only one who gets hurt by a bad flip.</p><p>The pattern earns its keep the moment an autonomous step can reach someone else's customers without a human in the loop: a client list, a scheduled digest, anything generated on a cron while nobody is watching the output appear. That's exactly where generate-and-send is most tempting, because it looks the most hands-off, and it's exactly where a half-written campaign is most expensive. Match the ceremony to the blast radius.</p><h3>Email earns this, but it ports</h3><p>Email is where this lesson is cheap to learn and expensive to ignore, because a bad send is public and permanent. There's no recall on a broadcast. The half-written sequence that almost shipped would have landed in thousands of inboxes with no way to pull it back, and the client would have paid for that in front of their own list, not in a log file nobody reads. But the pattern isn't really about email. Any autonomous AI action with a real-world consequence has the same shape of risk: a brittle generation step wired directly to an irreversible action. An agent that posts, pays, provisions, or messages a customer needs the same answer. Put a queue between the two, make the approval a committed artifact, and let the act of committing be the only path to execution. The medium changes from one workflow to the next, but the underlying structure carries over unchanged.</p><h3>The uncomfortable part</h3><p>Generate-and-send demos beautifully. In a recorded walkthrough it looks like the future: a prompt, a pause, an email in the inbox, no hands. That demo is exactly why the pattern is dangerous, because the thing that makes it impressive on stage is the thing that makes it untrustworthy in production. It removes the human from the most expensive decision in the workflow and calls that progress. The contrarian position is that only the async version, the one with a git commit standing between generation and delivery, is safe to point at a real client list. Treating the commit as the release decision feels slower and less magical than the demo. It's also the difference between a workflow you can safely hand back to a client and one that's one crashed session away from sending a campaign that was never finished.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your emails are about you.]]></title><description><![CDATA[Opening with "We're excited to announce" writes from the brand's side, not the reader's. Count your we-versus-you ratio and rewrite the first line.]]></description><link>https://tips.remint.email/p/your-emails-are-about-you</link><guid isPermaLink="false">https://tips.remint.email/p/your-emails-are-about-you</guid><pubDate>Tue, 07 Jul 2026 13:54:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f249f94e-8580-441e-b5cf-31b78e042509_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A SaaS client sent me a launch email to look over before it went out. The product was genuinely good, the design was clean, and the offer was fair. Then I read the first sentence: "We're thrilled to announce the biggest update in our company's history." I read it back to them as the subscriber would hear it, which is roughly: a company I half-remember is excited about a thing that has nothing to do with me. Everything under that line was written to sell the update. The line itself was written to celebrate it. Those are not the same job, and the reader meets the celebration first.</p><p>That opener is the single most consistent pattern I find in email copy that underperforms, and I have been auditing programs for fifteen years across DTC and SaaS. It is not weak subject lines and it is not bad buttons, though those exist too. It is the first sentence inside the email quietly announcing that the email is about the brand. Once you start looking for it, you cannot stop seeing it, because it is almost everywhere.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Open your last ten and read the first line</h3><p>Open your last ten promotional sends and ignore the subject line for now. Read only the first sentence inside each email, the one the subscriber hits after they have already decided to open. Count how many begin with "We," "Our," or "I."</p><p>"We're excited to introduce." "Our new collection just dropped." "I wanted to tell you about something we've been working on." Each of those is written from inside the building, looking out. The brand cares about its launch, its collection, its months of work, and every one of those sentences is true and heartfelt and completely uninteresting to the person reading it. The subscriber is not standing inside the building. They are outside it, holding a phone, deciding in about one second whether this email earns the next ten.</p><h3>Why the brand-first opener loses the click</h3><p>The first sentence of an email has exactly one job: give the reader a reason to keep reading. That is the whole assignment. It does not have to sell, it does not have to be clever, it just has to make the next line feel worth it. A brand-first opener fails that single job because it answers a question nobody asked. The subscriber opened to find out what is in this for them, and the first thing you handed them was a note about how you feel.</p><p>The honest internal response to "We're thrilled to announce" is "so what." Not hostility, just indifference, which is worse, because indifference closes the tab without a second thought. The reader is reading from the outside in: does this touch a problem I have, a thing I want, a situation I recognize? The brand wrote from the inside out: here is what we have, here is what we are proud of. When those two directions collide in the opening line, the inside-out version loses, and it loses at the exact moment you had the most attention you were ever going to get.</p><p>None of this is a perception trick you can fix with a warmer tone. It is a perspective problem, and perspective is decided by where the sentence starts. "We launched a new product today" points at the sender. "If your mornings disappear before you have done anything that matters, this is for you" points at the reader. Same product underneath, same offer three lines down, different opening frame, and a measurably different click rate on the campaigns where I have watched teams make only that change.</p><h3>The frame shift, in practice</h3><p>The fix is to stop writing from the brand outward and start writing from the subscriber inward. Concretely, the first sentence names one of three things: a problem the reader has, a desire the reader feels, or a situation the reader will recognize as theirs, rather than your launch or your announcement or your own excitement about any of it.</p><p>Three before-and-afters make the shift obvious. "We've expanded our size range" becomes "The size you gave up looking for is back." "Our summer sale starts today" becomes "The jacket you left in your cart is thirty percent off until Sunday." "I'm excited to share our new guide" becomes "You do not have to guess at this part anymore; here is the guide." In every pair the product and the offer are identical. The only thing that moved is whose side of the glass the sentence is written from.</p><p>You do not have to bury the product to do this, and you should not. The move is sequence, not omission: lead with the reader's problem or want, then introduce your thing as the answer to it. The brand still gets its launch. It just stops making the launch the reader's problem to care about before they have been given a reason to.</p><h3>The we-versus-you ratio</h3><p>If you want a number to hold onto, count the ratio. In the first three sentences of your last promotional send, tally "we," "our," and "I" against "you" and "your." If the brand words win, the email is written from the wrong side, and the opener is almost certainly where it went wrong.</p><p>Two honest caveats keep this from turning into a gimmick. First, the ratio only matters at the top. Product copy further down will use "we" and "our" constantly, because at some point you do have to describe the thing you make, and that is fine. It is the opening frame that sets the reader's expectation for whose email this is. Second, "you" can be overdone. Copy that is wall-to-wall "you" starts to read like a pushy salesperson leaning across a table, and readers feel the manipulation. The goal is not to purge every "we." It is to make sure the reader meets themselves in the first sentence before they meet you.</p><p>There are also emails where the brand-first opener is correct, and it is worth naming them so you do not over-apply the rule. A founder telling a genuine story, a small company sharing news the audience actually opted in to follow, a transactional confirmation: those can open with "we" because the reader signed up for exactly that relationship. The rule is about promotional email, where you are asking a half-interested subscriber to spend attention they have not yet agreed to spend.</p><h3>What changes when the reader comes first</h3><p>When the opener leads with the subscriber, the whole email reads as though it was written for the person holding the phone, because it was. The reader gets a half-second of recognition, "this might be about me," and that recognition is what buys the second sentence, which buys the third, which is how anyone ever reaches your offer at all. Nothing about the product changed. You did not touch the design, the discount, or the send time. You rewrote one sentence so it starts on the reader's side of the glass, and that is usually the cheapest lift in the entire email. The brand will always care most about its own launch while the subscriber only cares what the launch does for them, so the opening line has to be written for the person actually holding the phone rather than the one who hit send.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your button copy is a placeholder.]]></title><description><![CDATA[The button is the last line a subscriber reads before they click, and many teams leave it on the ESP default. Name the reward, not the action, and write three versions before you pick one.]]></description><link>https://tips.remint.email/p/your-button-copy-is-a-placeholder</link><guid isPermaLink="false">https://tips.remint.email/p/your-button-copy-is-a-placeholder</guid><dc:creator><![CDATA[Christian Lundgren]]></dc:creator><pubDate>Mon, 06 Jul 2026 16:37:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a49b3e45-2904-4df6-a632-f261b2be1d86_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A client sent me a promo to look over before it went out, and the whole thing was good. The subject line had a hook, the header image was clean, the offer was clear by the second paragraph. Then my eye landed on the button, the one blue rectangle the entire email was built to get them to press, and it said "Shop now." Everything above it had been written, but that one line had been left on default. It was the last thing the reader would see before deciding whether to act, and it was the one piece of copy nobody in the room had actually written.</p><p>What made it worse was who the email was for. This was a sports brand built for people who live outside, the runners and hikers and trail runners who are out on the path before the rest of us are awake. The copy up top knew exactly who it was talking to. It had the language of the trail, the feel of cold morning air and loose gravel, the small details that tell a reader you understand their sport. Every line above the button was doing the work of matching that identity. Then the button said "Shop now," the same two words a phone case store or a mattress company would use, and the voice they had spent the whole email building just collapsed at the one moment it mattered most. They took a reader who was out on the trail in their head and dropped them into a generic checkout. The button didn't just fail to sell, it broke the experience the rest of the email had earned.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>That's the pattern I see more than any other in copy reviews. Teams pour hours into the subject line and the body, then hand the most decisive two words in the email to whatever the ESP dropped in the button by default. "Shop now." "Learn more." "Get offer." These aren't copy, they're placeholders that survived to send. And the button is the worst possible place to stop writing, because it's the final line a subscriber reads before they either click or close the tab.</p><h3>Why "Shop now" survives every review</h3><p>Button copy gets neglected for a simple reason: it reads as fine. Nothing about "Shop now" is wrong, exactly, so it never trips a flag in the review. The subject line gets three rounds of edits because a weak subject visibly fails. The button gets none, because a generic button doesn't look like a mistake, it looks like a button. So it sails through, send after send, and the one line closest to the conversion is the one line nobody argues about.</p><p>The deeper issue is what the default copy actually describes. "Shop now" tells the reader what to do. It's an instruction, a description of the physical action their finger is about to take. But nobody clicks because they want to perform the act of shopping. They click because they want the thing on the other side. When your button describes the action instead of the reward, you're asking for the click without giving a reason for it, and you're doing that at the exact moment the reader is deciding.</p><h3>Write the reward, not the click</h3><p>The fix is to make the button finish the reader's own sentence. They're sitting there with a half-formed thought, "I want to...", and your job is to complete it with what they get, not what they do. "Find your fit" beats "Shop now" because it names the outcome the reader came for. "Claim your discount" beats "Get offer" because it hands them something rather than pointing at a feature. "Start my plan" beats "Sign up" because one is a result and the other is paperwork. Same click, same destination, but the copy now carries a reason instead of a command.</p><p>The practical habit that makes this automatic: write three versions of every button before you pick one. The first is almost always the placeholder your brain reaches for out of habit. The second is a light rewrite of the first. The third is usually the one that actually names the reward, because by then you've exhausted the lazy options and you're forced to say what the reader genuinely walks away with. It takes an extra minute per email. On the last line the reader sees before they decide, that's the cheapest minute in the whole build.</p><p>Two things to watch while you do it. Keep the button honest, so the copy has to match what's on the other side of the click, or you buy a click now and lose trust on the landing page. And keep it short, because a button that wraps to two lines on a phone stops reading as a button, so the reward has to land in a few words or it isn't button copy at all.</p><h3>How to make the button unique without making it vague</h3><p>Once the button names the reward, the next move is to write it in the voice the rest of the email is already speaking, which is exactly where the outdoor brand from earlier had the most to gain. A button doesn't have to settle for "Shop now" or even "Find your fit," it can borrow a verb the sport already owns: gear up for the trail, break them in, log the first mile. The verb matches how the reader thinks about the activity, so the click reads as the next step in something they already do rather than an ad interrupting it. There's one rule that keeps this from going off the rails, and it's the whole discipline: the reader still has to know it leads to product. Clever is fine right up until the reader can't tell what the button does.</p><p>First-person copy is worth a word here because it gets oversold. You'll see a widely repeated claim that switching a button from "your" to "my" lifts conversion by around ninety percent, but that figure traces back to a single landing-page test on one product years ago, so treat it as a story and not a rule you can bank on. The mechanism under it is real, because "Start my plan" lets the reader rehearse owning the thing while "Start your plan" sounds like you instructing them. Use it where the reader is genuinely claiming something for themselves, a fit, a spot, a plan, and resist pasting "my" onto every button, because the moment it's everywhere it starts to read like a trick.</p><p>It also helps to match the verb to how ready the reader actually is. On a cold send to people who barely know you, a hard "Buy now" asks for a commitment they haven't agreed to yet, so a lower-stakes verb like "See the fit" or "Take a look" tends to move more of them. You save the direct purchase verbs for the warm moment, the cart reminder or the back-in-stock note, where the reader is already most of the way to yes and a soft verb would just get in the way.</p><p>The most underused move isn't on the button at all, it's the line directly beneath it. The button carries the action, and one short honest line under it can clear the objection that was about to stop the click: free returns, ships today, no account needed, two-minute read. It's the cheapest reassurance you have available, and almost nobody writes it.</p><p>One discipline holds all of this together, and it's the part most copywriters skip: the button has to make sense on its own. A subscriber using a screen reader often moves through an email as a bare list of its buttons, stripped of the copy around them, so a send with "Learn more" sitting on it five times is genuinely unusable, while "Gear up for the trail" tells them exactly where each one goes. Writing the outcome into the button isn't only a conversion move, it's the difference between an email that works for everyone and one that quietly doesn't.</p><h3>What changes when the button earns the click</h3><p>When the button names the reward, the reader reaches it already knowing what they're getting, and that continuity is what lifts the click. There's no small gap between "Shop now" and the reason they were interested, no half-second where the offer and the action don't quite line up. The button becomes the last, clearest statement of the value instead of a neutral request to proceed. In the audits where a brand goes back and rewrites their default buttons across a flow, the click rate moves, and it moves without touching the subject line, the design, or the offer. You changed two words at the point of decision, which is the one place two words are worth the most.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Preview text is your second subject line.]]></title><description><![CDATA[Preview text is the inbox second line, and many senders waste it by repeating the subject. Continue it instead, add one new fact, and stop stray copy leaking in.]]></description><link>https://tips.remint.email/p/preview-text-is-your-second-subject</link><guid isPermaLink="false">https://tips.remint.email/p/preview-text-is-your-second-subject</guid><dc:creator><![CDATA[Christian Lundgren]]></dc:creator><pubDate>Thu, 02 Jul 2026 11:44:39 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/298d001f-61ad-4af7-87cf-730acb640559_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A client sent me their campaign the morning it went out, proud of the subject line. It read "Your June restock is live." Good enough. Then I opened the inbox preview on my phone and saw the line underneath it: "Your June restock is live." Word for word. The subject, then the subject again, taking up the most valuable second line the inbox gives you and saying nothing new. The open rate came in flat, a little under their usual, and we both knew the headline did all the work alone while the line beside it just sat there repeating itself like an echo.</p><p>That line has a name. It's the preview text, sometimes called the preheader: the snippet the inbox shows next to or beneath the subject before anyone opens. Gmail, Apple Mail, and Outlook all pull it into the list view. It's the second thing a reader sees, every time, in every client. And in my audits I often find it doing one of two useless things: repeating the subject, or auto-filling with whatever copy happens to sit first in the email body. Both are non-decisions, and each one wastes a slot you get for free.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Where the bad preview text comes from</h3><p>If you don't set preview text, the inbox doesn't leave it blank. It grabs the first readable text in your HTML and shows that instead, and usually that's a "View in browser" link, an address block, or the opening line of a header that was never written to be read in a list view. So the reader sees "Trouble viewing this email? Click here" sitting under your subject line, and that's the first impression your campaign makes. The fix people reach for is to repeat the subject in the preheader so at least it isn't garbage, but that just trades garbage for redundancy. You still spent the slot saying one thing twice.</p><h3>Treat it as a second subject line</h3><p>The better frame is the one in the title: preview text is a second subject line, and the two should never say the same thing. The subject carries the hook, and the preview text continues it. They're a setup and a follow, not a statement and its echo.</p><p>The simplest rule that works: the preview text has to add one new piece of information the subject doesn't contain. A name, a number, a deadline, a benefit, an objection answered. If your subject is "Your June restock is live," the preview can be "Three pieces from the waitlist sold out in April. They're back." Now the two lines do two jobs, the subject pulls the eye and the preview gives a reason to act. The reader learns more in the list view than they did before, which is the entire point of the line existing.</p><p>A few specifics from doing this across a lot of campaigns:</p><ul><li><p><strong>Continue, don't summarize.</strong> The preview isn't a recap of the email, it's the next sentence after the subject. Write them together, out loud, as one thought broken across two lines.</p></li><li><p><strong>Front-load the new information.</strong> Inboxes truncate the preview, and the cutoff length varies by client and device, so anything you care about has to land in the first stretch. Put the new fact at the start, not after a wind-up.</p></li><li><p><strong>Keep it tight.</strong> There's no single safe length across clients, so write the line to read complete in roughly the first sentence and treat anything past that as a bonus.</p></li><li><p><strong>Don't stuff keywords.</strong> A preview crammed with the same three offer words reads like spam to a human and adds nothing the subject didn't already say.</p></li></ul><h3>Hide the rest so it does not leak in</h3><p>There's one technical step that separates a controlled preview from a sloppy one. Even when you write a deliberate preview line, stray body copy can leak in after it. The inbox shows your preheader, runs out of your words, and then keeps pulling from the next readable text in the HTML, so the reader sees your clean line followed by a fragment of a headline or a button label.</p><p>The way to stop it is a hidden preheader: a div at the very top of the body that holds your preview text and is styled so a human opening the email never sees it, while the inbox still reads it for the list view. You set it to display none, then follow it with a run of space characters like <code>&amp;#8199;&amp;#65279;&amp;#847;</code>. That filler eats the remaining preview window, so the inbox runs out of room on your invisible spacer instead of grabbing your "View in browser" link, and the line you wrote is the only thing it shows. It's a small block of markup you write once and reuse on every template, and it's the difference between a preview you control and one the client assembles for you.</p><p>The whole thing costs you one sentence and a few lines of HTML. For that you get a second subject line on every send, working alongside the first instead of repeating it. The client whose restock email echoed itself writes the two lines together now, and the second line earns its place in the inbox the same way the first one does.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Claude learned your bad habits from your last brief.]]></title><description><![CDATA[Claude learns your bad habits from your last brief. Brief it on what not to write before you start and banned patterns stop shipping.]]></description><link>https://tips.remint.email/p/claude-learned-your-bad-habits-from-07c</link><guid isPermaLink="false">https://tips.remint.email/p/claude-learned-your-bad-habits-from-07c</guid><pubDate>Wed, 01 Jul 2026 11:35:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e830adc8-f2a5-4acf-be99-71c4a3459316_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Claude opened a client draft with a banned question lead I had killed twice that month, which wasn't a new mistake: the exact opener I had struck from the last two briefs, regenerated like it had never been flagged, with the same buried benefit and the structure the client pushed back on last quarter. Claude didn't invent those patterns; the brief taught them.</p><h3>Why Claude repeats the same mistakes</h3><p>Claude doesn't know what the last writer got wrong. You do. When you hand the model a brief with no constraints, it draws from every pattern it has seen: question openers, feature-led structures, soft value props buried three sentences in. Those patterns exist because they're common, and common isn't the same as good.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In email production, the failure mode is rarely a terrible first draft. It's a draft that repeats the exact pattern the client pushed back on last quarter: the same opener style and vague benefit statement, the same "we're excited to share" energy that signals filler. Claude will reproduce any pattern it can infer from the brief, and if the brief doesn't block those patterns, the model will find them.</p><h3>Where the anti-pattern block sits</h3><p>The block is the first of four mechanisms in the Remint Prompt Pattern we apply to every published prompt: <strong>prerequisites</strong> (this block), <strong>self-validation</strong> (the model checks its own output against the constraints), <strong>human gate</strong> (you approve before anything ships), and <strong>improvement proposal</strong> (the prompt surfaces recurring violations without rewriting its own rules).</p><p>The anti-pattern block lives in the prerequisites layer, where it declares what the model can't do before the brief tells it what to do. Self-validation then enforces those constraints on the output, the human gate sits between draft and send, and the improvement proposal grows the block over time, but only the operator commits the changes.</p><h3>The full wrapper</h3><p>Here is the structure applied to a single client work, where every section is load-bearing and the bracketed fields are the only places you fill in.</p><pre><code>## Prerequisites (required before running)

- An anti-pattern block tuned to this client
- VOICE.md for this client
- A brief with all six fields below filled in

If any prerequisite is missing, do not proceed. Respond:
"Cannot run. Missing: [list]. Provide and re-run."

## Anti-pattern block

Do not:
- [opener move that is out for this client]
- [phrases banned, listed verbatim]
- [structure that has failed for this audience]
- [tone described with an off-brand example]
- [recent revision pattern logged from the last cycle]

## Brief

Email type: [flow position, e.g. third send in a 3-part sequence]
Audience: [profile, last interaction, likely objection]
Offer: [the offer, unchanged across segments]
Goal: [the action the email is asking for]
Tone: [voice register coordinates]
Length: [hard limit on body copy]

## Output format

Subject: [subject line]
Preview: [preview text, max 90 characters]
Body: [email body, no greeting, no sign-off, plain copy only]

## Self-validation (run before returning output)

Before returning, check the draft against the anti-pattern block:

1. No banned phrase appears in subject, preview, or body
2. Opener does not match any banned pattern
3. Structure does not match any banned structure
4. Tone matches VOICE.md, not the off-brand example
5. Body word count is at or below the Length value specified in Brief

If any check fails, fix internally and re-check. If you cannot satisfy a
check after one attempt, return:
"Validation failed: [rule]. Cannot produce compliant copy."

## Human gate (before anything is queued)

After returning the draft, state:
"Review the draft above. Type APPLY to queue this for send, or REJECT with
the specific revision needed."

Do not move the draft to the send queue until APPLY is received.

## Improvement proposal (optional)

If during this run a pattern in the brief made you reach for a banned move,
append at the end of your output:

"PROPOSED RULE ADDITION (review before adding to the anti-pattern block):
[one line describing the move you almost made and why it's worth banning]"

Do not edit the anti-pattern block yourself. Only propose.</code></pre><h3>How to build your client block</h3><p>The most useful version is client-specific, not generic. Start with the actual revisions from the last engagement. If the client pushed back on question openers three times in a row, that goes in the block as a verbatim ban. If they flagged "synergy" once, it goes in the block. If they rejected a feature-led structure on the last campaign, that pattern goes in the block with a note on what they prefer instead.</p><p>Keep the block in a template file named for the client and update it every time a revision reveals a pattern the model keeps repeating. Over time it becomes a fast-loading document of everything you know about what doesn't work for that audience, and the block gets sharper with each production cycle. New team members inherit all of it immediately.</p><p>The version that holds up over time is specific about the prohibition, not vague. "No clich&#233;s" isn't actionable, but "Do not open with a question" is. "Avoid jargon" isn't actionable either, but "Do not use the words synergy, leverage, or drive results" is. The more specific the constraint, the less the model has to interpret it.</p><h3>When the block is working</h3><p>When the block is working, first drafts come back structurally correct. The opener is not a question, the first sentence leads with a benefit, and the tone is calibrated to the client before any revision happens. The feedback loop between what the client wants and what the model generates gets shorter with each new version of the block.</p><p>In my audits I often find that teams using Claude for email copy are spending revision rounds fixing patterns the model defaulted to, which means the anti-pattern block closes much of that gap before the first pass. You spend the revision time on the actual copy, not on undoing defaults.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Clever prompts drift where governed ones hold.]]></title><description><![CDATA[Clever prompts drift at volume. Governed prompts have four mechanisms that make them accountable before a human ever reads the output.]]></description><link>https://tips.remint.email/p/clever-prompts-drift-where-governed</link><guid isPermaLink="false">https://tips.remint.email/p/clever-prompts-drift-where-governed</guid><dc:creator><![CDATA[Christian Lundgren]]></dc:creator><pubDate>Tue, 30 Jun 2026 09:47:58 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/50ef4d42-8005-4d7c-81ae-bbfebe7e5fe4_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The first prompt pack we ran in production shipped a banned phrase into a client subject line on day one, and the prompt read well enough that we didn't catch it before shipping. We ran the same prompt across thirty emails in a week and it drifted: a banned phrase slipped through on email nineteen, a draft quietly changed the offer, and a "pass" came back with nothing actually checked, because the prompt had no obligation to check.</p><p>The instinct is to write a better instruction: more detail, more emphasis, a few more "make sure you" lines. That's the wrong fix, because the problem isn't that the instruction is unclear; it's that nothing forces the prompt to follow it. At volume, a prompt with no governance behaves like a junior writer with no review process: fine on a good day, unpredictable on a deadline.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Why a clever prompt drifts at volume</h3><p>A bare prompt is a suggestion. The model reads it, weighs it against everything else in the context window, and produces something plausible. On a single run that's usually close enough that you don't notice the gaps. The drift is invisible until you scale.</p><p>Run the same prompt fifty times and the gaps compound. When a required input is missing, the model guesses rather than stopping, so a bad draft ships instead of an error. When the output violates your rules, there's nothing that catches it before you see it. And because there's no human gate, the approval that should have been yours gets made silently by the model. None of these are failures of cleverness but of structure.</p><p>The teams I work with who run AI in production don't write smarter prompts; they wrap ordinary prompts in a structure that makes the prompt accountable for its own output before a human ever reads it.</p><h3>The four mechanisms that make a prompt govern itself</h3><p>A governed prompt has four parts layered on top of the instruction. Each one closes a specific drift failure.</p><ul><li><p><strong>Prerequisites, fail-closed.</strong> The prompt declares what it needs and refuses to run without it, so there's no silent guessing. If the input is missing, it stops and tells you what to provide.</p></li><li><p><strong>Self-validation, self-healing.</strong> Before returning anything, the prompt checks its own output against named rules. A failed check gets fixed once internally, or the prompt returns a "validation failed" line instead of a bad draft.</p></li><li><p><strong>Human gate.</strong> The prompt stops and waits for your APPLY or REJECT. It never writes a file, queues a send, or commits a change on its own. The decision stays with you, at the most expensive point in the workflow.</p></li><li><p><strong>Improvement proposal.</strong> When the prompt notices a recurring pattern, it proposes a one-line rule for you to add by hand. It never edits its own rules, so you stay in control of what the system learns.</p></li></ul><p>These four aren't specific to email; they're how you make any AI step safe to repeat. But email is where the cost of drift shows up fast, because a bad send is public and permanent.</p><h3>A governed prompt you can run today</h3><p>Here is one of the seven prompts from the pack, the pre-send QA check, written with all four mechanisms in place. Paste it into Claude, add your email HTML where the prompt asks, and run it. It refuses to proceed without the HTML, checks six categories, cites evidence for every flag, and stops for your decision instead of marking the send ready itself.</p><pre><code>## Prerequisites (required before running)

- Email HTML source (exported from your ESP, not a screenshot)
- Target ESP name (Klaviyo, HubSpot, Mailchimp, custom)

If either is missing, do not proceed. Respond:
"Cannot run. Missing: [list]. Provide and re-run."

## Inputs

Target ESP: [ESP NAME]
Email HTML: [PASTE FULL HTML INCLUDING HEAD AND FOOTER]

## Task

Run a pre-send QA across six categories. Return PASS or FAIL for each.
For every FAIL, cite the specific instance with a line number or quote.

1. Personalization: merge tags have fallbacks, no unclosed variables
2. CTA: one primary action, button names the action not the outcome
3. Legal: real unsubscribe URL present, physical address in footer
4. Mobile: no element wider than 600px, no body font under 14px
5. Dark mode: no hard-coded hex on text without a prefers-color-scheme override
6. Preview text: present, under 100 characters, not a repeat of the subject

## Self-validation (run before returning output)

- Every category returns PASS or FAIL
- Every FAIL cites a line number or verbatim quote
- No category marked PASS unless every check in it ran
- No suggestion outside the six categories above

If a check fails, fix once internally. If you cannot, return:
"Validation failed: [rule]. Cannot produce a compliant report."

## Human gate

After returning the findings, state:
"Type APPLY to block this send and queue the flagged fixes, or
OVERRIDE [category] with a documented exception note."

Do not modify the HTML. Do not mark the send as ready.

## Improvement proposal

If a recurring failure appears that is not in the six categories, append:
"PROPOSED RULE ADDITION: [one line]"
Do not modify this prompt.</code></pre><p>Run it on the raw HTML, not a screenshot, and paste the full markup including the head and footer. The legal items and preview text live in those sections, and they get stripped if you only copy the visible body.</p><h3>What changes when the prompt polices itself</h3><p>The output stops being a confident summary and starts being a work order. Instead of "looks good," you get "Line 47: <code>{{first_name}}</code> has no fallback." Instead of an approval the model made for you, you get a decision the model hands back. The same prompt produces the same discipline on email one and email fifty, which is the entire point of running AI in production rather than as a party trick.</p><p>This is the foundation under the rest of the system. Once a prompt governs itself, you can wire it into a pipeline, version it, and trust it to run without you watching every output. The full set, seven governed prompts for writing, auditing, and shipping email, is in the Email Production Prompt Pack. The ones worth keeping will show you which parts of your workflow you've been managing by hand.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your AI is confidently wrong.]]></title><description><![CDATA[Claude wrote a false GIF rendering claim that passed human review. A claims registry wired into two pipeline gates catches what the human skim misses.]]></description><link>https://tips.remint.email/p/your-ai-is-confidently-wrong</link><guid isPermaLink="false">https://tips.remint.email/p/your-ai-is-confidently-wrong</guid><pubDate>Mon, 29 Jun 2026 12:06:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2465443a-7d46-4900-9dd8-16b05f8fa010_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Claude wrote "Outlook only renders the first GIF frame" into a client's email copy, and it read like a sensible technical caveat, the kind a careful developer would add, except it's also false: modern Outlook plays GIFs. The line was lifted from a stale doc that stopped being true years ago, and it sat in an approved draft that was one click from going out to the client's full list. Nobody flagged it, because nothing about it looked wrong.</p><p>The failure worth understanding is that the model doesn't break loudly, it stays fluent and plausible and just quietly out of date. On a single email you might catch it, but at production volume you won't.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Why volume defeats the human skim</h3><p>Run AI across a real client roster and it generates dozens of factual claims a week: deliverability thresholds, ESP behavior, rendering quirks, benchmark numbers. Most are fine, but a few are stats that were accurate in 2023 and aren't now, hallucinated platform specifics, or numbers pulled from training data that no longer holds. The model has no way to know what your brand has actually verified, it only knows what sounds right, and out-of-date facts sound exactly as right as current ones.</p><p>The real danger is the plausible-but-retired fact, not the hallucination so wrong any reviewer catches it: it reads cleanly, it matches what a lot of people still believe, and it slides past a human skim because skimming is just pattern-matching against what looks reasonable, and a retired fact looks completely reasonable, which is why you can't eyeball your way past it. The reviewer who approved the GIF line wasn't careless; the claim simply passed every test a human applies at reading speed.</p><h3>What a claims registry actually is</h3><p>The fix is to stop relying on the model's memory and the reviewer's recall, and give both a brand-owned source of truth. A claims registry is a single file the AI has to defer to, and it has three sections.</p><p><strong>Verified facts:</strong> claims confirmed against a named source, with the year and the reference attached, so a fact is never just asserted. <strong>Forbidden claims:</strong> statements that are verified false or brand-prohibited, each with an explicit reason, so the same retired fact can't creep back in next quarter. <strong>Pending verification:</strong> claims that showed up in generated output but haven't been confirmed yet, parked until someone checks them instead of shipped on optimism.</p><pre><code>## Verified facts
- SPF authentication reduces domain spoofing risk
  Source: Cloudflare documentation 2025

## Forbidden claims
- "Outlook only renders the first GIF frame"
  Reason: false, modern Outlook plays GIFs
- "42x email ROI" without a 2025+ citation
  Reason: unverifiable as stated

## Pending verification
- "Gmail clips HTML past 102KB"
  Status: context-dependent, needs scoping</code></pre><p>The two entries under forbidden claims aren't facts I'm asserting. They're labeled examples of exactly what the registry exists to block: the GIF line, false; the recycled ROI figure, unverifiable as written. The registry's whole job is to keep those out of generated copy, by name.</p><h3>Two gates, fail-closed at both ends</h3><p>A registry sitting in a folder changes nothing on its own; it earns its place by wiring into two points of the pipeline. Pre-generation, the registry is injected at the prerequisites layer of the prompt, so the model draws from the verified list and refuses to make claims outside it. The prompt won't run a factual brief without the registry present. That's the first fail-closed gate: no source of truth, no generation.</p><p>Post-generation, a validator hook checks the written file against the forbidden list before it queues for send, so any match blocks the file and logs the violation before the model can mark its own work as clean. That's the second fail-closed gate, and it's the one that would have caught the GIF line: the claim was already written and already approved by a human, and the validator would have stopped it at the queue anyway. Two gates, because one is never enough when the cost of a miss is a send to the whole list.</p><p>This is the registry that gates Remint's own content, a JSON file with named sources and retrieval dates, verified claims with confidence levels and expiry dates, and a list of forbidden-claim patterns a validator runs on every build before anything ships. The "first GIF frame" line is in it, as a forbidden pattern, so the exact mistake that nearly went to a client can't reach this page either.</p><h3>One registry per client</h3><p>For an agency running Claude across multiple accounts, the registry isn't shared. Each client carries their own: their verified facts, their brand-specific prohibitions, their pending list. This is the part generic "fact-check your AI" advice ignores. A single house registry guarantees cross-contamination, where one client's approved claim or banished phrase leaks into another client's copy. Separate files per client make that structurally impossible. Facts and prohibitions stay isolated, because what's true and sayable for one brand isn't automatically true and sayable for the next.</p><p>Email is where this lesson gets learned, because email is unforgiving. ESP rendering facts and deliverability thresholds date fast, and a wrong one ships to the entire list at once with no recall. But the mechanism isn't really about email. Any AI workflow that makes factual claims on behalf of a customer needs a brand-owned source of truth sitting between the model and the output: verified facts in and forbidden claims blocked, with pending claims held until someone confirms them. The model supplies fluency, while the registry supplies the part the model can't have, which is knowing what's actually true for this client, this year.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your welcome flow treats a $40 buyer like a $400 one.]]></title><description><![CDATA[A considered purchase does not convert on a day-one discount. Build a welcome flow with orientation, proof, and objection-handling over weeks, not a commodity 3-email sequence.]]></description><link>https://tips.remint.email/p/your-welcome-flow-treats-a-40-buyer</link><guid isPermaLink="false">https://tips.remint.email/p/your-welcome-flow-treats-a-40-buyer</guid><pubDate>Tue, 16 Jun 2026 14:24:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/862c1306-6895-4633-b656-dbb9c960601b_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Your welcome flow treats a $40 buyer like a $400 one.</h2><p>A few months back I audited the welcome series for a brand selling handmade furniture, average order value north of $800, the kind of purchase a person thinks about for weeks before they commit. The flow was three emails over three days. Email one: brand story and a logo. Email two: ten percent off, sent the next morning. Email three: a last-chance reminder on the discount, the night after that. By the time the offer expired, the buyer had owned the brand's email address for seventy-two hours and had been asked to spend nearly a thousand dollars twice. Nobody buys a sofa on impulse before lunch on a Tuesday. The flow was built for a $40 buyer and pointed at a $400 one, and the open rates told the story: strong on email one, falling off a cliff by email three.</p><p>The owner thought the problem was the discount size, but it wasn't: the entire architecture assumed a decision the buyer had not even started to make.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Consideration time is the variable everyone ignores</h3><p>A commodity welcome flow works because the decision is small. Someone signs up for a $30 candle brand, gets a discount, and either buys this week or doesn't. Compressing that into a few emails over a couple of days is correct, because the deliberation window is genuinely short. There is nothing to think about, so the offer does most of the work.</p><p>High consideration is a different shape entirely. The buyer is not deciding whether to spend $30, they are deciding whether to trust you with a purchase they will live with for years. That decision has stages: do I believe this is well made, does it suit my space, what happens if it arrives damaged, is the price fair for what I get. None of those questions is answered by a coupon. A flow that fires its whole sequence in three days is asking for the sale before the buyer has finished the first stage of thinking. From experience, the deliberation window on a considered purchase runs one to several weeks, and the flow has to live inside that window rather than sprint past it.</p><h3>Fewer emails, each one doing more</h3><p>The instinct when a flow underperforms is to add more emails. For high AOV that is usually the wrong move. You don't want more touches, you want richer ones, spaced to match how the buyer actually moves through the decision.</p><p>Here is the architecture I rebuilt for the furniture brand, and the shape I now reach for on any considered purchase:</p><ul><li><p><strong>Email one, same day: welcome and orientation.</strong> Who you are, what you make, and one honest reason the product costs what it does. No offer. The job here is to set the frame, not to sell.</p></li><li><p><strong>Email two, day two or three: education.</strong> How the thing is made, the materials, the choices that justify the price. This is where you answer the unspoken "is this worth it" before the buyer has to ask. For a high-margin considered product, education is the real sales engine, not the discount.</p></li><li><p><strong>Email three, day five or six: proof.</strong> Real customers, real homes, a review that names a specific worry and resolves it. Social proof carries more weight here than anywhere, because the buyer is looking for permission to trust you.</p></li><li><p><strong>Email four, around day nine: objection handling.</strong> Shipping, returns, warranty, what happens if it doesn't fit the space. The boring logistics that quietly kill high-ticket sales when left unaddressed. Naming the risk out loud is what removes it.</p></li><li><p><strong>Email five, around day twelve to fourteen: the ask.</strong> Now, and only now, you make the offer. And when margin is healthy, the offer often isn't a discount at all. Free delivery, a longer return window, a design consultation. Something that lowers the perceived risk rather than cutting your price on a product whose value you just spent four emails establishing.</p></li></ul><p>That is five emails over two weeks instead of three over three days, and it converts better not because it is longer but because it is sequenced to the decision. Each email clears one stage of doubt before the next one arrives.</p><h3>The offer's job changes when margin is on the line</h3><p>On a commodity product the discount is the offer. On a high-AOV product the discount can actively undercut you. Lead with ten percent off a $40 candle and you nudge a sale. Lead with ten percent off an $800 sofa and you have just told the buyer the price was soft to begin with, which makes them wonder what else is. When margin matters, hold the offer until the end, make it about risk rather than price where you can, and let the education and proof do the persuading. The discount stops being the reason to buy and becomes the small final push for someone you have already convinced.</p><p>The buyer tells you how fast to move by how much they have to think. Match the architecture to the deliberation, not to a template that was built for a cheaper product. A welcome flow is not a fixed object you drop on every store. It is a map of one specific decision, and the more that decision costs, the more room you have to give it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your pre-send checklist has not been opened in months.]]></title><description><![CDATA[A six-category Claude prompt runs pre-send QA on raw email HTML, flagging every failure with a line number or quote, then stops for your decision.]]></description><link>https://tips.remint.email/p/your-pre-send-checklist-has-not-been</link><guid isPermaLink="false">https://tips.remint.email/p/your-pre-send-checklist-has-not-been</guid><pubDate>Mon, 15 Jun 2026 13:09:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/da0de2db-211c-4b9d-aba4-768b9d1358bb_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Your pre-send checklist has not been opened in months.</h2><p>A client send went out with a merge tag that never resolved. Subscribers opened an email addressed to {{first_name}}. The checklist that would have caught it existed. In my experience, it lived in a Notion doc that had not been opened since the last hire. The person responsible knew the items by memory. Or thought they did. Two items got skipped on every send. Neither had caused a visible failure yet. This one finally did.</p><h3>Why Manual Checklists Fail Under Time Pressure</h3><p>Pre-send checklists are one of those things that look like a system but operate more like a habit that erodes under pressure. In my audits I often find that teams have a checklist. It lives in a Notion doc, a shared Google Sheet, or a sticky note in the deployment folder. It was thoughtfully built. The problem is that it requires a person to open it, read it, and actually check each item against the live email at exactly the moment when that person is under the most deadline pressure of the week.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Time pressure compresses judgment. The first few items on any checklist get attention. The middle gets a skim. The bottom gets a mental checkmark without verification. Legal items, always low on the list because they feel routine, often get the least scrutiny. The unsubscribe link is there. The physical address is in the footer. Probably. The checklist was designed for a calm environment and deployed into a chaotic one.</p><p>A team I work with sends three campaigns a week. The manual checklist had not been opened in four months by the time I audited the program. The person responsible knew the items by memory. Or thought they did. The process had quietly collapsed into habit. When I asked them to walk through a recent send using the checklist retroactively, they found two items they had been routinely skipping: preview text character count and merge tag fallback verification. Neither had caused a visible failure yet. Both are the kind of thing that fails slowly and expensively.</p><p>The prompt version removes the habit dependency. You paste the HTML. The prompt fails closed without it. Six categories validated. Every flag cites a line number or verbatim quote. Then the prompt stops at the human gate and waits for your decision.</p><h3>Where the QA Prompt Sits</h3><p>The prompt follows the four-mechanism Remint Prompt Pattern: <strong>prerequisites</strong> (HTML source and target ESP), <strong>self-validation</strong> (every flag cites evidence), <strong>human gate</strong> (operator decides what blocks send), and <strong>improvement proposal</strong> (recurring failures become candidate hooks).</p><p>The mechanism that matters most here is the human gate. The prompt does not auto-fix and does not auto-send. It returns the findings and stops. The operator decides which flags block the send and which can ship with a documented exception. Decision authority stays with the human at the most expensive point in the workflow.</p><h3>The Six-Category QA Prompt, Full Wrapper</h3><p>Paste it into Claude with your email HTML at the bottom. The prompt itself is self-contained. No prior context needed beyond your VOICE.md if you also want voice checks layered in.</p><pre><code>## Prerequisites (required before running)

- Email HTML source (exported from ESP, not a screenshot)
- Target ESP name (Klaviyo, HubSpot, Mailchimp, custom)

If either is missing, do not proceed. Respond:
"Cannot run. Missing: [list]. Provide and re-run."

## Inputs

Target ESP: [ESP NAME]

Email HTML: [PASTE FULL HTML INCLUDING HEAD AND FOOTER BELOW]

## Task

Run a pre-send QA across six categories. For each, return PASS or FAIL.
For every FAIL, cite the specific instance with a line number or verbatim
quote. No summary verdicts. Specific evidence per flag.

Categories:

1. Personalization
   - Merge tags have fallbacks declared
   - No unclosed {{variable}} strings
   - Fallback syntax matches the target ESP's expected pattern

2. CTA
   - One primary action present
   - Button text names the action, not the outcome
   - Links do not chain through more than one redirect domain

3. Legal
   - Unsubscribe link present with a real URL (no placeholders)
   - Physical mailing address present in footer

4. Mobile
   - No element wider than 600px in inline styles or CSS rules
   - No body font smaller than 14px

5. Dark mode
   - No hard-coded hex color on text without a
     @media (prefers-color-scheme: dark) override
   - No transparent background images on hero or content blocks

6. Preview text
   - Present in a hidden preheader element
   - Under 100 characters
   - Does not repeat any word from the subject line

## Self-validation (run before returning output)

Before returning, check:

1. Every category returns PASS or FAIL
2. Every FAIL cites a line number or verbatim quote
3. No category marked PASS unless every check in that category ran
4. No suggestions outside the six categories above

If any check fails, fix internally. If you cannot satisfy a check after one
attempt, return:
"Validation failed: [rule]. Cannot produce compliant QA report."

## Human gate (before any change is applied)

After returning the findings, state:
"Review the QA report above. Type APPLY to block this send and queue the
flagged fixes for revision, or OVERRIDE [category] with a documented
exception note for any category you accept as-is."

Do not modify the HTML. Do not mark the send as ready. The operator
decides what blocks send and what ships with a tracked exception.

## Improvement proposal (optional)

If a recurring failure pattern appears across this run that is not in the
six categories above, append:

"PROPOSED RULE ADDITION (review before adding to a pre-commit hook):
[one line describing the pattern]"

Do not modify the QA prompt itself.</code></pre><p>The output is structured: one section per category, a verdict, and for any failure, the specific instance cited by line or quote. Not a summary. The exact broken merge tag, the exact redirect URL, the exact hex value without a media query override. That specificity is what makes it actionable rather than confirmatory.</p><h3>Running It on the HTML</h3><p>Run it on the HTML, not on a screenshot, not on a rendered preview, not on the text version. The issues this prompt catches are structural issues in the markup. Screenshots do not carry markup. A rendered preview will not show you that <code>{{first_name}}</code> has no fallback attribute. It will show you a name if your preview is populated with a contact record. In production, unpopulated records break.</p><p>Export the HTML from your ESP before the send. In Klaviyo, the "View source" option in the email editor. In Mailchimp, the code view. In any custom deployment, the file you are actually sending. Paste the full markup after the prompt. Do not abbreviate it or paste only the body section. The legal items, preview text, and some mobile constraints live in the head and footer, which get stripped if you only copy the visible content area.</p><p>The prompt does not require the email to be fully built. Running it on a near-complete draft at 80 percent done is useful. Structural issues surface early rather than at the send moment. Many teams find that running it twice produces more value than running it once: once at draft review stage, and once on the final exported HTML immediately before sending.</p><h3>Category Breakdown: What Gets Validated</h3><p><strong>Personalization integrity.</strong> The most common failure here is a merge tag without a fallback. In most ESPs, merge tags accept a default value inside the tag syntax: something like <code>{{first_name | default: "there"}}</code> in Liquid, or a fallback field set in the merge tag configuration. Without a fallback, an unmatched contact record renders the raw tag string in the email. Claude flags any tag structure that lacks a fallback attribute and quotes the instance with its line number.</p><p><strong>CTA structure.</strong> The category checks for a single primary action, not multiple competing calls to action. It also checks button text: the action, not the outcome. "Get your report" passes. "Unlock email growth" fails because it describes an outcome the click cannot verify. It also checks for redirect chains, which matter for deliverability. A link that routes through two or three tracking domains before reaching the destination is a pattern some spam filters treat as evasive.</p><p><strong>Legal.</strong> Unsubscribe link and physical mailing address. Not negotiable under CAN-SPAM and most comparable legislation. The check looks for their presence in the HTML. If the unsubscribe link is there but broken (a placeholder URL, a mailto with no address), it is flagged. The physical address check looks for any block of text structured like a postal address in the footer area.</p><p><strong>Mobile layout.</strong> Two hard constraints: fluid-widths for elements and no body font smaller than 14px. Both are stated in inline styles or CSS rules in the HTML, so the check reads them directly. The 14px minimum is the point below which text becomes impractical to read without zooming on a standard phone screen.</p><p><strong>Dark mode.</strong> The check is for hard-coded hex colors on text elements without a corresponding media query override. When a dark mode client inverts backgrounds, hard-coded light text on a now-dark background disappears. The partial fix is a <code>@media (prefers-color-scheme: dark)</code> override. Partial because some email clients will auto invert anyway, with no way for you to control it. The prompt flags any <code>color: #</code> declaration on a text element that does not have a corresponding dark mode rule. It also flags transparent background images, which invert poorly in forced dark mode rendering.</p><p><strong>Preview text.</strong> Three checks: present, under 100 characters, and not a repeat of the subject line. Preview text that echoes the subject line wastes the second line of visible real estate in the inbox. Under 100 characters is a practical limit based on what mobile clients display before truncating. The check reads the preview text from the hidden preheader element in the HTML and validates all three conditions.</p><h3>What Good Output Looks Like</h3><p>A clean result is six PASS verdicts with a one-line confirmation per category. "Personalization: PASS. All merge tags have fallbacks. No unclosed variable strings." That is the output you want immediately before sending.</p><p>A flagged result is more specific. Personalization: "FAIL. Line 47: <code>{{customer.first_name}}</code> has no fallback value." CTA: "FAIL. Button text reads 'Transform your email results': describes outcome, not action. Link at line 91 routes through two redirect domains before reaching destination." Legal: "FAIL. No physical mailing address found in footer."</p><p>The prompt quotes the specific instance rather than summarizing the category of problem. That instruction matters because a summary lets you assume you know what it means. A quote forces you to go to that exact line and fix that exact thing. The output is designed to be a work order, not a report.</p><p>If the result is a mix of passes and fails, fix the fails and run the prompt again on the updated HTML. Two passes, maybe three on a complex email, is the full workflow. The total time investment is less than a thorough manual review, and the coverage is consistent across every send.</p><h3>Building This Into Team Workflow</h3><p>For teams sending frequently, the prompt replaces the manual checklist as the final gate before deployment. Workflow: export HTML, paste into Claude with the prompt, address flagged items, re-export, run once more, send. The checklist document can be retired or kept as training documentation for new team members to understand what each category covers and why.</p><p>For teams where multiple people touch an email before it sends, the prompt can be run at handoff rather than only at send time. When the designer hands to the developer, run it. When the developer hands to the deployment operator, run it again on the final exported version. Running it at handoff catches structural problems before they compound.</p><p>The improvement-proposal block at the end of the wrapper is where this gets more powerful over time. When a specific failure pattern keeps showing up across QA runs (a particular ESP's merge tag syntax, a recurring dark mode issue from a designer who keeps using the same template), the proposal lines accumulate. The operator commits the recurring ones as pre-commit hooks. The hook catches them before the QA prompt ever runs. The QA prompt then catches whatever the hook missed. Coverage compounds.</p><p>The prompt does not require modification for different email types. It runs the same six categories against a promotional campaign, a transactional email, an onboarding sequence, or a newsletter. Some categories will be more relevant than others depending on the email type, but a universal checklist is more reliable than a type-specific one because it closes the gap where a sender decides a check "probably doesn't apply" to this particular send.</p><h3>Audit Checklist</h3><ul><li><p>Export the raw HTML from your ESP before running the prompt, not a screenshot or text preview</p></li><li><p>Paste the full HTML including the head section, not just the body or visible content area</p></li><li><p>Check that every merge tag in the email has a fallback value set in the HTML syntax</p></li><li><p>Verify the CTA button text names the action, not the outcome</p></li><li><p>Confirm the unsubscribe link uses a real URL, not a placeholder or broken href</p></li><li><p>Confirm a physical mailing address is present in the footer</p></li><li><p>Check that no element inline style or CSS rule sets a width greater than 600px</p></li><li><p>Check that no body copy font-size is set below 14px</p></li><li><p>Verify that any hard-coded hex color on text has a corresponding prefers-color-scheme dark override</p></li><li><p>Confirm preview text is present, distinct from the subject line, and under 100 characters</p></li><li><p>If any category fails, fix the specific flagged instance and re-run the prompt on the updated HTML before sending</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Claude learned your bad habits from your last brief.]]></title><description><![CDATA[An anti-pattern block placed before the brief stops Claude from repeating the openers and phrases your client already rejected, cutting revision rounds.]]></description><link>https://tips.remint.email/p/claude-learned-your-bad-habits-from</link><guid isPermaLink="false">https://tips.remint.email/p/claude-learned-your-bad-habits-from</guid><pubDate>Fri, 12 Jun 2026 12:27:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/36b31db5-8505-42b2-b723-24ed4e7295b3_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Claude learned your bad habits from your last brief.</h2><p>Claude opened a client draft with a banned question lead I had killed twice that month. Not a new mistake. The exact opener I had struck from the last two briefs, regenerated like it had never been flagged. Same opener style. Same buried benefit. Same structure the client pushed back on last quarter. Claude did not invent those patterns. The brief taught them.</p><h3>Why Claude Repeats the Same Mistakes</h3><p>Claude does not know what the last writer got wrong. You do. When you hand the model a brief with no constraints, it draws from every pattern it has seen: question openers, feature-led structures, soft value props buried three sentences in. Those patterns exist because they are common. Common is not the same as good.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In email production, the failure mode is rarely a terrible first draft. It is a draft that repeats the exact pattern the client pushed back on last quarter: the same opener style, the same vague benefit statement, the same "we're excited to share" energy that signals filler. Claude will reproduce any pattern it can infer from the brief. If the brief does not block those patterns, the model will find them.</p><h3>Where the Anti-Pattern Block Sits</h3><p>The block is the first of four mechanisms in the Remint Prompt Pattern we apply to every published prompt: <strong>prerequisites</strong> (this block), <strong>self-validation</strong> (the model checks its own output against the constraints), <strong>human gate</strong> (you approve before anything ships), and <strong>improvement proposal</strong> (the prompt surfaces recurring violations without rewriting its own rules).</p><p>The anti-pattern block lives in the prerequisites layer. It declares what the model cannot do before the brief tells it what to do. Self-validation then enforces the constraints on the output. The human gate sits between draft and send. The improvement proposal grows the block over time, but only the operator commits the changes.</p><h3>The Full Wrapper</h3><p>Here is the structure applied to a single client work. Every section is load-bearing. The bracketed fields are the only places you fill in.</p><pre><code>## Prerequisites (required before running)

- An anti-pattern block tuned to this client
- VOICE.md for this client
- A brief with all six fields below filled in

If any prerequisite is missing, do not proceed. Respond:
"Cannot run. Missing: [list]. Provide and re-run."

## Anti-pattern block

Do not:
- [opener move that is out for this client]
- [phrases banned, listed verbatim]
- [structure that has failed for this audience]
- [tone described with an off-brand example]
- [recent revision pattern logged from the last cycle]

## Brief

Email type: [flow position, e.g. third send in a 3-part sequence]
Audience: [profile, last interaction, likely objection]
Offer: [the offer, unchanged across segments]
Goal: [the action the email is asking for]
Tone: [voice register coordinates]
Length: [hard limit on body copy]

## Output format

Subject: [subject line]
Preview: [preview text, max 90 characters]
Body: [email body, no greeting, no sign-off, plain copy only]

## Self-validation (run before returning output)

Before returning, check the draft against the anti-pattern block:

1. No banned phrase appears in subject, preview, or body
2. Opener does not match any banned pattern
3. Structure does not match any banned structure
4. Tone matches VOICE.md, not the off-brand example
5. Body word count is at or below the Length value specified in Brief

If any check fails, fix internally and re-check. If you cannot satisfy a
check after one attempt, return:
"Validation failed: [rule]. Cannot produce compliant copy."

## Human gate (before anything is queued)

After returning the draft, state:
"Review the draft above. Type APPLY to queue this for send, or REJECT with
the specific revision needed."

Do not move the draft to the send queue until APPLY is received.

## Improvement proposal (optional)

If during this run a pattern in the brief made you reach for a banned move,
append at the end of your output:

"PROPOSED RULE ADDITION (review before adding to the anti-pattern block):
[one line describing the move you almost made and why it's worth banning]"

Do not edit the anti-pattern block yourself. Only propose.</code></pre><h3>How to Build Your Client Block</h3><p>The most useful version is client-specific, not generic. Start with the actual revisions from the last engagement. If the client pushed back on question openers three times in a row, that goes in the block as a verbatim ban. If they flagged "synergy" once, it goes in the block. If they rejected a feature-led structure on the last campaign, that pattern goes in the block with a note on what they prefer instead.</p><p>Keep the block in a template file named for the client. Update it every time a revision reveals a pattern the model keeps repeating. Over time, it becomes a fast-loading document of everything you know about what does not work for that audience. The block grows sharper with each production cycle. New team members inherit all of it immediately.</p><p>A few rules for keeping the block clean. Be specific about the prohibition, not vague. "No clich&#233;s" is not actionable. "Do not open with a question" is. "Avoid jargon" is not actionable. "Do not use the words synergy, leverage, or drive results" is. The more specific the constraint, the less the model has to interpret it.</p><h3>When the Block Is Working</h3><p>When the block is working, first drafts come back structurally correct. The opener is not a question. The first sentence leads with a benefit. The tone is calibrated to the client before any revision happens. The feedback loop between what the client wants and what the model generates gets shorter with each new version of the block.</p><p>In my audits I often find that teams using Claude for email copy are spending revision rounds fixing patterns the model defaulted to. The anti-pattern block closes much of that gap before the first pass. You spend the revision time on the actual copy, not on undoing defaults.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your open rate is lying to you.]]></title><description><![CDATA[Apple Mail Privacy auto-opens inflate open rate by 15 to 35 percent. Stop optimizing the metric that broke and track clicks, revenue per recipient, and engagement instead.]]></description><link>https://tips.remint.email/p/your-open-rate-is-lying-to-you</link><guid isPermaLink="false">https://tips.remint.email/p/your-open-rate-is-lying-to-you</guid><pubDate>Thu, 11 Jun 2026 11:27:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/57659084-1dfb-4791-af3c-ea8d0e0d126a_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Your open rate is lying to you.</h2><p>A client I worked with last year opened our quarterly review thrilled. Their campaign open rate had climbed to about 58%, the best number their account had ever shown. They wanted to know what we had changed so they could do more of it. I had to walk them through the uncomfortable part: we had not changed anything that explained it, and the revenue from those campaigns had stayed flat. The number went up. The money did not follow. In the audit it was obvious why. A large share of those "opens" were machines, not people.</p><p>This is the conversation I have most often now. A founder is reading a metric that used to mean something and no longer does, and they are making decisions on it. Send-time tweaks, subject line tests, list re-engagement, all tuned against a signal that has quietly gone hollow.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Why the open rate stopped meaning what it used to</h3><p>The break is Apple Mail Privacy Protection. When a subscriber on Apple Mail has it on, Apple pre-fetches the email's images through its own servers, in bulk, whether or not the person ever looks at the message. The tracking pixel that records an "open" fires on that pre-fetch. So the open gets logged for a human who may never have seen the subject line.</p><p>This is not a fringe case. Apple Mail accounts for around 49% of email opens (Litmus, January 2025), and roughly 64% of subscribers are on MPP-capable Apple Mail (Litmus 2025). When you stack the auto-opens on top of normal corporate scanners and security bots that also trip the pixel, the inflation is real and measurable: Litmus puts the lift at 15 to 35% depending on the list. In other words, a reported open rate can run a third higher than the human number underneath it.</p><p>The deeper point is what the metric now measures. An open does not tell you a person read your email. It tells you an inbox provider fetched an image. You are measuring infrastructure, not attention. For a list heavy on Apple users, the open rate is closer to a count of how many subscribers use Apple Mail than a count of who cared about your send.</p><h3>What I track instead</h3><p>The fix is not a better pixel. It is to stop treating opens as a primary metric and move to signals a machine cannot fake on a subscriber's behalf. These are the ones I put on the dashboard for every account.</p><ul><li><p><strong>Click-to-delivered.</strong> Clicks require a human hand. Measure unique clicks against emails delivered, not against opens, because the open denominator is the part that is polluted. This becomes your real engagement line. It will look lower than the open rate ever did, and that is the point: it is true.</p></li><li><p><strong>Revenue per recipient.</strong> Total revenue attributed to a send, divided by recipients. This is the number that survives every platform change, because it is tied to money rather than to a tracking method. When the client above saw flat revenue per recipient against a rising open rate, that gap was the whole story.</p></li><li><p><strong>Engaged segments by recency.</strong> Build segments on clicked or purchased in the last 30, 60, and 90 days, not opened. Opened-based segments quietly fill with Apple auto-opens, so your "engaged" audience inflates and your sunset logic stops working. Click and purchase recency keeps the segment honest, which protects your sender reputation when you mail it.</p></li><li><p><strong>List health trend.</strong> Watch the unsubscribe rate and the complaint trend over time, not any single send. A healthy unsubscribe rate sits around 0.1 to 0.3% per send (industry benchmarks 2025 to 2026); above 0.1% complaints (1 in 1000) is Google's documented red line at Gmail. These move in the wrong direction long before revenue does, so they are your early warning that the list is tiring of you.</p></li></ul><p>None of these are exotic. Every one of them is already in your ESP. The shift is deciding which number you let drive the calendar.</p><h3>Where opens still earn a place</h3><p>I am not telling you to delete the metric. A sudden collapse in open rate can still flag a deliverability problem, because if mailbox providers start routing you to spam, even the auto-opens stop firing. So a falling open rate is a useful alarm. A high open rate is just not a useful trophy. Read it as a smoke detector, not a scoreboard.</p><p>The hard part of this conversation is never the data. It is that someone has been reporting that 58% upward for a year, to a board or a partner or themselves, and the honest replacement number looks worse on the slide. But a worse number you can act on beats a flattering one you cannot. The client who saw the gap stopped optimizing for opens, rebuilt their segments on clicks and purchases, and within two quarters their revenue per recipient was something we could actually move. The open rate, we stopped mentioning. It was never the thing making them money.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Why your AI emails don't sound like you]]></title><description><![CDATA[It is not the model. Your voice file was written from memory, not from approved copy. Here is the extraction method that fixes it.]]></description><link>https://tips.remint.email/p/why-your-ai-emails-dont-sound-like</link><guid isPermaLink="false">https://tips.remint.email/p/why-your-ai-emails-dont-sound-like</guid><pubDate>Fri, 05 Jun 2026 15:33:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9a4f9bc1-cbaa-4024-aaeb-ec4feec3ad59_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Why your AI emails don't sound like you</h2><p>Every voice setup I have seen that starts with a self-description drifts. The rules are accurate: they describe the voice the client thinks they have. Not the voice their approved emails actually demonstrate. That gap is where first drafts go wrong and revision rounds pile up.</p><h3>Why Extracted Voice Beats Described Voice</h3><p>In my experience, voice setups that start with a self-description drift. Not because the rules are wrong. Because the rules describe the voice you think you have, not the voice your approved emails actually demonstrate.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>When you describe your voice in a document ("warm but direct, benefit-led, no corporate jargon"), you are writing in human language about writing behavior. Claude has to interpret that description and translate it into generation behavior. The interpretation step introduces error. "Warm but direct" means something specific in your head and something different when the model generates against it.</p><p>When you extract voice rules from approved output, something different happens. The rules come back in terms that describe writing patterns structurally: sentence rhythm, opener structure, recurring phrase patterns. When you paste that file into the next prompt, the model is reading a structural description of the voice, not a human description it has to interpret. From experience, the gap between instruction and output is smaller.</p><h3>Where Voice Calibration Sits in the Pattern</h3><p>The extraction prompt is governed by the same four-mechanism wrapper we apply to every prompt we publish: <strong>prerequisites</strong> (approved samples and brand context), <strong>self-validation</strong> (every rule cites a sample number), <strong>human gate</strong> (you approve the VOICE.md before it lands on disk), and <strong>improvement proposal</strong> (recurring violations from drift detection become operator-committed rule additions).</p><p>VOICE.md is then the declared prerequisite of every other prompt in the system. Subject line prompts, segment rewrites, pre-send QA: each one refuses to run unless VOICE.md is provided. The voice file is not optional context. It is a required input enforced at the prerequisites layer.</p><h3>The Two Layers Email Voice Actually Has</h3><p>The other failure mode in most voice setups is treating all email types as interchangeable. A welcome email and an abandoned cart email are not the same register. The same brand writes them differently: different warmth level, different urgency, different lead style. If you extract voice from five promotional emails and use that file for welcome copy, you get welcome emails written in a promotional register. Structurally correct, tonally wrong.</p><p>Email production voice has two distinct layers:</p><ul><li><p><strong>Brand identity layer:</strong> what stays consistent across every email type. Core vocabulary, sentence rhythm, prohibited phrases, opener DNA. This is extracted once and lives in the VOICE.md.</p></li><li><p><strong>Contextual register layer:</strong> how far each flow type moves on warmth, urgency, and lead style. Welcome sits at different coordinates than cart recovery for the same brand. This is documented separately in REGISTER.md and referenced per send.</p></li></ul><p>Building both is a one-time setup. Using them is one extra line in every prompt. From experience, the difference shows up in revision rounds: extracted voice files cut the back-and-forth on tone consistency from the first draft.</p><h3>Extraction Prompt: The Brand Identity Layer, Full Wrapper</h3><p>Use one representative approved email per primary flow type as input. Welcome, abandoned cart, promotional, and re-engagement if you have all four. The prompt extracts what is consistent across all of them: the brand identity. Patterns that only appear in one flow type are register, not identity, and get flagged as conflicts for the register map.</p><pre><code>## Prerequisites: required before running

- 5 to 10 approved email samples from this client, one per flow type
- A one-paragraph brand context (product, audience, primary offer)

If either is missing, do not proceed. Respond:
"Cannot run. Missing: [list approved emails / brand context as applicable].
Provide and re-run."

## Inputs

Brand context: [PASTE ONE PARAGRAPH ABOUT PRODUCT, AUDIENCE, OFFER]

Approved emails: [PASTE 5-10 APPROVED EMAILS, ONE PER FLOW TYPE,
SEPARATED BY --- BELOW]

## Task

Extract the brand identity layer: what stays consistent across ALL email
types. Write a VOICE.md file using exactly this structure:

---
## Tone
[one sentence: the consistent emotional register across all samples,
citing Sample numbers that demonstrate it]

## Sentence rules
1. [length and rhythm rule, with verbatim example in quotes and Sample number]
2. [paragraph structure rule, with Sample number]
3. [one other consistent structural pattern, with Sample number]

## Opener patterns
- [first-sentence style, with verbatim example in quotes and Sample number]
- [second pattern if present, or "one consistent pattern observed"]

## Recurring phrases
- "[exact phrase found across multiple emails]" (Samples N, N)
- "[exact phrase found across multiple emails]" (Samples N, N)
- "[exact phrase found across multiple emails]" (Samples N, N)

## What this voice never does
- [prohibition derived from consistent absence, with reasoning]
- [prohibition with reasoning]
- [prohibition with reasoning]

## Subject line pattern
[describe the pattern, citing Samples, or write
"not visible in samples" if subject lines not provided]
---

Rules:
- Brand identity only. Skip patterns that appear in only one flow type.
- Use verbatim examples where possible.
- If samples contradict each other on a pattern, write:
  CONFLICT: [what varies]. These belong in the register map, not here.

## Self-validation (run before returning output)

Before returning the VOICE.md, check:

1. Every rule cites at least one specific sample number
2. No rule is contradicted by another rule in the file
3. No subjective adjective ("punchy", "engaging", "conversational")
   appears without an operational test attached
4. The structure matches the schema above exactly
5. CONFLICT lines appear for any pattern that varies across samples

If any check fails, fix internally and re-check. If you cannot satisfy a
check after one attempt, return:
"Validation failed: [rule]. Cannot produce compliant VOICE.md."

## Human gate (before writing to disk)

After returning the VOICE.md block, state:
"Review the extracted VOICE.md above. Type APPLY to write it to disk as
VOICE-[YYYY-MM].md, or REJECT with specific corrections."

Do not write the file until APPLY is received.

## Improvement proposal (optional)

If you noticed a voice pattern in the samples that does not fit the four
sections above, append:

"PROPOSED RULE ADDITION (review before adding to the schema): [one line
describing the section or rule type that should be added]"

Do not modify the schema yourself.</code></pre><p>Any CONFLICT line the extraction returns is a signal to document that pattern in the register map. It means the brand genuinely calibrates that behavior by email type, and a single rule would either be too rigid or too vague to be useful.</p><h3>The Register Map, Same Wrapper</h3><p>Once VOICE.md is committed, run a second prompt against the same samples to derive the register coordinates per flow type. The register map does not need to be regenerated frequently. Only when the program adds a new flow type or when client feedback flags a specific flow as tonally off.</p><pre><code>## Prerequisites

- VOICE.md (the brand identity file from the extraction prompt above)
- The same email samples used for the extraction
- A list of flow types in the program

If any is missing, do not proceed. Respond:
"Cannot run. Missing: [list]. Provide and re-run."

## Inputs

VOICE.md: [PASTE VOICE.md CONTENTS HERE]

Email samples: [PASTE THE SAME SAMPLES USED FOR EXTRACTION]

Flow types in program: [LIST EVERY FLOW TYPE, ONE PER LINE]

## Task

For each flow type, identify register coordinates:

- Warmth level: high / medium / low, with one verbatim example sentence
- Urgency level: high / medium / low, with one verbatim example sentence
- Lead style: what the first sentence focuses on
  (benefit / consequence / story / question / direct CTA)
- CTA style: how the call to action is framed
  (soft / direct / urgent / implied)

Format as a table with one row per flow type. Coordinates, not rules.
They describe where this brand sits on each axis for each context.

## Self-validation

Before returning:
1. Every flow type from the input list has a row
2. Every cell cites a verbatim example sentence
3. No coordinate contradicts the VOICE.md identity layer
4. The table format is consistent

If a flow type has no representative sample, mark its row "INSUFFICIENT
SAMPLE" rather than guessing. Return the table even if some rows are
incomplete.

## Human gate

After returning the table, state:
"Review the REGISTER.md above. Type APPLY to write to disk, or REJECT
with corrections."

## Improvement proposal

If a register dimension keeps coming up that is not warmth/urgency/lead/CTA,
append:
"PROPOSED RULE ADDITION: [one line describing the new dimension]"</code></pre><p>The output is a table. Welcome might be high warmth, low urgency, benefit-led, soft CTA. Abandoned cart might be medium warmth, high urgency, consequence-led, direct CTA. The table goes into a REGISTER.md file stored in the same client folder as VOICE.md.</p><h3>Using Both Files in Every Downstream Prompt</h3><p>Once VOICE.md and REGISTER.md exist on disk, every other prompt in the system declares both as required prerequisites. The downstream prompts refuse to run without them.</p><p>Below is the usage prompt that consumes both files. Notice that the prerequisites block lists VOICE.md and REGISTER.md by name and stops if either is missing.</p><pre><code>## Prerequisites: required before running

- VOICE.md for this client
- REGISTER.md for this client
- A brief with all six fields below filled in

If any prerequisite is missing, do not proceed. Respond:
"Cannot run. Missing: [list]. Provide and re-run."

## Inputs

VOICE.md: [PASTE VOICE.md CONTENTS HERE]

Register for this send: [PASTE THE RELEVANT ROW FROM REGISTER.md]

## Brief
Type: [welcome / abandoned cart / promotional / re-engagement]
Position: [e.g. first in a 4-part sequence / third of five]
Audience: [who receives this and what they know about the brand]
Offer: [if applicable]
Goal: [what this email needs to accomplish]
Length: [word count target]

## Task

Write the email in the voice described in VOICE.md, calibrated to the
register coordinates above.

## Output format

Subject: [subject line]
Preview: [preview text, max 90 characters]
Body: [email body only, no greeting, no sign-off]

## Self-validation

Before returning, check the draft against:
1. Every VOICE.md "What this voice never does" rule
2. Register warmth, urgency, lead style, and CTA style match the row
3. Body word count is at or below the Length value specified in Brief

If any check fails, fix internally and re-check. If you cannot satisfy a
check after one attempt, return:
"Validation failed: [rule]. Cannot produce compliant copy."

## Human gate

After returning the draft, state:
"Review the draft above. Type APPLY to queue for send, or REJECT with the
specific revision needed."

Do not move the draft to the send queue until APPLY is received.

## Improvement proposal (optional)

If during writing you noticed a recurring pattern not covered by the
self-validation rules above (e.g. a register coordinate pairing that
consistently produces a structural conflict with VOICE.md), append:

"PROPOSED RULE ADDITION (review before adding): [one line describing the
pattern]"

Do not modify the self-validation rules in this prompt. Only propose.</code></pre><p>The register row anchors warmth and urgency before generation starts. Without it, the model calibrates from VOICE.md alone, which describes the brand's tonal center of gravity, not where a specific flow type should sit on the scale. The result is a promotional email written at welcome-register warmth, or a re-engagement email with the urgency level of a cart recovery send.</p><h3>When to Update Each Layer</h3><p>The two layers update on different triggers.</p><p>From experience, AI-assisted programs drift faster than human-authored ones because generation volume is higher. Set a review cadence before you start generating at volume, not after you notice output degrading. For AI-assisted production, monthly is the cadence we use. For human-authored programs, quarterly is the cadence we use as a baseline.</p><p>Brand identity layer: update when brand guidelines change, when a major campaign cycle introduces a deliberately different positioning, or when a drift detection run flags consistent violations across multiple flow types. Not every brand refresh requires a full extraction. If only the prohibited phrases changed, edit VOICE.md directly and commit the change.</p><p>Register map: update when a specific flow type consistently gets revision notes about tone. If every abandoned cart draft comes back too aggressive, the urgency coordinate for that flow type is wrong. Pull three recent approved sends from that flow, re-run the register prompt for that row only, and commit the updated table.</p><p>Keep both files versioned: <code>VOICE-2026-05.md</code>, <code>REGISTER-2026-05.md</code>. When an output starts feeling off and you cannot identify why, the file version is in git history and you can trace it back to the specific file the drafts were generated against. Improvement is governed, reviewable, reversible.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Your CLAUDE.md Is Working Against You]]></title><description><![CDATA[Email production pipelines often reach 200+ lines of CLAUDE.md by month three. Here is the decision tree and path-scoped rules structure that fixes it.]]></description><link>https://tips.remint.email/p/your-claudemd-is-working-against</link><guid isPermaLink="false">https://tips.remint.email/p/your-claudemd-is-working-against</guid><pubDate>Thu, 04 Jun 2026 13:03:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7e40522c-dc4c-4b5e-ac55-fdaded54097b_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Your CLAUDE.md Is Working Against You</h2><p>After three months in a live email production workflow, a CLAUDE.md file typically reaches 400 lines. Claude does not ignore the rules &#8212; it deprioritizes the ones buried deep enough that they lose the competition for attention. Here is the architecture that fixes it.</p><p>It made sense when you wrote it. Six months later it is 400 lines long and Claude is quietly ignoring the bottom half. Not because the rules are wrong. Because a model working through a live production session cannot consistently apply guidance buried that deep in a long file.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>How it happens</h3><p>A client is running Claude as part of their email production pipeline. Newsletter sends, product launch announcements, promotional campaigns, welcome series variations. The workflow is working, so they keep extending it. Every time Claude produces something that misses (wrong tone on a product email, a claim that should not be in a newsletter, a subject line that does not match the brand register), they add a rule to CLAUDE.md. The file grows one sensible addition at a time.</p><p>By month three, a typical client workflow managing 500 or more email topics has a CLAUDE.md past 200 lines. Brand voice rules. Forbidden claims from previous bad outputs. Product naming conventions. Template contracts for different send types. Tone variations per audience segment. Cadence rules. All of it written down. None of it reliably followed.</p><p>Anthropic flags this in their Claude Code documentation: CLAUDE.md files over 200 lines degrade adherence. The model deprioritizes rules it encounters deep in a long file. The context window is finite, and in a session working through a product launch campaign alongside newsletter copy and automated send logic, CLAUDE.md is competing with everything else in that session for attention.</p><h3>The workaround that does not work</h3><p>The instinctive fix is splitting the file using <code>@import</code>: breaking content into separate files and pulling them in. It does not reduce the problem. Imported files still load in full at the start of every session. The context cost is identical. You have reorganized the problem, not solved it.</p><p>The fix that actually works is the one Anthropic documents: <code>.claude/rules/</code> with <code>paths:</code> frontmatter. Files in that directory load only when Claude touches a matching file path during the session. Not at session start. Not always. Only when relevant.</p><h3>The decision tree we use to audit a CLAUDE.md</h3><p>We built a Claude Code skill called <code>/trim-claude-md</code> that walks every section of a CLAUDE.md through this logic. The full skill is free to copy at the bottom of this article. Here is how it categorizes each section:</p><ol><li><p><strong>Does every session need this?</strong> Brand voice rules, forbidden vocab, hard invariants. Yes: stays in CLAUDE.md.</p></li><li><p><strong>Does it only apply when working in a specific area?</strong> Template rules, copy rules for a specific campaign type, segment-specific guidelines. No: moves to a <code>.claude/rules/</code> file scoped to that path.</p></li><li><p><strong>Is it a multi-step procedure?</strong> Setup runbooks, credential flows, one-time config. Moves to <code>docs/setup-*.md</code> or a standalone skill.</p></li><li><p><strong>Is it state or history?</strong> "As of March 2026 the welcome series has 4 emails", shipped features, row counts. Cut entirely. Belongs in commit messages. It is not a rule, it is history, and history rots inside CLAUDE.md.</p></li><li><p><strong>Is it hard enforcement?</strong> "Must validate before commit", "must run linter before push". Moves to a pre-commit hook in <code>.claude/settings.json</code>. Hooks are enforced. CLAUDE.md instructions are not.</p></li></ol><h3>What the split looks like for an email production workflow</h3><p>What belongs in CLAUDE.md and loads every session: brand voice rules, forbidden claims the client has validated, US versus British English, the hard no-most-customers rule. These apply everywhere. They stay.</p><p>What moves to a scoped rule file:</p><ul><li><p><strong>Email template rules:</strong> subject line length limits, preheader conventions, CTA copy guidelines, template token contracts. Scoped to <code>templates/**</code>. Loads only when a session touches a template file.</p></li><li><p><strong>Product announcement rules:</strong> product naming conventions, launch tone, pricing language, permitted claims in promotional sends. Scoped to <code>campaigns/**</code> or <code>launches/**</code>. A session writing a welcome series never loads this.</p></li><li><p><strong>Segment-specific copy rules:</strong> rules for a specific audience segment or list. Scoped to those output directories. Irrelevant to most sessions and invisible to them once scoped correctly.</p></li><li><p><strong>ESP and rendering notes:</strong> client-specific rendering rules, deliverability constraints, dark mode handling. Scoped to the relevant build or export directories.</p></li></ul><p>What gets cut entirely: dated state notes, shipped features lists, and any paragraph describing the current state of the workflow rather than a rule Claude should follow. These belong in commit messages or a plans folder.</p><h3>What the frontmatter looks like</h3><p>A rule file for product announcement copy:</p><pre><code>---
paths:
  - "campaigns/**/*"
  - "launches/**/*"
---

# Product announcement copy rules

[Campaign-specific guidance here]
</code></pre><p>Claude Code reads the <code>paths:</code> block and loads the file automatically when a session touches a matching path. If the session is writing newsletter copy and never touches a campaign file, this file is invisible to it.</p><h3>The pattern extends beyond email</h3><p>We have seen this in every production workflow where clients run Claude over time: CLAUDE.md becomes the catch-all for every correction ever made. Legal adds a clause. Brand adds a voice note. A developer adds a rendering constraint. A marketer adds a segment rule. The file grows.</p><p>Email workflows are particularly prone to this because of the volume of writing, the number of variations, and the long-running nature of the pipeline. A client running 500 email topics across multiple send types, with audience segments and product lines and seasonal tone shifts, generates more rules than almost any other Claude use case. The context file needs architecture, not just growth.</p><p>If a client workflow has been live for more than three months and output quality has quietly declined from where it started, check the CLAUDE.md line count first. If it is past 200, run the audit.</p><h3>The skill: free to copy and use</h3><p>The <code>/trim-claude-md</code> skill automates the full audit. It reads your CLAUDE.md, walks every section through the decision tree above, and produces a proposal file showing exactly what stays, what moves, and where. Nothing is written until you approve. One session to run it.</p><p>To install it in your Claude Code project:</p><ol><li><p>Create the directory: <code>mkdir -p .claude/skills/trim-claude-md</code></p></li><li><p>Copy the skill file from the gist below into <code>.claude/skills/trim-claude-md/SKILL.md</code></p></li><li><p>Run it from the project root: <code>/trim-claude-md</code></p></li></ol><p>The full skill is here, free to use on any project: <a href="http://gist.github.com/ChristianLundgren/d4be5560eec2c36385d6fe3e5fd3dccd">gist.github.com/ChristianLundgren/d4be5560eec2c36385d6fe3e5fd3dccd</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[p=none Is Where Deliverability Programs Stall. Here Is How to Move Past It.]]></title><description><![CDATA[Many brands set DMARC to p=none and never move past it. Here is how the three policy options work and when to enforce quarantine or reject.]]></description><link>https://tips.remint.email/p/pnone-is-where-deliverability-programs</link><guid isPermaLink="false">https://tips.remint.email/p/pnone-is-where-deliverability-programs</guid><pubDate>Wed, 03 Jun 2026 12:25:14 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3a3e0209-f4c9-435b-b29b-60be67debed7_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>p=none Is Where Deliverability Programs Stall. Here Is How to Move Past It.</h2><p>DMARC has three policy levels. Many brands that have a DMARC record in place are sitting at the first one, and they have been sitting there for months or years. <code>p=none</code> technically satisfies the Google and Yahoo 2025 bulk sender requirements. You published a record, you pass the compliance check, and your emails continue to deliver. What you have not done is protect your domain from being spoofed by senders you did not authorise.</p><p>That gap between "technically compliant" and "actually protected" is where deliverability programs stall. The path from <code>p=none</code> to <code>p=reject</code> requires work, but it is structured work with a clear sequence. This article walks through exactly what each policy level does, why many brands get stuck at the first, and the step-by-step process to move through all three without breaking legitimate mail in transit.</p><h3>Why This Matters</h3><p>Domain spoofing is the attack that DMARC exists to block. Without a policy that enforces action on failing mail, anyone can send email that appears to come from your domain. Your customers receive what looks like an email from your brand, except it is a phishing attempt, a scam, or a spam blast from an infrastructure you have no visibility into.</p><p>Your domain reputation takes damage from mail you did not send. Your customers lose trust in emails that look like yours. And you have no mechanism to stop it because your DMARC policy instructs receiving servers to do nothing about it except file a report.</p><p>The Google Sender Guidelines 2025 and the Yahoo Sender Requirements 2025 both mandate a DMARC record for bulk senders at any policy level. This pushed many brands to publish their first DMARC record in 2024 and early 2025. What the requirements did not mandate is moving past <code>p=none</code>, which is the minimum that satisfies the check. In my audits, brands that implemented DMARC in response to the Google and Yahoo announcement often stopped at <code>p=none</code> and have not reviewed their aggregate reports since.</p><h3>The Full Breakdown</h3><p>DMARC builds on top of SPF and DKIM. To understand what each policy level does, you need to understand what a DMARC failure actually means. An email fails DMARC when it fails both SPF alignment and DKIM alignment for the domain in the <code>From:</code> header. SPF alignment means the authenticated sending domain matches the domain in the <code>From:</code> header. DKIM alignment means the domain in the DKIM signature matches the domain in the <code>From:</code> header. A single pass on either SPF or DKIM is sufficient for DMARC to pass. DMARC only fails when both fail.</p><p>With <code>p=none</code>, a DMARC-failing email delivers to the inbox without obstruction. The receiving mail server checks DMARC, finds a failure, and then does nothing about it except send an aggregate report to the address specified in your <code>rua</code> tag. Those reports are XML files that tell you which IP addresses are sending mail that claims to be from your domain, how much of that mail is passing or failing authentication, and from which sending sources. <code>p=none</code> is a monitoring tool. It is not a protection mechanism.</p><p><code>p=quarantine</code> changes the outcome for failing mail. Instead of delivering to the inbox, mail that fails DMARC is routed to the spam or junk folder. It still reaches the recipient. It still has the potential to damage your brand and mislead your customers. But the delivery path is degraded, and the probability of someone acting on it drops substantially.</p><p>Quarantine is the right intermediate step because it reduces the blast radius of spoofed mail while you continue to verify that all your legitimate sending sources are properly authenticated.</p><p><code>p=reject</code> is the destination. Failing mail is rejected at the server level. It never reaches any folder, inbox or spam. This is complete protection against domain spoofing for properly authenticated rejection. The risk in jumping to <code>p=reject</code> without preparation is that if any legitimate sending source &#8212; a transactional email provider, a CRM, a third-party tool sending on behalf of your domain &#8212; is not properly authenticated, its mail will be blocked entirely. That is why the path from <code>p=none</code> to <code>p=reject</code> goes through a structured authentication audit rather than a direct flip of the policy tag.</p><h3>Step-by-Step Implementation</h3><ol><li><p><strong>Publish your DMARC record at p=none with aggregate report delivery configured. <br><br>What:</strong> Add a TXT record to your DNS at <code>_dmarc.yourdomain.com</code> with the value <code>v=DMARC1; p=none; rua=mailto:reports@yourdomain.com</code>. The <code>rua</code> tag is where aggregate reports are sent. Use a real inbox that someone monitors. If you do not want to manage raw XML, route reports through a DMARC analysis tool (Postmark's free analyser, Dmarcian, Valimail) that parses them into readable summaries. <br><strong>Why:</strong> Before you can enforce any policy, you need a complete picture of every source sending mail with your domain in the <code>From:</code> header. <code>p=none</code> gives you that data without risk to legitimate mail delivery. <br><strong>Common mistake:</strong> Omitting the <code>rua</code> tag. A DMARC record without a report destination is monitoring with no output. You will never know what the reports would have shown because you have nowhere to receive them.</p></li><li><p><strong>Run on p=none for 30 days and read your aggregate reports. <br><br>What:</strong> Let a full month of sending data accumulate in your aggregate reports. Review the reports to identify every IP address or sending source that is sending mail from your domain. You are looking for three categories: sources you recognise and have authenticated, sources you recognise but have not fully authenticated, and sources you do not recognise at all. <br><strong>Why:</strong> A 30-day window captures the full range of your sending infrastructure, including tools that may send infrequently &#8212; password resets, transactional notifications, quarterly digests. A shorter observation window risks missing a legitimate source and blocking it when you move to enforcement. <br><strong>Common mistake:</strong> Looking at reports once and declaring the source list complete. Aggregate reports are delivered daily or weekly depending on the receiving mail server. Review them at the end of the 30-day window, not the beginning, and consolidate across the full period.</p></li><li><p><strong>Authenticate every legitimate sending source. <br><br>What:</strong> For each source identified in your aggregate reports that you authorise to send mail from your domain, verify that SPF and DKIM are correctly configured. For your ESP (Klaviyo, Mailchimp, Braze, or equivalent), this typically means verifying domain authentication inside the platform settings. For transactional mail (SendGrid, Postmark, Amazon SES), check that your sending domain is authenticated with a valid DKIM key and that your SPF record includes the provider's sending IPs or mechanism. <br><strong>Why:</strong> Moving to <code>p=quarantine</code> or <code>p=reject</code> before authenticating every legitimate source will block or quarantine mail from those sources. The only way to enforce DMARC safely is to ensure that every source you want to pass authentication actually does pass it. <br><strong>Common mistake:</strong> Assuming that because your ESP sends email successfully, it is DMARC-aligned. Successful delivery and DMARC alignment are not the same thing. Check your aggregate reports specifically for DMARC pass/fail status per source, not just delivery status.</p></li><li><p><strong>Move to p=quarantine, initially with pct=10 or pct=25. <br><br>What:</strong> Update your DMARC record to <code>v=DMARC1; p=quarantine; pct=10; rua=mailto:reports@yourdomain.com</code>. The <code>pct</code> tag tells receiving mail servers to apply the quarantine policy to only 10 percent of failing mail. The other 90 percent still delivers as if <code>p=none</code> is in effect. Increase <code>pct</code> gradually: 10 to 25 to 50 to 100 over two to four weeks. <br><strong>Why:</strong> Gradual rollout via the <code>pct</code> tag is a safety mechanism. If there is a legitimate source you missed during the authentication phase, the partial rollout limits the damage from blocking its mail to a fraction of sending volume, giving you time to identify and fix the issue before it affects all delivery. <br><strong>Common mistake:</strong> Jumping directly to <code>pct=100</code> on the first quarantine update. The <code>pct</code> tag exists precisely to allow staged enforcement. Use it. The time cost of a staged rollout is two to four weeks. The cost of blocking a critical transactional mail source is customer-facing delivery failures.</p></li><li><p><strong>Verify quarantine-phase reports, then move to p=reject. <br><br>What:</strong> Monitor aggregate reports through the quarantine phase at each <code>pct</code> increment. Look for any legitimate sources appearing in the failing mail category. Once you reach <code>pct=100</code> quarantine with no legitimate sources failing, update the record to <code>v=DMARC1; p=reject; pct=100; rua=mailto:reports@yourdomain.com</code>. Use the same gradual <code>pct</code> ramp if you want the additional safety net. <br><strong>Why: </strong><code>p=reject</code> at <code>pct=100</code> is full enforcement. Failing mail is blocked at the server. There is no recovery path for a sender that is blocked by reject policy except fixing their authentication. Confirming a clean quarantine phase before stepping to reject gives you confidence that the only mail being blocked is mail you do not authorise. <br><strong>Common mistake:</strong> Treating <code>p=reject</code> as a set-and-forget final state. New sending tools get added to the stack. Subdomains get spun up. Acquisitions add new infrastructure. Review DMARC aggregate reports quarterly to catch new unauthenticated sources before they become a problem.</p></li><li><p><strong>Set up forensic reports (optional but useful for investigating specific failures). <br><br>What:</strong> Add an <code>ruf</code> tag to your DMARC record: <code>ruf=mailto:forensic@yourdomain.com</code>. Forensic reports contain redacted message-level data about individual DMARC failures, including headers that can help identify where failing mail is originating. Not all mail servers send forensic reports (Gmail does not by default), but those that do provide more granular detail than aggregate reports. <br><strong>Why:</strong> When investigating a specific spoofing campaign or a stubborn unidentified source in your aggregate data, forensic reports give you message-level context. Aggregate reports show patterns. Forensic reports show instances. <br><strong>Common mistake:</strong> Routing forensic reports to the same inbox as aggregate reports without a filtering rule. Forensic report volume can be high during active spoofing attempts. Keep them in a separate inbox or folder so they do not bury your aggregate report summaries.</p></li></ol><h3>The Framework</h3><p>Use this decision tree when assessing or building a DMARC implementation. Each branch represents the correct next action given your current state.</p><pre><code>DMARC POLICY DECISION TREE
============================

START: Does a DMARC record exist at _dmarc.yourdomain.com?
|
+-- NO  --&gt; Publish p=none with rua= configured. Start 30-day observation.
|
+-- YES --&gt; What is the current policy?
            |
            +-- p=none
            |     |
            |     +-- Is rua= configured and are reports arriving?
            |           |
            |           +-- NO  --&gt; Add rua= tag immediately. Restart observation.
            |           |
            |           +-- YES --&gt; Have you reviewed 30+ days of aggregate reports?
            |                       |
            |                       +-- NO  --&gt; Wait. Review at 30 days.
            |                       |
            |                       +-- YES --&gt; Are all sending sources authenticated?
            |                                   |
            |                                   +-- NO  --&gt; Authenticate each source.
            |                                   |          Then step to quarantine pct=10.
            |                                   |
            |                                   +-- YES --&gt; Step to p=quarantine pct=10.
            |
            +-- p=quarantine
            |     |
            |     +-- What is pct?
            |           |
            |           +-- Less than 100 --&gt; Ramp pct by 25 every 1-2 weeks.
            |           |                    Monitor reports at each step.
            |           |
            |           +-- 100 --&gt; Are any legitimate sources appearing as failures?
            |                       |
            |                       +-- YES --&gt; Fix authentication. Hold at quarantine.
            |                       |
            |                       +-- NO  --&gt; Step to p=reject pct=100.
            |
            +-- p=reject
                  |
                  +-- Is rua= still configured and monitored quarterly?
                        |
                        +-- NO  --&gt; Add rua= or resume review schedule.
                        |
                        +-- YES --&gt; You are at full enforcement. Maintain.

NOTES:
- Never remove rua= at any policy level. Reports are your visibility.
- New sending tools require re-authentication before first use.
- Subdomains inherit nothing. Each subdomain used for sending needs its own
  SPF, DKIM, and DMARC configuration or an explicit subdomain DMARC record.
- sp= tag controls subdomain policy if not set separately at the subdomain level.
</code></pre><h3>Real Example</h3><p>A B2B SaaS company I worked with in early 2026 had published a DMARC record eighteen months earlier in response to the initial Google and Yahoo announcement. The record was <code>v=DMARC1; p=none;</code> &#8212; no <code>rua</code> tag, no report destination. They had received zero aggregate reports in eighteen months because there was no inbox configured to receive them.</p><p>From the outside, their DMARC implementation looked complete: the record existed, the DNS lookup returned a valid value, and every compliance checker they ran returned green. Their domain had been spoofed for at least three months, which they discovered only when a customer forwarded a phishing email that appeared to come from their support address. A green compliance check is not the same as a working implementation.</p><p>The remediation work took six weeks. First, we added the <code>rua</code> tag and spent two weeks reading the aggregate reports that immediately began arriving. Three legitimate sending sources were not fully DMARC-aligned: their transactional email provider had DKIM configured but SPF alignment was broken because the <code>From:</code> domain was their root domain while the SPF record only covered the subdomain they used for transactional mail. Their marketing automation platform was passing DKIM but their SPF record had not been updated to include the platform's sending infrastructure after they migrated from a previous tool the previous year. And a third-party survey tool was sending from a subdomain with no DMARC record and no authentication at all.</p><p>We fixed authentication for all three sources, confirmed clean aggregate reports across two weeks of observation at <code>p=none</code>, then moved to <code>p=quarantine</code> at <code>pct=10</code> and stepped up to <code>pct=100</code> over three weeks. After another two-week clean observation period, we moved to <code>p=reject</code>. The spoofed phishing mail stopped appearing in their customers' inboxes within days of the <code>p=quarantine</code> step, before they had even reached full enforcement.</p><h3>Audit Checklist</h3><ul><li><p> A DMARC record exists at <code>_dmarc.yourdomain.com</code> &#8212; verify with a DNS lookup tool or <code>dig TXT _dmarc.yourdomain.com</code></p></li><li><p> The record includes an <code>rua=</code> tag pointing to a monitored inbox or DMARC report aggregation service</p></li><li><p> Aggregate reports are actually arriving and being reviewed at least monthly (not just configured and forgotten)</p></li><li><p> Your current policy is not <code>p=none</code> if you have been running aggregate reports for 30 or more days and your sending sources are authenticated</p></li><li><p> Every active sending source (ESP, transactional provider, CRM, third-party tools) has SPF and DKIM configured for DMARC alignment, not just for delivery</p></li><li><p> Any subdomain used for sending has its own DMARC record or inherits a policy via the <code>sp=</code> tag on the root domain record</p></li><li><p> Your SPF record includes all current sending infrastructure and does not include infrastructure from a previous ESP you migrated away from</p></li><li><p> Your DKIM keys are at least 1024-bit (2048-bit recommended) and have been rotated in the last 12 months if your provider supports rotation</p></li><li><p> You have a process to re-authenticate new sending tools before they send their first email, not after the DMARC reports flag them</p></li></ul>]]></content:encoded></item><item><title><![CDATA[SPF Is Not Optional in 2026. Here Is What It Actually Does.]]></title><description><![CDATA[SPF authenticates that your sending server is authorised to send on behalf of your domain. Here is how it works and why it matters for deliverability.]]></description><link>https://tips.remint.email/p/spf-is-not-optional-in-2026-here</link><guid isPermaLink="false">https://tips.remint.email/p/spf-is-not-optional-in-2026-here</guid><pubDate>Mon, 01 Jun 2026 12:29:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0e9fbe34-0427-4840-8b20-1da37ce3e55a_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>SPF Is Not Optional in 2026. Here Is What It Actually Does.</h2><p>Every day, emails are rejected by Gmail and Yahoo because the sending domain has no SPF record, or has one that does not include the ESP they are actually sending through. This is not a technical edge case. It is one of the most common, most fixable deliverability problems I encounter in audits, and it is entirely preventable once you understand what SPF actually does.</p><h3>What Is Actually Happening</h3><p>SPF stands for Sender Policy Framework. It is a DNS record that tells receiving mail servers which IP addresses are authorised to send email on behalf of your domain.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>When your ESP, Klaviyo, Mailchimp, or any other platform sends an email with your domain in the From address, the receiving server looks up your domain's DNS records and checks whether the IP address that just sent the email is on your authorised list. If the IP is there, SPF passes. If it is not, SPF fails.</p><p>Without an SPF record, there is no authorised list at all. The receiving server has no way to verify that the email claiming to be from your domain was actually sent by you or anyone you authorised. That is not a minor gap. It is a verification failure at the most fundamental level of email authentication.</p><p>SPF was designed to address a specific problem: anyone can send an email claiming to be from any domain. Nothing in the basic email protocol prevents that. SPF exists so receiving servers can check whether the server that delivered the message was actually authorised to claim that domain.</p><p>Google and Yahoo's 2025 bulk sender requirements made SPF mandatory for high-volume senders. Missing it is a non-compliance issue that can result in email being rejected outright, not just filtered to spam.</p><p>The most common SPF failure I see in audits is not a missing record entirely. It is a record that exists but does not include the ESP being used. A brand set up SPF three years ago when they were sending through one platform, then migrated to a different platform, and never updated the DNS record. The new ESP's IP addresses are not in the authorised list. SPF fails. Email lands in spam, or gets blocked, and no one understands why because the record technically exists.</p><p>SPF has one technical limitation worth knowing. It verifies the sending server's IP address, not the message itself. When a subscriber forwards your email, the forwarder's server re-sends from a different IP, which is not in your SPF record. The forwarded message fails SPF.</p><p>DKIM exists alongside SPF precisely because of this: DKIM signs the message and survives forwarding. Both are required for DMARC alignment. SPF is the foundation, and without it, the rest of the authentication stack is weaker.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:null,&quot;text&quot;:null,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>The One Fix</h3><p>Verify your SPF record and confirm it includes every sending source you are currently using.</p><p>Open your DNS management tool, find the TXT record for your domain that starts with <code>v=spf1</code>, and read through the authorised includes. Cross-reference that list against every platform that sends email on your behalf: your primary ESP, any transactional email service you use for order confirmations, any third-party tools that send notifications or automated emails from your domain.</p><p>If any sending source is missing from the SPF record, add its include. Every major ESP publishes its authentication setup instructions in its documentation. For Klaviyo, SPF is handled through the branded sending domain CNAME configuration; check your Klaviyo account's domain authentication settings for the exact DNS records required. For Mailchimp, the include is <code>include:servers.mcsv.net</code>. Add the appropriate include, save the record, and allow up to 48 hours for DNS propagation.</p><p>If you do not have an SPF record at all, create one. The format is a DNS TXT record at your root domain. A basic SPF record for a single ESP looks like <code>v=spf1 include:klaviyo.com ~all</code>. The <code>~all</code> at the end is a soft fail for IPs not in your list. The direction in current email security practice is toward <code>-all</code> (hard fail) once you are confident the record is complete and you have moved your DMARC policy off <code>p=none</code>.</p><p>Use an SPF validation tool &#8212; MXToolbox is the most common option &#8212; to confirm the record syntax is correct after making changes. Invalid SPF syntax does not fail gracefully. A malformed record can break SPF entirely, which is worse than having no record at all. Get this right before moving on.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:null,&quot;text&quot;:null,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>When SPF Is Configured Correctly</h3><p>When SPF is correctly configured, receiving servers can verify that your emails are coming from authorised sources before they decide where to deliver them. You have one component of the authentication foundation in place. Combined with DKIM and a DMARC policy, SPF forms the technical proof that an email claiming to come from your domain was actually sent by you or a service you authorised.</p><p>The practical outcome is that your emails are not rejected at the server level for a fixable authentication failure. That baseline matters more than any subject line test.</p><p>You cannot A/B test subject lines to fix a problem that exists before the email is delivered. Authentication issues surface upstream of everything else. In my audits, SPF is the most common gap, and it is usually the right first place to start.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[HTML Does Not Hurt Deliverability. Your Sender Reputation Does.]]></title><description><![CDATA[The claim that HTML emails hurt deliverability is a distortion of a real but narrow problem. Here is what actually affects inbox placement.]]></description><link>https://tips.remint.email/p/html-does-not-hurt-deliverability</link><guid isPermaLink="false">https://tips.remint.email/p/html-does-not-hurt-deliverability</guid><pubDate>Thu, 28 May 2026 21:18:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2899fbab-6772-4e3c-99fd-0927b3ab829b_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>HTML Does Not Hurt Deliverability. Your Sender Reputation Does.</h2><p>I have seen brands switch to plain text emails because they read that HTML hurts deliverability. Their inbox rates did not improve. Their brand experience dropped. The myth cost them something real, and it was built on a misreading of what mailbox providers actually measure.</p><h3>What Is Actually Happening</h3><p>The claim that HTML hurts deliverability has been circulating since the early days of spam filtering and it has not become more accurate with age. In 2026, it is still repeated as deliverability advice in forums, blog posts, and cold outreach playbooks. It is a partial truth, distorted so far from its origin that it functions as misinformation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Here is where the idea came from. In the early 2000s, when spam was primarily a volume problem and content-based filtering was the dominant approach, tools like SpamAssassin assigned scores to email content. Certain HTML patterns, particularly image-only emails with no text content, were correlated with spam. Spammers at the time frequently used single-image HTML emails to bypass keyword-based text filters. Image-only format became a spam signal.</p><p>The correlation was real. The causation was wrong. The format did not cause the spam problem. The format happened to be used by people who were running spam campaigns. An authenticated sender with a healthy list sending a well-coded HTML email to subscribers who wanted it was not, and is not, penalised for the format.</p><p>Modern mailbox providers at Google and Yahoo evaluate sender reputation and engagement as the primary inbox placement signals, per Google's Sender Guidelines 2025 and Yahoo's Sender Requirements 2025. Authentication matters: SPF, DKIM, and DMARC are non-negotiable in 2026. Engagement matters: if a significant portion of your list is not opening, clicking, or is actively marking your mail as spam, your reputation suffers. List hygiene matters. Domain and IP reputation matter.</p><p>HTML as a format is not in that list. The markup is not what Gmail's algorithms are measuring when they decide where your email lands. In every deliverability analysis I have run, format type has not been the variable that explains inbox placement differences. The variables that matter are on the sender side, not the template side.</p><p>Where HTML can cause a deliverability problem is through broken implementation. Excessively large HTML files can trigger issues in some environments. Poor code that produces enormous message sizes, or certain deprecated HTML patterns, can occasionally flag. But that is a code quality problem, not an HTML problem. A well-built HTML email from an authenticated sender with good engagement lands in the inbox.</p><p>I have tested this directly: the same sender, the same list, the same authentication setup, with a plain text send and an HTML send within the same week. Inbox placement rates are comparable. The format does not move the needle when the sender is healthy.</p><p>When the sender is unhealthy, switching to plain text does not fix the underlying problem. It just gives you a worse-looking email with the same deliverability issues.</p><h3>The One Fix</h3><p>If you are worried about deliverability, audit the actual deliverability variables. Do not audit your template format.</p><p>Start with authentication. Is your SPF record set? Is DKIM configured and aligned? Do you have a DMARC record published? These three are the foundation. Google and Yahoo's 2025 bulk sender requirements made them non-optional. If any of them are missing or misconfigured, that is your deliverability problem. A plain text email from an unauthenticated domain will land in spam faster than an HTML email from an authenticated one.</p><p>Then look at list health. What percentage of your list has not engaged in the last 60 to 90 days? What is your spam complaint rate? These are the engagement signals that mailbox providers use to build your sender reputation. A disengaged list sending to unengaged subscribers is a reputation problem. It does not matter whether the emails are HTML or plain text.</p><p>If both authentication and list health are clean, check your HTML code quality as a secondary step. Use render testing tools like Litmus, Email on Acid, or Testi@ to validate your email renders correctly across clients. A well-coded HTML email should have no deliverability issues originating from its format.</p><h3>What Good Looks Like</h3><p>When deliverability is working, it is not because of format choices. It is because the sender has clean authentication, a healthy engaged list, and a consistent sending pattern that builds domain reputation over time. HTML emails from that sender land in the inbox alongside plain text emails from the same sender, at comparable rates.</p><p>Treating format as the deliverability variable is a distraction from the variables that actually matter. Every week spent worrying about HTML is a week not spent on list hygiene, engagement re-activation, or authentication auditing. Those are the levers that move inbox placement.</p><p>The HTML fear also has a real cost. Plain text email loses the branded experience, the product imagery, the design language you have built. It trades a capability you actually have for an advantage that the evidence does not support.</p><p>That is a bad trade, and it is made repeatedly by brands that absorbed a myth without tracing it back to its source.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Best Send Time Advice Is From 2009. Here Is Why It Has Not Aged Well.]]></title><description><![CDATA[The best send time changes by list, audience, and ESP. Here is why Tuesday 10am is a myth and how to find the right time for your subscribers.]]></description><link>https://tips.remint.email/p/the-best-send-time-advice-is-from</link><guid isPermaLink="false">https://tips.remint.email/p/the-best-send-time-advice-is-from</guid><pubDate>Wed, 27 May 2026 21:12:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ca2959bc-b8e8-4188-a86a-b225daf8a254_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Best Send Time Advice Is From 2009. Here Is Why It Has Not Aged Well.</h2><p>Tuesday at 10am has been the most confidently repeated email advice for fifteen years. It was wrong when it started, and it is provably wrong now. The fact that it persists says more about how email advice circulates than it does about when your subscribers open their email.</p><h3>What Is Actually Happening</h3><p>The Tuesday morning rule originated in benchmark reports published by early email platforms in the late 2000s and early 2010s. MailChimp and HubSpot both published aggregate send-time data showing that Tuesday morning had higher open rates across their customer bases. That finding got picked up, repeated, and eventually ossified into conventional wisdom.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>There are two major problems with it, and both have gotten worse over time.</p><p>The first is the data source. Those recommendations were derived from aggregate open rate data. Open rates in 2026 are not a reliable signal of actual engagement. Apple Mail Privacy Protection, introduced in 2021, fires an open pixel for every subscriber using Apple Mail regardless of whether they actually read the email. By the time Litmus State of Email 2025 data was published, Apple Mail held a substantial share of the email client market.</p><p>Any open-rate-based recommendation built on data from 2025 or earlier carries some portion of this inflation. Any recommendation built on data from before 2021 predates the problem entirely and carries no adjustment for it.</p><p>The second problem is the aggregation itself. An average across all verticals and all list compositions is not advice for your specific programme. Klaviyo's 2025 benchmark data shows meaningful variation in engagement patterns across different industry verticals. A DTC brand selling premium skincare to a primarily working-parent female audience has a fundamentally different subscriber behaviour pattern than a B2B software newsletter targeting technical decision-makers. Both have subscribers. Neither behaves like an aggregate benchmark.</p><p>From my work with DTC brands, I find that send-time performance varies not just by industry but by list segment, by device type, and by where in the customer lifecycle the subscriber sits. A lapsed buyer segment responds at different times than an active engaged segment. A mobile-heavy audience has a different schedule than a desktop-heavy one. These are your variables. A 2009 industry average is not.</p><p>And the competitive factor makes the Tuesday rule particularly counterproductive. If everyone follows the same advice, Tuesday 10am becomes the most congested inbox moment of the week. You are competing for attention in the same window as every other brand that read the same article. That is not a strategy advantage. It is a traffic jam.</p><h3>The One Fix</h3><p>Stop guessing and start testing against your own list data, using a reliable metric.</p><p>The reliable metric is click rate, not open rate. Open rates are MPP-inflated and unreliable as a testing signal. Click rate reflects an action a subscriber actually took. It is not immune to noise, but it is substantially closer to actual engagement than a pixel that fires automatically for Apple Mail users.</p><p>Run a send-time test with a meaningful sample size. Split your next three or four campaigns across two different send times in the same week. Send half your list on Tuesday morning, half on Thursday afternoon. Measure clicks and conversions over 48 hours. Do it again the following week with different times. After four to six rounds you have real data on your list's behaviour, not an industry average from fifteen years ago.</p><p>Many ESPs have send-time optimisation tools that do this automatically at the individual subscriber level. Klaviyo's Smart Send Time feature, for example, analyses each subscriber's historical engagement pattern and suggests a send window based on when that specific person has previously engaged. That is a meaningfully better basis for send scheduling than any aggregate benchmark, including the ones published in 2025.</p><p>Use the tool if it is available to you. If it is not, run the manual test.</p><h3>What Good Looks Like</h3><p>When send time is based on actual list behaviour, campaigns stop competing in the same inbox window as every other brand that follows the same generic advice. Your subscribers get your email when they are more likely to be in a reading context. Click rates improve because the timing is calibrated to their behaviour, not to an industry norm.</p><p>The more important outcome is that you stop treating a single piece of 2009 wisdom as a permanent fixture. Send time is a variable. Like any variable, it should be tested, measured, and updated when your list composition changes.</p><p>A brand that acquired a significant segment of subscribers from a new channel has probably changed its audience behaviour pattern enough to warrant retesting. That is the right posture: periodic testing as the list evolves, not one inherited rule applied indefinitely.</p><p>Tuesday at 10am is not wrong for everyone. It may happen to be the right time for your specific list. But you should know that because you tested it, not because someone wrote it in a benchmark report before most of your current subscribers were on your list.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Abandoned Cart and Abandoned Checkout Are Different Flows. Many Brands Run One for Both.]]></title><description><![CDATA[Abandoned cart and abandoned checkout are triggered differently and convert differently. Most brands run one flow for both and leave revenue on the table.]]></description><link>https://tips.remint.email/p/abandoned-cart-and-abandoned-checkout</link><guid isPermaLink="false">https://tips.remint.email/p/abandoned-cart-and-abandoned-checkout</guid><pubDate>Tue, 26 May 2026 13:56:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/baf66bed-49bd-401b-8698-d1d005ab834e_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Abandoned Cart and Abandoned Checkout Are Different Flows. Many Brands Run One for Both.</h2><p>A subscriber who added something to a cart and left is not the same person as a subscriber who reached the payment page, entered their email address, and left. Running one recovery email to both groups is treating two very different buying signals as if they are the same problem. They are not.</p><h3>What Is Actually Happening</h3><p>In almost every ESP, you can trigger flows from two separate events: a cart add that does not progress to checkout, and a checkout initiation that does not result in a completed purchase. These are technically distinct events, and they represent distinct buyer psychology. The ESP knows the difference. Your copy should too.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Abandoned cart, the first event, fires when someone adds a product to their cart but never moves further. They may be browsing, comparing options, saving items for later, or simply not ready. You may or may not have their email address depending on whether they are already a subscriber. The intent signal is real but shallow.</p><p>Abandoned checkout, the second event, is a different category entirely. The subscriber navigated to the checkout page and provided their contact details. They were close enough to purchase that they started the process. Their intent is demonstrably higher.</p><p>The email can reflect that. It does not need to re-introduce the product or rebuild the case for buying. The subscriber was already at the payment screen.</p><p>In my audits, many brands have one flow handling both. The trigger is either set to cart abandonment only, missing the checkout event entirely, or it is built on checkout abandonment but described internally as the "cart recovery" flow. In both cases, the higher-intent group receives messaging calibrated to the wrong point in the purchase process.</p><p>Klaviyo's 2025 benchmark data shows that abandoned checkout emails consistently outperform abandoned cart emails on revenue-per-recipient. The reason is the intent gap. Someone who made it to checkout was materially closer to buying. A direct email that acknowledges they were at checkout, makes completing the purchase simple, and does not waste their time re-persuading them on the product performs better than a generic "you left something behind" message built for a lower-intent audience.</p><p>The missed opportunity is not just in open or click rates. It is in the messaging architecture.</p><p>When one flow handles both groups, the copy is written at the lowest common denominator. It is cautious, product-focused, and soft on the CTA because it needs to work for someone who barely engaged as much as someone who was at the payment screen. That calibration hurts the higher-intent group more than it helps the lower-intent one.</p><h3>The One Fix</h3><p>Separate the two flows at the trigger level and write distinct copy for each. This is a one-time structural fix.</p><p>The abandoned cart flow can afford to be educational and trust-building. It is working with a lower-intent audience. Show the product, address common concerns, offer social proof. Give the subscriber what they need to decide.</p><p>The abandoned checkout flow should be direct. The subscriber knows the product. They were at the payment screen. Your first email can acknowledge that plainly: they left before completing their order, here is a link back to their checkout, here is what happens after they buy. No need to re-pitch the product.</p><p>The objective is friction removal, not persuasion.</p><p>If you are currently running a single flow for both groups, start by splitting the trigger. In Klaviyo, this means having an "Active on Site" flow with a checkout started metric and a separate flow on "Added to Cart" that excludes people who have already triggered checkout. The copy can evolve over time. Getting the separation in place is the structural fix that makes the right messaging possible.</p><p>The timing also differs. In my experience, abandoned checkout emails perform better with a shorter first-send window. Someone who was at payment and left is still mentally in purchase mode for a shorter period than someone who added an item to a cart.</p><p>Waiting 24 hours to send the first email in a checkout abandonment flow misses the peak recovery window. Many brands I work with have sent it within an hour and seen materially better conversion than the same message sent the next day.</p><h3>What Good Looks Like</h3><p>When the two flows are separated and the messaging is calibrated to intent level, the abandoned checkout flow typically becomes one of the highest revenue-per-recipient automations in the programme. Not because the audience is larger, but because the intent is higher and the copy is finally doing the right job.</p><p>The abandoned cart flow, now freed from needing to work for a high-intent audience, can be more patient and educational. It can take three emails over three days rather than trying to close urgently in the first send. Conversion rates on both flows improve when neither is written for the wrong audience.</p><p>From experience, the single most consistent finding in DTC email audits is that brands are conflating these two flows. The fix is a one-time structural change in the ESP. In the accounts I have rebuilt, the revenue impact shows up in the first 30 days of the abandoned checkout flow running properly.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Flow Brands Build Last Should Be the First One They Fix]]></title><description><![CDATA[The Flow Brands Build Last Should Be the First One They Fix]]></description><link>https://tips.remint.email/p/the-flow-brands-build-last-should</link><guid isPermaLink="false">https://tips.remint.email/p/the-flow-brands-build-last-should</guid><pubDate>Mon, 25 May 2026 13:07:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d16e1245-1ce8-4fa5-a341-d26909428a7c_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Flow Brands Build Last Should Be the First One They Fix</h2><p>Brands spend weeks refining their abandoned cart sequence and leave their welcome series as a single email with a discount code. That is the most expensive sequencing mistake in email. The flow that performs best is the one getting the least attention.</p><h3>What Is Actually Happening</h3><p>The welcome series is the highest revenue-per-recipient flow across many DTC brands. Omnisend's 2025 email marketing data confirms this pattern consistently. The reason is not complicated: a subscriber is at peak intent the moment they join your list. Open rates in the welcome window are among the highest of any automated sequence. Engagement is higher. Purchase likelihood is higher. The relationship is brand new and the subscriber actively chose to hear from you.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>That window closes. It does not stay open indefinitely while you decide what to do with it. By the time a subscriber has been on your list for three weeks and received nothing but a discount code on day one, the relationship has already settled into something much lower-engagement. You cannot restart that first week. The opportunity exists once per subscriber.</p><p>In my audits, I consistently find that brands have invested significant time in their abandoned checkout flow. Two or three emails, timed carefully, with personalised product content. They have a post-purchase sequence. They may even have a win-back flow for lapsed buyers.</p><p>And then their welcome series is one email that delivers a promo code and says something like "welcome to the family."</p><p>The logic that creates this pattern is understandable. Abandoned cart has clear, attributable revenue. You can see it in your ESP's flow analytics: this sequence recovered X in the last 30 days. Welcome series revenue is harder to isolate because it runs through the same first-purchase attribution as organic discovery. The money is there. It just does not always appear where people expect it to be.</p><p>The other factor is effort. A good welcome series takes real work. You need to think about what a new subscriber actually needs to know, in what order, over what timeframe. That is a more complex build than a two-email cart recovery sequence. So it stays in the backlog.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:null,&quot;text&quot;:null,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>The One Fix</h3><p>Before you touch your abandoned checkout timing, your post-purchase upsell sequence, or your win-back threshold, audit your welcome series against one question: does it do more than deliver a discount?</p><p>A welcome series that performs well at minimum covers four things across four to six emails sent over ten to fourteen days:</p><ul><li><p><strong>Email 1, immediate:</strong> deliver the promised incentive without making the subscriber hunt for it. Introduce the brand in one short paragraph.</p></li><li><p><strong>Email 2, day one to two:</strong> brand story. What makes the product, the process, or the people different. This is where trust starts to form.</p></li><li><p><strong>Email 3, day three to four:</strong> social proof. Bestsellers, reviews, anxiety reducers for new buyers.</p></li><li><p><strong>Emails 4 through 6, every two to three days:</strong> product education, FAQ handling, and an offer close with clear expiry.</p></li></ul><p>If your current welcome series is one email, the fix is not a complete rebuild. It is adding email two this week. That alone closes more of the welcome window than any other single action you can take in your flow architecture.</p><p>Then add email three. The welcome series compounds as you extend it, because each email you add catches the subscribers who were ready to buy on day three or day seven but had nothing from you at that moment. Every gap in your sequence is a subscriber who made a decision without you.</p><p>The Klaviyo 2025 benchmark data shows that welcome series with four or more emails consistently outperform single-email welcomes across revenue-per-recipient. In my experience, the difference is not small. A single email is leaving a compounding revenue opportunity on the table for every new subscriber who joins.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:null,&quot;text&quot;:null,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>What Good Looks Like</h3><p>When the welcome series is working properly, the programme stops relying on campaigns to convert new subscribers. First purchases happen inside the welcome window, before the subscriber has had time to disengage.</p><p>The abandoned cart flow, the post-purchase sequence, and every subsequent flow all perform better because the subscriber was properly introduced to the brand before they encountered them.</p><p>A well-built welcome series also reduces the pressure on promotional campaigns. When new subscribers are already converting in the first two weeks, you are not dependent on a sale email to recover them three months later. The relationship starts at a higher trust level and stays there.</p><p>From my experience, when a brand invests properly in the welcome series for the first time, it is often the highest single-flow revenue contributor in the first quarter after launch. Not abandoned checkout. Not post-purchase. Welcome. Because it is the one moment every subscriber passes through, and it is the moment where intent is at its peak.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Welcome Series Framework That Consistently Performs: Six Emails, Fourteen Days]]></title><description><![CDATA[Welcome series generates higher open rates and revenue-per-recipient than any other flow. Here is the six-email framework that consistently performs.]]></description><link>https://tips.remint.email/p/the-welcome-series-framework-that</link><guid isPermaLink="false">https://tips.remint.email/p/the-welcome-series-framework-that</guid><pubDate>Fri, 22 May 2026 12:39:18 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1d94fcd8-6993-4ebc-ac88-0f218064e3ff_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>The Welcome Series Framework That Consistently Performs: Six Emails, Fourteen Days</h2><p>Here is the tension at the heart of welcome series strategy: the moment a subscriber signs up is the single highest-intent moment they will ever have with your brand, and that is exactly when many brands send one email and go quiet. A discount code delivery. A receipt. Then silence until the next campaign blast.</p><p>The welcome window closes fast. Omnisend and Klaviyo benchmark data consistently show welcome series open rates running 2 to 3 times higher than standard campaigns. Engagement levels drop sharply after the first week. Purchase likelihood peaks early and then fades.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>You get one shot at this window and the question is not just how many emails to send. It is how to structure them across the full window so that intent converts rather than evaporates.</p><p>This article gives you the complete framework. Six emails, fourteen days, with the specific job each email does, the timing rationale behind each gap, and the common mistakes that collapse the sequence before it earns its keep.</p><h3>Why This Matters</h3><p>According to the Omnisend Email Marketing Statistics Report 2025, welcome series emails generate substantially higher open and conversion rates than standard broadcast campaigns. The data consistently shows that welcome emails sent immediately upon signup outperform those sent even a few hours later. The window is not metaphorical. There is a real and measurable degradation in engagement as time passes from the signup moment. Most brands are late.</p><p>The Klaviyo Benchmark Report 2025 reinforces this from the revenue side. Welcome flows rank among the highest revenue-per-recipient automations across the DTC brands tracked in the data.</p><p>In my audits of brand email programs, I find that welcome series performance is often the single biggest lever a brand can pull before touching any other flow. Abandoned cart gets rebuilt first at many brands. The welcome series stays as a one-email stub. That is the wrong order. Fix the highest-intent window first, then optimise the recovery flows.</p><h3>The Full Breakdown</h3><p>The core mistake I see in welcome series builds is conflating email count with coverage. A brand sends six emails in four days and believes they have built a thorough welcome sequence. They have not. They have hammered a subscriber who just raised their hand and created pressure where there should be relationship. The variable that matters most is not count. It is spacing.</p><p>The fourteen-day window is not arbitrary. The first 48 hours capture the peak-intent subscriber who signed up because something triggered them: a recommendation, a social post, a paid ad they clicked, a piece of content that landed. Emails in this window should be operational and brand-establishing.</p><p>After that window, the subscriber has returned to their normal behaviour and is reading emails in a different state of mind. The middle of the sequence, days three through seven, is where you build the case at a lower intensity. Education, proof, differentiation.</p><p>The final phase, days eight through fourteen, is where you make and close the offer with a subscriber who has already been through the relationship-building phase.</p><p>A four-email series is the minimum that does this work properly. One email is a receipt. Two emails can deliver the incentive and introduce the brand but have no room for the trust-building that drives second purchase. Four emails get you through incentive delivery, brand story, social proof, and one offer close.</p><p>Six emails let you add product education and an FAQ-handling email, which is where a lot of the conversion lift comes from in higher-complexity or higher-pricepoint products.</p><p>The spacing between emails matters as much as the emails themselves. When I rebuild welcome series for brands, the most common problem is not missing content. It is emails stacked too tightly in the first 72 hours and then a gap from day four to day twelve while the subscriber forgets who the brand is. The framework below is structured to avoid both failure modes: the pressure that comes from overcrowding, and the drop-off that comes from underpacing.</p><h3>Step-by-Step Implementation</h3><ol><li><p><strong>Email 1: Immediate send. Deliver the incentive, introduce the brand.What:</strong> This email fires the moment the subscriber confirms their opt-in. It delivers exactly what was promised: the discount code, the freebie download, the exclusive access, or the content piece. Beyond the incentive delivery, it introduces the brand clearly. One to two sentences on what the brand is and what the subscriber can expect from the series. No hard sell here.<strong>Why:</strong> The immediate trigger is the most important timing decision in the entire sequence. According to Omnisend 2025 data, immediate welcome emails see significantly higher open rates than those delayed even a short time after signup. The subscriber is in the browser tab. Their inbox is open. Send now.<strong>Common mistake:</strong> Burying the incentive code halfway down a long welcome email full of brand narrative. Deliver the code in the first viewport. Everything else is secondary to the promise you made when they signed up.</p></li><li><p><strong>Email 2: Day 1 to 2. The brand story.What:</strong> This email focuses entirely on differentiation. Not what you sell. Why you exist and what makes the brand different from everything else in the category. Founder story if it is relevant and compelling. Sourcing story if it is a differentiator. Mission if it is authentic and specific rather than generic.<strong>Why:</strong> The subscriber knows what you sell. They signed up. What they do not know yet is why they should buy from you rather than a competitor. This email answers that question while their interest is still high and the brand memory from Email 1 is fresh.<strong>Common mistake:</strong> Writing a brand story email that is really a product catalogue with a paragraph of copy at the top. The story email should not have more than one product mention, and that mention should serve the narrative rather than lead it.</p></li><li><p><strong>Email 3: Day 3 to 4. Social proof and bestsellers.What:</strong> Curated reviews, ratings, user-generated content, and the two or three products that convert best for new customers. This email should reduce the anxiety a first-time buyer has about whether the product will actually deliver. Real quotes, real numbers, specific outcomes rather than adjectives.<strong>Why:</strong> By day three, the subscriber has seen the brand and heard the story. Social proof is the evidence that backs the claims. It converts the interested subscriber into someone with enough confidence to consider buying. Bestsellers narrow the decision: instead of browsing a full catalogue, the subscriber is looking at the three things that work best for people like them.<strong>Common mistake:</strong> Using generic review excerpts. "Great product, love it" does not reduce purchase anxiety. Find reviews that mention the specific problem the product solves or the specific outcome it delivers. Those are the ones that do the work.</p></li><li><p><strong>Emails 4 and 5: Days 6 to 8. Education and FAQ handling.What:</strong> Two emails spaced two to three days apart that teach the subscriber something genuinely useful about the category, the product, or the problem the brand exists to solve. One of these emails should address the most common objections and questions you hear before a first purchase. Answer them directly and without defensiveness.<strong>Why:</strong> By this point the subscriber has the incentive, the brand story, and the proof. What is still stopping many of them from converting is residual uncertainty. They do not know how the product works in practice, or they have a question they have not found answered, or they are not sure the product applies to their situation. Education emails answer these without requiring the subscriber to go looking.<strong>Common mistake:</strong> Making the education email a thinly veiled sales email. If the educational content is genuine and useful, the conversion happens as a byproduct. If it reads like a sales pitch formatted as a how-to guide, it reads like a sales pitch.</p></li><li><p><strong>Email 6: Day 11 to 14. Offer close.What:</strong> This is the dedicated conversion email. If the subscriber has not purchased by now, this email creates urgency around the original incentive or introduces a new, time-limited reason to act. Direct copy, clear CTA, specific expiry on the offer. One job only.<strong>Why:</strong> After five emails of value delivery, the direct ask has earned its place. The subscriber knows the brand, has seen the proof, understands the product. The offer close is not a cold pitch. It is a reminder and a final nudge from a brand they have now had a relationship with for two weeks.<strong>Common mistake:</strong> Making the offer close email apologetic. Phrases like "just a quick reminder" or "in case you missed our discount" undercut the urgency. State the offer clearly, state the expiry clearly, and let it stand on its own.</p></li></ol><h3>The Framework</h3><p>Use this structure as a decision template when building or auditing any DTC welcome series. Each email maps to a specific subscriber state and a specific job.</p><pre><code>WELCOME SERIES FRAMEWORK
========================

Email 1 | Immediate | Incentive delivery + brand intro
------------------------------------------------------------
Subscriber state: peak intent, just opted in
Job: deliver the promise, introduce the brand clearly
Content: incentive (code / download / access), 1-2 sentences on what the brand is
Length: short. Under 200 words of body copy.
CTA: one. Use the incentive.

Email 2 | Day 1-2 | Brand story
------------------------------------------------------------
Subscriber state: interested, memory of Email 1 fresh
Job: answer "why this brand over others"
Content: founder story, sourcing story, or mission (pick the most authentic one)
Length: medium. 250-350 words.
CTA: one. Secondary product or about page.

Email 3 | Day 3-4 | Social proof + bestsellers
------------------------------------------------------------
Subscriber state: considering, not yet decided
Job: reduce purchase anxiety, narrow product choice
Content: 3-5 specific reviews + top 2-3 products for new customers
Length: medium. Let the reviews lead.
CTA: one per featured product or one to bestsellers page.

Email 4 | Day 6-7 | Education
------------------------------------------------------------
Subscriber state: familiar, still non-converting
Job: teach something genuinely useful, build category authority
Content: how-to, use-case guide, or comparison relevant to the product
Length: medium-long. 300-400 words.
CTA: relevant product or resource.

Email 5 | Day 8-9 | FAQ and objection handling
------------------------------------------------------------
Subscriber state: uncertain, specific friction point blocking conversion
Job: surface and answer the 3 most common pre-purchase questions
Content: Q+A format. Direct answers. No hedging.
Length: short-medium. Questions lead, answers are brief and confident.
CTA: one to the product or a quiz / recommendation tool.

Email 6 | Day 11-14 | Offer close
------------------------------------------------------------
Subscriber state: brand-aware but unconverted
Job: create urgency, drive the first purchase
Content: offer reminder or time-limited incentive, specific expiry, clear CTA
Length: short. Under 150 words of body copy.
CTA: one. The offer.

SPACING RULE: Never stack two emails less than 24 hours apart after Email 1.
SEQUENCE EXIT: Tag and suppress anyone who purchases at any point. The series
is for non-converters. Buyers enter the post-purchase flow immediately.
</code></pre><h3>Real Example</h3><p>A DTC skincare brand I worked with in early 2026 had a three-email welcome series running on a five-day cadence. Email 1 delivered the discount code. Email 2 was a product catalogue sent two days later. Email 3 was a "your code expires soon" reminder on day five. Their conversion rate from the welcome series was below what the Klaviyo Benchmark Report 2025 shows as average for the skincare category.</p><p>The audit identified two problems. First, the brand story email was missing entirely. The subscriber went from incentive delivery to product catalogue with no context about what made this brand different. In a category with dozens of direct competitors, that absence was costly.</p><p>Second, the five-day total window left a twelve-day gap with no contact before the next campaign send landed. Subscribers who did not convert in the welcome window were receiving brand communications again after nearly two weeks of silence, and by then the connection had faded.</p><p>We rebuilt the series to six emails over fourteen days following the framework above. Email 2 was rewritten as a pure brand story with no product push. Email 3 introduced the top three products for first-time buyers with real review excerpts that named specific outcomes. Emails 4 and 5 covered the two most common questions the support team received from pre-purchase customers. Email 6 was a clean offer close with a five-day expiry. One job. One CTA.</p><p>Within sixty days, the conversion rate from the welcome series increased by roughly a third compared to the previous three months. The biggest single driver was closing the gap between day five and day fourteen. Subscribers who would previously have fallen into silence were still receiving relevant contact from the brand and converting at a meaningful rate across the Email 4 to Email 6 window.</p><h3>Audit Checklist</h3><ul><li><p> Email 1 fires within five minutes of signup confirmation, not on a batched schedule</p></li><li><p> The incentive or promised content is in the first viewport of Email 1, not buried below the fold</p></li><li><p> There is a dedicated brand story email (not a product catalogue with an intro paragraph)</p></li><li><p> At least one email in the series features specific, outcome-oriented reviews rather than generic positive sentiment</p></li><li><p> No two emails are sent less than 24 hours apart (except Email 1, which is immediate)</p></li><li><p> The series runs at least ten days, with coverage extending to day twelve or fourteen for the offer close</p></li><li><p> Subscribers who purchase at any point in the series are tagged and moved out of the welcome flow into post-purchase</p></li><li><p> The final email has a single CTA and a specific offer expiry rather than an open-ended "shop now" prompt</p></li><li><p> The series has been reviewed against current Klaviyo Benchmark data for your product category to sanity-check open and conversion rates</p></li><li><p> Every email in the series has one primary job. If you can name two equal jobs, split the email or cut the weaker one</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://tips.remint.email/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en-gb&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Remint is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>