Category: Newsletters

  • Newsletter unsubscribe links: where platforms place them and why

    Newsletter unsubscribe links: where platforms place them and why

    Newsletter unsubscribe links: where platforms place them and why
    Photo: Alphabet, Inc. via Wikimedia Commons (Public domain)

    Unsubscribe links sit in the footer of every newsletter you send. But where in that footer—and how prominently—varies wildly across platforms. That placement isn’t just aesthetic. It changes deliverability, spam complaint rates, and reader behavior in ways most operators never notice until something breaks.

    Here’s how the major platforms handle it, what each approach signals to inbox providers, and when you should care enough to override the default.

    Footer vs. header: what the platforms do

    Most ESPs place the unsubscribe link in the email footer by default. Beehiiv, ConvertKit, MailerLite, and Substack all default to footer placement, typically in small gray text beneath your content and any footer copy you’ve added.

    Some operators ask about header placement—putting the unsub link at the top of the email, reasoning that transparency builds trust. Gmail’s one-click unsubscribe feature (which surfaces a prominent “Unsubscribe” button at the top of the interface) made this conversation louder in early 2024, but that feature pulls from the List-Unsubscribe header in your email’s metadata, not from visible link placement in your HTML.

    Moving your visible unsubscribe link to the email header doesn’t improve deliverability. It just makes it easier for casual readers to bail before they’ve read anything. The data from operators who’ve tested this consistently shows higher unsub rates with no measurable improvement in engagement from the readers who stay.

    How spam filters read unsubscribe placement

    Inbox providers—Gmail, Outlook, Yahoo—look for two signals: a visible unsubscribe link in the email body, and a List-Unsubscribe header with either a mailto or HTTPS endpoint. Both matter, but the header matters more.

    When the header is present and functional, Gmail and Yahoo display their own one-click unsubscribe button. If the header is missing or broken, they rely on the visible link in your email body. If that’s hard to find—buried in a wall of fine print, styled to blend with the background, or located off-screen on mobile—spam filters flag it.

    Most platforms handle the header automatically. Postmark, for example, injects a List-Unsubscribe header by default on all sends if you’ve set up suppression lists. Brevo and MailerLite do the same. If you’re self-hosting your email sends via SMTP or API, you need to add this header manually.

    The visible link’s placement matters less to filters than its presence and clarity. Filters scan for the word “unsubscribe” or “opt out” in the lower third of the email. If it’s there, in a legible font size (at least 10px), you’re fine. If you hide it in an image, use a euphemism (“manage preferences” alone doesn’t count), or require multiple clicks to complete the action, you risk spam folder placement—especially on Yahoo and Outlook.

    Reader behavior: bottom vs. really bottom

    There’s footer placement, and then there’s footer placement. Some operators bury the unsubscribe link below their mailing address, company registration details, and three lines of legal disclaimers. Others put it directly beneath the last content block, in the same font size as the rest of the email.

    The conventional wisdom says to make unsub easy but not prominent. The data backs that up. A 2025 analysis of 800+ newsletters by Inbox Collective found that emails with unsubscribe links placed within two scrolls of the main content had 12% lower spam complaint rates than emails where the link required three or more scrolls on mobile. Spam complaints—not unsubscribes—are the real deliverability killer. When readers can’t find the unsubscribe link, they hit “Report spam” instead.

    If your spam complaint rate is above 0.1%, check your footer. Open your last send on a phone. Count how many swipes it takes to reach the unsubscribe link. If it’s more than two, move it up or cut the text above it.

    When to customize your unsubscribe flow

    Most platforms give you a one-click unsubscribe: the reader clicks the link, lands on a confirmation page, and they’re out. Some operators add a preferences page instead—offering options to reduce frequency, switch to a digest, or unsubscribe from specific content types.

    This works if you have multiple send types and segments worth preserving. If you’re sending one weekly newsletter, a preferences page just adds friction. The reader who wanted out still wants out; now they’re annoyed.

    The exception: if you’re seeing high unsub rates on specific campaigns but low rates overall, a preferences step lets you isolate what’s driving exits. ConvertKit and MailerLite both support custom unsubscribe pages. Set one up, track which options readers pick, and adjust your content mix accordingly.

    If you’re running a free newsletter funded by sponsors or affiliates, you might be tempted to add a “Are you sure?” interstitial or an exit survey. Don’t. Every extra step increases the chance the reader hits “Report spam” instead of finishing the unsub flow. You can ask for feedback after they’ve unsubscribed—on the confirmation page—but not before.

    The one thing to check this week

    Send yourself a test email from your ESP. Open it on your phone. Scroll to the unsubscribe link and tap it. If the process takes more than two taps and five seconds, simplify it. Then check your spam complaint rate in your sending dashboard. If it’s above 0.08%, your unsubscribe flow is probably part of the problem.

    Want more breakdowns like this? Subscribe to One Two Three Send for weekly deep dives on the tools and tactics that power solo content businesses.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • ConvertKit subscriber tagging: how bulk operations skip edge cases

    ConvertKit’s tagging system is the backbone of most automation workflows. Tags trigger sequences, segment broadcasts, and decide who sees what offer. But bulk tagging operations—applying or removing tags across hundreds or thousands of subscribers at once—don’t always behave the way you’d expect.

    If you’ve ever run a bulk tag operation and found that a handful of subscribers didn’t get tagged, or that a tag removal left stragglers behind, you’ve hit one of the edge cases that bulk actions don’t always catch. Here’s what’s happening under the hood, and when to double-check your work.

    How ConvertKit processes bulk tag operations

    When you apply a tag to a segment or a filtered list, ConvertKit queues the operation and processes it in batches. For small lists—under a few hundred subscribers—this happens almost instantly. For larger lists, it can take several minutes.

    During that processing window, subscribers can move in and out of the original selection criteria. If someone unsubscribes, completes a sequence, or gets manually moved to a different form while the bulk operation is running, they may or may not receive the tag, depending on when the batch processor reaches them.

    This isn’t a bug—it’s how background jobs work when you’re operating on a live dataset. But it means that bulk tagging isn’t always atomic. If your workflow depends on every subscriber in a segment receiving a specific tag, you need to verify after the fact.

    Edge cases that skip subscribers

    Three scenarios consistently produce incomplete bulk tag operations:

    Subscribers added mid-operation. If you’re tagging everyone on a form, and someone submits that form while the bulk operation is running, they may not receive the tag. ConvertKit snapshots the list when you initiate the operation, so late arrivals aren’t included.

    Subscribers moving between sequences. If a subscriber is transitioning from one automation sequence to another at the exact moment a bulk tag operation runs, they can fall into a timing gap. The tag operation checks their current sequence state, but if that state is mid-transition, the tag may not apply.

    Manual imports overlapping bulk operations. If you’re importing a CSV and simultaneously running a bulk tag operation on a segment that includes those new subscribers, the import and the tag operation can race. Depending on which finishes first, some imported subscribers may not get tagged.

    None of these are common—most bulk operations complete without issue. But if you’re running a high-stakes workflow (like tagging everyone who should receive a refund, or segmenting a product launch list), these edge cases matter.

    When to audit your bulk operations

    You don’t need to verify every bulk tag operation. But if any of the following apply, run a post-operation check:

    • You’re tagging more than 5,000 subscribers at once
    • The segment criteria include multiple overlapping tags or sequences
    • You’re running the operation during high-traffic hours (e.g., immediately after a broadcast)
    • You’re tagging subscribers who are also enrolled in active automation sequences
    • You’ve recently imported subscribers via CSV

    To verify, create a new segment using the same criteria as your original bulk operation, then filter by the tag you just applied. If the segment count matches the original selection, you’re clean. If it’s off by more than a handful, re-run the operation or apply the tag manually to the stragglers.

    A non-obvious workaround

    If you’re running a bulk operation that absolutely cannot miss anyone, split it into smaller batches. Instead of tagging an entire 10,000-subscriber segment at once, filter it into five 2,000-subscriber segments and tag each one separately, with a few minutes between operations.

    This gives ConvertKit’s background job processor time to finish each batch cleanly, and reduces the chance of subscribers moving mid-operation. It’s slower, but it eliminates most edge cases.

    You can also use ConvertKit’s API to apply tags programmatically, which gives you more control over error handling and retries. If you’re comfortable with a bit of scripting, the API’s POST /tags/{tag_id}/subscribe endpoint lets you tag subscribers one at a time, with immediate confirmation of success or failure.

    Keep reading

    Bulk operations are one of the fastest ways to manage large subscriber lists, but they’re not foolproof. If you’re running high-volume workflows, take the extra minute to verify your results—especially when the outcome matters.

    Want more breakdowns of how newsletter tools actually work? Subscribe to One Two Three Send for weekly deep-dives on the mechanics behind the platforms you use every day.

  • Beehiiv’s Boost network: how the referral exchange actually works

    Beehiiv’s Boost network: how the referral exchange actually works

    Beehiiv's Boost network: how the referral exchange actually works
    Photo: Johan Schiff/Miljöpartiet de gröna via Wikimedia Commons (CC0)

    Beehiiv‘s Boost network is a built-in recommendation marketplace that lets newsletter operators cross-promote with each other—without cold outreach or manual swaps. You list your newsletter, set a cost-per-subscribe bid, and Beehiiv surfaces your publication in other creators’ recommendation slots.

    It’s not a magic growth lever, but it is one of the few platform features that actually drives net-new subscribers without requiring you to build an audience somewhere else first. Here’s how it works under the hood, when it makes sense to use, and the one setting that changes your entire cost structure.

    How Boost recommendations surface

    When a reader subscribes to a Beehiiv newsletter, the confirmation page can display a grid of recommended publications. If the operator has enabled Boost, some of those slots are filled by paid recommendations from other newsletters in the network. Beehiiv runs an auction: the highest bidder for that audience segment wins the slot.

    You don’t pay per impression. You pay per verified subscribe—meaning someone clicked your recommendation, entered their email, and confirmed (if double opt-in is required). Beehiiv tracks this end-to-end and charges your account balance once the subscriber is verified.

    The minimum bid is typically $1.00 per subscriber, but competitive niches (business, finance, tech) often see effective bids closer to $2.00–$4.00. You set a daily budget cap and a maximum cost-per-acquisition, and Beehiiv pauses your campaign when either limit is hit.

    Who it works for (and who it doesn’t)

    Boost makes the most sense if you’re already monetising subscribers and know your lifetime value. If a subscriber is worth $8 to you over six months—through ads, affiliate commissions, or paid upgrades—then paying $3 to acquire them is sustainable. If you’re pre-revenue and treating growth as a pure attention play, Boost becomes expensive quickly.

    It also works better for generalist or accessible topics. A newsletter about «productivity for remote workers» will find more available impression inventory than one about «Rust async runtime internals.» Beehiiv’s network skews toward business, creator economy, and lifestyle content; if your niche is narrow, you’ll spend more per subscriber or exhaust available inventory fast.

    One major limitation: you can’t target by topic with surgical precision. Beehiiv offers basic category filters (business, tech, health, etc.), but you can’t specify «only show my SaaS newsletter to readers who subscribe to other B2B SaaS newsletters.» The algorithm learns over time which placements convert, but early campaigns are broad.

    The setting most operators miss: subscriber quality filters

    Buried in the Boost campaign setup is a toggle called Premium Placements. When enabled, Beehiiv only shows your newsletter on confirmation pages for publications with strong engagement metrics—typically above 40% open rate and low unsubscribe rates.

    This cuts your available inventory by roughly half, but the subscribers you acquire tend to stick. In practice, turning this on increases your cost-per-subscribe by 20–30%, but reduces 30-day churn by nearly the same margin. If you’re optimising for retained subscribers rather than raw list growth, it’s worth the trade.

    Most operators leave it off by default because Beehiiv doesn’t surface it prominently during onboarding. It’s in the campaign settings under Advanced Options, and the UI doesn’t explain the churn impact—just that it “prioritises high-quality placements.”

    When to pause (or skip entirely)

    Boost isn’t a substitute for organic growth. If you don’t have a clear monetisation model or you’re still testing content-market fit, paying $2–$4 per subscriber usually doesn’t pencil out. It works when you’ve already validated that your content converts and retains, and you’re ready to add paid acquisition as a supplement to organic channels.

    It also doesn’t replace SEO, social, or referral loops. Boost subscribers arrive cold—they know nothing about you except a two-sentence pitch and a thumbnail. If your onboarding sequence isn’t strong, they churn fast. Operators who succeed with Boost typically have a welcome series that delivers immediate value and sets clear expectations within the first three emails.

    One other watch-out: Beehiiv’s auction pricing can spike during high-inventory periods (end of quarter, January resolution season). If your campaign suddenly doubles in cost-per-subscribe, check whether you’re bidding during a demand surge and consider pausing until costs normalise.

    Want more breakdowns like this? Subscribe to One Two Three Send for weekly deep-dives on the tools and tactics that actually move the needle for online operators. One email, no fluff, every Sunday.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Newsletter spam complaints: when 0.1% flags your entire domain

    Newsletter spam complaints: when 0.1% flags your entire domain

    Newsletter spam complaints: when 0.1% flags your entire domain
    Photo by Brett Jordan on Unsplash

    Most operators watch open rates and unsubscribes. Almost nobody watches spam complaint rate until their entire sending domain gets flagged.

    A spam complaint happens when a recipient clicks “Report spam” or “Mark as junk” in their email client. That signal goes back to the inbox provider—Gmail, Outlook, Yahoo—and gets logged against your sending domain and IP address.

    The threshold that matters: 0.1% complaint rate. That’s one complaint per thousand delivered emails. Cross that line consistently, and inbox providers start filtering your mail to spam for everyone, not just the people who complained.

    How complaint rate differs from unsubscribe rate

    Unsubscribes are visible to you. Someone clicks your footer link, your platform logs it, and they’re removed from your list. Complaint rate is mostly invisible.

    When someone marks your email as spam, most inbox providers don’t tell you. Gmail’s postmaster tools show aggregate complaint data if you’ve set up domain authentication. Outlook offers JMRP and SNDS dashboards. Yahoo has a feedback loop you can register for. But unless you’ve configured these—and most solo operators haven’t—you’re flying blind.

    Even worse: a complaint doesn’t automatically unsubscribe the recipient from your platform’s perspective. They’re still on your list. You keep sending. They keep marking as spam. Your complaint rate climbs.

    Postmark surfaces complaint rate in the main dashboard because it affects deliverability faster than almost any other metric. If you’re on a shared sending platform without complaint monitoring, you’re trusting that the platform is watching it for you—and many don’t surface it until you’re already in trouble.

    What drives complaints up

    The most common cause isn’t content quality. It’s expectation mismatch.

    Someone signed up for a lead magnet. You start sending a weekly newsletter. They don’t remember opting in, or they expected one email, not fifty. Instead of scrolling down to find the unsubscribe link, they click “Report spam.” It’s faster.

    Older recipients and mobile users hit the spam button more often. On mobile, the unsubscribe link is small, sometimes hidden in a collapsed footer, and requires extra taps. The spam button is right there in the toolbar.

    Other complaint drivers:

    • Long gaps between sends. You send once, then nothing for three months, then resume. Recipients forget who you are.
    • Sending to old lists. Addresses that haven’t engaged in a year are far more likely to complain when you re-appear.
    • Misleading subject lines. Promising something the email doesn’t deliver makes people angry.
    • No recognizable “From” name. If your sender name is a domain or an unfamiliar business name, recipients assume it’s spam.

    What happens when you cross 0.1%

    Inbox providers don’t warn you. They just start filtering.

    Gmail moves your mail to spam for everyone, not just complainers. Outlook does the same, often within hours. Yahoo’s filters are aggressive—cross 0.2% and you’re done.

    Fixing it takes weeks, not days. You need to:

    • Stop sending to anyone who hasn’t engaged recently (90 days is a safe threshold).
    • Improve your unsubscribe link visibility—put it at the top and the bottom.
    • Send a re-engagement campaign to dormant subscribers and remove non-responders.
    • Wait. Domain reputation recovers slowly. Complaint rate has to stay under 0.05% for two to four weeks before filtering eases.

    Switching to a new sending domain doesn’t fix it if you’re taking the same list with you. The complaints follow the behavior, not just the domain.

    Monitoring before it’s too late

    Set up Google Postmaster Tools and Microsoft SNDS even if you’re on a managed platform. These give you domain-level complaint data that your ESP might not surface.

    If your platform does show complaint rate—Postmark, Brevo, and MailerLite all do—check it weekly. Anything above 0.05% is a yellow flag. Above 0.08% and you need to act immediately.

    The fastest fix: make your unsubscribe link impossible to miss. Put it in the first paragraph if you have to. A higher unsubscribe rate is infinitely better than a rising complaint rate, because unsubscribes don’t kill your domain.

    If you’re seeing complaints climb and you don’t know why, look at your most recent sign-up source. Did you import a list? Run a giveaway that attracted freebie-seekers? Change your content format without warning? Complaint spikes almost always trace back to a list-quality issue in the prior 30 days.

    Want operator tactics like this in your inbox? Subscribe to One Two Three Send for weekly deep-dives on the tools and platform mechanics that matter.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • ConvertKit visual automations trigger twice when tags overlap

    ConvertKit visual automations trigger twice when tags overlap

    ConvertKit visual automations trigger twice when tags overlap
    Photo: Rlistmedia via Wikimedia Commons (CC BY 4.0)

    ConvertKit’s visual automation builder lets you create subscriber journeys triggered by tags, form submissions, product purchases, and other events. It’s more flexible than the older rule-based sequences—but that flexibility introduces a subtle bug that can send duplicate emails to the same subscriber.

    If a subscriber meets more than one entry condition at the same time, they can enter the same automation twice. The platform doesn’t deduplicate entries by default, so a single action can spawn two parallel runs of the same workflow.

    How the overlap happens

    Visual automations accept multiple triggers. You might configure an automation to start when a subscriber gets tagged “Lead Magnet A” or when they submit a specific form. If someone submits that form and your form settings apply the tag automatically, both triggers fire.

    ConvertKit processes each trigger independently. The subscriber enters once via the form trigger, and again via the tag trigger. If your automation sends a welcome email as step one, they receive two copies within seconds of each other.

    This also happens when you use Zapier or API calls to apply tags. If your Zap adds a tag and triggers a webhook that also starts the automation, you’ve created two entry points for the same event.

    Where it breaks workflows

    Duplicate entries don’t just mean duplicate emails. If your automation includes conditional splits, each instance of the subscriber moves through independently. A subscriber in two parallel runs can trigger different paths based on timing—one instance might hit a delay while the other checks a condition immediately.

    This gets worse in automations with wait steps. A subscriber paused for three days in one run might complete a purchase during that window, which your second parallel run detects immediately. Now they’re receiving emails from two conflicting sequences: one treating them as a lead, the other as a customer.

    ConvertKit’s reporting doesn’t surface this clearly. The automation analytics show total entries and completions, but don’t flag when the same email address enters multiple times. You’ll see inflated entry counts without realizing some subscribers are being double-processed.

    How to prevent it

    The safest fix is to use a single trigger per automation. If you need multiple entry points, create separate automations for each and funnel subscribers into a shared tag-based sequence after the initial step.

    Alternatively, add a filter at the start of your automation that checks for an exclusion tag. The first action in your workflow applies a tag like “Automation-Started-Welcome-Series,” and the entry conditions exclude anyone who already has that tag. This blocks the second parallel run before it sends anything.

    You can also audit your form settings and Zapier workflows. If a form already triggers an automation, don’t also apply a tag that serves as a separate trigger for the same workflow. Pick one mechanism and stick with it.

    For API users, check whether your webhook handler and tag application both fire automations. If you’re using ConvertKit’s subscriber tagging endpoint, make sure your webhook doesn’t also trigger on that tag event unless you’ve built in deduplication logic on your end.

    What ConvertKit could do

    Other platforms like ActiveCampaign and Drip deduplicate automation entries by default. If a contact is already active in an automation, a second trigger either gets ignored or restarts the sequence from the beginning—your choice via a setting.

    ConvertKit doesn’t offer this. The visual builder treats each trigger as independent, with no native deduplication toggle. You can request it via their feature feedback form, but as of September 2026, it’s not on the public roadmap.

    Until then, the workaround is manual: simplify your triggers, use exclusion tags, and test every automation with a real subscriber before turning it on for your full list.

    Have you hit this issue in ConvertKit or another platform? Reply and let me know how you solved it—I’ll share the best workarounds in a follow-up.

  • Newsletter double opt-in: when confirmation emails cost you 40% signup loss

    Newsletter double opt-in: when confirmation emails cost you 40% signup loss

    Newsletter double opt-in: when confirmation emails cost you 40% signup loss
    Photo by Stephen Phillips – Hostreviews.co.uk on Unsplash

    Every newsletter platform offers double opt-in as a setting. Most treat it as a deliverability best practice. Some operators swear by it. Others disable it immediately and never look back.

    The truth is more nuanced: double opt-in trades signup volume for list quality, and the cost is steeper than most operators realize.

    What double opt-in actually does

    Single opt-in adds an email address to your list the moment someone submits the form. Double opt-in sends a confirmation email first, requiring the subscriber to click a verification link before they’re added.

    The intent is defensible: it blocks typos, spam traps, and fake signups. It proves the address is real and the owner consented. ISPs like Gmail and Outlook treat double opt-in lists more favorably because confirmed subscribers complain less and engage more.

    But here’s the friction cost: industry averages show 30–50% of people who submit a signup form never click the confirmation link. That’s not because they changed their mind—it’s because the email landed in spam, they closed the tab, or they got distracted. You lose nearly half your signups to inbox logistics.

    When double opt-in makes sense

    If you’re running paid traffic to a lead magnet, double opt-in is expensive. You’re paying per click, and half those clicks evaporate before they become subscribers. The math gets worse if your cost-per-lead is above $2.

    Double opt-in works better when:

    • You’re in a high-regulation jurisdiction (GDPR-heavy EU markets treat double opt-in as safer legal ground)
    • Your content attractsbot traffic or low-intent freebie hunters
    • You’re sending high-frequency emails and need engaged subscribers who won’t mark you as spam
    • Your list monetization depends on open rates or click-through performance, not raw size

    Platforms handle the setting differently. Beehiiv defaults to single opt-in but lets you toggle double opt-in per form. MailerLite offers both, with double opt-in recommended for EU-based audiences. Brevo enforces double opt-in for free-tier accounts but allows single opt-in on paid plans once your sender reputation is established.

    What the confirmation email reveals

    If you enable double opt-in, the confirmation email becomes your first deliverability test. If 60% of confirmation emails never get clicked, check your sending domain’s SPF and DKIM records—those subscribers might not be ignoring you; they might never have seen the message.

    Postmark, which handles transactional email and small-volume newsletters, publishes delivery stats by mailbox provider. Confirmation emails to Gmail addresses see 92–96% inbox placement when authentication is correct. Yahoo and Outlook sit closer to 85–88%. If your confirmation rate is below 50%, it’s not a subscriber problem—it’s a delivery problem.

    One fix: customize the confirmation email subject line. Default text like “Please confirm your subscription” gets filtered aggressively. Try something specific to your content: “Your [Topic] guide is one click away” performs better because it reminds the reader why they signed up.

    The hybrid approach

    Some operators split the difference: single opt-in for organic traffic, double opt-in for paid. Most platforms don’t support conditional opt-in logic natively, but you can approximate it by creating separate forms with different settings.

    Another tactic: enable single opt-in, but send a welcome email immediately with a soft call to action—”Reply and tell us what you want to read about.” Replies signal engagement to ISPs almost as effectively as a confirmation click, and you get qualitative feedback in the process.

    If you’re optimizing for subscriber count and you trust your traffic sources, single opt-in wins. If you’re optimizing for engagement metrics and long-term deliverability, double opt-in pays off over six months. There’s no universal answer, but the 40% conversion penalty is real, and it’s worth measuring in your own signup flow before you commit.

    Have a question about newsletter setup, deliverability, or platform quirks? Reply to this email—operator questions shape future articles.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Newsletter referral programs reward shares, not subscribers—here’s why

    Newsletter referral programs reward shares, not subscribers—here’s why

    Newsletter referral programs reward shares, not subscribers—here's why
    Photo by Team Nocoloco on Unsplash

    Newsletter referral programs look simple: existing subscriber shares your newsletter, someone new signs up through their link, original subscriber gets credit. But the mechanics under the hood reveal a design choice that changes how you should think about rewards, milestones, and fraud prevention.

    Most platforms—including Beehiiv, Sparkloop, and UpViral—credit the referrer at the moment of the share action or initial click, not when the new subscriber confirms their email or becomes active. That’s not an oversight. It’s a deliberate trade-off between attribution accuracy and user experience.

    Why platforms credit the share, not the conversion

    If a platform waits to credit the referrer until the new subscriber confirms their email, you introduce a 24-to-48-hour delay before the referrer sees any progress toward their reward. That delay kills momentum. People share once, see no movement on their dashboard, and assume the system isn’t working.

    Crediting the share immediately gives the referrer instant feedback. They see their count tick up within seconds. That dopamine hit encourages them to share again.

    The downside: you’re counting referrals that never convert. If someone shares your newsletter and ten people click but only three confirm their email addresses, the referrer gets credit for ten. Your dashboard shows ten referred subscribers, but your email list only grows by three.

    Beehiiv‘s referral system, for example, increments the referrer’s count when someone lands on the signup page via their unique link and submits an email address—before double opt-in confirmation. If that person never clicks the confirmation email, Beehiiv doesn’t automatically deduct the referral credit. You’re left with inflated referral counts and a smaller list than your referral leaderboard suggests.

    What this means for milestone design

    If you’re running a referral program with tiered rewards—get five referrals, unlock a PDF; get 25, get a one-on-one call—you need to account for the gap between credited referrals and confirmed subscribers.

    A conservative multiplier: assume 60-70% of credited referrals will actually confirm and stay active. If you want someone to genuinely deliver 25 new subscribers to your list, set the milestone at 35-40 credited referrals. That’s not padding—it’s compensating for the way the system counts.

    Some operators do the opposite. They set lower thresholds and accept that referral credits overstate real growth. The logic: referral programs are about engagement and word-of-mouth momentum, not precise list-building math. If someone shares your work enough to rack up 40 credited referrals, they’ve done the work even if only 25 people actually joined.

    Both approaches work. The mistake is setting a milestone at, say, ten referrals, expecting ten confirmed subscribers, and then feeling cheated when your list only grows by six.

    Fraud and gaming the system

    Because platforms credit the share action, referral programs are vulnerable to bulk fake signups. Someone creates a dozen disposable email addresses, uses their own referral link, submits all twelve emails, and immediately gets credit for twelve referrals—even though none of those addresses will ever open an email.

    Most platforms have basic fraud detection: they flag referrals from the same IP address, block known disposable email domains, and penalize accounts that rack up referrals with zero engagement. But enforcement is reactive, not preventive. If someone wants to game your referral leaderboard, they can do it for at least a few days before the system catches up.

    The operator-side fix: build engagement thresholds into your rewards. Don’t just offer a reward at ten referrals—require that at least seven of those ten people open an email in the first 30 days. Sparkloop and some custom-built systems let you set that kind of conditional unlock. Beehiiv doesn’t natively support engagement-based milestones, so you’d need to manually audit your leaderboard before delivering high-value rewards like coaching calls or physical products.

    When conversion-based crediting makes sense

    A few platforms—mostly custom-built referral systems using tools like Rewardful or ReferralCandy—let you choose when to credit the referrer. You can configure the system to wait until the new subscriber confirms their email, opens their first email, or even makes a purchase (if you’re running a paid newsletter).

    That approach eliminates inflated counts, but it introduces the delay problem. If your audience is sophisticated enough to understand that referral credit takes 24-48 hours to appear, it works. If your audience skews toward casual readers who expect instant feedback, the delay will depress sharing behavior.

    One middle path: credit the share immediately, but display two numbers on the referrer’s dashboard—”total shares” and “confirmed subscribers.” Transparency costs you nothing, and it sets expectations. If someone sees they’ve sent 15 people to your signup page but only 9 confirmed, they understand the gap without feeling penalized.

    Most newsletter platforms don’t offer that dual display by default. You’d need to build it yourself or accept that your referral dashboard is a directional indicator, not a precise accounting tool.

    What to do now

    If you’re running a referral program, audit your current milestone structure. Check the gap between credited referrals and actual confirmed subscribers over the last 30 days. If the gap is more than 20%, adjust your milestones upward or add engagement requirements before delivering rewards.

    If you’re designing a new referral program, decide whether you’re optimizing for momentum (credit the share) or accuracy (credit the conversion). Most solo operators should optimize for momentum. Referral programs live or die on early enthusiasm, and nothing kills enthusiasm faster than a dashboard that doesn’t move.

    Got a referral program question? Reply to this email—I read every response.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • ConvertKit vs. MailerLite: which one actually delivers better?

    ConvertKit and MailerLite both land on every “best newsletter platform” list. Both promise high deliverability. Both offer free tiers, automation builders, and landing pages. So which one actually gets your emails into inboxes more reliably?

    The short answer: it’s closer than you think, and deliverability alone probably shouldn’t decide this.

    Deliverability reputation and shared IP pools

    Both platforms use shared IP pools for most senders. That means your emails go out alongside thousands of other newsletters. If you’re on the Creator plan at ConvertKit (starts at $25/month for 1,000 subscribers) or any paid MailerLite tier (starts at $9/month for the same size), you’re sharing infrastructure with everyone else at your tier.

    ConvertKit’s advantage: they segment pools by sender reputation. High-engagement senders get routed through better-performing IPs. MailerLite uses a flatter pool structure, though they do isolate problematic senders.

    In practice, third-party inbox placement studies from mid-2025 through early 2026 show both platforms landing 92–96% of emails in primary inboxes for senders with clean lists and consistent engagement. The difference is statistically narrow—often within 2 percentage points depending on the test cohort.

    What matters more: your own list hygiene. A 40% open rate on MailerLite will outperform a 15% open rate on ConvertKit every time.

    Deliverability tooling: where they differ

    ConvertKit includes SPF and DKIM setup in onboarding, but custom domain sending (the “from” address uses your domain, not convertkit.com) requires a paid plan. MailerLite offers custom domain sending on all paid plans, including the $9 tier.

    Both platforms enforce list verification and double opt-in by default. ConvertKit is stricter about imported lists—they’ll flag high bounce rates faster and throttle sending if you upload a stale list. MailerLite gives you slightly more rope, which can be a liability if you’re not careful.

    Neither platform offers dedicated IPs on standard plans. ConvertKit Creator Pro (starts at $50/month) includes that option. MailerLite requires you to contact sales for dedicated IP pricing, typically starting around $80/month for higher-volume senders.

    Where ConvertKit pulls ahead

    Automation sophistication. ConvertKit’s visual builder lets you branch on link clicks, tag additions, custom field values, and purchase behavior. If you’re running a funnel with lead magnets, trip-wire offers, and product launches, ConvertKit’s logic handles complexity better.

    Subscriber tagging is more flexible. You can apply multiple tags per action, segment by tag combinations, and trigger sequences based on tag presence or absence. MailerLite has groups and segments, but the tagging system feels more rigid once you’re past 3,000 subscribers.

    Paid newsletter integration is native. ConvertKit Commerce lets you sell subscriptions and digital products without connecting Stripe separately. Revenue share is 3.5% + transaction fees. MailerLite requires third-party integrations for paid memberships.

    Where MailerLite wins

    Price. For the same 5,000 subscribers, ConvertKit charges $66/month. MailerLite charges $30/month. That’s $432/year in savings, which matters when you’re bootstrapped.

    Drag-and-drop email builder. ConvertKit’s editor is intentionally simple—plain text with minimal formatting. MailerLite gives you a visual editor with image blocks, buttons, columns, and templates. If your newsletter includes product showcases or event promotions, MailerLite’s design flexibility shows.

    Included features at lower tiers. Landing pages, pop-up forms, and A/B testing are available on MailerLite’s $9 plan. ConvertKit gates landing pages behind the $25 tier and limits forms on the free plan.

    Built-in website builder. MailerLite added a simple site builder in late 2025. It’s not WordPress, but if you need a landing page hub without spinning up hosting, it’s included.

    Who should pick which

    Choose ConvertKit if you’re running a creator business with multiple offers, a segmented audience, and automation sequences that branch based on behavior. The extra cost pays for itself if you’re monetizing through courses, coaching, or premium subscriptions.

    Choose MailerLite if you’re launching, your list is under 10,000, and you need a full-featured platform without spending $500+/year. The design flexibility and lower price make it easier to experiment before you’ve nailed product-market fit.

    Switch between them? Both platforms let you export your list as CSV. Automation sequences don’t transfer cleanly—you’ll rebuild those by hand. Expect half a day of work to migrate 3,000+ subscribers.

    Want more tool breakdowns like this? Subscribe to One Two Three Send and get operator-focused comparisons every week—no affiliate fluff, just what actually works.

  • Newsletter header preloading: when Outlook blocks external images

    Newsletter header preloading: when Outlook blocks external images

    Newsletter header preloading: when Outlook blocks external images
    Photo by Markus Winkler on Unsplash

    Most newsletter platforms let you upload a header logo or hero image that sits at the top of every send. It lives on a CDN somewhere, gets referenced in your email HTML, and appears when subscribers open the message—unless they’re using Outlook with default security settings.

    Outlook blocks external images by default. That’s not new. But the way it treats image preloading—and the specific conditions under which it does load images automatically—matters more than most operators realize, especially if your branding or layout depends on that header rendering correctly.

    How Outlook’s image blocking actually works

    When someone opens an email in Outlook (desktop or web), the client checks whether the sender’s domain is in the recipient’s safe sender list. If it’s not, Outlook blocks all external image requests and shows a placeholder bar: “Right-click here to download pictures. To help protect your privacy, Outlook prevented automatic download of some pictures in this message.”

    Your logo, your hero image, your inline graphics—all blocked until the recipient manually enables images for that message or adds your sending domain to their safe list.

    This affects roughly 15–20% of B2B newsletter audiences, depending on industry. Enterprise inboxes default to Outlook, and most users never change the image settings.

    When preloading doesn’t help

    Some platforms offer “image preloading” or “image caching” as a feature. The idea: the platform fetches your images, hosts them on its own domain, and includes them inline or as cached assets so they load without external requests.

    That works for tracking pixels and some layout images, but it doesn’t bypass Outlook’s block if your header is still hosted externally—or if the platform’s CDN domain isn’t recognized by the recipient’s safe sender configuration.

    Beehiiv and MailerLite both cache images on their own delivery infrastructure, which improves load speed and reduces broken-image rates in most clients. But Outlook treats any external image request as suspect unless the sender domain (not the CDN domain) is whitelisted.

    If your header logo is a separate asset hosted on cdn.yourplatform.com, it’s still an external resource. Outlook blocks it.

    The workaround: inline data URIs

    You can embed small images directly in the email HTML using Base64-encoded data URIs. This removes the external request entirely—the image data lives in the HTML itself.

    Most platforms don’t do this automatically because it increases message size and can trigger spam filters if overused. But for a logo under 10 KB, it’s usually safe.

    In MailerLite, you can manually insert a data URI in the HTML editor. In Beehiiv, you’re limited to the visual builder unless you export and host elsewhere.

    Practical limit: keep data URIs under 15 KB per image, and use them only for critical branding elements. A 2,000-pixel-wide hero image won’t work here.

    What to test before you commit

    Send a test to an Outlook.com address and a corporate Outlook inbox if you have access. Open the message without enabling images. Check:

    • Does your header logo appear, or is it a broken placeholder?
    • Does your layout break without the hero image?
    • Is your CTA button an image, or is it HTML/CSS? (Image-based CTAs are blocked too.)

    If your layout depends on images loading, you need a text fallback or an HTML-based design that works without graphics. That’s not a compromise—it’s baseline deliverability design for any B2B audience.

    When to care about this

    If your newsletter audience skews consumer (Gmail, Apple Mail, Yahoo), Outlook image blocking is a minor edge case. Those clients load images by default.

    If you’re sending to enterprise subscribers, SaaS operators, or corporate decision-makers, Outlook is the majority client in many inboxes. Image-blocking rates jump to 30–40% in some verticals.

    Check your platform’s open-tracking data by client. If Outlook represents more than 15% of opens and your header image is external, you’re losing branding consistency for a meaningful slice of your list.

    Want to compare how different platforms handle image hosting and Outlook compatibility? Reply to this email with your current setup—we’ll add it to a future tool comparison.

    Heads up — some links in this article are affiliate links. If you sign up through them, we may earn a small commission at no extra cost to you. We only recommend tools we use ourselves.

  • Ghost’s native membership feature: when it replaces Stripe Billing

    Ghost’s native membership feature: when it replaces Stripe Billing

    Ghost's native membership feature: when it replaces Stripe Billing
    Photo: Houses of the Oireachtas via Wikimedia Commons (CC BY 2.0)

    Ghost offers a membership feature that sits directly inside the CMS. You connect your Stripe account, set pricing tiers, and Ghost handles recurring subscriptions, member login, and content gating—without ever touching Stripe Billing or Customer Portal.

    If you’re running a paid newsletter or membership site and evaluating Ghost, understanding how this feature works saves you from building redundant infrastructure or assuming you need third-party subscription tools.

    How Ghost’s membership system works

    Ghost integrates with Stripe via the Payments API, not Billing. When a reader subscribes, Ghost creates a Stripe customer, attaches a payment method, and initiates a subscription using its own logic. The subscription object lives in Stripe, but Ghost controls the billing cycle, plan changes, and member status.

    Members log in through Ghost’s member authentication system. Once authenticated, they see gated content based on their tier—free, paid monthly, paid yearly, or custom tiers you define. Ghost handles password resets, email verification, and session management. There’s no separate login portal to maintain.

    You manage members in Ghost’s dashboard. Cancellations, refunds, and tier changes happen there, and Ghost syncs the changes to Stripe. The member never interacts with Stripe directly unless they update their payment method, which Ghost surfaces through a pre-built account page.

    When to use Ghost’s native memberships instead of Stripe Billing

    If your monetization model is straightforward—monthly and yearly subscriptions at fixed prices—Ghost’s built-in system removes complexity. You don’t need to configure Stripe Customer Portal, build webhooks to sync subscription status, or write custom code to gate content. Ghost does it.

    This matters most for solo operators who want to launch paid content quickly. Setting up Stripe Billing properly requires handling webhook events (customer.subscription.updated, invoice.payment_failed, etc.), managing session states, and building account management UI. Ghost eliminates that entirely.

    Ghost also handles proration automatically when members upgrade or downgrade between tiers. If someone switches from monthly to yearly mid-cycle, Ghost calculates the credit and applies it. Stripe processes the payment, but Ghost manages the logic.

    Where Ghost’s system falls short: complex pricing models. If you need usage-based billing, tiered add-ons, or one-time purchase bundles alongside subscriptions, you’ll hit limitations. Ghost’s membership tiers are subscription-only. You can’t mix recurring and one-time payments in the same checkout flow.

    One non-obvious limitation: member import constraints

    Ghost lets you import members via CSV, including existing Stripe customer IDs if you’re migrating from another platform. But here’s what doesn’t transfer cleanly: partial billing cycles.

    If you import a member whose Stripe subscription renews on the 15th of each month, Ghost resets their billing anchor to the import date unless you manually adjust it in Stripe first. That means members might get charged twice in one month—once by your old system, once by Ghost—if you don’t coordinate the cutover carefully.

    The workaround: before importing, pause subscriptions in Stripe, let Ghost recreate them, then cancel the old subscription objects. Or manually set the billing_cycle_anchor in Stripe to align with Ghost’s expected renewal date. Ghost’s import tool doesn’t expose this field, so you handle it via Stripe’s API or dashboard.

    Pricing and platform lock-in

    Ghost’s membership feature is free on self-hosted installs. You pay Stripe’s standard transaction fees (2.9% + $0.30 in the U.S.), but Ghost itself doesn’t take a cut. If you use Ghost’s managed hosting (Ghost(Pro)), pricing starts at $9/month for up to 500 members, then scales based on member count—$31/month for 1,000 members, $79/month for 5,000.

    The lock-in risk: if you outgrow Ghost and want to migrate to a different CMS, your member data exports cleanly (Ghost provides CSV and JSON exports), but you’ll need to rebuild content gating logic and member authentication in your new system. Stripe subscriptions persist, but the integration layer doesn’t.

    One mitigation: Ghost is open-source. If you self-host and later switch platforms, you can keep Ghost running in parallel as a membership backend while moving content elsewhere. It’s not elegant, but it works if you need time to rebuild.

    If you’re launching a paid newsletter or membership site and your pricing fits monthly/yearly tiers, Ghost’s native membership system removes significant backend work. You avoid webhook debugging, portal configuration, and session management. Just know the constraints around pricing flexibility and billing cycle imports before you commit.

    Have a question about Ghost memberships or another platform feature? Reply to this email—we cover reader questions every Sunday.