Author: onetwothreeadmin

  • 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.

  • ConvertKit’s visual automation builder: when branches break your flow

    ConvertKit’s visual automation builder replaced the old “sequence + rule” system in 2019, and most solo operators treat it like a flowchart app: drag some boxes, draw some lines, hit publish. It works—until you nest a few conditional branches or try to merge two paths back into one step, and subscribers start falling through cracks you didn’t know existed.

    The builder feels intuitive because it mirrors how we sketch funnels on paper. But the canvas hides execution logic that doesn’t always match what the diagram suggests. Here’s what actually happens under the hood, when to use it, and one non-obvious trick that keeps automations from breaking when you scale them.

    How the builder actually executes branches

    ConvertKit’s automation engine evaluates conditions at the moment a subscriber reaches that step. If you branch on “has tag X,” the system checks tag state right then—not when they entered the automation, and not continuously. That’s fine for simple yes/no splits, but it creates two common failure modes.

    First: timing gaps in nested branches. If you add a five-day delay before a conditional check, and the subscriber gains or loses the relevant tag during that delay, the branch decision reflects the tag state on day five—not day zero. Most operators assume the branch locks in at entry. It doesn’t.

    Second: parallel branches don’t merge cleanly. The canvas lets you draw two separate paths that converge into a single “Send email” step. Visually, it looks like both paths feed into one action. In practice, ConvertKit treats each incoming connection as a separate trigger. If a subscriber qualifies for both branches simultaneously—say, they have two tags that each route them down a different path—they’ll hit that shared email step twice and receive duplicate sends. There’s no automatic deduplication at merge points.

    When to use the visual builder vs. segments and broadcasts

    The automation builder shines when you need time-based sequencing with simple branching—onboarding flows, drip courses, or post-purchase follow-ups where the next step depends on one or two clear conditions (opened email, clicked link, purchased product). It’s purpose-built for “if this, then wait X days, then do that” logic.

    It’s the wrong tool when you need complex multi-condition logic or frequent re-evaluation. If your segmentation involves “has tag A and tag B, but not tag C, and joined before date D,” you’re better off using ConvertKit’s segment builder and sending one-off broadcasts to that segment. Segments re-evaluate in real time; automations evaluate once per step. Trying to replicate segment logic inside an automation canvas leads to branching spaghetti that’s impossible to debug when a subscriber reports they didn’t get an email.

    The other time to avoid the builder: when you need to pause or edit a live flow without stopping new subscribers. ConvertKit doesn’t let you edit an active automation. You have to duplicate it, make changes, archive the old one, and redirect new subscribers to the new version. Anyone mid-flight in the old automation stays there until they complete it or you manually move them. For high-traffic funnels, that’s a versioning nightmare. A combination of tags, segments, and scheduled broadcasts gives you more control.

    The non-obvious trick: use events, not tags, for branch conditions

    Most operators branch on tags because tags are visible and easy to apply. But tags are state—they can be added, removed, or changed by other automations, manual bulk actions, or integrations. If two automations both manipulate the same tag, you’ve introduced race conditions you can’t see on the canvas.

    ConvertKit’s event triggers—”Purchased product,” “Completed form,” “Clicked link in email”—are immutable. Once an event fires, it stays in the subscriber’s history. Branching on events instead of tags eliminates the timing-gap problem: you’re checking “did this happen” rather than “does this tag currently exist.”

    Practical example: instead of branching on “has tag: clicked-link-in-welcome-email” (which you’d apply via a separate link-trigger automation), branch directly on the event “Clicked link in [specific email].” It’s one fewer moving part, and the condition can’t be accidentally overwritten by a bulk tag removal you run three months later.

    The trade-off: events are harder to manipulate manually. If you need to retroactively mark someone as having completed a step, you can add a tag by hand; you can’t fake an event. For most use cases, that’s a feature, not a bug—it forces you to model your automation around actual subscriber behavior rather than abstract state.

    What to check before you publish

    Before you activate any automation with more than two branch points, walk through it as if you’re a subscriber who qualifies for multiple paths simultaneously. ConvertKit’s preview mode only shows you one path at a time; it won’t surface the duplicate-send issue. Manually trace each route on paper or in a separate doc.

    Also check your delays. ConvertKit’s builder lets you stack delays inside branches, and the total wait time isn’t surfaced anywhere in the UI. I’ve seen onboarding automations where the “fast track” branch accidentally included 14 days of cumulative delays because each step added “wait 2 days” without the operator realizing they’d nested four of them. Subscribers stopped engaging because the follow-up came two weeks late.

    Finally, set up a test subscriber with a disposable email and run them through the full flow in real time—don’t just use preview mode. Create the edge-case conditions: apply conflicting tags, click links out of order, purchase mid-sequence. You’ll catch merge issues and timing gaps that don’t show up in the visual review.

    If you’re running ConvertKit automations and want more tools and breakdowns like this one, subscribe to One Two Three Send. We cover the features and gotchas that don’t make it into official docs—one concrete piece per week, no fluff.

  • Productised consulting breaks when you template the wrong parts

    Productised consulting breaks when you template the wrong parts

    Productised consulting promises the appeal of recurring revenue without the chaos of custom projects. Fixed scope, fixed price, repeatable delivery. The pitch is seductive: package your expertise once, sell it many times, reclaim your calendar.

    But most solo operators who try it discover the same problem six months in: the parts they productised are the parts that needed to stay flexible. The parts they left manual are the ones begging for systems. The model doesn’t break because productisation is flawed—it breaks because operators template the wrong layer.

    The standard productisation mistake

    The typical approach goes like this: take your most popular consulting engagement, strip out the variability, write a scope document, set a flat fee, and launch a landing page. A website audit for $1,500. A content strategy sprint for $3,000. An email migration package for $2,200.

    It works for the first three clients. Then client four has a WordPress multisite setup your checklist didn’t account for. Client five wants Slack check-ins instead of email updates. Client six needs the deliverable two weeks early because they’re launching a product.

    You say yes because you need the revenue. You carve out exceptions. You adjust timelines. You rewrite sections of the template. Within two months, every engagement is a special case again, and you’re back to running a custom consulting practice with a productised label and a fixed price that no longer covers your time.

    What to productise: delivery infrastructure, not scope

    The fix is inverting the template. Don’t productise the scope—productise the scaffolding that makes delivery predictable.

    Productise your onboarding sequence: the intake form, the kickoff email, the Notion workspace structure, the Loom walkthrough you send on day one. Productise your communication cadence: update emails every Monday and Thursday, decision points flagged 48 hours in advance, async video reviews instead of meetings. Productise your handoff: the same Notion deliverable template, the same export format, the same two-week support window post-delivery.

    Let the scope flex. A site audit might include four pages for one client and forty for another. A content strategy might cover SEO for one operator and lead magnets for another. That variance is fine—it’s why clients hire you instead of buying a course. But if every client goes through the same onboarding, gets updates on the same schedule, and receives their deliverable in the same format, you’ve productised the part that actually creates leverage.

    This is how agencies scale without turning into workflow chaos. It’s also how solo operators can take on more clients without proportionally increasing coordination overhead.

    The second-order benefit: pricing becomes modular

    When you productise delivery instead of scope, pricing becomes easier to defend and easier to scale. Instead of a single flat fee, you can price along two axes: scope complexity and delivery speed.

    A basic website audit with standard delivery might be $1,200. The same audit with a 48-hour turnaround adds $600. An audit covering multisite, headless CMS, and API integrations adds another $900. The client picks the scope; you control the delivery cost by keeping the process identical across all tiers.

    This also solves the “I need it faster” problem. Clients who want to jump the queue pay for it. Clients who are fine with standard timelines get the lower price. You’re not discounting for flexibility—you’re charging for constraints.

    It’s the same reason Postmark charges per email sent, not per “email strategy.” The infrastructure is productised; the volume is variable.

    When to stick with fully productised scope anyway

    There are cases where locking down scope still makes sense. If your service is diagnostic—like a technical SEO audit or a site-speed analysis—the inputs are predictable enough that a checklist works. If your market is early-stage operators who don’t yet have complex infrastructure, variability stays low.

    But even then, the operators who run these services successfully are still productising delivery. The audit might be the same 40-point checklist every time, but the Loom walkthrough, the Notion handoff doc, and the two-week Q&A window are what make it repeatable.

    If you’re spending more time customising the template than you’d spend scoping a custom project, your productisation is backwards.

    The goal isn’t to eliminate variability. It’s to move variability into the part of the engagement where your expertise adds value—and to eliminate it everywhere else.

    Want more breakdowns on what works (and what doesn’t) when you’re running a content-driven business solo? Subscribe to One Two Three Send and get one focused article like this in your inbox each week.