Author: onetwothreeadmin

  • ConvertKit custom fields bloat subscriber profiles—when to use tags instead

    ConvertKit gives you two ways to track information about subscribers: custom fields and tags. Most operators pick one by habit or intuition, then run into performance problems, automation failures, or segmentation nightmares six months later.

    The difference isn’t just semantic. Custom fields and tags work differently under the hood, cost differently at scale, and break in different ways when you push them too hard.

    What custom fields actually store

    Custom fields hold variable data—strings, numbers, dates—unique to each subscriber. Think first name, referral source, purchase count, or renewal date.

    ConvertKit stores these as key-value pairs in your subscriber record. You can reference them in emails with liquid syntax ({{ first_name }}), filter segments by their values, and update them via API or form submission.

    The gotcha: every custom field you create adds a column to every subscriber record, whether populated or not. An empty field still exists in the database. Add twenty fields and you’re carrying twenty columns per contact, even if nineteen are blank.

    This doesn’t break anything immediately. But it slows segment queries, complicates exports, and makes your data harder to audit. I’ve seen accounts with forty-plus custom fields where only six held useful information. The rest were legacy experiments or half-finished automations.

    What tags actually track

    Tags are binary flags. A subscriber either has a tag or doesn’t. You can’t store a value in a tag—just presence or absence.

    ConvertKit indexes tags separately from subscriber records. Adding a tag doesn’t expand the subscriber table. It creates a relationship record in a join table. That architecture scales better when you’re tracking dozens of attributes.

    Tags also surface better in the UI. You can see all applied tags at a glance in the subscriber list. Custom field values require opening each record or exporting a CSV. For quick visual checks—who’s in the beta cohort, who opted into coaching—tags win.

    The downside: tags can’t hold nuance. If you need to store when someone joined the beta or which tier they purchased, a tag won’t cut it. You’ll end up creating beta_joined_2026_01, beta_joined_2026_02, and so on—tag sprawl that’s worse than a single date field.

    When to use custom fields

    Reach for custom fields when you need to store or reference a specific value:

    • Personalization tokens in email copy (first name, company, city)
    • Numeric counters that increment (emails opened this month, courses completed)
    • Dates for time-based logic (trial start date, last purchase, renewal window)
    • External IDs for syncing with other tools (Stripe customer ID, WordPress user ID)

    Custom fields also make sense when you need to filter segments by ranges or partial matches. “Purchase count greater than 3” or “City contains ‘New’” requires field-based logic. Tags can’t do that.

    When to use tags

    Use tags for binary states, audience segments, and behavioral flags:

    • Lifecycle stages (subscriber, buyer, churned, reactivated)
    • Interest categories (AI tools, WordPress, monetization)
    • Engagement tiers (active, dormant, cold)
    • Cohort membership (joined Q1 2026, beta tester, workshop attendee)

    Tags scale better when you’re tracking many attributes that most subscribers won’t have. If only 8% of your list are buyers, a buyer tag is leaner than a is_buyer custom field sitting empty on 92% of records.

    Tags also play nicer with automation branching. ConvertKit’s visual automations let you split paths based on tag presence with a single click. Doing the same with custom field values requires more setup and is harder to debug when it breaks.

    The hidden cost of choosing wrong

    I’ve worked with a SaaS newsletter operator who used custom fields for everything—including audience interests. They had fields like interested_in_AI, interested_in_SEO, and interested_in_monetization, each storing “yes” or blank.

    Segmenting required filtering by six different field conditions. Automations couldn’t branch cleanly. Exports included twelve columns of “yes” and empty cells. Switching to tags cut segment load time from four seconds to under one and made the automation map readable again.

    Conversely, I’ve seen operators try to use tags for dates. They’d create trial_started_2026_06_15, then realize a week later they couldn’t query “trial started more than 7 days ago” without manually adding 365 tags. A single trial_start_date custom field solved it.

    One non-obvious tip

    You can combine both. Use a custom field to store the precise value and a tag to mark the category.

    Example: store last_purchase_date as a custom field (for time-based logic and reference), then apply a buyer tag (for quick filtering and automation branching). The field gives you precision; the tag gives you speed.

    This hybrid approach works especially well for high-cardinality data—attributes that can take many values but where you still want fast segment access. Referral source is another good candidate: store the exact UTM in a field, apply a referral_traffic tag.

    Before you create your next custom field or tag, ask: am I storing a value I need to reference, or am I marking a state I need to check? The answer tells you which to use.

    Got a ConvertKit setup question? Reply to this email—I read every one, and reader questions become future articles.

  • Zapier vs. Make vs. n8n: which automation platform to pick

    Zapier vs. Make vs. n8n: which automation platform to pick

    Workflow automation tools promise to glue your stack together—newsletter platform to CRM, form submissions to Slack, payment webhooks to spreadsheets. But the three most popular platforms—Zapier, Make, and n8n—differ sharply in pricing model, learning curve, and where they break under load.

    Here’s how to pick the right one for your online business, based on technical comfort and workflow complexity.

    Zapier: the fastest onramp, highest per-task cost

    Zapier is the incumbent. Its library covers 6,000+ apps, the UI is beginner-friendly, and most workflows take under ten minutes to build. You connect two apps, pick a trigger, map fields, and hit publish.

    Pricing starts at $19.99/month for 750 tasks. A “task” is any action—sending an email, creating a row, posting to Slack. Multi-step Zaps consume one task per step. If you’re running a weekly digest that pulls 50 rows from Airtable, formats them, and sends via Postmark, that’s 100 tasks per send (50 read actions + 50 format actions). At moderate volume, you’ll hit the 750-task ceiling fast.

    The $49/month tier gives you 2,000 tasks and multi-step Zaps. The $69 tier unlocks 5,000 tasks and premium apps like Salesforce. After that, overage is $0.01–0.03 per task depending on plan.

    Zapier is best for: solo operators who want speed over cost efficiency, workflows under 1,000 tasks/month, and teams with zero dev resources.

    Where it breaks: Complex conditional logic requires nested filters that eat tasks. Error handling is limited—if step three fails, the whole Zap dies unless you add error-catching steps (more tasks). Debugging multi-step Zaps means clicking through each execution log manually.

    Make: visual logic, cheaper at scale

    Make (formerly Integromat) uses a node-based canvas. You drag modules onto a board, draw connections, and configure routers, filters, and loops. It’s more visual than Zapier but steeper to learn.

    The key difference: Make charges by operations, not tasks, and counts more efficiently. A single HTTP request that returns 50 records and pipes them through a filter counts as two operations (fetch + filter), not 50. For bulk workflows, this cuts cost dramatically.

    Pricing starts at $9/month for 10,000 operations. The $16 tier gives you 40,000. Even the free tier includes 1,000 operations—enough to test real workflows. Make also includes built-in error handling, rollback, and scenario versioning at every tier.

    Make is best for: operators comfortable with flowcharts, workflows that process batches (RSS to social, CSV imports, webhook queues), and anyone hitting Zapier’s task ceiling.

    Where it breaks: The UI intimidates non-technical users. App connectors are less polished than Zapier’s—some require manual API setup. The execution log is powerful but dense; reading it requires understanding JSON structure.

    n8n: self-hosted, unlimited operations, steepest learning curve

    n8n is open-source. You host it yourself (DigitalOcean, AWS, or your own VPS) or pay for n8n Cloud. The workflows look similar to Make—nodes, connections, conditional branches—but you control the infrastructure and pay nothing per operation.

    Self-hosting costs $5–20/month depending on server size. n8n Cloud starts at $20/month for 2,500 executions (an execution is one full workflow run, regardless of steps). The free Cloud tier allows 50 executions/month.

    n8n’s power is in flexibility. You can write JavaScript inside nodes, call custom APIs, manipulate data inline, and trigger workflows via webhook, cron, or manual button. It’s the only platform where you can run a workflow locally, version-control it in Git, and deploy via CI/CD.

    n8n is best for: technical founders, dev-friendly teams, workflows that need custom code, and businesses running 10,000+ operations/month where per-task pricing becomes prohibitive.

    Where it breaks: You’re responsible for uptime, backups, and security. The app connector library is smaller (400+ apps vs. Zapier’s 6,000). Some integrations require OAuth app setup or API keys that aren’t documented. If you’re non-technical and your server goes down at 2am, you’re stuck.

    How to decide

    Start with your monthly operation count and technical comfort.

    If you’re running under 1,000 tasks/month and want zero friction, use Zapier. If you’re processing batches—pulling 200 RSS items daily, importing CSVs, or handling webhook queues—switch to Make before you hit Zapier’s $69 tier. If you’re technical, running 10,000+ operations, or need version control and custom logic, self-host n8n.

    One non-obvious move: use Zapier for the first 90 days to validate workflows, then migrate the high-volume ones to Make or n8n once you know they’re permanent. Rebuilding a workflow in Make takes 20–40 minutes if you understand the original logic.

    Most solo operators land on Make. It’s the sweet spot between Zapier’s ease and n8n’s control, and the $16/month tier covers 95% of real-world use cases.

    Have a workflow question? Reply to this email—we read every one and answer the best questions in future issues. Subscribe here if someone forwarded this to you.

  • Google Search Console’s URL Inspection Tool: What It Actually Tests

    Google Search Console’s URL Inspection Tool: What It Actually Tests

    Google Search Console’s URL Inspection tool sits at the top of every SEO operator’s diagnostic stack. You paste a URL, hit Enter, and get a verdict: indexed or not, crawlable or blocked, mobile-friendly or broken.

    But the tool checks more than you think—and sometimes lies about what it finds. Here’s what actually happens when you inspect a URL, what the results mean, and when to ignore them entirely.

    What the Tool Actually Checks

    When you run an inspection, Google fetches the live version of your page and compares it against the last indexed snapshot. The report breaks into two columns: URL is on Google (the indexed version) and Live Test (what Googlebot sees right now).

    The live test runs through:

    • Crawlability: Can Googlebot access the page? Checks robots.txt, meta robots tags, X-Robots-Tag headers, and server response codes.
    • Rendering: Does the page load JavaScript successfully? Google uses a recent Chromium version, but timeouts still happen.
    • Mobile usability: Viewport settings, text size, tap target spacing. Google indexes mobile-first, so this matters even if your traffic skews desktop.
    • Structured data: Parses schema.org markup and flags errors or warnings.
    • Canonical tag: Confirms whether your declared canonical matches Google’s selected canonical.

    The indexed column shows what Google already cached. If you recently changed the page, the two columns won’t match. That’s normal—but it also means you can’t trust the indexed column to reflect current reality.

    When the Tool Misleads You

    The live test doesn’t guarantee indexing. It only proves Googlebot can crawl the page. Google may still choose not to index it due to quality signals, duplicate content, or crawl-budget constraints.

    I’ve seen pages pass every live test—green across the board—yet remain excluded for months. The tool won’t tell you why. You’ll need to cross-reference the Coverage report and check for “Crawled – currently not indexed” or “Discovered – currently not indexed” flags.

    The rendering preview also lies occasionally. Google’s renderer times out after five seconds for most JavaScript execution. If your React app or WordPress theme loads critical content late, the preview may show a blank page even though real users see the full layout. Compare the screenshot against an incognito browser session to catch this.

    Structured data validation in the URL Inspection tool is stricter than the separate Rich Results Test. A page might fail in the inspector but still earn rich snippets in search. If you’re optimizing for featured snippets or product schema, validate in both tools.

    The “Request Indexing” Button and What It Actually Does

    After running a live test, you can click Request Indexing. Google adds the URL to a priority crawl queue, but it’s not instant—and it’s not a guarantee.

    The queue processes within a few hours to a few days, depending on your site’s overall crawl budget and domain authority. High-authority sites see faster indexing. New domains or sites with thin content wait longer.

    You get a limited number of indexing requests per property per day. Google doesn’t publish the exact quota, but operators report hitting limits around 10–12 requests in 24 hours. If you’re launching a batch of new pages, prioritize the ones that drive revenue or backlink to other content.

    One non-obvious tip: request indexing for your XML sitemap URL itself after adding new pages. This signals Google to re-crawl the sitemap and discover the new URLs faster than waiting for the next scheduled sitemap fetch.

    When to Use It vs. When to Wait

    Use the URL Inspection tool when:

    • You’ve fixed a crawl error or removed a noindex tag and need to confirm the change took effect.
    • You’ve published time-sensitive content—event coverage, product launches, breaking commentary—and need Google to pick it up within hours.
    • You’ve updated a high-traffic page and want to verify rendering before Google re-indexes on its own schedule.
    • You’re debugging why a page isn’t appearing in search despite being live for weeks.

    Skip it when:

    • You’re publishing evergreen content that doesn’t compete on speed. Let Google’s normal crawl cycle handle it.
    • You’ve already requested indexing for the same URL in the last 48 hours. Repeated requests don’t speed things up.
    • The page is thin, duplicate, or low-quality. Requesting indexing won’t override Google’s quality filters.

    The tool works best as a diagnostic instrument, not a publishing workflow. If you’re hitting the request-indexing button for every post, you’re either publishing too much low-value content or your site has deeper crawl-budget problems that no amount of manual requests will fix.

    One Two Three Send covers SEO tools, traffic strategy, and operator workflows every week. Subscribe here to get the next breakdown in your inbox.

  • Beehiiv’s boost network: when paid discovery costs more than it delivers

    Beehiiv’s boost network: when paid discovery costs more than it delivers

    Beehiiv‘s Boost network lets you pay to place your newsletter in front of other publishers’ audiences. You set a cost-per-subscribe bid, the network distributes your sign-up form as a recommendation block in other newsletters, and you pay only when someone converts.

    It sounds clean: growth on demand, no creative work, pay-per-result pricing. But the unit economics break down faster than most solo operators expect, and the subscriber quality often doesn’t match what you’d get from a direct swap or organic channel.

    How Boost pricing actually works

    You bid per subscriber. Beehiiv suggests a minimum around $1.00 to $2.00 depending on your niche, but competitive categories—business, finance, tech—regularly see bids north of $3.50. The platform runs an auction: your bid competes against other newsletters targeting similar audiences, and higher bids get more placement.

    If you’re spending $3.00 per subscriber and converting 100 sign-ups, that’s $300. Compare that to a single well-placed guest post, a Reddit comment thread that goes viral, or a reciprocal mention in a newsletter with 5,000 engaged readers. Those channels cost time, not cash, and the subscribers tend to stick around longer because they arrived with context.

    Boost also takes a 20% platform fee on top of your bid when you’re the one receiving the promotion revenue. So if another publisher is willing to pay $2.00 per subscriber to reach your audience, you only net $1.60. That margin matters if you’re considering Boost as a two-sided marketplace—running campaigns and monetizing your own list simultaneously.

    Subscriber quality lags behind owned channels

    Boost subscribers convert at the point of least intent. They see a recommendation block, often at the bottom of someone else’s newsletter, and click through with minimal context about what you publish. Compare that to someone who found you via search, read three articles, then subscribed—or someone who saw you interviewed on a podcast and went looking for your sign-up page.

    The data backs this up. Operators I’ve spoken with report Boost subscribers opening 10–15 percentage points lower than their list average, and unsubscribe rates spike in the first three sends. You’re not buying an audience; you’re renting attention from people who were already reading something else.

    That doesn’t make Boost useless—it makes it a cold-traffic channel. If your welcome sequence is strong and your first three emails do the work of educating and filtering, you’ll retain some of those subscribers. But if you’re comparing cost-per-acquisition across channels, Boost often ranks as the most expensive per engaged subscriber, not just per sign-up.

    When Boost makes sense (and when it doesn’t)

    Boost works if you have a monetization model that converts cold traffic quickly—like a low-ticket digital product, an affiliate funnel, or a sponsored placement you’re testing. You can afford a $3.00 CPA if your average subscriber generates $8.00 in affiliate commissions in the first 30 days. The math breaks even, and you’re buying reach you couldn’t generate organically in the same timeframe.

    It also works as a diagnostic tool. Run a small Boost campaign with $100–$200, track open rates and unsubscribe behavior, and compare the cohort to your organic subscribers. If the gap is narrow, your welcome sequence is doing its job. If Boost subscribers churn at 40% in week one, you know the acquisition channel isn’t the only problem—your onboarding needs work.

    Where Boost fails: when you’re pre-revenue, when your content needs warm context to make sense, or when you’re trying to grow a tight community rather than a broadcast list. Paying $2.50 per subscriber to add 500 unengaged emails to your list doesn’t move your business forward. It inflates a vanity metric and increases your monthly platform costs if you’re on a plan that charges per contact.

    Compare Boost to organic cross-promotion first

    Before you allocate budget to Boost, exhaust direct swaps. Reach out to five newsletter operators in adjacent niches—not competitors, but publishers whose audience would genuinely benefit from your content—and propose a mutual recommendation. No money changes hands. You write a 50-word blurb about them, they write one about you, and you both send it to your lists.

    A single swap with a newsletter that has 3,000 engaged readers can net you 30–80 subscribers at zero cost, and those subscribers already trust the curator who recommended you. That’s a conversion rate and engagement quality Boost struggles to match, even at $4.00 per sign-up.

    If organic swaps aren’t yielding results, the problem is usually positioning, not distribution. Fix your one-sentence pitch, tighten your welcome email, and make sure your archive demonstrates consistent value. Then revisit paid channels.

    One thing to try this week: If you’re on Beehiiv and considering Boost, run a $100 test campaign and tag those subscribers in a separate segment. Compare their 30-day open rate and unsubscribe rate to your organic cohort from the same period. If the gap is wider than 20 percentage points, reallocate that budget to a guest post or a direct swap instead.

    Have a question about newsletter growth tactics or want to share your own Boost numbers? Hit reply—I read every response.

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

  • WordPress managed hosting SSH access: what you lose and why

    WordPress managed hosting SSH access: what you lose and why

    When you move from a VPS or shared cPanel host to managed WordPress hosting, one of the first things you might notice is limited—or completely absent—SSH access. Some hosts disable it by default. Others gate it behind higher-tier plans. A few remove it altogether and route everything through proprietary dashboards or Git workflows.

    If you’ve spent years running wp-cli commands, deploying via rsync, or tailing error logs in real time, the loss stings. But managed hosts aren’t just being difficult. The trade-off is deliberate, and understanding it helps you decide whether the convenience is worth what you’re giving up.

    What actually disappears when SSH goes away

    The most immediate loss is direct command-line access to your WordPress install. That means:

    • No WP-CLI. Bulk operations—importing posts, regenerating thumbnails, flushing rewrite rules—now require plugins or support tickets.
    • No custom deploy scripts. If your workflow relies on rsync, scp, or Git hooks that push files directly to the server, you’ll need to adapt to the host’s deployment tools or SFTP.
    • No real-time log access. Tailing error.log or access.log via SSH is out. Most managed hosts surface logs through their dashboard, but with a delay—sometimes five to fifteen minutes.
    • No cron job customisation. If you’ve been scheduling tasks via crontab -e, you’re now limited to WordPress’s built-in wp-cron or the host's scheduled task interface.

    For solo operators who've built muscle memory around SSH workflows, this feels like a downgrade. And in some cases, it is.

    What you gain in exchange

    Managed WordPress hosts strip SSH access because it reduces the surface area for things to break. When they control how you interact with the server, they can:

    • Enforce object caching and page-cache rules. Hosts like Kinsta and WP Engine bake Redis or Memcached into the stack and manage purge behaviour automatically. If you could SSH in and flush caches manually, you'd bypass their optimisations—and their support team would struggle to diagnose performance issues.
    • Prevent bad plugin installs. Some hosts scan uploads and block known-bad plugins or themes before they hit the filesystem. SSH access would let you sidestep that.
    • Standardise environments. When everyone uses the same deployment method—whether it's SFTP, a Git push, or a dashboard upload—the host can guarantee file permissions, directory structure, and PHP handler consistency.

    The result: faster support, fewer "it works on my machine" tickets, and a tighter performance baseline. For operators who don't want to think about server tuning, that's a win.

    When the restriction actually hurts

    SSH restrictions cause real problems in three scenarios:

    Migration and bulk imports. If you're moving a large site—10,000+ posts, extensive custom taxonomies, or complex metadata—WP-CLI's import commands are orders of magnitude faster than browser-based plugins. Without SSH, you're stuck waiting for PHP timeouts or splitting files into tiny batches.

    Custom integrations. If your business relies on a custom sync script—pulling data from an external API and writing it directly to wp_postmeta, for example—you'll need to rewrite it as a plugin or cron job that runs inside WordPress's PHP environment. That's slower and harder to debug.

    Granular troubleshooting. When a plugin conflict or theme bug crashes your site, SSH access lets you rename directories, disable plugins via the filesystem, and check error logs in real time. Without it, you're waiting for support to do it for you—or fumbling with SFTP and hoping you don't make things worse.

    How to adapt (or avoid the problem)

    If you're on a managed host without SSH and you need command-line access, a few hosts offer middle-ground options:

    • BigScoots offers SSH on all managed WordPress plans, with WP-CLI pre-installed. You get the performance stack and support model of managed hosting without losing terminal access.
    • Cloudways and GridPane both provide full SSH and let you configure cron jobs, deploy via Git, and run custom scripts.
    • Kinsta and WP Engine don't offer SSH, but both have robust staging environments and Git-based deployment workflows. If you can shift your workflow to Git push instead of rsync, you'll regain most of the flexibility.

    If you're evaluating hosts and SSH is non-negotiable, ask explicitly during onboarding. Some sales reps will say "limited SSH" when they mean "SFTP only." Get specifics: can you run WP-CLI? Can you tail logs? Can you schedule cron jobs outside WordPress?

    The real question

    SSH access isn't inherently good or bad. It's a tool. If your workflow depends on it—bulk imports, custom scripts, real-time debugging—choose a host that supports it or be ready to rewrite your processes. If you'd rather offload server management entirely and trust the host's optimisations, the loss won't hurt.

    The mistake is assuming all managed WordPress hosting is the same. It's not. Some hosts remove SSH to simplify support. Others preserve it because their customers need it. Know which camp you're in before you sign up.

    What's your experience? Hit reply and let us know whether SSH restrictions have been a dealbreaker or a relief. We read every response.

  • Social media carousel posts: when ten slides kill engagement

    Social media carousel posts: when ten slides kill engagement

    Platform algorithms love carousel posts. Instagram, LinkedIn, and Facebook all reward multi-slide content with extended reach because users spend more time swiping through them. That’s the pitch, anyway.

    The reality for solo operators: most carousels perform worse than single-image posts because completion rates tank after slide three. You get the initial engagement bump, then watch 80% of your audience bail before seeing your call-to-action on slide ten.

    Here’s what actually works, based on engagement data from operators running content businesses on Instagram and LinkedIn.

    The completion cliff happens at slide four

    LinkedIn’s own analytics show that carousel posts with four to six slides get the highest completion rates—around 60% of people who engage will see the final slide. Push that to eight slides and completion drops to 35%. Go to ten or twelve slides and you’re looking at 15-20% completion.

    Instagram’s behavior is similar. Posts with three to five slides maintain swipe-through rates above 50%. Beyond that, users assume the content is either repetitive or padded, and they scroll past.

    This matters because most operators bury their CTA on the last slide. If only 20% of engaged users see it, your conversion rate collapses no matter how good the top-of-funnel hook is.

    Slide count vs. content density

    The advice to “add value on every slide” sounds good, but it creates a different problem: cognitive load. If each slide introduces a new concept, tool, or step, users disengage because they can’t process ten discrete ideas in 30 seconds.

    High-performing carousels follow a different structure:

    • Slide 1: Hook or thesis—one sentence, large text, high contrast.
    • Slides 2-4: Core content. Each slide elaborates one point. No new concepts after slide four.
    • Slide 5: CTA or summary. Assume this is the last slide most people see.
    • Optional slide 6: Secondary CTA or credential-builder (“I’ve done this for X clients” or “This drove Y result”).

    If you need more than six slides to make your point, you’re either covering too much ground or padding for algorithmic favor. Both backfire.

    When to use ten slides anyway

    Long carousels work in two situations: lead magnets and tutorials where users expect to save the post for later.

    If your carousel is a step-by-step guide to setting up a WordPress staging site or a checklist for launching a paid newsletter, users will save it and return when they need it. Completion rate on first view doesn’t matter—saves and shares become your primary metric.

    In this case, slide ten can hold your CTA because the user who saves the post will eventually scroll through the full sequence when they’re ready to act. You’re optimizing for intent, not impulse.

    But if your goal is immediate engagement—replies, profile visits, link clicks—keep it to five slides or fewer. The algorithm boost from a carousel format isn’t worth a 70% completion drop.

    Scheduling tools and slide limits

    Most social scheduling platforms support carousels, but slide limits vary. Publer lets you upload up to ten images per carousel for Instagram and LinkedIn. Buffer caps LinkedIn carousels at fifteen slides but warns that performance drops after six. Later supports up to ten slides across platforms but doesn’t auto-optimize for completion rates.

    None of these tools will stop you from uploading a twelve-slide carousel. They also won’t tell you that your engagement rate is about to fall off a cliff.

    If you’re batch-scheduling carousels, set a internal rule: five slides maximum unless the post is explicitly a save-and-reference resource. Track completion rate (Instagram Insights and LinkedIn analytics both surface this) and compare it against your single-image posts. If carousels aren’t outperforming by at least 20%, you’re wasting time on extra slides.

    What to do instead

    If you have ten points to make, split them into two carousels published a week apart. Each one will get better completion rates, and you’ll have two chances at algorithmic distribution instead of one post that half your audience abandons.

    Alternatively, post a three-slide carousel as a hook, then drive traffic to a blog post or newsletter archive where you can expand without fighting platform attention spans.

    Carousels are a formatting choice, not a strategy. If the content doesn’t justify multiple slides, a single strong image with a tight caption will outperform a padded carousel every time.

    What’s working for you? Reply with your average carousel completion rate—I’m tracking operator benchmarks for a future piece.

    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.

  • Gumroad’s rolling 30-day payout hold: what it means for cash flow

    Gumroad doesn’t pay you when a customer buys. It pays you 30 days after each individual sale—not 30 days after signup, not on a fixed monthly schedule. Every transaction starts its own countdown.

    If you’re used to Stripe’s two-day rolling payouts or payment processors that batch weekly, Gumroad’s model feels slower than it is. But the mechanics matter, especially when you’re scaling from a few sales a week to daily transactions. The delay doesn’t disappear once you pass some threshold. It rolls forward, sale by sale.

    How the 30-day hold actually works

    When someone buys your product on June 1, Gumroad releases that payment to your bank account on July 1. A sale on June 15 pays out July 15. There’s no aggregation, no calendar-month cutoff. Each sale has its own 30-day timer.

    For sellers with consistent daily volume, this creates a pseudo-steady state after the first month: you’re always receiving yesterday’s sales from 30 days ago. But in the early weeks, or during launch spikes, you feel the gap hard. A $5,000 launch day in week one becomes a $5,000 deposit in week five, long after you’ve paid for ads, freelancers, or software subscriptions that supported the launch.

    Gumroad’s stated reason is chargeback and fraud protection. Digital products see higher dispute rates than physical goods, and holding funds lets the platform cover refunds and contested transactions without chasing sellers for clawbacks. Fair enough—but it shifts working-capital planning onto you.

    When the delay compounds

    The 30-day hold isn’t static. If you issue a refund, Gumroad pulls from your pending balance first, then from your available balance if pending isn’t enough. That can push future payouts back further or create negative balances that offset incoming releases.

    Seasonal or campaign-driven businesses feel this more acutely. If you run a product launch in May and coast in June, your June cash flow is strong (May’s sales finally pay out) while July dries up. The mismatch between revenue-recognition timing and cash-in-hand makes monthly budgeting harder than it should be.

    There’s also a subtle tax-reporting wrinkle: Gumroad reports sale dates to the IRS, not payout dates. Your 1099 reflects when customers paid, but your bank account reflects 30 days later. For accrual accounting that’s fine; for cash-basis sole props, it’s a reconciliation headache every January.

    What you can do about it

    You can’t negotiate the hold away. Gumroad applies it universally, regardless of transaction history or volume. But you can plan around it.

    First, model your cash flow with the delay baked in. If you’re bootstrapping and every dollar counts, assume any revenue you generate today won’t hit your account for five weeks (30 days plus a few business days for bank transfer). Budget expenses accordingly. Don’t spend launch-week revenue on launch-week costs unless you have a separate cushion.

    Second, consider running a hybrid monetization stack. Use Gumroad for products where its simplicity and audience-discovery features matter—especially if you’re selling to creators who already browse the platform. But for high-ticket items, memberships, or anything with predicable monthly revenue, route payments through Stripe-connected tools like Memberful or Lemon Squeezy. Stripe’s default is a two-day rolling payout, and Lemon Squeezy batches twice a month. Both give you cash faster.

    Third, if you’re doing $10,000+ monthly on Gumroad and cash flow is genuinely constraining growth, talk to your bank about a line of credit or invoice factoring. It’s not free, but the cost of capital might be lower than the opportunity cost of delaying a hire or ad spend because you’re waiting on payouts.

    How it stacks up against alternatives

    Gumroad’s 30-day hold is longer than most competitor platforms. Lemon Squeezy pays out twice a month (on the 1st and 16th) after a short initial hold. Payhip has a 7-day hold for new accounts, then pays weekly. Stripe’s standard is two business days. PayPal is instant to your PayPal balance, though moving it to a bank account adds another day.

    The tradeoff is simplicity. Gumroad requires no developer integration, no SSL cert management, no checkout UI design. You get a link, you share it, you’re selling. For solo operators who want to ship fast and don’t want to wrestle with Stripe’s documentation, that’s worth something—especially early on.

    But once you’re past proof-of-concept and cash flow starts dictating what you can build next, the 30-day wait stops feeling like a reasonable trade. You’re not a high-risk merchant. You’re not drop-shipping gadgets from Alibaba. You’re selling ebooks, courses, templates—things with near-zero chargeback rates after the first week. The hold feels like a blunt instrument.

    If you’re already on Gumroad and the delay is biting, run the numbers on migration cost versus cash-flow gain. Moving your catalog to Lemon Squeezy or a Stripe-based tool takes a weekend, maybe two if you have complex product tiers. The faster payout cadence might free up enough working capital to pay for itself in a single quarter.

    One thing to try this week: Export your Gumroad sales CSV and map each transaction to its actual payout date (sale date plus 30 days). Compare that to your expense calendar. If you see a mismatch—launch costs in June, payouts in July—you’ve found your cash-flow pinch point. Fix it with a buffer fund, a different platform, or a line of credit. Don’t just hope it smooths out.

    Questions about payment processors, payout timing, or monetization mechanics? Reply to this email—I read every response, and reader questions drive half the articles here.

  • AI content generators charge by the token—here’s what you’re actually paying for

    AI content generators charge by the token—here’s what you’re actually paying for

    If you’re using AI to write drafts, generate social captions, or summarise research, you’ve seen the pricing: $0.002 per 1,000 tokens, $20 for 500,000 tokens, or a monthly credit pool that resets whether you use it or not. But unless you’ve dug into the billing docs, you probably don’t know what a token actually is—or why your 300-word article sometimes costs twice as much as another one the same length.

    Token-based pricing isn’t new. OpenAI, Anthropic, Cohere, and most API-first AI platforms use it. What is new is how many solo operators are now running these tools daily without understanding the unit economics. That gap shows up as surprise overage charges, underpriced client work, or abandoned workflows because “AI got too expensive.”

    Tokens are not words

    A token is a chunk of text the model processes. It’s usually a word, part of a word, or a punctuation mark. The exact split depends on the tokeniser the model uses—and different models tokenise differently.

    Claude uses a tokeniser that averages about 1.3 tokens per word in English. GPT-4 is similar. That means a 1,000-word article is roughly 1,300 tokens. But if you’re writing in a language with more complex characters, working with code, or including lots of special formatting, the ratio climbs. A Markdown-heavy draft with tables and links can push 1.8 tokens per word.

    This matters for budgeting. If you’re charging a client $50 for a 1,500-word AI-assisted article and you assume 1,500 tokens, you’ll underestimate your input cost by 30% or more once you factor in the prompt, context, and output.

    Input tokens cost less than output tokens

    Most AI platforms charge different rates for input (what you send) and output (what the model returns). As of mid-2025, Claude‘s Sonnet 3.5 charges $3 per million input tokens and $15 per million output tokens. GPT-4o is $5 input, $15 output.

    If you’re pasting a 2,000-word style guide into every prompt to keep the AI on-brand, that’s roughly 2,600 input tokens—every single time. Run that 100 times in a month and you’ve burned through 260,000 tokens before the model writes a word. At $3 per million, that’s $0.78. Not huge, but it adds up if you’re also including example posts, research notes, or previous drafts in the context window.

    Output costs more. A 1,000-word draft is 1,300 tokens of output. Generate 100 of those and you’re at 130,000 output tokens, or about $1.95 at Claude’s rates. Combined with input, a modest content operation can easily hit $50–$75/month in API costs—before you factor in revisions, which double or triple the token count.

    How to track what you’re actually spending

    Most AI platforms show token usage in the dashboard, but it’s often buried. In the OpenAI Playground, token counts appear after each response. In the API, you get them in the response payload. If you’re using a wrapper tool like Writesonic, Jasper, or Copy.ai, token reporting is inconsistent—some show it, some don’t, and some round aggressively.

    For client work or internal budgeting, track tokens at the API level. If you’re calling Claude or GPT-4 directly, log the usage object in each API response. It breaks out input tokens, output tokens, and total tokens. Export that to a spreadsheet once a week and you’ll see exactly where the spend concentrates.

    If you’re using a third-party tool, ask support how they bill tokens. Some apply a markup. Others bundle token costs into flat-rate plans but throttle you after a threshold. Jasper, for example, moved to word-based credits in 2024, but those credits map back to token estimates under the hood—and the exchange rate isn’t published.

    One non-obvious way to cut token costs

    Stop regenerating entire drafts when you only need to fix one section. Most AI tools let you highlight a paragraph and re-run just that part. If you’re using the API, trim your context window: instead of sending the full 3,000-token style guide every time, send a 200-token summary. Test whether a shorter prompt gets you 90% of the quality at 40% of the cost.

    Also: use cheaper models for simpler tasks. GPT-4o-mini costs $0.15 per million input tokens and $0.60 per million output—10x cheaper than GPT-4o. Claude’s Haiku is similarly cheap. If you’re generating meta descriptions, social captions, or reformatting lists, the cheaper model is usually fine. Save the expensive one for long-form drafts where nuance matters.

    Token pricing is transparent once you understand the math. The opacity comes from not tracking usage and not knowing which levers to pull. If you’re spending more than $20/month on AI content tools, you’re past the point where rough estimates work. Start logging tokens, compare input vs. output costs, and test cheaper models for repetitive tasks.

    Want more breakdowns like this? Subscribe to One Two Three Send and get one operator-focused deep-dive every day—no fluff, no vendor pitches.

    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.

  • Stop measuring open rate—deliverability lives in the spam folder

    Stop measuring open rate—deliverability lives in the spam folder

    Most solo operators watch open rates like a hawk. A 40% open rate feels like success. A 25% rate triggers panic and a subject-line audit.

    But open rate measures engagement among people who received your email in their inbox. It tells you nothing about the readers who never saw it because Gmail, Outlook, or Apple Mail dumped it straight into spam or the Promotions tab.

    If 30% of your list never sees your email, a 40% open rate on the remaining 70% means your true reach is closer to 28%. You’re optimising the wrong number.

    What deliverability actually measures

    Deliverability isn’t whether your ESP successfully handed off the email to the recipient’s server. That’s the delivery rate, and it’s usually above 98% unless your domain is blacklisted.

    Deliverability is inbox placement—the percentage of delivered emails that land in the primary inbox, not spam, not Promotions, not the Updates tab.

    Your ESP’s dashboard won’t show this number by default. Most platforms report delivery rate and open rate, then stop. A 99% delivery rate and 35% open rate looks healthy until you discover that 40% of your delivered emails went straight to spam.

    How to check where your emails actually land

    The simplest method: seed lists. Create a free account on Gmail, Outlook, Yahoo, and Apple iCloud. Add those addresses to a hidden segment in your ESP. Send every broadcast or automation to that segment, then manually check each inbox and spam folder within an hour of sending.

    Log what you see:

    • Primary inbox
    • Promotions tab (Gmail)
    • Spam folder
    • Not delivered at all

    Do this for ten consecutive sends. If more than two land in spam or Promotions, you have a placement problem, not an engagement problem.

    For a more automated approach, use a tool like GlockApps, Mail-Tester, or Litmus Spam Testing. These services give you test addresses across dozens of providers and return placement reports within minutes. GlockApps starts at $49/month for 30 tests. Mail-Tester offers pay-as-you-go at $0.50 per test. Litmus Spam Testing is included in Litmus Email Analytics plans starting at $99/month.

    What breaks inbox placement (and what doesn’t)

    Common advice blames spammy subject lines or too many exclamation points. In practice, inbox placement breaks for infrastructure reasons first, content reasons second.

    Authentication failures. If your SPF, DKIM, or DMARC records are misconfigured or missing, ISPs treat your emails as unverified. Even a single failed authentication check can trigger spam filtering. Check your DNS records using MXToolbox or dmarcian. If you’re sending from a subdomain (e.g., news.yourdomain.com), make sure your DKIM selector matches and your SPF record includes your ESP’s sending IPs.

    Low engagement history. ISPs track how recipients interact with your domain over time. If your last ten emails had sub-20% open rates or high spam-complaint rates, future emails start in spam by default. This creates a vicious cycle: spam placement lowers engagement, which worsens future placement.

    Sudden volume spikes. Sending to 5,000 subscribers after months of sending to 500 looks like a compromised account. Ramp slowly. If you’re reactivating a cold list or migrating ESPs, warm your domain by sending to your most engaged segment first, then expand over two weeks.

    Shared IP reputation. If you’re on a shared sending IP (most ESPs below $100/month), your placement depends partly on other senders using the same IP. One spammer on your IP can hurt your placement. Platforms like Postmark and Mailgun isolate transactional senders onto separate IP pools with stricter quality controls. If you’re sending fewer than 50,000 emails per month, a shared IP on a quality ESP is usually fine—just avoid the cheapest bulk-email platforms.

    The non-obvious fix: prune faster

    Here’s the tactic most operators resist: remove unengaged subscribers before they hurt your sender reputation.

    If someone hasn’t opened an email in 90 days, they’re either not reading, using an email client that blocks tracking pixels, or your emails are landing in spam. Keeping them on the list lowers your engagement rate, which signals to ISPs that your content isn’t wanted.

    Set up a 90-day re-engagement automation: one plain-text email asking if they still want to hear from you, with a clear unsubscribe link. If they don’t click within seven days, remove them from your main list. Move them to a separate “cold” segment if you want to try again in six months, but stop sending regular broadcasts.

    This will drop your subscriber count. It will improve your open rate, click rate, and inbox placement. ISPs reward senders who mail engaged audiences.

    One metric to watch weekly

    If you track one number, make it your spam complaint rate—the percentage of recipients who mark your email as spam. Your ESP’s dashboard will show this, often buried under “Abuse Reports” or “Complaints.”

    Anything above 0.1% (one complaint per 1,000 emails) is a red flag. Above 0.3%, ISPs start throttling your delivery. Above 0.5%, you’re headed for blacklist territory.

    If your complaint rate spikes, stop sending and audit your signup flow. Are people actually opting in, or are you adding them without explicit consent? Is your unsubscribe link visible and one-click? Are you sending more frequently than you promised at signup?

    Most complaint spikes trace back to expectation mismatches, not content quality.

    Want to go deeper on email infrastructure and deliverability tactics? Reply to this email with your biggest placement headache—I’ll cover the most common issues in a future piece.

  • Analytics event naming: when consistent schemas break multi-tool funnels

    Analytics event naming: when consistent schemas break multi-tool funnels

    Most solo operators inherit analytics event-naming advice from enterprise playbooks: pick a consistent schema, document it in a spreadsheet, enforce it across every tool. The promise is clarity—one event name, one definition, one source of truth.

    The reality is messier. When you track the same event across Google Analytics 4, a CRM, an email platform, and a payment processor, identical labels often mean subtly different things. GA4’s purchase event fires on confirmation-page load. Your payment processor’s purchase webhook fires when funds clear. Your CRM’s purchase tag triggers when a deal stage changes. None of them happen at the same moment, and none of them count the same subset of transactions.

    Forcing a single name across all four systems doesn’t unify your data—it hides the gaps.

    Where naming consistency helps

    Event schemas make sense within a single platform. If you’re routing custom events into GA4, a predictable structure—category_action_label or verb_noun—keeps your reports readable and your segments reusable. The same applies to customer-data platforms that ingest events from multiple sources but store them in one database.

    Consistency also helps when you’re debugging. If every button click follows the same pattern—click_cta_header, click_cta_sidebar—you can filter by prefix and catch tracking gaps faster.

    But once you cross tool boundaries, the schema starts working against you.

    The multi-tool attribution gap

    Here’s the common scenario: you run a content site with a paid membership tier. A reader lands via organic search, opens three articles, clicks a paywall CTA, enters their email on a lead-magnet landing page, receives a nurture sequence, clicks a checkout link in email four, and completes payment.

    GA4 sees the paywall click and the checkout page view. Your email platform (MailerLite, Postmark, ConvertKit) sees the email opens and link clicks. Your payment processor (Stripe, Lemon Squeezy) sees the transaction. If you name every conversion point conversion, your attribution report shows three separate conversions with no shared context.

    You can’t merge them retroactively because the timestamps don’t align—GA4 logs in the user’s timezone, your email platform logs in UTC, and Stripe logs when the webhook fires, which might be seconds or minutes after the charge.

    Naming every step conversion or purchase makes your dashboard look unified. But when you try to calculate cost-per-acquisition or attribute revenue to a specific traffic source, you’re double- or triple-counting.

    Namespace by tool, not by intent

    A better approach: prefix event names with the tool or surface that generated them. Instead of purchase everywhere, use:

    • ga4_purchase for client-side page tracking
    • stripe_charge_succeeded for payment webhooks
    • crm_deal_closed for CRM pipeline updates
    • email_checkout_click for link tracking in transactional sequences

    This naming convention makes the gaps explicit. When you run a report and see four different revenue events for the same order, you know immediately which one to trust (usually the payment processor) and which ones are proxies.

    It also makes it easier to build rollup metrics. If you want a single “conversion” event that fires once per paying customer, you write a rule: count stripe_charge_succeeded, ignore everything else. You’re not guessing which purchase event is the real one.

    When to break the namespace rule

    There’s one case where tool-agnostic naming still makes sense: when you’re using a customer-data platform like Segment, RudderStack, or Hightouch to route events from a single source to multiple destinations.

    In that setup, the CDP is the source of truth. You send one Order Completed event with a structured payload, and the CDP forwards it to GA4, your CRM, your email tool, and your data warehouse. Each destination interprets the same event in its own way, but you’re starting from a single canonical definition.

    Even then, you’ll want to add destination-specific properties—GA4 needs transaction_id, Stripe needs payment_intent, your CRM needs deal_id—but the top-level event name can stay consistent.

    What this means for your reporting stack

    If you’ve been wrestling with attribution models that don’t add up, check your event-naming layer first. Open your GA4 events list, your email platform’s link-tracking log, and your payment processor’s webhook history. Look for overlapping names. If you see the same label in three places, assume they’re counting different things until you prove otherwise.

    Then decide which tool owns the metric. Revenue attribution? That’s your payment processor. Email engagement? That’s your ESP. Page-level behaviour? That’s GA4. Name your events to reflect ownership, not aspiration.

    The goal isn’t a beautiful schema—it’s a reporting stack where every number has one clear source and every query returns the same answer twice.

    Got a question about analytics, attribution, or tooling for solo operators? Reply to this newsletter—we read every response and use the best ones for future deep-dives.