Author: onetwothreeadmin

  • ConvertKit vs. Beehiiv vs. Substack: which platform wins in 2026

    ConvertKit vs. Beehiiv vs. Substack: which platform wins in 2026

    If you’re launching a newsletter or considering a platform switch in 2026, you’re probably weighing ConvertKit, Beehiiv, and Substack. All three handle the basics—sending email, growing a list—but the pricing models, feature sets, and ideal operators diverge fast.

    Here’s the honest breakdown: what each does well, where each falls short, and who should pick which.

    Pricing structures and where they hurt

    ConvertKit bills on subscriber count. You’ll pay $29/month for up to 1,000 subscribers, $49/month for 3,000, and $79/month for 5,000. Every contact on your list counts, even if they never open. The free tier caps at 10,000 sends per month and strips out advanced automations.

    Beehiiv uses a hybrid model: the free tier supports up to 2,500 subscribers with full feature access, but you’ll hit send limits and branding. The Scale plan ($49/month) removes caps and adds custom domains, referral programs, and ad network access. If you monetise through ads or premium subscriptions, Beehiiv takes a 3% cut on top of Stripe fees until you upgrade to $99/month.

    Substack is free to send, forever. You pay nothing unless you charge readers. Then Substack takes 10% of gross subscription revenue, plus Stripe’s ~3%. No monthly fee, no subscriber caps. You’re trading platform fees for zero upfront cost.

    The pain point: ConvertKit penalises list growth. Beehiiv’s ad-network cut eats margin if you’re earning through sponsors. Substack’s 10% hurts most once you’re above $5K/month in revenue—that’s $500/month in platform fees alone.

    Feature depth and what’s actually useful

    ConvertKit leads on automation. You can build complex sequences, tag based on link clicks, segment by custom fields, and trigger emails from Zapier events. The visual automation builder is clean, and subscriber scoring helps you identify engaged readers. It’s built for creators who run multiple funnels and need granular control.

    Beehiiv focuses on growth tools. The referral program is native and easy to configure—readers unlock rewards by sharing your newsletter. The recommendation network cross-promotes you to other Beehiiv publishers. Polls, 3D analytics, and A/B testing on subject lines come standard. If you’re chasing rapid list growth and don’t need deep CRM features, Beehiiv’s toolset is optimised for that.

    Substack strips features to the bone. You get a text editor, a paywall toggle, and threading for discussions. No automation, no tagging, no custom fields. The mobile app drives discovery and reader engagement, but you can’t segment sends or personalise beyond first name. It’s a deliberate trade-off: simplicity over power.

    The decision point: pick ConvertKit if you’re running a business with lead magnets, courses, or multi-step onboarding. Pick Beehiiv if your primary goal is growing the list and monetising through ads or recommendations. Pick Substack if you want to write, charge, and ignore infrastructure.

    Who each platform is actually built for

    ConvertKit works best for course creators, coaches, and productised-service operators who treat email as the top of a conversion funnel. If you’re selling a $500 course or a $2K coaching package, the automation ROI justifies the monthly cost. You’ll use sequences to nurture cold leads and tags to segment buyers from browsers.

    Beehiiv fits media-style publishers and newsletter-first businesses aiming for five- or six-figure subscriber counts. The referral mechanics and ad network make sense if you’re optimising for reach and CPM-based revenue. If you’re planning to sell sponsorships or run your own ad placements, Beehiiv’s analytics and testimonial exports help close deals.

    Substack suits independent writers and commentary-focused creators who want readers to pay for the writing itself, not a product at the end of a funnel. The 10% fee is tolerable if you’re earning $2K–$10K/month and don’t want to manage infrastructure. Above $10K/month, the platform cut starts to sting, and migration becomes worth the effort.

    Migration friction and lock-in risks

    All three let you export your list as CSV. ConvertKit and Beehiiv support GDPR-compliant double opt-in imports; Substack requires you to email your list with a confirmation link before importing to another platform, which adds friction and drops some subscribers.

    ConvertKit’s automation and tagging data exports cleanly, but you’ll need to rebuild sequences on the new platform. Beehiiv’s referral program data doesn’t port anywhere—if you’ve built a referral flywheel, leaving means starting over. Substack’s discussion threads and community features don’t migrate; you lose the social layer.

    The lock-in hierarchy: Substack has the lowest technical lock-in but the highest social lock-in. Beehiiv locks you into growth mechanics. ConvertKit’s lock-in is workflow rebuilding, not data loss.

    If you’re just starting, pick based on where you want to be in 12 months. If you’re switching, model the cost of recreating what you’ve built versus the cost of staying. ConvertKit at $79/month is cheaper than Substack’s 10% once you’re earning $800/month. Beehiiv’s $99/month makes sense if it replaces a separate referral tool and an analytics dashboard.

    Want more tool breakdowns like this? Subscribe to One Two Three Send for weekly comparisons, no sales pitch.

    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.

  • How to run WordPress on DigitalOcean in 2026: every option compared

    How to run WordPress on DigitalOcean in 2026: every option compared

    Shared hosting is fine right up until the day it isn’t. For us, that day arrived when our host suspended a live site over a billing hiccup — taking the blog, the signup forms, the newsletter, and the paywall offline in one move, with no warning. If you run anything that earns money on WordPress, that is the moment you start looking at hosting you actually control.

    The obvious destination is a cloud provider like DigitalOcean: predictable pricing, real resources, no mysterious “you exceeded your plan” suspensions. But “put WordPress on DigitalOcean” turns out to have about six different answers depending on how much of the server you want to manage yourself. This is the honest comparison we wish we’d had — every option, what it costs in 2026, and which one actually fits a small operator running a handful of sites.

    First, understand the spectrum

    Every option below puts your site on the same underlying DigitalOcean infrastructure. What changes is who configures and maintains the server — nginx, PHP, MySQL, SSL certificates, caching, backups, and the cron jobs that make scheduled posts and newsletters actually fire on time. That maintenance layer is the entire decision.

    From most hands-on to least:

    • Do it all yourself — a bare droplet you configure by hand.
    • A control panel on your own droplet — you own the DigitalOcean account; a panel automates the server work.
    • Fully managed — a third party provisions and runs a DigitalOcean droplet for you.

    Option 1: The DigitalOcean 1-Click WordPress droplet

    DigitalOcean’s Marketplace has a “1-Click” WordPress image — a droplet pre-loaded with the full LEMP stack (Linux, nginx, MySQL, PHP) and WordPress already installed.

    The “one click” label oversells it. You still SSH into the server, run a setup script, point DNS, install an SSL certificate, and own every line of nginx and PHP config from then on. It is built around a single site, so running four sites means hand-rolling virtual hosts and databases. Cost: just the droplet — from about $12–24/month.

    Who it’s for: developers who genuinely enjoy server administration and want zero abstraction. Who it’s not for: anyone whose actual job is publishing, not sysadmin. The trap here is building a server only you understand — the day it breaks and you’re busy, there’s no support line and no UI.

    Option 2: A free control panel you self-host (CloudPanel)

    CloudPanel is a free, open-source control panel you install onto your own droplet. It gives you a clean web interface for managing nginx, PHP, MariaDB, and free SSL without paying a monthly panel fee.

    Cost: $0 plus the droplet. The catch is that you self-host and maintain the panel itself, and there’s no managed backups-to-cloud-storage or hand-holding support. It’s a strong middle ground for the technically confident who want to avoid recurring fees.

    Option 3: A managed control panel on your own droplet (the sweet spot)

    This is where most small operators land, and where we did. You create and own the DigitalOcean account and droplet. A control panel connects to it and automates everything: it provisions nginx, PHP, and the database, sets up free SSL on every new site, configures caching and cron correctly, and runs scheduled backups to cloud storage. You get full ownership and root access, but a polished UI removes about 95% of the sysadmin work.

    The main contenders in 2026, all of which support DigitalOcean, expose root access, and handle free SSL plus staging:

    Panel From (2026) WordPress-only? Built-in cloud backups Notes
    xCloud Free (1 server / 10 sites), $5/mo unlimited No (also Laravel/Node) Yes Newest, cheapest, DigitalOcean-native, generous free tier
    FlyWP $5/server/mo (bring your own server) WordPress-focused Yes Flat per-server pricing, no feature gating
    RunCloud ~$8–9/mo No (any PHP) Add-on Established, multi-framework, cheapest of the veterans
    SpinupWP $12/mo Yes Yes WordPress-native, best documentation, auto cron + caching
    Ploi ~€8 / $10/mo No (Laravel-leaning) Yes Developer-focused, strong CLI tooling
    GridPane Free (25 sites) up to $100/mo Yes Yes Agency-grade; powerful but overkill for a few sites

    The pattern is the same across all of them: you paste a DigitalOcean API token into the panel once, it spins up the droplet, and from then on you add sites from a dashboard instead of a terminal.

    Option 4: Fully managed (Cloudways)

    Cloudways — now owned by DigitalOcean — provisions and fully manages a DigitalOcean droplet on your behalf. Free migration, staging, automated backups, and a full control panel, with nothing for you to maintain at the server level. The trade-off is that the DigitalOcean relationship is owned by Cloudways, not you: it’s DigitalOcean infrastructure under a Cloudways account, starting around $11–14/month for a 1GB server.

    Who it’s for: operators who never want to think about a server and are happy not to hold the DigitalOcean account directly. DigitalOcean’s own App Platform can also run WordPress, but it’s container-oriented and awkward for traditional multi-site WordPress hosting — we’d skip it for this use case.

    The operator concerns that actually matter

    Spec sheets miss the things that bite you in production. Three to weigh:

    Cron reliability

    This is the quiet one. WordPress’s built-in scheduler (WP-Cron) only fires when someone visits your site. On a low-traffic site, that means scheduled newsletters and posts can fire late — or not at all — until a visitor happens to load a page. It’s a leading cause of “my scheduled email didn’t go out.” A proper server setup disables WP-Cron and replaces it with a real system cron job that runs every few minutes, deterministically. SpinupWP and the other WordPress-native panels configure this automatically; on a hand-rolled server you have to remember to do it. If reliable scheduled sending matters to you — and for a newsletter it’s the whole game — this alone justifies a managed panel.

    Email deliverability is separate from hosting

    A point of relief: how you send email doesn’t have to change when you move hosts. If you send through a dedicated service like Amazon SES, Resend, Postmark, or an SMTP provider, that keeps working regardless of where WordPress lives — you just carry your SPF, DKIM, and DMARC DNS records to wherever your DNS is managed. Moving hosts does not mean rebuilding your sending reputation.

    DNS and a free safety layer

    Moving to your own server is the natural moment to put Cloudflare (free) in front of your sites. You get easy DNS management, a global CDN, page caching, and DDoS protection at no cost — and it pairs neatly with bot-protection tools like Cloudflare Turnstile on your signup forms.

    How to move without downtime

    The migration itself is less scary than it sounds, because you never touch the live site until the very end:

    1. Provision the droplet and panel; create an empty WordPress install for each site.
    2. Copy each site across with a free migration plugin. Migrate Guru is the easy button — no size limits, runs on its own infrastructure rather than straining your server, and rewrites URLs automatically.
    3. Test each migrated site on a temporary URL before changing any DNS.
    4. Cut over DNS only once you’ve confirmed it works — lower your TTL first, then point the records at the new server. SSL re-issues automatically.
    5. Verify email sending, any payment webhooks, and scheduled jobs on the new host.
    6. Keep the old host for a grace week, then cancel.

    Do one low-stakes site first as a pilot, validate the whole flow end-to-end, then batch the rest once you trust it.

    So what should you actually pick?

    If you value… Pick
    Lowest cost, comfortable with a newer tool xCloud (free tier)
    Maturity, best docs, WordPress-native polish and support SpinupWP ($12/mo)
    Flat-rate middle ground FlyWP ($5/mo)
    Zero panel fee, fully self-hosted, hands-on CloudPanel (free)
    Never wanting to see a server again Cloudways

    For a small business that just got burned by an unreliable host, we’d weight reliability and support over saving a few dollars a month. A single $12–24/month DigitalOcean droplet comfortably runs several low-traffic WordPress sites, and a WordPress-native panel handles the cron and caching that prevent the exact failures that pushed us off shared hosting in the first place. The newer free-tier panels are genuinely compelling if you’d rather trial first and keep costs near zero — DigitalOcean’s $200 new-account credit covers months of droplet time while you decide.

    Whatever you choose, the principle is the same: own the account, own the data, and put a thin layer of automation between you and the terminal. That’s the difference between hosting that serves your business and hosting that can switch it off.

  • Zapier’s task history cap and what it costs you in debugging time

    Zapier’s task history cap and what it costs you in debugging time

    Zapier stores a rolling window of task history—the step-by-step logs that show what fired, what data passed through, and where things broke. On the free tier, you get seven days. Starter and Professional plans bump that to 14 and 30 days, respectively. After that, the logs vanish.

    This sounds like a reasonable retention policy until you need to debug an automation that ran three weeks ago, or trace why a subscriber didn’t get tagged in your CRM after a payment event last month. The data exists in your destination app, but the execution trail—the one thing that tells you why it happened or didn’t—is gone.

    When short retention windows hurt

    Most operators don’t notice the cap until they hit one of three scenarios:

    Delayed failure discovery. A Zap processes thousands of tasks a month. One edge case—maybe a malformed webhook payload or a missing custom field—fails silently. You don’t catch it for three weeks because the destination app doesn’t surface the gap. By the time you notice, Zapier’s purged the task log. You know something broke, but you can’t see the payload or error message.

    Auditing compliance or billing. If you bill clients based on automated actions—email sends, form submissions routed to a CRM, course enrollments triggered by payment—you need a paper trail. Zapier’s task history works as a lightweight audit log, but only if the window covers your billing cycle. A 14-day retention window doesn’t span a monthly invoice period.

    Intermittent bugs that surface late. A Zap runs fine for weeks, then fails once because a third-party API changed a field name or returned an unexpected null value. The single failure happens on day 12. You don’t investigate until day 20. The log is gone, and you’re left guessing whether the bug still exists or resolved itself.

    What the cap costs you in operator time

    Without task history, you rebuild context from scratch. That means:

    • Manually triggering test runs to reproduce the original conditions, which often don’t match production data
    • Cross-referencing timestamps across multiple apps to infer what Zapier did or didn’t send
    • Requesting webhook logs from upstream services if they even retain them
    • Guessing at payload structure instead of copying it directly from the task detail screen

    A task log that takes 90 seconds to scan turns into a 20-minute archaeology project. Multiply that across every automation you run, and the retention cap becomes a recurring tax on your debugging time.

    How to work around the purge

    Log critical task data externally. Add a final step to high-value Zaps that writes key fields—timestamp, record ID, status—to a Google Sheet or Airtable base. You control the retention window, and you can filter or search logs without Zapier’s UI. This adds one task per run, so factor that into your monthly task quota.

    Upgrade selectively. If most of your Zaps are low-risk but a few handle payments or CRM updates, consider splitting them across workspaces. Keep mission-critical automations on a Professional plan (30-day history, $70/month for 2,000 tasks) and routine workflows on Starter ($20/month, 14 days). Zapier bills per workspace, so this only works if task volume justifies separate plans.

    Screenshot or export on failure. Zapier emails you when a Zap errors. The email includes a link to the task detail page, but that link expires when the task purges. If the error looks non-trivial, open the task immediately and screenshot the payload and error message. Low-tech, but it survives the retention window.

    Use webhook catch-all endpoints sparingly. Some operators route all inbound webhooks through a single Zapier catch hook, then branch with filters. This centralizes task history in one Zap, but it also means a single retention window governs every webhook you process. If you need longer retention for specific event types—like payments—give them their own Zap so you can log or upgrade them independently.

    When the cap doesn’t matter

    If your Zaps are stateless—posting to social media, reformatting RSS feeds, sending Slack notifications—you rarely need historical logs. The output is fire-and-forget. A missing task from two weeks ago doesn’t cascade into data integrity problems.

    But if your automations write to a system of record—your CRM, your course platform, your subscriber database—you’re betting that nothing will ever need forensic review outside the retention window. That’s a bet that costs you time the moment it loses.

    Want more automation deep-dives like this? Subscribe to One Two Three Send for tool breakdowns, pricing traps, and workflow fixes for solo operators.

  • WordPress media library search: how it works and when it fails

    WordPress media library search: how it works and when it fails

    If you’ve ever uploaded 2,000 images to WordPress and then spent ten minutes hunting for the one screenshot you need, you’ve hit the wall of the default media library search. It’s not indexing what you think it’s indexing—and once you understand how it actually works, you can stop fighting it.

    What WordPress media search actually indexes

    The WordPress media library search looks at exactly three fields:

    • The original filename at upload time
    • The title field (auto-generated from the filename unless you edit it)
    • The alt text field (if you filled it in)

    That’s it. It does not search captions, descriptions, or any EXIF/IPTC metadata embedded in the image file itself. If you uploaded a photo called IMG_4387.jpg and added a detailed caption later, searching for words in that caption returns nothing.

    This surprises people who assume WordPress reads embedded keywords or folder structure. It doesn’t. The media library is flat, and search is string-matching against a narrow set of database fields.

    When it breaks down

    Three scenarios make the default search useless:

    Batch uploads from a camera or design tool. If your filenames are sequential numbers or random strings (Screenshot 2026-05-14 at 3.42.18 PM.png), you have no meaningful search surface. Unless you manually rename files before upload or edit the title field afterward, you’re scrolling.

    Stock photo libraries. Stock sites often deliver files with generic names like business-team-meeting-1234567.jpg. If you’ve downloaded fifty similar images over six months, searching “meeting” returns all of them in no useful order.

    Client handoffs or team uploads. When multiple people upload assets, filename conventions collapse. One person uses dashes, another uses underscores, a third uploads final_FINAL_v3.png. Search becomes a guess-and-scroll game.

    What to do instead

    If you’re running a content site that depends on reusing images—screenshots, product photos, infographics, author headshots—you need a layer on top of the default library.

    FileBird (free and pro versions) adds folder structure to the media library. You can nest folders, drag-and-drop files, and filter searches by folder. It doesn’t change how search works, but it narrows the haystack. The pro version ($29/year for unlimited sites) adds bulk folder assignment and better sorting.

    Media Library Assistant (free) lets you add custom taxonomy terms to media files. You can tag images with project names, content categories, or usage rights, then filter by those terms. It’s more powerful than folders but requires discipline—if your team doesn’t tag consistently, it creates noise instead of clarity.

    Search & Replace for Media is overkill for most solo operators, but if you’ve inherited a site with thousands of poorly-named files, it’s the fastest way to batch-rename based on upload date, folder, or pattern matching.

    The non-obvious fix: enforce filename hygiene at upload

    The simplest long-term solution is a pre-upload naming convention. Before dragging a file into WordPress, rename it to something searchable: headshot-jane-smith.jpg, screenshot-stripe-dashboard-fees.png, chart-open-rate-march-2026.png.

    This feels like extra work, but it’s five seconds per file. The alternative is five minutes of scrolling every time you need to reuse an asset. If you’re publishing multiple posts a week, the math tips fast.

    For teams, agree on a pattern: [content-type]-[subject]-[date].ext works for most workflows. The WordPress title field inherits the filename, so you get searchable metadata by default.

    When you actually need a DAM

    If you’re managing more than 10,000 media files, or if you’re running a membership site with gated content libraries, or if multiple editors need to pull from a shared asset pool with usage rights tracking, the WordPress media library isn’t the right tool anymore. You need a digital asset management system like Cloudinary, Bynder, or even a self-hosted solution like ResourceSpace.

    But for most solo operators and small teams, the problem isn’t the tool—it’s the lack of a naming system before upload. Fix that, and search starts working again.

    One question: how do you currently organize reusable images in WordPress—folders, tags, or just better filenames? Reply and let us know what’s working (or what’s driving you up the wall).

  • Traffic attribution breaks when you run multiple campaigns at once

    Traffic attribution breaks when you run multiple campaigns at once

    Most analytics platforms promise to tell you exactly where your traffic came from. Google Analytics 4 shows you a tidy funnel with source, medium, and campaign labels. You see “organic search” or “Facebook / cpc” and assume you know what’s working.

    But if you’re running more than one acquisition channel at the same time—SEO content, a Google Ads campaign, and a LinkedIn presence, for example—your attribution data is almost certainly lying to you.

    The problem isn’t the tools. It’s that attribution models can’t handle the way real people behave online.

    Why multi-touch attribution falls apart

    Attribution models try to assign credit for a conversion across multiple touchpoints. GA4 offers data-driven attribution by default, which sounds sophisticated until you realize it’s still guessing.

    Here’s what actually happens: someone finds your site via organic search, reads a post, leaves. Three days later they see your LinkedIn post, click through, subscribe. Two weeks after that, they click a retargeting ad and buy your course.

    GA4 will credit the last non-direct click—the retargeting ad—even though the organic post did most of the work. If you switch to first-click attribution, you overweight SEO and ignore the fact that your ad closed the deal. Data-driven attribution tries to split the difference, but it’s still modeling behavior it can’t fully see.

    Cross-device journeys make it worse. If someone reads your newsletter on their phone and later converts on desktop, most analytics platforms treat those as two separate users unless you’re running a logged-in experience with user IDs.

    The result: you look at your attribution report and think Facebook is outperforming SEO, so you cut your content budget. Three months later, your paid campaigns stop converting because there’s no top-of-funnel content feeding them.

    What to track when attribution breaks

    Instead of trusting last-click or data-driven models, track channel performance in isolation and watch for correlation, not causation.

    Segment by landing page source. If most of your organic traffic lands on blog posts and most of your paid traffic lands on a dedicated landing page, you can compare conversion rates by entry point. It’s not perfect, but it’s more honest than pretending GA4 knows which click “caused” the sale.

    Use UTM parameters religiously, but don’t over-rely on them. Tag every link you control—social posts, email campaigns, guest articles. But remember that UTMs only tell you where the last click came from. If someone clicks your LinkedIn post, browses, leaves, and returns via direct traffic, the UTM is gone.

    Track assisted conversions separately. GA4’s “Advertising” workspace has an assisted conversions report that shows which channels appeared earlier in the funnel, even if they didn’t get last-click credit. It’s buried, but it’s one of the few reports that acknowledges multi-touch reality.

    Run channel blackout tests. This is the only way to measure true incrementality. Pause one channel completely for two weeks and watch what happens to your overall conversion volume. If you turn off paid ads and conversions drop by exactly the amount those ads were generating, they were working. If conversions stay flat, your paid traffic was cannibalizing organic visits that would have converted anyway.

    When to stop caring about attribution

    If you’re a solo operator pulling in less than $10K/month, attribution modeling is probably a distraction. You don’t have enough traffic or conversions to make statistical inferences, and you’re better off focusing on channel-level metrics: CPM for paid ads, click-through rate for email, time-on-page for SEO content.

    Attribution matters when you’re spending enough that a 10% efficiency gain is worth the analytical overhead. For most indie operators, that threshold is somewhere north of $5K/month in paid acquisition spend.

    Below that, track what you can measure cleanly—email open rates, organic impressions, ad spend per signup—and accept that the handoff between channels is a black box. Your job is to keep all the channels healthy, not to perfectly allocate credit between them.

    A better question than “which channel converted?”

    Instead of asking which channel gets credit for the sale, ask: which channels would cause revenue to drop if I turned them off?

    That’s a harder question to answer, but it’s the one that actually matters. It forces you to think in terms of systems, not funnels. Your SEO content feeds your email list. Your email list warms people up for your paid retargeting. Your retargeting closes deals that started with a Twitter thread six weeks ago.

    Attribution reports want to collapse that system into a single “winning” channel. In reality, the system only works when all the parts are running.

    If you want to get serious about measuring incrementality, set up holdout groups, run A/B tests at the channel level, and accept that you’ll never have perfect data. If you just want to grow your business, watch revenue per channel over time and invest more in whatever’s trending up—even if you can’t prove exactly why.

    Got a question about tracking, attribution, or analytics for your online business? Reply to this email—we read everything and answer the best questions in future issues.

  • Content calendars break when you plan more than two weeks out

    Content calendars break when you plan more than two weeks out

    Most productivity advice tells you to plan your content calendar weeks or months in advance. Map out topics, assign publish dates, block time for research and writing. The promise: less scrambling, more consistency, better results.

    The reality: those carefully planned calendars fall apart within days. A news cycle shifts. A tool launches. A reader question surfaces a better angle. Suddenly your polished four-week roadmap is obsolete, and you’re either publishing stale content or abandoning the plan entirely.

    Content calendars aren’t the problem. Over-planning is.

    Why long-range content planning fails solo operators

    When you’re running an online business alone or with a small team, you don’t have the luxury of a newsroom’s division of labor. You’re the reporter, editor, and publisher. That means your content strategy needs to respond to what you’re learning in real time—from analytics, reader replies, product feedback, and the tools you’re actually using day-to-day.

    A quarterly content calendar assumes your priorities won’t change. But if you’re iterating on a product, testing traffic channels, or adjusting your monetization model, your editorial focus should shift. Locking topics into a grid three months out creates artificial commitment to ideas that may no longer serve your business.

    There’s also the sunk-cost problem. Once you’ve invested an hour sketching out twelve topic ideas and slotting them into a spreadsheet, you feel obligated to execute them—even when a better, more timely topic emerges. The calendar becomes a constraint instead of a tool.

    The two-week threshold

    Two weeks is roughly the outer limit where topic planning still holds value without becoming a liability. You can reasonably predict:

    • Which tools you’ll be using or testing
    • What questions your audience is asking right now
    • What seasonal or industry events are genuinely imminent
    • Your own availability and energy levels

    Beyond that window, you’re guessing. And guesses dressed up as a content calendar waste time twice: once when you plan them, again when you revise or scrap them.

    For operators publishing multiple times per week, two weeks gives you four to eight slots. That’s enough runway to write ahead when inspiration strikes, but not so much that you’re locked into topics that go stale.

    What to plan instead of topics

    If you’re not filling a calendar grid with headline ideas, what do you schedule?

    Themes and beats, not individual pieces. Decide that this month you’ll rotate between three beats—say, email tools, AI workflows, and monetization tactics—without assigning specific angles. When it’s time to write, you pick the freshest idea within that beat.

    Formats and content shapes. Monday is a tutorial. Wednesday is a tool comparison. Friday is a case study with real numbers. The format is fixed; the topic flexes based on what’s relevant that week. This is how One Two Three Send operates, and it prevents both topic fatigue and the scramble for structure.

    Production blocks, not publish dates. Instead of “publish SEO guide on June 12,” schedule “research and draft one traffic piece between June 10–14.” You’re committing to the work, not the output. If a better angle surfaces mid-week, you can pivot without guilt.

    Evergreen buckets. Keep a running list of topics that aren’t time-sensitive. When you have energy but no urgent idea, pull from the bucket. These aren’t scheduled—they’re available.

    The calendar you actually need

    Your content calendar should answer one question: What’s the next thing I need to write, and when do I need to write it?

    For most solo operators, that’s a two-column tracker: publish date and content type. Fill the next two weeks. Leave everything else in a backlog, unsorted and unscheduled. Review the backlog weekly, pull in what’s relevant, let the rest age out.

    Tools don’t matter much here. A Notion database works. So does a Google Sheet, Trello board, or a text file. The system isn’t the point—the short planning horizon is.

    If you’re currently staring at a color-coded content calendar that runs through September, try this: archive everything more than two weeks out. For the next month, plan only the immediate next batch. Track whether you feel more scrambled or more responsive.

    Odds are, you’ll publish more relevant content with less planning overhead. And you’ll stop feeling guilty about ignoring a roadmap that was never going to survive contact with your actual business.

    What’s your content planning window right now—and is it working? Hit reply and let me know. I read every response, and reader questions often shape what we cover next.

  • AI assistants leak context when you switch between projects

    AI assistants leak context when you switch between projects

    If you’re using ChatGPT, Claude, or Gemini to draft emails, write product descriptions, and brainstorm content ideas in the same session, you’ve probably noticed the tone starting to bleed. A client brief starts sounding like your newsletter. Your course outline picks up jargon from a product spec you wrote an hour ago.

    That’s not you losing focus. It’s the assistant remembering too much.

    How AI memory works across conversations

    Most conversational AI tools maintain context within a single chat thread. That’s useful when you’re iterating on a draft or debugging a workflow. But many platforms now also persist memory across threads—storing facts, preferences, and patterns from past sessions to make future responses feel more tailored.

    ChatGPT’s memory feature, for example, stores details like your writing style, preferred tools, and recurring projects. Claude offers a similar feature called “custom instructions” that carries forward between chats. Gemini ties memory to your Google account, pulling in context from Gmail, Docs, and prior conversations.

    The problem: these tools don’t automatically segment memory by project, client, or business vertical. If you’re a solo operator juggling freelance work, your own newsletter, and a side product, the AI treats it all as one continuous job.

    That means a prompt like “write a welcome email” might generate copy that sounds like the SaaS client you were working with yesterday—not the D2C product you’re launching today.

    When bleed happens and why it matters

    Context bleed shows up most clearly in tone, vocabulary, and assumed audience. If you’ve been drafting B2B landing pages all morning and then ask the AI to write a casual Twitter thread, you’ll often get something that splits the difference: too formal for social, too chatty for a white paper.

    It’s worse when you’re working under NDA or handling sensitive client material. Even if you’re not pasting in proprietary data, the AI might pick up on industry-specific language, product names, or strategic framing and echo it back in unrelated work. That’s a compliance risk and a professionalism problem.

    For operators running multiple revenue streams—affiliate content, a paid newsletter, consulting, a course—context bleed also dilutes your brand. Your newsletter starts to sound like your client’s voice. Your course copy picks up affiliate-review phrasing. Readers notice when the tone shifts, even if they can’t articulate why.

    How to isolate context without losing efficiency

    The simplest fix: use separate chat threads for separate projects. Don’t rely on the AI to infer boundaries. Start a fresh conversation every time you switch contexts.

    If your AI tool supports memory or custom instructions, turn it off for client work. In ChatGPT, you can disable memory in settings under “Data Controls.” Claude lets you clear custom instructions per chat. Gemini’s memory is harder to partition, but you can use incognito mode or a separate Google account for client sessions.

    For operators who bill multiple clients or run distinct content verticals, consider using different AI accounts entirely. A free-tier ChatGPT account for client drafts, a paid Claude subscription for your own content. It’s redundant, but it enforces a hard boundary.

    Another tactic: explicitly reset context in your prompt. Start each session with a short instruction that overrides prior memory. Something like: “Forget previous projects. This is a cold email for a B2C e-commerce brand selling outdoor gear. Tone: direct, benefit-focused, no jargon.” It’s not foolproof, but it reduces bleed.

    When memory is worth keeping

    Context persistence isn’t inherently bad. If you’re working on a single long-term project—building out a course, drafting a book, developing a content calendar—memory helps the AI stay consistent without you having to repeat background in every prompt.

    The key is intentional segmentation. Treat AI memory like browser cookies: useful within a defined scope, risky when it leaks across domains.

    If you’re a solo operator, that means thinking through which projects share a voice and which need to stay isolated. Your newsletter and your Twitter threads? Probably fine to share context. Your newsletter and a white-label ghostwriting gig? Keep those separate.

    Most AI tools don’t yet offer project-level memory management. Until they do, the burden is on you to create those boundaries manually—through new threads, separate accounts, or hard resets in your prompts.

    One Two Three Send covers AI tools, workflow automation, and the infrastructure that keeps solo operators running. If this kind of tactical breakdown is useful, subscribe for one article like this every day.

    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.

  • Notion databases: when to relate tables and when to duplicate

    Notion databases: when to relate tables and when to duplicate

    Notion sells itself on the promise of connected databases—one source of truth, relational properties, rollups that calculate automatically. It’s a compelling pitch, especially if you’re managing clients, projects, content calendars, and invoices in the same workspace.

    But relational databases in Notion come with friction most solo operators don’t anticipate until they’re neck-deep in broken views and slow-loading pages. Sometimes the smarter move is to duplicate your data instead of relating it.

    When relations make sense

    Relational properties work well when you need live, two-way sync between databases. A classic example: a Projects database linked to a Clients database. You relate each project to a client, and Notion automatically shows all projects under that client’s page. Add a rollup, and you can calculate total hours billed or outstanding invoices without touching a spreadsheet.

    This setup shines when:

    • You frequently filter or group by the related property (e.g., “show me all active projects for Client X”).
    • The related database is relatively small—under 500 rows.
    • You need rollups or formulas that pull data from the related table.

    But the moment your related database grows past a few hundred entries, or you start chaining relations (Projects → Clients → Invoices → Line Items), Notion’s performance starts to sag. Pages take three to five seconds to load. Inline databases stutter when you apply filters. Mobile becomes nearly unusable.

    When duplication beats relation

    Duplication means copying static data—like a client name or project status—directly into the database where you need it, rather than linking to another table. You lose the automatic sync, but you gain speed and simplicity.

    Here’s when to duplicate:

    • High-volume databases. If your content calendar has 1,000+ rows and you’re relating each post to an author database, every view recalculates those links. Duplicating the author name as plain text makes filters instant.
    • Archival data. If you’re logging completed projects or past invoices, the data rarely changes. A relation adds complexity with no upside—just copy the client name and close the loop.
    • Cross-workspace collaboration. Notion’s database relations don’t work across workspaces. If you’re sharing a content calendar with a client but keeping your internal project tracker private, duplication is your only option.

    Yes, you lose the ability to update a client’s name in one place and see it cascade everywhere. But for most solo operators, that’s a theoretical problem. You’re not renaming clients every week. The performance gain is real; the sync risk is hypothetical.

    The hybrid approach

    You don’t have to choose one strategy for your entire workspace. I run a Content database with 800+ posts. Each post has a Topic property—but instead of relating to a separate Topics database, I use a multi-select dropdown. It’s technically duplication (the topic name lives in the Content database), but I can still filter, group, and count posts by topic without the relational overhead.

    For high-touch workflows—like tracking sponsorship deals where I need live rollups of total contract value—I keep the relation. For everything else, I flatten the data.

    Notion’s automation and API integrations (via Zapier or Make) can help maintain duplicated data if you do need occasional syncing. A zap can copy a client’s updated name into your archive database once a month, for example, without forcing every page load to recalculate a relation on the fly.

    What this means for your workspace

    If your Notion workspace feels sluggish, audit your relational properties first. Open your largest database, check the relations panel, and ask: Do I actually use this link, or am I just maintaining it because it feels like best practice?

    Relations are a feature, not a requirement. Treat them like indexes in a SQL database—powerful when you need them, expensive when you don’t.

    Using Notion to run your business? Reply with your biggest database headache—I’ll feature reader solutions in a future issue.

  • Canva’s content planner doesn’t play nice with multi-account workflows

    Canva’s content planner doesn’t play nice with multi-account workflows

    Canva rolled out its content planner feature to Pro subscribers in 2023, pitching it as an all-in-one design-and-schedule hub. You design a post, hit schedule, and Canva pushes it to Instagram, Facebook, LinkedIn, Pinterest, or TikTok at the time you choose. No export, no intermediate tool.

    It’s genuinely useful if you run a single brand with one social account per platform. But if you manage more than one business, run client accounts, or operate multiple brands under different identities, Canva’s content planner becomes a liability fast.

    One Canva account, one social identity

    Canva ties each social platform connection to a single account. You can link one Instagram account, one Facebook page, one LinkedIn profile. If you want to schedule to a second Instagram account, you need to disconnect the first, reconnect the second, schedule, then reverse the process.

    There’s no account switcher. There’s no team workspace toggle that lets you route posts to different clients’ accounts. Every disconnect-reconnect cycle risks losing your queue if you’re not careful, and it makes batch scheduling across brands impossible.

    For solo operators running two newsletters with separate social presences, or a freelancer managing three clients, this isn’t a minor inconvenience—it’s a structural mismatch.

    Brand kits don’t bridge the gap

    Canva lets Pro users create multiple brand kits: custom color palettes, fonts, and logos. You can swap between them when designing. But brand kits don’t extend to social account connections. Your Instagram link is account-wide, not brand-specific.

    You can design a post for Client A using their brand kit, then realize you’re still connected to Client B’s Instagram. The only fix is to save the design, disconnect, reconnect, find the design again, and reschedule. If you’re doing this more than twice a week, you’ll start looking for an alternative.

    Where dedicated schedulers win

    Tools like Publer, Buffer, and Later separate design from scheduling. You upload an asset, write copy, and assign it to one account in a dropdown. You can manage ten Instagram accounts, three LinkedIn profiles, and five Facebook pages in the same dashboard. Switching between them takes one click.

    Publer in particular handles this well: you connect multiple accounts per platform, tag each with a client or brand name, and filter your content calendar by account. Canva can’t replicate that because its content planner was built as a convenience feature for individual creators, not a workflow hub for multi-brand operators.

    The pricing delta is small. Canva Pro runs $120/year. Publer’s Premium plan is $12/month ($144/year) for up to ten social accounts and unlimited scheduling. If you’re already paying for Canva and need multi-account scheduling, the extra $24/year is negligible.

    When Canva’s planner still makes sense

    If you run one brand, post occasionally, and design everything in Canva anyway, the content planner is fine. It’s faster than exporting, uploading to another tool, and scheduling there. The calendar view is clean, the post preview is accurate, and it handles Instagram carousels without drama.

    But the moment you add a second account—whether that’s a personal brand alongside a business, a client project, or a side newsletter with its own social presence—the convenience evaporates. You’ll spend more time managing connection state than you save skipping an export step.

    If you’re already hitting that wall, set up Publer or Buffer now. Export your designs as PNGs, schedule them in a tool built for multi-account workflows, and stop fighting Canva’s architecture. The content planner is a feature, not a platform. Treat it that way.

    Want more tool breakdowns like this? Subscribe to One Two Three Send and get operator-focused guides every week—no fluff, just the mechanics that matter.

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

  • Substack’s paid subscriber import: how it works and what breaks

    Substack’s paid subscriber import: how it works and what breaks

    If you’re switching to Substack with an existing paid subscriber base, you’ll quickly discover that importing them isn’t a one-click operation. The platform treats free and paid subscribers very differently—and the tooling around paid imports is intentionally limited to protect both you and your readers from billing chaos.

    Here’s how the process actually works, what limitations you’ll hit, and the non-obvious gotcha that can cost you a month of revenue if you’re not careful.

    The two-path import: free vs. paid

    Free subscribers upload via CSV without friction. You export from your old platform, map the columns, and Substack ingests them in minutes. Paid subscribers require a different workflow because Substack needs to connect each person to an active billing relationship—either a Stripe subscription ID or a comped status you manually assign.

    If your previous platform used Stripe, Substack can import the subscription metadata directly—but only if both accounts share the same Stripe Connect relationship. That’s rare unless you were already using a Stripe-native platform like Ghost or a custom-built membership site. Most operators are coming from ConvertKit, Mailchimp, or Beehiiv, none of which expose raw Stripe subscription IDs in their CSV exports.

    That means you’ll use the comped subscriber route: you import paid subscribers as free accounts, then manually apply a “complimentary subscription” that grants them full access without charging them. Substack treats comped subs identically to paid ones for content access, but they don’t appear in your MRR calculations and won’t auto-renew unless you later convert them to a paid plan.

    The billing cutover problem

    Here’s the edge case that catches people: if you comp your existing paid subscribers and tell them to re-subscribe at their next renewal date, you’ll lose anyone whose renewal falls in the window between your import and your announcement. They’ll get charged by your old platform, then hit a paywall on Substack, and assume something broke.

    The safer approach is to cancel all subscriptions on your old platform before you import, refund any partial-month charges, and immediately comp everyone on Substack with an expiration date set to their original renewal. Then send a dedicated email explaining the transition and asking them to update their payment method before the comp expires. Substack will email them automatically seven days before expiration, but your own message converts better because it comes from you, not the platform.

    Expect 10–15% of comped subscribers to churn during this transition. That’s normal. The ones who don’t update their payment info within 30 days probably weren’t engaged enough to stay long-term anyway.

    The Stripe metadata you actually need

    If you do have access to Stripe subscription IDs—either because you’re migrating from Ghost, or because you were running Stripe directly—you’ll still need to provide Substack support with a CSV that maps each email address to its subscription ID and current billing cycle anchor date. You can’t upload this yourself; Substack’s backend team handles it manually to avoid mismatched billing states.

    Turnaround time is typically 3–5 business days, and they’ll only process it if your Stripe account is already connected to your Substack publication. If you’re switching Stripe accounts as part of the migration (common if you’re moving from a business entity to a personal one, or vice versa), you’ll need to use the comp method instead. Substack won’t connect a subscriber to a subscription ID that lives in a different Stripe account.

    When to skip the import entirely

    If you have fewer than 50 paid subscribers, the cleanest move is often to let them re-subscribe manually. Cancel their old subscriptions, refund the current billing period, and send a launch email with a discounted annual plan offer that offsets the hassle. You’ll lose some, but you’ll also avoid two weeks of support emails from people whose billing states didn’t migrate cleanly.

    For lists above 200 paid subscribers, the comp-and-convert method is worth the effort. Between 50 and 200, it depends on how hands-on you want to be and whether you’re also changing pricing or plan structure as part of the move.

    One last note: if you’re moving to Substack because you want their payment infrastructure to handle sales tax, VAT, and global compliance, make sure you’re not grandfathering in subscribers at old prices that don’t include tax. Substack’s tax automation only works on new subscriptions created after you enable it. Comped subscribers who convert will be charged tax, but anyone you migrate via Stripe ID handoff will keep their original tax treatment unless you manually update each subscription in Stripe. That’s a billing-support nightmare six months later when your accountant asks why half your EU subscribers aren’t remitting VAT.

    If you’re planning a platform migration and want step-by-step breakdowns like this every week, subscribe to One Two Three Send. We cover the tooling decisions that actually matter when you’re running a one-person content business.

    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.