Author: onetwothreeadmin

  • Claude Projects vs. ChatGPT custom instructions: which to use when

    Claude Projects vs. ChatGPT custom instructions: which to use when

    If you’re using AI to write, research, or automate any part of your online business, you’ve probably hit the same wall: the tool forgets everything between sessions. You end up re-explaining your audience, your voice, your product, and your preferences every single time.

    Both Anthropic and OpenAI offer solutions. Claude has Projects. ChatGPT has custom instructions (and now GPTs, though those are a different beast). They solve the same problem—context persistence—but they work in fundamentally different ways, and picking the wrong one costs you time.

    How Claude Projects work

    Claude Projects let you create a named workspace with its own knowledge base. You upload documents, paste style guides, add background about your business, and then every conversation inside that Project has access to that material.

    Each Project can hold up to 200,000 tokens of reference material (roughly 150,000 words). That’s enough for a full brand guide, product documentation, past article archives, customer research notes, and your editorial calendar all in one place.

    The big advantage: you can have multiple Projects. One for customer support replies, one for content writing, one for course development. Each stays isolated. The AI doesn’t mix context from your SaaS docs into your newsletter drafts.

    Projects are available on Claude Pro ($20/month) and the API. The free tier doesn’t get them.

    How ChatGPT custom instructions work

    Custom instructions are a single set of persistent guidelines that apply to every conversation in your account. You get two text fields: one for context about you, one for how you want ChatGPT to respond.

    The context field is where you explain your business, audience, products, and role. The response field is where you set tone, format preferences, and constraints (e.g., “always use American English,” “never use exclamation marks,” “keep answers under 300 words”).

    The limitation: it’s global. You can’t scope instructions to specific use cases unless you manually turn them off, edit them, or work around them in your prompts. If you want formal tone for client emails and casual tone for social posts, you’re stuck toggling or overriding.

    Custom instructions are free on all ChatGPT tiers, including the free plan. GPT-4 and GPT-4o respect them. GPTs (the custom chatbot builder) bypass custom instructions entirely and use their own system prompts instead.

    When to use Claude Projects

    Use Projects when you have distinct workflows with different context needs. If you’re writing a newsletter, managing a membership community, and building a course, those are three separate Projects. Each gets its own voice guide, audience research, and example library.

    Projects also shine when you need to reference large documents repeatedly. Upload your entire content archive, and Claude can pull from it without you pasting excerpts into every prompt. It’s particularly useful for research-heavy work—competitor analysis, SEO audits, or synthesizing reader feedback.

    The major downside: you have to remember to switch Projects. If you’re in your “newsletter” Project and ask a question about your course, Claude won’t know what you’re talking about. It’s not smart enough to auto-switch.

    When to use ChatGPT custom instructions

    Use custom instructions when your needs are consistent across everything you do. If you’re a solo operator with one brand, one voice, and one audience, global context works fine. Set it once, forget it.

    Custom instructions also work well for constraints and formatting preferences that apply universally. Things like “never use jargon,” “default to bullet points,” or “cite sources inline” belong here. You don’t want to re-specify those in every Project or GPT.

    The catch: if your work varies in tone or scope, custom instructions become a lowest-common-denominator compromise. You’ll end up writing longer prompts to override the defaults, which defeats the purpose.

    The hybrid approach

    Most operators I’ve talked to don’t pick one. They use both tools for different parts of the business.

    Claude Projects handle the heavy, structured work: content production, documentation, research synthesis. ChatGPT with custom instructions handles the quick, ad-hoc stuff: drafting emails, brainstorming headlines, troubleshooting code snippets.

    If you’re paying for both—Claude Pro and ChatGPT Plus both run $20/month—this split makes sense. If you’re only paying for one, pick based on where you spend the most time. Content-heavy businesses lean Claude. Generalists lean ChatGPT.

    Reply to this email if you’re using Projects or custom instructions in a way that’s working (or not). I’m collecting notes for a follow-up on how operators are actually structuring their AI workflows.

    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.

  • What MailerLite is, and how to use it with the One Two Three Send plugin

    What MailerLite is, and how to use it with the One Two Three Send plugin

    For most operators starting a newsletter in 2026, the question isn’t which email platform to pick — it’s which platform won’t bankrupt me before I have any readers. MailerLite‘s answer is the most generous free tier in the industry: 1,000 subscribers and 12,000 emails per month, free, no time limit, no credit card needed. That changes the math for anyone in the first year of a newsletter where revenue is zero and you don’t yet know if the project will work.

    This post is the operator’s guide to MailerLite: what it actually is, the cost math past the free tier, the step-by-step setup with the One Two Three Send plugin, and the honest comparison vs Mailchimp, Beehiiv, ConvertKit, and Substack.

    What MailerLite is, in one paragraph

    MailerLite is a Lithuanian-founded (now GoDaddy-owned) email marketing platform that’s been building toward “the simplest professional email tool” since 2010. It’s the closest thing the industry has to “Mailchimp without the Mailchimp pricing surprises” — a clean drag-and-drop editor, automations, landing pages, signup forms, A/B testing, and an API/SMTP interface that integrates with anything. About 1.5 million businesses use it. The deliverability reputation is solid (not as obsessive as Postmark but materially better than Mailchimp on the same lists in our testing). The killer feature for new operators is a free tier that actually lets you run a newsletter at scale, not a 14-day trial that converts you to $30/month before your first subscriber arrives.

    The case for MailerLite

    Three reasons it shows up in operator stacks more than most people realize:

    1. The free tier is real. Most “free” email platforms are time-limited (14 days), volume-limited (300 emails total), or feature-crippled to push you to upgrade. MailerLite’s free tier gives you 1,000 subscribers and 12,000 sends per month with the full editor, automation, and landing-page tools. The only feature gate is removal of the MailerLite footer — which costs $9/month if you care, $0 if you don’t.

    2. The editor doesn’t fight you. Mailchimp’s editor was the industry standard until about 2018, when they started progressively breaking it for power users. MailerLite kept the editor simple. Drag a block in, type in it, save. Operators coming from Substack (“just give me a textbox”) tolerate it. Operators coming from Mailchimp (“why does this require six clicks?”) love it.

    3. Automations and landing pages are bundled. Welcome sequences, abandoned-form recovery, paid-tier upgrade flows — all built in, no Zapier glue, no third-party email-automation tool layered on top. Same with landing pages: you can build a signup form + thank-you page + welcome email in 20 minutes without leaving the platform.

    The cost reality, with real numbers

    The pricing is structured by subscriber count (not email volume), which is the right unit for newsletter operators.

    SubscribersMailerLiteMailchimp StandardConvertKit CreatorSubstack
    0–1,000$0 (free)$20$1510% of revenue
    2,500$25$45$2910% of revenue
    5,000$39$75$4910% of revenue
    15,000$99$200$14910% of revenue
    50,000$289$385+$37910% of revenue

    For a paid newsletter at $5/month with 5,000 subscribers (50% paid = $12,500/month revenue), Substack takes $1,250/month. MailerLite plus a $20/month Postmark or SES bill takes $59 total. The break-even on switching off Substack to a self-hosted MailerLite + One Two Three Send stack is roughly 250 paid subscribers — at that point the platform fees you’re saving cover the entire stack with money to spare.

    Setup with the One Two Three Send plugin

    The pro plugin has a built-in MailerLite provider — pick it from the dropdown and you’re 90% there. About 10 minutes if you already have a domain.

    Step 1 — Sign up and verify your domain

    Sign up at mailerlite.com. You’ll be asked some onboarding questions about your business; pick “Newsletter” or “Content creator” — answers don’t affect anything functional. Once in, go to Account → Domains and add the domain you want to send from. MailerLite gives you four DNS records to add: SPF, DKIM (two records), and a Return-Path CNAME. Add them all at your DNS provider, click Verify. Done within 10 minutes.

    Skipping any of these — especially the DKIM pair — costs you 5–10% deliverability at Gmail. Don’t skip them.

    Step 2 — Get your API key

    From the MailerLite console, go to Integrations → MailerLite API. Click “Generate new token.” Name it “OTTS plugin.” Copy the token — you’ll only see it once.

    Step 3 — Configure the plugin

    In your WordPress admin, go to Newsletter → Settings → Provider. Pick MailerLite from the dropdown. Paste the API key. Click Save.

    If the pro plugin isn’t installed (you’re on the free One Two Three Send only), the MailerLite option won’t appear — install the pro companion plugin first (it’s free if you’re on the One Two Three Send newsletter list).

    Step 4 — Map your subscriber list

    One Two Three Send keeps subscribers in WordPress (in the otts_subscribers table). MailerLite keeps them in their own subscriber database. The plugin’s MailerLite provider syncs WP subscribers into a MailerLite group of your choice when they sign up. In Settings, pick the MailerLite group ID you want new signups to join (create one in MailerLite first — usually just “Newsletter Subscribers”). Existing subscribers get one-way-synced on the next save.

    Step 5 — Send your first test

    From Newsletter → New Newsletter, write a quick test or generate a draft, hit Send Test to your admin address. The plugin pushes it to MailerLite’s API; MailerLite delivers. Activity shows up in MailerLite’s Reports tab within 30 seconds. Click into the campaign to see the open rate, click rate, and unsubscribe count — all the things MailerLite does well that you’d otherwise need a separate analytics tool for.

    How MailerLite compares to the alternatives

    vs Mailchimp — Mailchimp is what people pick when they don’t know what else to pick. Pricing is roughly 2× MailerLite at every tier above the free plan. Deliverability has slipped over the last 5 years (independent benchmarks consistently put Mailchimp behind both MailerLite and ConvertKit at Gmail). The editor is bigger and more complicated; the automations are slightly more powerful. If you’re already on Mailchimp and don’t have time to migrate, fine. If you’re starting fresh, MailerLite is the better default.

    vs BeehiivBeehiiv is the modern Substack competitor, built specifically for paid newsletters with built-in monetization, referral programs, and a publisher network. The free tier (up to 2,500 subscribers) is generous. Beehiiv is the right pick if you want the publishing platform AND the email engine in one product. MailerLite is the right pick if you want a sending engine and you’re publishing on WordPress.

    vs ConvertKit (now Kit) — Kit is the creator-economy platform of choice — built for course creators, membership site operators, and people who sell digital products through their list. The tagging and segmentation are best-in-class. Pricing is comparable to MailerLite at the low end, slightly more expensive past 5K subscribers. If your business is “newsletter that sells courses,” Kit. If your business is “newsletter,” MailerLite.

    vs Substack — Substack is the easiest path to a paid newsletter at zero technical cost. They take 10% of revenue forever. The math for switching off Substack to MailerLite + WordPress + One Two Three Send: at 250 paid subscribers ($5/month each = $1,250/month revenue), you’re paying Substack $125/month and MailerLite + Postmark + hosting would cost $40 total. The catch is the migration friction — getting your subscribers off Substack onto your own list is the part most operators put off until they’ve already overpaid by years.

    vs Brevo (formerly Sendinblue)Brevo‘s free tier is volume-based (300 emails/day) instead of subscriber-based, which makes it good for transactional but bad for newsletter sends to a 1,000-subscriber list. Stay on MailerLite for newsletters.

    Pitfalls operators hit (in the order they hit them)

    1. Importing a “stale” list. MailerLite’s compliance team reviews your first import. If you upload a list that’s been sitting in a spreadsheet for two years, hasn’t been emailed in months, or includes addresses you got from a giveaway, expect MailerLite to suspend the account pending review. Send to the freshest, most-engaged segment first to establish reputation, then add the older addresses gradually. This isn’t unique to MailerLite — every legitimate provider does this — but they’re stricter than most.

    2. The 5,000-character limit on automation emails. Newsletter content rarely runs into this, but operators who paste long-form essays into welcome-email automations sometimes hit it. Split into multiple emails or reduce the length.

    3. Forgetting to set up DKIM properly. The DKIM records are TWO records (most providers use one). If you only added one, your DKIM signing is broken and Gmail will mark you as Unauthenticated. Check both are showing green in MailerLite’s Domains section before sending real campaigns.

    4. The “engaged subscribers only” reflex. MailerLite has a feature called “send only to engaged subscribers” (people who opened in the last 90 days). Toggle that on to protect deliverability, but don’t ALSO be aggressively pruning your list — you’ll lose subscribers who just don’t open every send but would resubscribe given a re-engagement nudge. Engagement send + occasional re-engagement campaign is the right combo, not “only ever email the openers.”

    5. Form duplicate-handling. If a subscriber fills out your One Two Three Send form AND ALSO a MailerLite-hosted form (e.g. on a landing page), you can end up with the same address counted twice. The plugin de-dupes on the WordPress side; MailerLite de-dupes on theirs. Keep signups going through one path (your WP form, synced via the plugin) and skip MailerLite’s standalone forms unless you have a specific reason.

    6. The ‘paid plan starts immediately’ surprise. If you upgrade from Free to a paid tier, you’re billed for that month in full immediately, prorated only on subsequent months. Time the upgrade for the first day of a calendar month if you can.

    Long-term maintenance

    Less than running your own SES, more than pure Substack.

    Weekly: glance at the Reports tab. Open rates trending down means a deliverability problem; click rates trending down means a content problem. Both are fixable, but only if you notice.

    Monthly: prune subscribers who haven’t opened in 180 days. MailerLite has a built-in “Inactive subscribers” segment — review it, send a re-engagement campaign, then suppress the people who still don’t engage. Inbox providers downgrade your reputation when you keep mailing to inactive addresses.

    Quarterly: review your DNS records. Once a year, a domain registrar will quietly drop a record during a settings reshuffle and nobody will notice for two months. The MailerLite Domains tab shows live verification status; check it.

    Annually: rotate your API token. Generate a new one in MailerLite, paste it into One Two Three Send, deactivate the old one a week later. Ten minutes of maintenance for a meaningful security win.

    When MailerLite is the wrong choice

    If you’re sending more than 100,000 emails a day from a single account, MailerLite’s per-subscriber pricing stops being competitive. At that volume, an SES + custom dashboard setup costs roughly half. Consider migrating only when you’re consistently above that threshold for 3+ months.

    If your business depends on advanced segmentation across dozens of tags, custom fields, and complex automation flows (think course-creator operations selling 10+ products into the same list), Kit or HubSpot is a better fit. MailerLite handles 80% of segmentation needs cleanly; the last 20% is where you outgrow it.

    If your audience is concentrated in compliance-heavy industries (financial services, healthcare, legal) where you need detailed audit trails for every send, MailerLite’s audit logging is adequate but not specialized. Higher-end ESPs aimed at enterprise compliance (Iterable, Klaviyo’s Enterprise tier) are worth the extra cost.

    For everyone else: MailerLite paired with One Two Three Send is the most cost-effective newsletter stack available to operators in 2026 — free until you cross 1,000 subscribers, predictably-priced after that, and meaningfully better at deliverability than the platform most operators default to. The only reason not to start here is inertia.

    Some links in this post are affiliate links — we earn a small commission if you sign up through them, at no cost to you. We only recommend tools we actually use.

  • Zapier’s table formatter: when to use it and when to skip it

    Zapier’s table formatter: when to use it and when to skip it

    Zapier’s table formatter is one of those features that looks simple in the UI but behaves unpredictably once you start pushing real data through it. It’s designed to take a blob of text—CSV rows, tab-delimited lines, or even scraped HTML tables—and turn it into structured rows you can loop over or push into a spreadsheet.

    It works. Sometimes brilliantly. But it also fails in ways that are hard to debug, and it adds latency to every Zap run. If you’re automating anything that touches customer data, order logs, or content pipelines, you need to know when this feature is the right tool and when it’s a liability.

    What the table formatter actually does

    The formatter takes unstructured or semi-structured text and tries to parse it into rows and columns. You tell Zapier what your delimiter is (comma, tab, pipe, semicolon), whether your data has headers, and how many columns to expect. It returns an array of line items you can iterate over in a looping Zap or map directly into Google Sheets, Airtable, or a database.

    It’s useful when you’re pulling data from tools that don’t offer native integrations—scraped tables from a webpage, exported CSVs from legacy software, or bulk data from an API that returns everything as a single text block.

    But here’s the catch: Zapier’s parser is not smart about edge cases. If your data contains a comma inside a quoted field, or if a row has fewer columns than expected, the formatter will either skip the row, split it incorrectly, or throw a silent error that doesn’t surface until you notice missing records three days later.

    When it’s the right tool

    The table formatter shines in a few specific scenarios:

    • You’re working with clean, predictable CSVs. If your data source is a well-structured export with consistent delimiters and no nested commas or line breaks, the formatter works fast and reliably.
    • You need to parse fewer than 100 rows per run. Zapier charges task usage for every loop iteration. If you’re parsing 500 rows, that’s 500 tasks. The formatter itself counts as one task, but looping over the output will burn through your plan quickly.
    • You’re prototyping. If you’re testing a workflow and need to see whether the data structure is usable, the formatter is faster than writing a Code step. You can always replace it later with Python or JavaScript once the logic is proven.

    When to skip it and use a Code step instead

    If your data is messy, inconsistent, or large, you’re better off writing a Code by Zapier step with Python or JavaScript. Here’s why:

    Speed. The formatter adds 2–4 seconds of latency to every Zap run. A Code step that does the same parsing with Python’s csv module runs in under a second, even with hundreds of rows.

    Error handling. The formatter fails silently on malformed rows. A Code step lets you log errors, skip bad rows gracefully, or send yourself a Slack alert when something breaks.

    Flexibility. If your CSV has quoted fields, escaped characters, or inconsistent column counts, the formatter will choke. A Code step gives you full control over how to handle those cases. You can strip extra whitespace, coalesce missing columns, or even validate data types before passing rows downstream.

    Here’s a bare-bones Python snippet that replaces the table formatter for most use cases:

    import csv
    from io import StringIO
    
    input_text = input_data.get('csv_text')
    reader = csv.DictReader(StringIO(input_text))
    rows = [row for row in reader]
    
    return {'rows': rows}

    That’s it. You get an array of dictionaries, one per row, with column names as keys. You can loop over it, filter it, or transform it before sending it to your destination app.

    One non-obvious tip: use line item groups cautiously

    If you’re using the formatter inside a loop (for example, parsing multiple CSV files in a single Zap run), Zapier will try to batch the output into line item groups. This sounds convenient, but it makes debugging nearly impossible. You can’t inspect individual rows in the Zap history, and if one row in the batch fails, the entire group fails without telling you which record caused the error.

    If you’re dealing with anything mission-critical—customer orders, payment logs, subscriber imports—avoid line item groups entirely. Parse once, loop once, and log each iteration so you can trace failures back to the source row.

    Want more workflow breakdowns like this? Reply with the automation you’re trying to build—we’ll cover it in a future issue.

  • What Postmark is, and how to use it with the One Two Three Send plugin

    What Postmark is, and how to use it with the One Two Three Send plugin

    Most email-sending advice for operators is some version of “use Amazon SES if you’re cheap, use Resend if you want a nice dashboard, use Mailchimp if you don’t want to think about it.” That advice is fine until you actually look at the inbox-placement numbers — and then you find that one provider keeps quietly outperforming everyone else for newsletter sending: Postmark.

    If your last three newsletters landed in Promotions or Spam at Gmail, the cheapest fix isn’t a deliverability consultant. It’s switching to Postmark. This post is the operator’s guide: what Postmark actually is, the cost math at newsletter scale, the step-by-step setup with the One Two Three Send plugin, and the honest tradeoffs vs SES and Resend.

    What Postmark is, in one paragraph

    Postmark is a transactional and broadcast email service operated by Wildbit (acquired by ActiveCampaign in 2022, but run as a separate product). It’s been around since 2010 and is known in the developer community for one thing: deliverability. Where most email providers let you send anything and learn about reputation problems via your bounce rate, Postmark aggressively splits transactional traffic from marketing/broadcast traffic onto separate IP pools, monitors content patterns proactively, and has the most-paranoid abuse team in the industry. The result: their inbox placement is consistently 5–15% higher than the median provider on the same lists. That sounds small until you calculate the revenue lift on a list of 10,000 paid subscribers.

    Why operators pick Postmark over SES or Resend

    Three reasons that show up after a few months of running:

    1. Inbox placement. Postmark’s Send Score and email Insights tools show you, per send, how Gmail/Outlook/Yahoo are categorizing your mail. SES gives you “delivered” — meaning the recipient’s server accepted the message. That doesn’t tell you whether it landed in the Inbox or Promotions or Spam. Postmark tells you.

    2. Bounce + complaint dashboard, free, no SNS or Lambda. SES requires you to wire up SNS topics → Lambda → your database → suppression list before you can see why a domain is bouncing. Postmark gives you that view in their console out of the box. For an operator who values shipping over plumbing, it’s the difference between a one-hour setup and a one-day setup.

    3. Strict separation of broadcast and transactional streams. When you accidentally send a marketing email through your transactional stream — every newsletter operator does this at least once — Postmark blocks it before it harms your transactional reputation. SES has nothing equivalent. The savings from not losing your password-reset deliverability after one rogue announcement are real.

    The cost reality

    Postmark is more expensive than SES, less expensive than Mailchimp at scale, and roughly even with Resend.

    Subscribers (sending 5×/week)Emails/monthPostmarkSESResend retail
    1,00022,000$15$2.20$20
    5,000110,000$80$11$50
    15,000330,000$200$33$200
    50,0001,100,000$700$110$1,000+

    The honest reading: Postmark is roughly 7× SES at any volume. That’s the price of the deliverability premium and the dashboard. For lists under ~25,000 paid subscribers, it’s the right tradeoff almost every time. Above that, you’ll start considering SES for cost reasons and accepting the operational overhead.

    Postmark also has a free tier — 100 emails/month, no time limit — that’s enough to set everything up, send yourself test emails, and verify the integration with One Two Three Send before you put a card in.

    Setup with the One Two Three Send plugin

    Eight minutes if you have a domain in hand. The plugin uses Postmark’s SMTP interface (no custom Postmark provider needed — the standard SMTP option in OTTS handles it perfectly).

    Step 1 — Sign up and create a server

    Go to postmarkapp.com and sign up. Once you’re in, click Servers → Create Server. Name it after your newsletter (“Love Ireland”, “OTTS Newsletter”, etc.). Pick the “Broadcast” server type — this is critical. Postmark separates transactional and broadcast traffic onto different IP pools and reputation profiles, and broadcast is what newsletters need. Don’t pick the default Transactional unless you also want to use Postmark for password resets and order confirmations on the same site (in which case create two servers, one of each type).

    Step 2 — Verify your sending domain

    From the new server, go to Sender SignaturesAdd Domain. Enter your domain (e.g. yourbrand.com). Postmark gives you three DNS records to add:

    • One TXT record for SPF (the value includes spf.mtasv.net)
    • One TXT record for DKIM (the long signing key)
    • One CNAME record for the Return-Path domain

    Add all three to your DNS, click “Verify.” Done within 10 minutes. Skipping any of these — especially DKIM — is the difference between landing in Promotions and landing in Inbox at Gmail.

    Step 3 — Get your Server API token

    From the server’s overview page, click API Tokens. Copy the Server token. This token is both your SMTP username AND your SMTP password (Postmark uses the same value for both — unusual but documented).

    Step 4 — Configure One Two Three Send

    In your WordPress admin, go to Newsletter → Settings → Provider. Pick SMTP. Enter:

    • SMTP Host: smtp.postmarkapp.com
    • Port: 587
    • Encryption: STARTTLS (the default)
    • Username: [your Server token]
    • Password: [the same Server token]
    • From Email: any address at your verified domain (e.g. [email protected])
    • From Name: your newsletter’s name

    Click Test connection. The plugin will fire a test email to your admin address. If it lands, you’re done.

    Step 5 — Send your first newsletter through Postmark

    Generate a draft, hit Send. Within 30 seconds, the message shows up in Postmark’s Activity log with its delivery state. Click into any send to see the message metadata, bounce/complaint state if any, and (within an hour) the recipient’s email-client breakdown.

    Send a test to your own Gmail and click Show original. You should see SPF: PASS, DKIM: PASS, DMARC: PASS (the last one assumes you have a DMARC TXT record on your domain — if you don’t, see Pitfall #2 below). All three passing is the bar. Anything less and your inbox placement won’t be what Postmark is capable of giving you.

    Comparison vs the obvious alternatives

    vs Amazon SES — SES is roughly 1/7 the price at every scale. It’s the right choice when monthly volume crosses ~250,000 emails AND you have someone on the team who can wire up SNS for bounces, run CloudWatch dashboards, and warm up dedicated IPs. For everyone smaller, the time you spend on SES infrastructure costs more than Postmark’s bill. We have a separate post on running SES for the operators who are at that scale.

    vs Resend — Resend is the modern competitor: nicer API, comparable deliverability for newsletters, slightly cheaper at the lower tiers, similar at the higher ones. Postmark is older, more conservative, and has a meaningful inbox-placement edge specifically at Gmail and Outlook. If you’re building a SaaS app and want clean developer ergonomics, Resend wins. If you’re running a newsletter and the only metric you care about is open rate, Postmark wins.

    vs Mailgun — Roughly comparable price at low volume, cheaper at high volume, slightly worse deliverability in our testing. Mailgun’s main advantage is they accept high-volume sends without a manual review process Postmark sometimes does on accounts approaching 1M/month. If you’re going from 100K → 1M and don’t want to negotiate, Mailgun is the easier path.

    vs Mailchimp / ConvertKit / Beehiiv — Different category. These are mailing platforms (list, editor, analytics, automation, signup forms). Postmark is a sending engine. You wouldn’t compare a hosting provider to Squarespace; same here.

    vs SendGrid — SendGrid is fine. The pricing tiers are less predictable above 100K, and the deliverability has slipped in independent benchmarks over the last 3 years. Use Postmark instead unless you’ve got a SendGrid contract you can’t get out of.

    Pitfalls operators hit (in the order they hit them)

    1. Picking the wrong server type. If you accidentally created a “Transactional” server and start sending newsletters through it, Postmark’s abuse team will flag the account within a week. Create a Broadcast server. If you created the wrong one, delete it (after migration) and start fresh — don’t try to flip the type.

    2. No DMARC record. Gmail and Yahoo’s 2024 sender requirements mandate DMARC for any domain sending more than 5,000 emails/day to their users. The minimum acceptable record is v=DMARC1; p=none; rua=mailto:[email protected]. Without it, Postmark’s deliverability advantage evaporates because Gmail/Yahoo discount your sender reputation. Add the TXT record before you send to a real subscriber.

    3. Sending from a free email address. If your From Email is [email protected] Postmark will refuse to send. The From must be at a domain you’ve verified in Postmark. Most operators trip over this on the first test send and lose 15 minutes wondering why nothing fires.

    4. Suppression list surprises. Postmark’s automatic suppressions are aggressive — they’ll suppress anyone who marks one email as spam, anyone whose domain bounces hard, anyone who clicks unsubscribe via Postmark’s unsubscribe handler. This is good for reputation but means you need to be intentional about list re-engagement. The Suppressions tab in Postmark’s console shows the full list; you can manually remove someone if they email you to say they want back on.

    5. The 10MB attachment limit. Postmark won’t accept emails over 10MB total (HTML + inline images + attachments). Most newsletters are under 200KB so this never matters — except when someone uploads a 4K-resolution hero image and the rendered email balloons past the limit. Compress images to under 1MB before they go into the email body.

    6. Approval delay on first 1M-email month. When you cross approximately 1 million emails in a billing month, Postmark’s account review team will email you to verify you’re a legitimate operator. Reply within 48 hours with proof of the list source (signup form URL, growth pattern). Don’t ignore the email — they’ll throttle the account if you do.

    Long-term maintenance

    Less than SES, more than a pure SaaS like Beehiiv.

    Daily/weekly: nothing. Postmark is set-and-forget for the first 6 months. The activity log emails are a useful occasional read.

    Monthly: review the Suppressions tab. Look for patterns — if a corporate domain is on there 50 times, you’ve probably been blocked at the SMTP level by their gateway and need to get IT-whitelisted. Look at bounce-rate trend in the dashboard; if it’s creeping past 3%, you have a list-quality problem worth fixing.

    Quarterly: review your DMARC reports (the rua address gets weekly XML aggregates from Gmail/Yahoo/Microsoft). Tools like Postmark’s DMARC monitor (free) parse these into a readable dashboard.

    Annually: rotate your Server token. Settings → API Tokens → “Generate new token”, paste the new one into One Two Three Send’s SMTP settings, deactivate the old one a week later.

    When Postmark is the wrong choice

    If you’re sending fewer than 5,000 emails a month, Postmark’s $15/month minimum is overkill and you should stay on Resend or Mailchimp’s free tier until volume justifies the spend.

    If you’re sending more than ~500,000 emails a month and have technical capacity, Amazon SES becomes meaningfully cheaper. The break-even for “the time SES costs me to set up” vs “the dollars Postmark saves me” lands somewhere around the 200K–300K/month volume mark for most operator teams.

    If your audience is concentrated in countries where Postmark’s IP pools have weak reputation (a few specific Asian and African corporate-email gateways are the usual culprits), test before committing. Postmark’s free tier of 100 emails/month is enough to verify your top-10 corporate domains accept mail from them before you migrate.

    For everyone else: Postmark is the boringly-best transactional and broadcast email provider available to newsletter operators in 2026. Pair it with One Two Three Send and you have an inbox-placement-optimized newsletter stack that takes 8 minutes to set up and runs without intervention for 6 months at a time. That’s what infrastructure is supposed to do.

    Some links in this post are affiliate links — we earn a small commission if you sign up through them, at no cost to you. We only recommend tools we actually use.

  • What Claude Code is, and how to actually use it in a small business

    What Claude Code is, and how to actually use it in a small business

    Claude Code is the answer to a question most operators stop asking around year three: can I just build this thing myself, or do I have to pay someone?

    For the last decade the answer was almost always “pay someone.” Custom WordPress plugin? $750 from a freelancer. Migration script? $400. Bespoke admin tool to fix one annoying workflow? Not worth it at any price. The friction was always the same — you knew what you wanted, but the gap between knowing and shipping was wider than it was worth crossing.

    Claude Code closes that gap. It’s Anthropic’s command-line agent — a chatbot that can read every file in your project, write new files, run commands, and tell you when it’s done. Pair it with a base subscription to Claude Pro ($20/month) or Claude Max ($100/month) and you can build the small bespoke things that previously weren’t worth a freelancer’s invoice. This post is the operator’s guide: what it actually is, what’s worth building with it, where it goes wrong, and how to avoid the bills people quietly spend on it without realizing.

    What Claude Code actually is

    It’s a CLI app you install on your laptop. Once it’s running, you point it at a folder (your WordPress plugin, your Next.js app, your scripts/ directory of one-off Python tools) and you talk to it like you’d talk to a junior developer. “Add a settings page to this plugin.” “Find why this script crashes on rows where the price is null.” “Migrate this CSV into the new database schema.” It reads the files, writes the changes, runs whatever tests you have, and tells you what it did.

    It’s not a chatbot in a browser tab. It runs locally with file system access. Everything it changes is on your disk, in git if you’ve initialised git, ready to review and commit. That distinction matters more than it sounds — most “AI helps me code” workflows are still copy-paste between a browser and an editor. Claude Code skips the copy-paste.

    The cost math, with honest numbers

    For an operator who codes maybe twice a week, the right tier is Claude Max $100/month. Below that you’ll either run out of usage limits during a focused build session, or you’ll pay-per-use through the API and watch costs balloon unpredictably.

    Use intensityRight tierMonthly cost
    1–2 sessions a month, 1–2 hours eachClaude Pro$15
    1–3 sessions a week, focused buildsClaude Max (5×)$80
    Daily / serious project workClaude Max (20×)$160
    Heavy + via API for automationAPI pay-per-use$100–500 variable

    For comparison: a WordPress freelancer charges $500–$1000 for a custom plugin you’d describe in a paragraph. Two of those a year and you’ve already paid for a year of Claude Max. The break-even is three custom builds per year — most operators have at least that on their backlog if they’re honest about it.

    What it’s actually good at (with examples)

    Concrete things we’ve built with Claude Code at One Two Three Send and adjacent projects:

    Custom WordPress plugins. The plugin you’re reading this post on was built largely with Claude Code. Settings pages, REST endpoints, custom post types, scheduled cron jobs, encrypted storage of API tokens — all the patterns are well-documented and Claude Code knows them. The trick is keeping each session focused on one feature at a time.

    One-off data wrangling. Migrating subscriber lists between platforms, backfilling missing meta on 5,000 posts, importing a CSV into a custom database, scraping a competitor’s RSS feed for inspiration. The scripts are 50–200 lines, take 15 minutes to write with Claude Code, and you delete them after they’ve run.

    Cross-site provisioning. Running 10+ WordPress sites for a multi-brand newsletter business? Write a Python script that takes one JSON config per brand and provisions everything via REST — site title, plugins activated, API keys, custom templates, signup forms. We did this exact thing for the One Two Three Send multi-brand rollout. Saved 3+ hours per brand.

    Refactors and bug hunts. “There’s a bug somewhere in this 3,000-line PHP file where the date appears as ‘Nov 30, -0001’. Find it.” Claude Code reads the file, traces the data flow, finds the bug, and tells you the fix in 30 seconds. Genuinely worth the $100/month for that alone.

    Documentation. Point it at a codebase and ask for a README. Ask for inline comments where the logic is non-obvious. Ask for a CHANGELOG generated from your git log. None of this is glamorous and all of it accumulates value.

    Tests. Most operators don’t write tests because the upfront cost feels infinite. Claude Code writes them in minutes. They’re not always perfect; they catch the regressions that matter.

    What it’s NOT good at

    Be honest with yourself about these.

    Open-ended product design. Asking “what should we build next?” produces generic answers. The agent is downstream of your product instinct, not a substitute for it.

    Domains where the training data is sparse or contested. Bleeding-edge framework versions, niche e-commerce platforms with thin docs, proprietary CRMs — Claude Code will sound confident and be wrong. It’s at its best on mainstream stacks (WordPress, Node.js, Python, React, the AWS basics) and degrades fast outside them.

    Anything where the spec is unclear in your own head. “Make the dashboard better” wastes tokens. “Add a column to the dashboard table showing percentage change vs last week, sorted by absolute value descending” produces working code in one shot. The discipline you need is the same discipline you’d need with a junior developer.

    Production deployments that nobody reviews. Don’t auto-merge whatever Claude Code produces. Read every diff. The mistake mode isn’t usually “the code is broken” — it’s “the code works but does subtly the wrong thing.” For example: deletes rows it should have soft-deleted, retries failures forever instead of giving up, hardcodes a value that should have been a setting.

    Honest comparison vs the alternatives

    vs Cursor — Cursor is an editor (a fork of VS Code) with AI baked in. Better workflow if you want to stay in an IDE. Claude Code is better if you want to “talk and watch it work” rather than drive an editor yourself. Many serious developers run both — Cursor for the everyday editing, Claude Code for the bigger autonomous tasks. Cost is similar.

    vs GitHub Copilot — Copilot is autocomplete-on-steroids. It writes the next 5 lines as you type. It does not read your repo, does not run tests, does not refactor. Useful for typing speed; doesn’t change what’s worth building. $10/month, complementary not competitive.

    vs Aider — Open-source equivalent of Claude Code. Same agent pattern, runs in your terminal, brings your own API key. If you’re philosophically committed to open-source tooling or want to swap models, Aider is the answer. Claude Code’s ergonomics are better; Aider’s flexibility is better.

    vs ChatGPT / Claude in a browser — Different category. Browser chatbots work well for “explain this code” or “write a 10-line snippet.” For anything that touches multiple files, you spend 10 minutes copy-pasting before the agent does any actual work. Claude Code skips that.

    vs hiring a freelancer — A good developer at $100/hour will build better software for medium-complexity work. They’ll also take 2 weeks for what you wanted last Tuesday. The honest tradeoff: Claude Code for things you’d otherwise not build at all, freelancer for things that genuinely matter to your business and need to be right.

    Setup, in the order to actually do it

    1. Sign up at claude.ai. Pick the right tier (see cost math above). Start with Pro if you’re unsure — you can upgrade in 30 seconds when you outgrow it.
    2. Install the CLI: npm install -g @anthropic-ai/claude-code. Requires Node.js 18+. On macOS the easier path is brew install node first.
    3. Authenticate: claude login from your terminal. Opens a browser tab; come back to the terminal and you’re in.
    4. Initialise a project: cd into the folder you want to work in (e.g. your WordPress plugin’s directory) and run claude. Type your first request.
    5. Install git first if you haven’t. Every change Claude Code makes is reviewable — but only if your project is tracked. git init, commit your starting state, then turn the agent loose.
    6. Create a CLAUDE.md file in the project root with project-specific context: “this is a WordPress plugin,” “PHP 7.4+ compatible,” “follow WP coding standards,” “tests run with phpunit.” Whatever’s true. Claude Code reads this every session and follows it. Five minutes spent here saves hours of misaligned output later.

    Pitfalls operators hit (in the order they hit them)

    1. Tokens add up. If you’re on the API pay-per-use tier, a single afternoon of debugging a 5,000-line file can cost $20+. Move to Claude Max once you find yourself anxious about each request — the predictable monthly bill removes the friction.

    2. The agent makes plausible-but-wrong assumptions about your codebase. It might invent a function name, assume a config file exists at a path it doesn’t, or confidently call a deprecated WordPress API. Read the diffs. Always.

    3. Letting it commit unsupervised. Don’t. Even when it asks “shall I commit this?” — review the diff first. The single most useful habit is “always git diff before git commit.”

    4. Asking for too much in one session. “Refactor the entire plugin to use OOP” produces a tangled mess. “Refactor just the settings page to use a settings class” produces a clean diff. Smaller asks, more sessions.

    5. Trusting the agent with secrets. Don’t paste API keys, customer data, or production credentials into the chat. Claude Code can see what’s on your filesystem when you let it; treat it like an intern with strong typing skills, not a vault.

    6. Confusing “it ran without errors” with “it works.” An automated script can complete cleanly while having done the wrong thing. Test the actual behavior, not just the exit code.

    Long-term: what changes when you’ve used it for a few months

    The first month you’ll over-use it — building things you don’t actually need because building feels free. Resist this. The second month you’ll under-use it — going back to manual tasks out of habit. The third month is when the muscle memory clicks: you’ll instinctively reach for Claude Code at the moment a task crosses the “annoying enough that I’d otherwise put it off” threshold.

    The accumulation matters more than any single use. The 50-line script that backfills missing image attribution. The 200-line plugin that schedules Facebook posts. The data migration that runs at 3am via cron. None of these would have existed if they had to wait for a freelancer’s quote. All of them now exist, take five minutes of attention each, and quietly do their jobs.

    Spend twenty minutes a month deleting the scripts you’ve stopped using. Spend an hour a quarter rewriting your CLAUDE.md to reflect what’s actually true about your project now. Don’t spend tokens on entertainment requests when bored — they cost real money. Treat the agent like a contractor who bills by the minute, because that’s what it is.

    When Claude Code is the wrong choice

    If you’ve never written a line of code, Claude Code’s output will look like mysterious progress until something breaks and you can’t tell what’s wrong. The minimum bar isn’t “fluent in PHP” — it’s “I can read what this is doing and tell whether it looks reasonable.” If you can’t, you’ll either trust it too much (and break things) or too little (and spend longer than just doing it yourself). Spend a weekend on a basic Python tutorial first; you don’t need to be good, you need to be literate.

    If your work is GUI-heavy with no underlying code surface — running ads in Meta Business Manager, managing campaigns in Mailchimp’s dashboard, updating Squarespace pages by drag-and-drop — Claude Code can’t help. Its leverage is on the parts of your business that have files in a directory.

    For everyone else: Claude Code is the boringly-best automation tool available to operators in 2026. The honest case for it isn’t “AI revolutionises everything” — it’s “the small custom things that were never worth $500 are now worth $20, so build them.”

    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.

  • SEO traffic is slower than you think — and faster than you fear

    SEO traffic is slower than you think — and faster than you fear

    Search traffic has a schizophrenic reputation among solo operators. Half the internet swears it takes eighteen months to see results. The other half is selling you a course promising page-one rankings in six weeks.

    Both are wrong, but in useful ways.

    The truth sits in an inconvenient middle ground that doesn’t make for good social media advice: SEO is slower than impatience allows and faster than pessimism assumes. The operators who succeed are the ones who understand which parts move quickly and which parts require compounding time.

    The first 90 days: faster than you think

    If you publish a well-structured article targeting a low-competition keyword today, Google will index it within hours. If the topic has search volume and your site has even modest authority, you’ll see impressions within a week. Clicks follow within two to four weeks.

    This isn’t theory. A site with six months of history and a handful of backlinks can rank on page two or three for a long-tail query in under thirty days. That might be position 18, earning you four visits a month — but it’s movement, and it’s measurable.

    What kills most operators here isn’t the timeline. It’s the expectation mismatch. Four visits feels like failure when you were hoping for four hundred. But those four visits are the seed. Google is watching dwell time, bounce rate, and whether anyone links to the piece. If the content satisfies intent, that position-18 ranking starts climbing.

    The mistake is publishing one article, seeing no avalanche, and concluding SEO is broken. The thirty-day window shows you whether you’re in the game. It doesn’t deliver the outcome.

    Months 3–9: the compounding lag

    This is where the eighteen-month myth comes from, and where most operators bail out.

    Between month three and month nine, growth is nonlinear and maddeningly inconsistent. You’ll publish your best work and watch it sit at position 22 for sixty days. Then a piece you half-forgot about will jump to position 7 overnight and stay there. Another will flatline for four months, then double its traffic in week seventeen.

    Google’s ranking algorithm isn’t slow — it’s Bayesian. It’s testing your content against user behavior signals and adjusting confidence intervals over time. A new page doesn’t get the benefit of the doubt. It earns trust through sustained performance: low pogo-sticking, returning visitors, inbound links from related content, and topic clustering across your site.

    This is the phase where consistency matters more than velocity. Publishing two articles a week won’t make Google trust you faster. But publishing one strong piece a week for six months builds a content graph that signals topical authority. That’s what moves the needle.

    Operators who succeed here treat months 3–9 as infrastructure work. You’re not optimizing for this week’s traffic. You’re building the conditions for month twelve.

    Month 9 onwards: the hockey stick (if you earned it)

    If you’ve published consistently, targeted search intent accurately, and built internal links between related pieces, month nine is where traffic curves upward.

    This isn’t magic. It’s Google’s algorithm deciding your site is a reliable source for a topic cluster. Once that happens, new content ranks faster. A piece that would have taken ninety days to hit page one in month four might land there in three weeks by month ten.

    The compounding effect is real, but it requires critical mass. A site with eight articles won’t experience it. A site with sixty articles spanning three related topic clusters will.

    The other shift: older content starts climbing. Articles you published in month two that plateaued at position 15 suddenly jump to position 6. Not because you updated them (though that helps), but because the authority of your overall site lifted them.

    This is when operators start calling SEO “passive income.” It’s not passive — you built the asset — but the return on effort does change. Month twelve traffic reflects work you did in month four.

    The part everyone gets wrong

    The real mistake isn’t misunderstanding the timeline. It’s treating SEO as binary.

    Operators either go all-in, publish five articles a week, see no hockey stick by month six, and quit — or they dismiss SEO entirely, chase social traffic, and wonder why their business is a treadmill.

    The correct move is to start SEO earlier than feels exciting and diversify sooner than feels necessary. If you’re at zero, publish one search-optimized article a week and spend the rest of your time on faster channels: social, newsletters, communities. By month six, search will be contributing 15–20% of your traffic. By month twelve, it might be 40%. That’s not a disappointing result — it’s compounding leverage.

    The operators who win are the ones who accept that SEO is a portfolio position, not a sprint. Start it now. Don’t wait for it to pay off before you do anything else. And don’t quit three months in because the curve hasn’t bent yet.

    What’s working for you? Reply and tell me where you are in the timeline — and whether the curve matches what you expected.

  • WordPress object caching: what it is, when to turn it on, and why

    WordPress object caching: what it is, when to turn it on, and why

    Most WordPress sites hit the database dozens of times per page load. Every menu, every widget, every post query — they all fire separate requests. For a low-traffic blog, that’s fine. For a content business serving thousands of readers a day, it becomes a bottleneck.

    Object caching stores the results of those database queries in memory so WordPress can reuse them instead of re-running the same query ten times per page. It’s not page caching (which saves entire HTML pages). It’s not browser caching (which stores assets locally). It’s an in-between layer that speeds up the dynamic parts of your site — the bits that change based on who’s logged in, what’s in the cart, or which posts are being displayed.

    If you’re running a membership site, a high-traffic blog, or a WooCommerce store, object caching can cut server load by 40–60%. But it adds complexity, and it doesn’t help every site equally.

    How object caching works in WordPress

    WordPress has a built-in object cache — but by default, it only lasts for a single page load. Every time someone visits a page, the cache resets.

    Persistent object caching extends that lifespan. Instead of storing query results in PHP memory (which disappears after each request), it stores them in Redis or Memcached — key-value stores that sit in RAM and persist across requests.

    When a query runs, WordPress checks the object cache first. If the result is there, it skips the database entirely. If not, it runs the query, stores the result, and serves it from cache next time.

    Common queries that benefit: navigation menus, widget output, post metadata, taxonomy terms, user data, WooCommerce product attributes. Anything that gets called repeatedly and doesn’t change on every page load.

    When to turn it on

    Not every site needs object caching. A static blog with 500 visitors a month won’t see a meaningful difference. But you’ll notice a real impact if:

    • You’re serving more than 10,000 page views per month
    • Your site uses complex queries (custom post types, taxonomies, meta queries)
    • You’re running WooCommerce, BuddyPress, or another plugin-heavy setup
    • Your database queries are taking longer than 50ms (check this in Query Monitor)
    • You’re hitting CPU or memory limits during traffic spikes

    The easiest way to tell: install Query Monitor, load a few pages, and look at the query count and total query time. If you’re running 100+ queries per page or spending more than 200ms on database calls, object caching will help.

    Most managed WordPress hosts (Kinsta, WP Engine, Cloudways) offer Redis as a one-click add-on. If you’re on a VPS with BigScoots or similar, you’ll need to install Redis yourself (or ask support to do it) and add a plugin like Redis Object Cache or Object Cache Pro.

    The non-obvious gotcha

    Object caching breaks badly written plugins.

    If a plugin assumes every query hits the database — or if it doesn’t properly invalidate (clear) cached data when something changes — you’ll see stale content. A post updates, but the old version keeps showing. A product goes out of stock, but the cache still says it’s available.

    Good plugins handle this automatically by calling wp_cache_delete() or wp_cache_flush() when data changes. Bad plugins don’t.

    Before you enable object caching site-wide, test it on a staging environment. Update a post, change a menu, edit a product. If those changes appear immediately on the front end, you’re fine. If they don’t, you’ve got a plugin conflict.

    One more thing: object caching doesn’t replace page caching. It speeds up dynamic queries, but you still want a layer (like WP Rocket, Cloudflare, or your host’s built-in cache) saving full HTML pages for logged-out users. The two work together — page caching handles static content, object caching handles the bits that can’t be fully static.

    What to do next

    If you’re not sure whether your site needs object caching, start here: install Query Monitor (it’s free), load your most-trafficked pages, and check the database panel. If you’re seeing 80+ queries or 150ms+ query time, object caching will make a measurable difference.

    If you’re already on a managed host, check whether Redis is included or available as an add-on. If you’re on a VPS, ask your host whether they support Redis, or spin up a staging site and test it yourself.

    And if you do turn it on: keep Query Monitor installed for a week and watch for stale content. Most modern plugins handle caching well, but the ones that don’t will show themselves quickly.

    Got a question about WordPress performance, caching, or infrastructure? Hit reply — this is the sort of thing we dig into every week.

    Some links in this post are affiliate links — we earn a small commission if you sign up through them, at no cost to you. We only recommend tools we actually use.

  • ConvertKit vs. Beehiiv: which platform fits your business model?

    ConvertKit vs. Beehiiv: which platform fits your business model?

    ConvertKit and Beehiiv both call themselves newsletter platforms, but they’re built for fundamentally different operators. One is a creator-focused email marketing tool that happens to support newsletters. The other is a media company in a box.

    If you’re trying to choose between them, the feature lists won’t help much. What matters is how you plan to grow, what you’re selling, and how much control you need over your reader experience.

    What each platform is actually optimized for

    ConvertKit was built for course creators, coaches, and small product businesses who use email as part of a broader funnel. It excels at segmentation, tagging, and automation sequences. You can build complex subscriber journeys based on behavior, purchases, and custom fields. The landing page builder is serviceable. The forms are flexible. The visual automation builder is genuinely good.

    Beehiiv is a publishing platform first. It’s optimized for ad-supported or subscription-based newsletters that feel like media properties. The editor is purpose-built for newsletter writing, with built-in polls, referral programmes, and recommendation networks. Monetisation tools—ad network, premium subscriptions, boosts—are baked into the core product, not bolted on.

    If your business model is “grow an audience, sell them a thing,” ConvertKit makes more sense. If it’s “publish regularly, monetise attention,” Beehiiv is the better fit.

    Pricing and what you actually get

    ConvertKit starts at $25/month for up to 1,000 subscribers on the Creator plan, which includes landing pages, forms, and basic automation. The Creator Pro plan is $50/month and adds the visual automation builder, subscriber scoring, and advanced reporting. Pricing scales with list size—10,000 subscribers costs $119/month on Creator Pro.

    Beehiiv’s free tier is surprisingly generous: up to 2,500 subscribers, unlimited sends, and access to the referral programme and basic analytics. The Scale plan is $42/month for up to 10,000 subscribers and unlocks the ad network, custom domains, and audience segmentation. The Max plan at $84/month adds premium subscriptions, priority support, and no Beehiiv branding.

    Beehiiv is cheaper if you’re just publishing and growing. ConvertKit costs more, but you’re paying for automation depth and integration flexibility.

    Monetisation: built-in vs. bring-your-own

    Beehiiv’s monetisation stack is its clearest differentiator. The ad network connects you with sponsors once you hit 2,500 subscribers. Premium subscriptions (paywalled content, member-only issues) are native. The boost feature lets you pay to get recommended to other Beehiiv newsletters. It’s all designed to work without leaving the platform.

    ConvertKit has a tipping feature (one-off payments via Stripe) and supports paid newsletters through Commerce, but it’s not the core experience. Most ConvertKit users monetise by selling courses, memberships, or services outside the platform and using email to drive conversions. Integrations with Gumroad, Teachable, Circle, and Stripe are solid.

    If you’re building a subscription newsletter or want sponsorship revenue, Beehiiv’s infrastructure saves you months of setup. If you’re selling products or services, ConvertKit gives you more control over the funnel.

    Migration, design control, and lock-in

    ConvertKit exports are clean. You own your subscriber data, and you can leave with a CSV and your sending domain intact. The template system is flexible but not beautiful—you’ll need custom HTML if you care about design.

    Beehiiv’s editor is opinionated. You get a polished, mobile-friendly design out of the box, but customization is limited. Exporting is straightforward (subscriber list, post archive), but if you’ve built revenue through Beehiiv’s ad network or boost ecosystem, that doesn’t port anywhere.

    Neither platform holds your list hostage, but Beehiiv’s monetisation tools create stickiness that ConvertKit’s automation doesn’t.

    Who should pick which

    Choose ConvertKit if you’re selling digital products, running a service business, or need complex automation. It’s the better tool for operators who think in funnels, lifecycle stages, and multi-step sequences. You’ll outgrow the design limitations, but the automation won’t let you down.

    Choose Beehiiv if you’re publishing content on a schedule, building a media brand, or monetising through ads and subscriptions. It’s faster to set up, cheaper at scale, and the built-in growth tools (referral programme, recommendations, boosts) are legitimately useful if you’re trying to grow without paid ads.

    Both platforms are competent. The wrong choice isn’t about features—it’s about picking a tool that doesn’t match how you actually plan to make money.

    Want more comparisons like this? One Two Three Send breaks down tools, tactics, and trade-offs for online operators every week. Subscribe to get the next one.

    Some links in this post are affiliate links — we earn a small commission if you sign up through them, at no cost to you. We only recommend tools we actually use.

  • How to set up WordPress on DigitalOcean and install One Two Three Send

    How to set up WordPress on DigitalOcean and install One Two Three Send

    Most “host your own WordPress” guides assume you want to learn Linux. This one doesn’t. The goal here is a working newsletter site running on DigitalOcean, with One Two Three Send installed and ready to send your first email, in roughly 90 minutes. Cost: about $10/month all in. If you’ve never touched a server before, you can still follow this. Wherever a step needs more explanation than a sentence, we’ve put it inline. Wherever you can safely skip a sub-task, we’ve said so.

    Why DigitalOcean

    For a single newsletter site, you have three real options:
    • Managed WordPress hosts (Kinsta, WP Engine, SiteGround). $25–35/month minimum. Someone else handles the server. Worth it if your time is genuinely worth more than the cost.
    • Shared hosts (Bluehost, Hostinger). $3–5/month. Cheaper, but resource-constrained, oversold, and slow once your list grows past a few thousand.
    • Cloud VPS (DigitalOcean, Linode, Vultr, Hetzner). $6–12/month. You get a real Linux server. Slightly more setup, dramatically more control.
    DigitalOcean wins on simplicity for the cloud-VPS category. Their dashboard is the cleanest in the industry, their one-click WordPress image is genuinely good, and their pricing is predictable. Hetzner is cheaper if you’re in Europe; AWS Lightsail is comparable if you’re already on AWS for other reasons. For everyone else, DO is the default.

    Sizing the droplet correctly

    This is where most guides waste your money. The right droplet for a newsletter site depends almost entirely on subscriber count, not on traffic.
    Subscribers Droplet Monthly
    0–2,000 Basic 1GB / 1 vCPU $6
    2,000–15,000 Basic 2GB / 1 vCPU $12
    15,000–50,000 Basic 4GB / 2 vCPU $24
    50,000+ CPU-Optimized 8GB $84
    Start small. DigitalOcean lets you resize a droplet vertically (more RAM/CPU) with a five-minute reboot. There is zero benefit to over-provisioning. The $6 plan handles a couple of thousand subscribers comfortably.

    Step 1 — Create the DigitalOcean account

    Go to digitalocean.com and sign up. They’ll ask for a payment method. They give new accounts $200 in credit valid for 60 days, which is plenty to test multiple configurations before committing. Add a payment method even if you have credit — without one, your droplet gets destroyed when the credit expires.

    Step 2 — Spin up the WordPress droplet

    From the control panel: Create → Droplet.
    1. Region: pick the one closest to your subscribers. For a US/global audience, NYC3 or SFO3. For Europe, FRA1 or AMS3. For Asia/Pacific, SGP1 or SYD1. The droplet’s region determines the latency for your admin use; subscribers don’t see your droplet, they see the email’s sending IP (which is your email provider, not DO).
    2. Image: click the Marketplace tab and search “WordPress”. Pick “WordPress on Ubuntu 22.04”. This is the official DigitalOcean one-click image — it ships with WordPress, MySQL, nginx, PHP, and Certbot pre-installed. Saves you about three hours of setup.
    3. Plan: Basic → Regular. Pick the size from the table above.
    4. Authentication: SSH key if you know what one is, password if you don’t. (You can switch to SSH later.) Set a strong password and store it in a password manager.
    5. Hostname: something memorable like love-france-newsletter. Doesn’t affect anything outside the dashboard.
    6. Backups: tick the box. It’s 20% of the droplet cost ($1.20 on a $6 droplet) and it’s the cheapest insurance you’ll ever buy. Weekly snapshots, four-week retention, fully automated.
    Click Create Droplet. Wait 60 seconds.

    Step 3 — Finish the WordPress install

    Once the droplet’s ready, copy its IP address from the dashboard. SSH in:
    ssh root@YOUR_DROPLET_IP
    The first login runs the WordPress finalisation script automatically. It asks for:
    • Your domain name (or use the IP for now if you haven’t bought a domain yet)
    • An email address for Let’s Encrypt SSL certificate notifications
    • Whether to enable HTTPS (yes — it’s free and automatic)
    The script provisions an SSL certificate via Let’s Encrypt and configures nginx for HTTPS. This is the single best part of the DO marketplace image — getting SSL right manually is an hour’s work that you skip entirely. If you don’t have a domain yet, point your browser at the droplet’s IP and you’ll see the WordPress install wizard. Pick a strong admin password (NOT “admin” as the username — pick something obscure), set the site title, and finish.

    Step 4 — Point your domain at the droplet

    If you bought a domain (Namecheap, Cloudflare, or any other registrar), add two DNS records:
    • A record: @ → your droplet IP
    • A record: www → your droplet IP
    DNS propagation takes 5 minutes to an hour depending on the registrar. While you wait, log into WordPress at https://YOUR_DOMAIN/wp-admin. If SSL didn’t get set up during step 3 (because you didn’t have a domain yet), SSH back in and run:
    certbot --nginx -d YOUR_DOMAIN -d www.YOUR_DOMAIN
    Certbot handles the cert, the nginx config, and the auto-renewal cron job in one command.

    Step 5 — Set up backups (the second kind)

    You enabled DigitalOcean’s droplet backups in step 2 — those snapshot the entire server weekly. That’s good for “the droplet died” recovery. You also need WordPress-level backups for “I broke a plugin” recovery. The free UpdraftPlus plugin is the operator standard. Install it from Plugins → Add New, configure it to back up to Google Drive or Dropbox daily, and forget about it. Your insurance is now layered: UpdraftPlus restores the WP install in minutes, DO snapshots restore the entire server in an hour. Most operators never need either, but the one time you do, you’ll be glad you set both up.

    Step 6 — Install One Two Three Send

    From the WordPress admin: Plugins → Add New, search for “One Two Three Send”, click Install, then Activate. The plugin walks you through initial configuration:
    1. Claude API key. Get one from console.anthropic.com. Pasted into Newsletter → Settings → AI. Required only if you want AI generation; you can run the plugin without it and write everything by hand.
    2. Email provider. Pick one in Newsletter → Settings → Provider. For under 50,000 emails a month, Resend or Postmark are the easiest. Above that, switch to Amazon SES — we wrote a separate post on that.
    3. Signup form. The plugin creates a default form at Newsletter → Signup Forms. Copy its shortcode and paste it into a WordPress page (e.g. /subscribe) or a widget area.
    4. Welcome email. Newsletter → Settings → Welcome. New subscribers see this immediately on signup. The default is fine; customize the body to match your brand voice.
    That’s the minimum to start sending. Generate your first newsletter at Newsletter → New Newsletter.

    Step 7 — Optional: install One Two Three Send Pro

    If you want Stripe paywalls, custom newsletter templates, the public archive, the Newsletter Network cross-promotion widget, or the AI Agents blog generator, install the Pro companion plugin. Pro is distributed by email to subscribers of the One Two Three Send newsletter — sign up at onetwothreesend.com and the install link arrives within minutes. Once installed, Pro auto-updates from the manifest server; no manual updates needed.

    What you should NOT do on the droplet

    Some categories of work that look reasonable but will cause problems: Do not run your own SMTP server. Outbound port 25 on cloud providers is heavily blocked by inbox providers because so much spam comes from cloud IPs. Even if you got mail to leave the droplet, it would land in spam folders. Always use a dedicated email service (Resend, Postmark, SES) for sending. The droplet’s job is to host the WordPress admin and the public site, nothing more. Do not skip the firewall. Run ufw enable on first login and only open ports 22 (SSH), 80 (HTTP), and 443 (HTTPS). DO has a network-level firewall in the dashboard that’s even better — set it up to lock everything else down. Do not run as root forever. The marketplace image lets you log in as root by default. Within the first day, create a non-root user with sudo, copy your SSH key over, and disable root SSH login. There are guides for this; fifteen minutes of work that pays off the first time someone scrapes your IP looking for SSH brute-force opportunities. Do not install random WordPress plugins. Each plugin is server code running with database access. The plugin ecosystem is broad and most plugins are fine, but the bad ones are spectacularly bad. Stick to plugins with 100,000+ active installs, recent updates, and active support. UpdraftPlus, Yoast SEO, Wordfence, and One Two Three Send all qualify.
    A toolkit on a workbench
    Photo: Wikimedia Commons (CC)

    Long-term maintenance

    If you do nothing else, do these. Weekly: log in to WordPress and click “Update” on anything with an update available. WordPress core, plugins, themes. WordPress’s auto-update for minor versions is on by default; you’re checking that nothing got missed. Monthly: SSH in and run apt update && apt upgrade. Reboot if a kernel update comes through. This applies Ubuntu security patches. Quarterly: review installed plugins. Anything not actively used should be deactivated and deleted. Inactive plugins still receive updates and can introduce security issues. The one-click image ships with about a dozen utility plugins; remove any you’re not using. Annually: re-evaluate your droplet size. If your subscriber count has 5x’d, your $6 droplet is now under-provisioned. If your subscriber count hasn’t grown, your $24 droplet is overspending. DigitalOcean’s resize takes five minutes and a reboot.

    When DigitalOcean is the wrong choice

    If you genuinely don’t want to ever SSH into a server, pick managed WordPress hosting. Kinsta is the gold standard ($35/mo for a starter site); WP Engine is the enterprise default; SiteGround is the budget option. You pay 3–5x more, but you never have to think about Linux. If you’re running 100+ sites, DigitalOcean stops being optimal. AWS Lightsail with a Multi-AZ database, or a Kubernetes cluster on DO/Linode, becomes worth the additional setup. The break-even point is around 10–20 sites. If your audience is mostly in one specific region (say, Australia), pick a host with a data center in that region. DO’s SYD1 region is fine; alternatives like Vultr Sydney or AWS ap-southeast-2 are also options. For everyone else: DigitalOcean is the most boring infrastructure decision you can make for a newsletter site, and that’s the highest compliment infrastructure can earn.

    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.

  • Why your free archive is training people not to subscribe

    Why your free archive is training people not to subscribe

    You’ve built a beautiful public archive. Every issue, neatly catalogued and indexed by Google. SEO-friendly URLs, a clean grid layout, maybe even a search function. It feels like good practice—transparent, reader-friendly, discovery-oriented.

    And it’s teaching your most interested readers that subscribing is optional.

    This isn’t about paywalls or artificial scarcity. It’s about understanding what an archive actually does in the wild, and why the tension between discoverability and commitment isn’t resolved by simply making everything public.

    The logic that breaks down

    The standard argument goes like this: public archives build trust, enable search traffic, let people sample your work before committing, and give you an SEO footprint. All true. The problem is what happens after someone finds your archive and reads three excellent back issues.

    They bookmark it. They add it to their RSS reader if you’ve enabled one. They remember your name and return when they think of it. What they don’t do is subscribe, because they’ve just learned they don’t have to. The value is already freely available, indexed, and accessible on their terms.

    You’ve turned your newsletter into a blog with an optional notification system.

    The readers who do subscribe from an archive page are often the least engaged cohort you’ll add to your list. They’re completionists, people who clicked the button out of vague interest, not urgency. They’re not waiting for your next issue—they’ve already read the ones that mattered to them. Your open rate from this segment will quietly drag down your overall metrics, and your deliverability along with it.

    What partial access actually looks like

    You don’t need to lock everything behind a signup wall, but you do need to create a meaningful difference between what subscribers get and what the public sees. That difference is where the value of being on your list lives.

    Some operators show only the most recent issue publicly, letting it act as a live sample while older issues remain subscriber-only. Others make the first three paragraphs public and truncate the rest. Some publish selectively—only certain types of issues go public, while the main editorial thread stays private.

    The key is that your archive shouldn’t answer the question “What does this newsletter contain?” It should answer “Is this worth subscribing to?” Those are different questions. The first one converts curiosity into passive readership. The second converts it into commitment.

    The unsubscribe safety valve

    Here’s the concern that always comes up: “But if people can’t read old issues, how will they know whether to subscribe?”

    They won’t know for certain. That’s the point. Subscribing becomes a low-stakes experiment, not a fully informed decision. And because you’ve made unsubscribing easy and visible (you have, haven’t you?), the risk is nearly zero. They’ll try one issue, maybe two. If it’s not for them, they’ll leave. If it is, they’ll stay and actually read what you send.

    This is healthier than a list padded with people who joined after reading six months of archives and now ignore everything in their inbox because they’ve already consumed your best work.

    What this means for discovery

    Yes, a restricted archive reduces your search surface area. You’ll get fewer organic landing pages, fewer inbound links to old issues, less passive traffic. That’s real.

    But ask yourself what that traffic was doing for you. If it rarely converted to subscribers, or converted them into unengaged ones, you’ve lost vanity metrics and kept the part that matters: people who join because they want what you’re about to send, not what you’ve already sent.

    If search visibility matters to your model—because you’re building authority, monetising traffic separately, or using the archive as a lead generation tool for something else—then a public archive may still make sense. But know what you’re trading. You’re optimizing for attention, not for list quality.

    For most newsletter operators, the list is the asset. Everything else is scaffolding.

    Here’s the thing: if you’re not sure whether your archive is helping or hurting, try this—check how many of your most engaged subscribers originally joined via an archive page versus a landing page, referral, or direct link. The answer will tell you whether your archive is doing the work you think it is.

    If you found this useful, subscribe to One Two Three Send and get insights like this in your inbox before they hit the archive. If they hit the archive at all.