Author: onetwothreeadmin

  • Google Analytics 4’s debug mode: catch tracking errors before they cost you

    Google Analytics 4’s debug mode: catch tracking errors before they cost you

    Most operators treat Google Analytics like a black box. You drop the tracking code on your site, events fire, and you trust the dashboard to tell the truth. But when conversion data goes missing or attribution breaks, you’re stuck guessing what happened three weeks ago.

    GA4’s debug mode solves this. It’s a real-time event inspector that shows you exactly what’s being tracked, what’s broken, and what’s being ignored — before bad data compounds into bad decisions.

    What debug mode actually does

    Debug mode is a testing layer that sits between your site and GA4’s servers. When enabled, it pipes all event data into a dedicated real-time report called DebugView, where you can see:

    • Every event as it fires, with full parameter details
    • User properties being set or updated
    • Validation errors (missing required fields, malformed values)
    • Events that aren’t configured to show up in standard reports

    It doesn’t change what gets tracked — it just makes the tracking visible while you’re testing. Once you turn it off, everything reverts to normal collection.

    This matters because GA4 silently drops events that don’t meet its schema. If you’re firing a custom event with a parameter name longer than 40 characters, GA4 won’t tell you — it’ll just ignore it. Debug mode surfaces these failures immediately.

    How to turn it on

    There are three ways to enable debug mode, depending on your setup.

    If you’re using Google Tag Manager: Open your GA4 configuration tag, expand “Fields to Set,” and add a field called debug_mode with the value true. Publish the container. This enables debug mode for all users, so only do this in a staging environment or with a separate GTM container.

    If you’re using gtag.js directly: Add debug_mode: true to your config call:
    gtag('config', 'G-XXXXXXXXXX', { debug_mode: true });

    If you want to test without changing code: Install the Google Analytics Debugger extension for Chrome. It enables debug mode for your browser session only, so you can test on a live site without affecting real user data.

    Once enabled, open GA4, go to Admin → DebugView (under the Property column), and interact with your site in another tab. Events should appear within seconds.

    What to check first

    Start with your conversion events. If you’re tracking newsletter signups, course purchases, or affiliate clicks as conversions, fire each one manually and watch DebugView.

    Look for:

    • Missing parameters. If your purchase event is supposed to include value and currency, but DebugView shows them as absent, GA4 won’t report revenue correctly.
    • Wrong data types. If you’re sending value: "29.00" as a string instead of a number, GA4 will reject it. DebugView flags type mismatches.
    • Events firing multiple times. If a single button click triggers three sign_up events, you’re inflating your conversion count. DebugView’s timestamp column makes duplicates obvious.
    • Events that never fire. If you expect to see a scroll event at 90% but it never appears, your trigger is misconfigured.

    One non-obvious thing: DebugView also shows you the engagement_time_msec parameter on every event. If this is always zero, it means GA4 thinks users aren’t engaging with your content — which can suppress your pages in Search Console’s performance reports.

    When to leave it on (and when not to)

    Debug mode is a diagnostic tool, not a permanent setting. Leaving it enabled in production clutters your DebugView report with noise and creates a false sense that everything’s being tracked (it is — for you, but not necessarily for users without the flag).

    Turn it on when:

    • You’re testing a new event or parameter
    • Conversion counts suddenly drop and you suspect a tracking break
    • You’re migrating from Universal Analytics and validating parity
    • You’re onboarding a new developer and want to show them what “correct” looks like

    Turn it off once you’ve validated the setup. If you need ongoing monitoring, use GA4’s standard real-time report instead — it’s less granular, but it reflects what actual users are sending.

    One more thing: debug mode doesn’t work with the GA4 measurement protocol (server-side tracking). If you’re sending events from your backend, you’ll need to validate those with GA4’s event builder or by checking the raw HTTP response codes.

    Want more operator-focused breakdowns of the tools that actually matter? Subscribe to One Two Three Send — one article like this, delivered weekly, no fluff.

  • Buffer vs. Typefully: which tool fits your content rhythm?

    Buffer vs. Typefully: which tool fits your content rhythm?

    If you’re running a content business solo or with a small team, you’ve probably tried to maintain some kind of social media presence. And if you’ve tried that for more than a week, you’ve looked at scheduling tools.

    Buffer and Typefully both solve the same surface problem—getting posts out the door without living inside Twitter or LinkedIn all day. But they’re built around completely different assumptions about how you work, and picking the wrong one will quietly make your workflow worse.

    Here’s what actually matters when you’re choosing between them.

    What each tool assumes about you

    Buffer assumes you’re managing multiple brands or clients, posting across several platforms, and want a central command center. It’s built for marketers who need to see everything in one place: a unified calendar, team collaboration, and analytics that roll up across Twitter, LinkedIn, Facebook, Instagram, and more.

    Typefully assumes you’re a solo operator or small team focused primarily on Twitter and LinkedIn, writing threaded content, and treating social as a writing practice—not a marketing channel. It’s designed around the composition experience first, scheduling second.

    That philosophical difference shows up everywhere.

    Pricing and what you actually get

    Buffer’s free plan gives you three social channels and ten scheduled posts per channel. If you need more, the Essentials plan starts at $6/month per channel. A typical setup—Twitter, LinkedIn, maybe Facebook—runs you $18/month. The Team plan ($12/channel/month) adds collaboration and approval workflows.

    Typefully’s free plan is more generous for Twitter-focused operators: unlimited scheduling on one Twitter account, basic analytics, and the core writing tools. The Creator plan ($12.50/month) adds LinkedIn, thread formatting, analytics, and auto-retweets. The Professional plan ($25/month) brings in team features and auto-plugs (automatic promotional replies to high-performing tweets).

    If you’re only posting to Twitter and LinkedIn and don’t need a visual calendar, Typefully’s free tier will cover you. If you’re juggling Instagram, Facebook, and client accounts, Buffer’s multi-platform approach makes more sense—but you’ll pay per channel.

    Where the workflow diverges

    Buffer’s strength is the calendar view. You can see a week or month at a glance, drag posts around, identify gaps, and treat scheduling like editorial planning. It integrates with Canva for image creation, supports first-comment scheduling on Instagram, and has a browser extension that makes sharing links fast.

    But Buffer’s composition interface is basic. You’re writing in a small text box. If you’re drafting threads or long-form LinkedIn posts, you’re fighting the UI.

    Typefully inverts that priority. The editor is clean, distraction-free, and purpose-built for threads. You can see character counts per tweet, preview how threads will unfold, and use slash commands to insert plugins (auto-promote your newsletter, add a link to your bio page, insert a call-to-action). The “Drafts” view functions more like a writing inbox than a calendar.

    Typefully also has a feature Buffer doesn’t: the ability to auto-RT your own tweets after a set delay, giving good content a second chance at reach without manual work.

    Where Typefully falls short is multi-platform posting. If you need to post the same update to Twitter, LinkedIn, and Facebook simultaneously, Buffer handles that in one action. Typefully treats Twitter and LinkedIn as separate composition contexts, which is more accurate to how the platforms work—but slower if you’re cross-posting identical content.

    Analytics and what they tell you

    Buffer gives you unified analytics across all connected platforms: reach, engagement, clicks, and top posts. It’s useful for reporting to a client or tracking overall performance, but it’s not deep. You won’t get follower growth trends or per-tweet breakdowns without upgrading to the Analyze add-on ($35/month).

    Typefully’s analytics are narrower but more actionable for solo operators. You see impressions, engagement rate, and profile visits per tweet. The “Top Tweets” view helps you identify what’s working so you can write more of it. The auto-retweet feature uses this data to resurface high performers automatically.

    Neither tool replaces native platform analytics for serious deep dives, but Typefully’s feedback loop—write, schedule, see what worked, write again—feels tighter.

    Which one to pick

    Choose Buffer if you’re managing multiple platforms (especially Instagram or Facebook), need a visual content calendar, or are coordinating with a team that needs approval workflows. It’s a solid, stable tool for multi-channel marketers.

    Choose Typefully if Twitter and LinkedIn are your primary channels, you write threaded content regularly, and you want the scheduling tool to feel like a writing environment. The free tier is legitimately usable, and the Creator plan is cheaper than Buffer’s equivalent if you’re only using two platforms.

    One more variable: if you’re already paying for a tool like Notion or Airtable and building your own content calendar there, Typefully’s lighter workflow might complement that better. Buffer wants to be your calendar.

    Want more tool breakdowns like this? One Two Three Send runs these comparisons every week. Subscribe here and get them in your inbox, no fluff attached.

  • Stripe’s payment links vs. checkout sessions: which one to use

    Stripe’s payment links vs. checkout sessions: which one to use

    Stripe offers two ways to collect payment without building a full checkout flow: payment links and checkout sessions. They look similar on the surface—both generate a Stripe-hosted page where customers enter their card details—but they solve different problems and scale differently.

    If you’re selling a course, accepting sponsorships, or launching a paid tier, knowing which tool to reach for saves you from either over-engineering or outgrowing your setup in three months.

    What payment links do well

    Payment links are static URLs you generate once in the Stripe dashboard. You pick a product, set a price, click “Create link,” and get a URL like buy.stripe.com/abc123. You paste that into an email, a Notion page, a Linktree, or anywhere else.

    They’re dead simple. No code. No integration. You can create one in under 60 seconds.

    They work best when:

    • You’re selling one or two products with fixed pricing
    • You want to test demand before building infrastructure
    • You need to send a payment request to a specific person (e.g., a sponsor invoice)
    • You’re embedding buy buttons in no-code tools like Carrd or Notion

    The trade-off: payment links are not dynamic. You can’t pass custom data, adjust pricing per customer, or trigger complex logic after payment. Every link points to the same product at the same price. If you want to sell three tiers, you need three separate links.

    When checkout sessions make more sense

    Checkout sessions are generated programmatically via Stripe’s API. Instead of a static URL, your server (or a tool like Zapier, Make, or a membership plugin) creates a unique session each time someone clicks “Buy.” That session can include custom line items, coupon codes, customer metadata, or pre-filled email addresses.

    You need a bit of code—or a tool that wraps the API—but you get control in return.

    Checkout sessions shine when:

    • You’re selling multiple SKUs or pricing tiers from one page
    • You want to pass user data (email, name, UTM params) into Stripe’s metadata
    • You need to apply dynamic discounts or generate invoices on the fly
    • You’re integrating with a CRM, membership site, or email platform that reacts to purchase events

    For example: if you run a course platform and want to tag buyers in ConvertKit the moment they pay, a checkout session can include the buyer’s email and course ID in metadata. A webhook listens for checkout.session.completed, pulls that metadata, and fires the tag. Payment links can’t do that.

    Pricing and limits

    Both options use the same Stripe transaction fees: 2.9% + 30¢ for cards in the U.S. There’s no additional cost for using payment links vs. sessions.

    Payment links support subscriptions, one-time payments, and even “customer chooses price” donation-style flows. Checkout sessions support the same, plus more flexibility around tax collection (Stripe Tax), installment plans, and multi-currency pricing.

    One gotcha: payment links expire after 90 days of inactivity if you’re on a free Stripe account and haven’t processed volume recently. Checkout sessions expire after 24 hours by default (you can extend this to 30 days), but they’re generated fresh each time, so expiration is rarely an issue in practice.

    Which one to pick

    Start with a payment link if you’re testing, selling one thing, or need something live in the next five minutes. It’s faster than building anything, and you can always upgrade later.

    Move to checkout sessions when you need:

    • Dynamic pricing or product selection
    • Integration with your CRM, ESP, or membership tool
    • Custom metadata or post-purchase automation
    • A branded checkout domain (Stripe lets you use checkout.yourdomain.com with sessions, not links)

    Most solo operators start with payment links for their first product, then switch to sessions once they’re running webinars, cohort courses, or tiered sponsorships. The migration is straightforward—your Stripe account, customer data, and reporting stay the same. You’re just changing how the checkout URL gets generated.

    If you’re already using WordPress and want a middle ground, plugins like WP Simple Pay generate checkout sessions without writing code. You build a shortcode-based button, and the plugin handles the API call behind the scenes.

    One more thing: whichever option you pick, turn on Stripe’s email receipts in your dashboard settings. A shocking number of operators forget this, and customers assume the payment didn’t go through when they don’t get confirmation. That’s a support ticket you don’t need.

    Want more breakdowns like this? Reply and tell us which tool or feature you’re trying to figure out—we’ll cover it in a future issue.

  • Cloudflare’s waiting room: when traffic spikes become revenue spikes

    Most indie operators dream about traffic spikes. A Reddit front page. A viral tweet. A mention in a big newsletter. Then the spike happens and the site goes down for two hours, taking sales pages, signup forms, and credibility with it.

    Cloudflare’s waiting room feature solves this by creating a virtual queue when traffic exceeds your threshold. Visitors see a branded holding page instead of a 503 error. They’re admitted automatically as capacity frees up. Your infrastructure stays online. Nobody sees a broken site.

    It’s not a caching trick or a CDN boost. It’s actual traffic control—and for solo operators running lean infrastructure, it’s worth understanding even if you never turn it on.

    How it actually works

    You define a threshold: say, 500 concurrent users on your checkout page or course login. When traffic crosses that line, new visitors enter a queue. They see a countdown timer and their queue position. The page auto-refreshes when it’s their turn.

    Cloudflare tracks visitors using a session cookie, so someone who closes the tab and returns doesn’t lose their spot. Sessions expire after 15 minutes of inactivity by default, though you can adjust that.

    The waiting room sits in front of specific paths—/checkout, /buy, /enroll—not your entire domain. Static pages, your blog, and your homepage can still serve normally while the bottleneck stays protected.

    Setup takes about ten minutes. You create the waiting room in the Cloudflare dashboard, define your traffic cap, customize the holding page HTML and CSS, then map it to the URL paths you want protected. No code changes on your end unless you want deeper control.

    When solo operators actually need this

    Most don’t. If your site runs on managed WordPress hosting with auto-scaling or you’re serving static content through a Jamstack setup, you probably have enough overhead to absorb spikes.

    But three scenarios make waiting rooms worth the setup cost:

    Limited backend capacity during launches. You’re selling a cohort-based course with 100 spots. Enrollment opens at noon. Five thousand people hit the page in the first three minutes. Your payment processor can handle it, but your WordPress backend can’t serve that many dynamic pages simultaneously. A waiting room meters the flow and keeps Stripe links working.

    Expensive per-request infrastructure. You’re running a tool with server-side processing—an image optimizer, a report generator, something that does real work per visitor. Each request costs CPU and RAM. A traffic flood doesn’t just slow the site; it racks up hosting bills. Waiting rooms cap your exposure.

    Critical conversion paths you can’t afford to break. You’re launching a one-time product with narrow margins. If the sales page goes down during launch hour, you lose the revenue permanently. A waiting room adds 20 seconds of wait time but ensures every visitor sees a working buy button.

    If none of those apply, you don’t need it. Caching, a solid host, and a CDN will cover most spikes.

    Pricing and platform limits

    Waiting rooms live on Cloudflare’s Business plan and above—$200/month as of early 2025. The Pro plan ($20/month) doesn’t include them. Free and Pro users see the feature grayed out in the dashboard.

    That’s steep for a solo operator, but if you’re already paying for Business-tier features—advanced firewall rules, custom SSL for SaaS, image optimization APIs—the waiting room becomes a bundled safety net rather than a standalone purchase.

    If you’re not on Business and a launch is coming, you can upgrade for one month, enable the waiting room, then downgrade after the event. Cloudflare doesn’t penalize plan switching. Just note that waiting room configs persist but won’t activate on lower tiers.

    The non-obvious tip: test with query parameters

    Waiting rooms activate based on concurrent sessions, not total visits. That makes them hard to test. You can’t simulate a thousand-user spike from your laptop.

    Cloudflare lets you force a waiting room preview by appending ?__cf_waitingroom=1 to your protected URL. That drops you into the queue regardless of actual traffic. Use it to check your custom HTML, test the countdown timer, confirm session cookies work, and make sure your brand colors don’t clash with the default layout.

    Run this test on mobile and desktop, and confirm that your holding page includes a clear message explaining why visitors are waiting and how long they should expect it to take. The default Cloudflare template is functional but generic. Sixty seconds spent customizing the copy reduces abandonment measurably.

    One more thing: if you’re protecting a path like /buy, make sure your email links, ad campaigns, and social posts all point to the exact protected URL. A waiting room on /buy won’t catch traffic landing on /purchase or a homepage button leading somewhere else. Traffic control only works when all roads lead through the same gate.

    Hit reply if you’ve used Cloudflare waiting rooms during a launch—or if you’ve survived a spike without them. I’m tracking real-world operator experiences for a follow-up piece on traffic resilience patterns.

  • Stop Buying Subscribers. Start Trading Them.

    Stop Buying Subscribers. Start Trading Them.

    Most operators trying to grow a newsletter run into the same wall around 1,000 subscribers. Organic search drips a few signups a day. Social posts spike traffic for 24 hours then go quiet. Paid ads on Meta or X cost $3–$8 per email when they work, more when they don’t. Referrals — actual reader-to-reader forwarding — are the gold standard but slow until you have enough subscribers for the math to compound.

    The piece most operators miss is mutual recommendation: appearing in the recommendation list of newsletters whose audience overlaps with yours, and showing those same newsletters to your readers. It’s how Substack’s “Recommended by other writers” works inside their platform; it’s how SparkLoop and Beehiiv‘s recommendation marketplaces work as a paid layer; and it’s the single channel new operators consistently underestimate.

    The “Other newsletters you might like” widget in One Two Three Send Pro is the same idea — free, and built into the WordPress plugin.

    What the widget does

    The plugin runs a central directory at onetwothreesend.com — a registry of newsletters built on One Two Three Send Pro. When you install the plugin and opt in, two things happen:

    1. Your newsletter appears in other publishers’ widgets — both on their websites and at the bottom of their daily emails. A reader who’s enjoying their newsletter sees a card with your name, your one-line description, and a Subscribe button.
    2. Your widget shows other publishers’ newsletters — the same way, on your blog posts and at the bottom of your emails.

    Four cards by default. Each Subscribe link routes through a tracked redirect, so both sides can see how many clicks each surface produces.

    Why mutual recommendation outperforms most other channels

    1. The intent match is excellent. Someone reading another travel-newsletter operator’s post is, by definition, a person who likes reading travel newsletters. They’ve already qualified themselves on the medium and the topic. Conversion from that audience is typically 2–10× a cold paid ad on Meta, because the reader is already doing the thing you want them to keep doing.

    2. The cost is ad inventory you weren’t selling. The bottom of every blog post and every email is real estate that, if you’re not running the widget, is empty. Trading that space for similar inventory on someone else’s newsletter is free. The “cost” is showing four other newsletters to your readers — and if you’ve curated the network well, that’s a feature, not a leak.

    3. It compounds with size. A widget with 4 newsletters in it is mildly useful. A widget with 50 newsletters in the registry (where the algorithm picks the 4 most-relevant for each impression) is a small Times Square billboard. Each newsletter that joins makes the widget more useful for everyone. Networks of this kind typically hit a tipping point at 30–50 members where the rate of new subscribers from the widget overtakes referrals for new operators.

    What you actually see on each surface

    On every blog post: the widget appears at the end of the article body as a labelled section — Other newsletters you might like — with four cards. Subscribe buttons go to each partner newsletter’s signup form.

    At the bottom of every newsletter email: the same four newsletters, rendered in email-safe inline tables so it works in Gmail, Outlook, Apple Mail, and the rest — not just modern browsers.

    No widget on: admin pages, RSS feeds, REST output, the home page or category archives, your own newsletter posts (those build their own widget already), and any post where you’ve placed the shortcode manually so we don’t duplicate it.

    The 60-second setup

    Once you have One Two Three Send + One Two Three Send Pro installed:

    1. Go to Newsletter → Network.
    2. Click Join the network.
    3. Confirm your newsletter name, description, and signup URL. The description is what shows up under your name in everyone else’s widget — keep it to one line and lead with the value.
    4. Save.

    That’s it. The plugin starts publishing your listing to the central registry within a minute. Other sites’ widgets refresh their cached recommendations every few hours, so you should start appearing on partner sites within a day. Your own widget activates once at least three other newsletters have joined — otherwise the widget hides itself rather than show a barely-populated panel.

    To override the default count for a specific page, drop the shortcode in manually:

    		

    Other newsletters you might like

    Local Edinburgh

    Local Edinburgh is a website that is dedicated to the promotion of Edinburgh as a travel destination. Edinburgh is Scotland’s capital city renowned for its heritage culture and festivals.

    Subscribe

    Ireland Moments

    A daily newsletter and blog celebrating Ireland — its places, culture, music, history and the stories worth sharing from the Emerald Isle.

    Subscribe

    Love London

    A newsletter for Londoners who want to rediscover their own city. Travellers planning their first or fifth visit. Anglophiles who fell in love with London through literature, film, or a rainy afternoon on the South Bank.

    Subscribe

    Scottish Rugby Fans

    The best Scottish rugby updates, straight to your inbox — Six Nations, the Nations Championship, Glasgow and Edinburgh. Only when there's something worth reading.

    Subscribe

    Newsletters via the One Two Three Send network.  ·  Want your newsletter featured here? Click here

    Cap is 10 cards.

    What to put in the description line

    The line under your newsletter name is the entire pitch. People read eight words and decide whether to click. Bad descriptions look like this:

    “A newsletter about productivity, time management, focus, and getting more done in less time with proven techniques.”

    Good descriptions look like this:

    “One small experiment to get unstuck. Mondays.”

    The first one is a list of topics. The second is a contract: what you’ll get, when you’ll get it. Lead with the benefit, name the cadence, stop.

    A few patterns that work:

    • The benefit + the cadence: “Smarter ad copy. Every Tuesday.”
    • The audience + the value: “For solo SaaS founders. The one growth tactic I tried this week.”
    • The hook + the proof: “The newsletter that made me $40k. Free.”

    Avoid adjective stacking (“the best, smartest, most insightful…”), listing every topic (“…covering marketing, sales, retention, hiring…”), and generic claims (“trusted by thousands of readers”). They all eat your eight words and say nothing.

    Honest expectations

    The widget is not a button you press to get subscribers. Real numbers from running this on a small travel-newsletter network:

    • First 30 days: 5–15 new subscribers per week if you’re a small site with 200–1,000 weekly visitors. Roughly 0.5–1.5% click-through rate on widget impressions; about 30% of clicks convert when the partner newsletter and yours overlap topically.
    • Once your daily email goes to 3,000+ subscribers: 20–80 new subscribers per week, mostly via the email-bottom widget rather than the blog one (email gets read; blog posts compete with everything else).
    • The network effect kicks in around 30 members: below that, your widget might only show 4 partners and reader fatigue (“oh, those four again”) shows up. Recommend the plugin to other operators in your space — every additional member makes everyone’s widget more useful.

    The widget will not turn a newsletter nobody wants into one people want. It amplifies whatever signal your newsletter already has. If your retention is poor and your open rate is 12%, the widget will bring in subscribers who will also unsubscribe. If your newsletter is genuinely good and you’re stuck below 1,000 because nobody knows about you, the widget is one of the best free channels available.

    Click tracking and stats

    Every Subscribe-button click routes through the central registry’s click endpoint, so both sides see where their clicks come from. You can read your own outgoing-and-incoming click counts at Newsletter → Network → Stats. Useful for two things:

    • Spotting which partners send the best subscribers — open rate of subscribers from each source, after 30 days. Bad-fit traffic shows up as a 60% open-rate drop in the first week.
    • Spotting when you’ve outgrown the description — if your CTR (Subscribe clicks ÷ widget impressions) drops below 0.5%, you’ve either changed audiences (the description no longer matches what they’ll get) or the partners on the widget no longer overlap with you. Time to rewrite the line.

    What the widget is not

    • Not a paid placement. Nobody’s buying recommendations. The network is mutual — you appear if and only if you also show others.
    • Not Substack Recommendations. Substack’s system only works inside Substack and lives in publication settings. This widget is your own real estate, on your own domain, in your own email.
    • Not affiliate-driven. No commission. The point is reader exchange.
    • Not curated by us. Every newsletter that joins appears. Spam protection is automated (failed delivery rate, complaint rate, listing takedown reports). If you find a partner that’s a poor fit, you can hide specific listings from your widget without leaving the network.

    The minimum viable test

    If you’ve never used the widget before, this is the smallest test that tells you whether it’s worth keeping on:

    1. Install One Two Three Send + One Two Three Send Pro.
    2. Join the network (Newsletter → Network → Join).
    3. Leave it on for 30 days. Don’t change anything else — no new lead magnet, no new content cadence, no new referral push.
    4. After 30 days, check Newsletter → Stats for incoming subscriber count from the widget vs. your usual weekly average.

    If you got more than 50 new subscribers from the widget alone, it’s a permanent channel. If you got 5 and the partner newsletters were a poor fit, your description is the issue (rewrite it) or your topical neighborhood is thin in the network (recruit a few peers).

    Either way: the widget costs nothing to keep on, and the first 30 days will tell you whether to invest in better description copy or recruit more partners. Most operators discover that “a small percentage of every email and every blog post” turns into their third or fourth largest acquisition channel after a few months.

    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.

  • 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 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 Beehiiv — Beehiiv 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 Signatures → Add 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.

    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.