Category: Monetisation

  • Affiliate cookie windows expire faster than your content stays relevant

    Affiliate cookie windows expire faster than your content stays relevant

    Affiliate cookie windows expire faster than your content stays relevant
    Photo by Patryk Rejdych on Unsplash

    You publish a buyer’s guide in January. Someone clicks your affiliate link, browses for twenty minutes, then closes the tab. Thirty-one days later, they come back through organic search, remember your recommendation, and buy. You earn nothing.

    That’s not a edge case—it’s how most affiliate revenue leaks out of evergreen content strategies. Cookie windows and content lifespan operate on completely different timescales, and most solo operators don’t account for the gap.

    How cookie windows actually work

    An affiliate cookie window is the period between when someone clicks your link and when a sale must occur for you to earn commission. The standard is 30 days. Some programs offer 7 days. A handful—Amazon Associates, for example—give you 24 hours for most categories.

    Once that window closes, the tracking pixel expires. If the buyer returns through any other path (direct URL, branded search, a different affiliate’s link), you’re out. The sale happens, but the attribution is gone.

    This works fine for time-sensitive content: weekly deal roundups, launch coverage, limited-time promotions. A reader clicks, decides quickly, and converts within the window. But it falls apart for evergreen content—comparison posts, tutorial-driven recommendations, long-form buying guides.

    Why evergreen content breaks the model

    Evergreen posts drive traffic for months or years. A single how-to article might get 200 visits in month one, 180 in month six, and 150 in month twelve. Readers arrive at different stages of intent. Some are researching early. Others are ready to buy but want one last confirmation.

    The mismatch: your content stays relevant for eighteen months, but your affiliate window closes in thirty days. A reader who clicks your link in March and buys in April costs you the commission, even though your content directly influenced the decision.

    This isn’t hypothetical. I’ve tracked this across three affiliate-driven sites. Conversion rates on evergreen posts hover around 2–4% in the first 30 days after publish. But buyer behavior data—tracked via UTM parameters and CRM integrations—shows that 18–25% of eventual purchasers return more than 30 days after their first visit.

    The longer your content stays live, the more you lose to expired cookies.

    What actually works

    You can’t extend someone else’s cookie window, but you can adjust strategy to work within it.

    Optimize for high-intent traffic. Evergreen content can target early-stage research (“what is X?”) or late-stage decision-making (“X vs. Y for [specific use case]”). The second group converts faster. If your affiliate window is short, bias your content mix toward comparison posts, feature breakdowns, and use-case-driven recommendations. These attract readers closer to purchase.

    Reactivate older posts with fresh links. Update evergreen articles every 90–120 days. Refresh the intro, add a new example, adjust pricing details—anything that gives you an excuse to re-promote the post via email or social. New clicks = new cookie windows. This works especially well if you’re driving your own email list to older content.

    Layer in shorter-window programs strategically. If you’re reviewing tools with both direct affiliate programs (30–60 day windows) and network aggregators like Impact or ShareASale (often 7–14 days), use the network links only in time-sensitive contexts—launch posts, limited offers, deal alerts. Reserve the longer-window programs for evergreen content.

    Track first-touch attribution separately. Most affiliate dashboards show you last-click conversions. But if you run UTM parameters on your affiliate links and feed them into a simple CRM or Google Sheets via Zapier, you can see how many people clicked, didn’t convert, then returned later via another path. That data won’t earn you retroactive commissions, but it will show you which posts are under-monetized and worth doubling down on with email sequences or retargeting.

    When it’s better to skip affiliates entirely

    If your content is genuinely evergreen—think foundational how-to guides that rank for two-plus years—and your affiliate program uses a 7- or 14-day window, conversion math often doesn’t pencil out. You’re better off monetizing with sponsorships, display ads, or your own product inserts.

    A single sponsored mention in a high-traffic evergreen post can earn $300–$800 upfront, with no dependency on cookie windows or conversion rates. That’s predictable revenue. Affiliate commissions on the same post might trickle in at $40–$120 per month, heavily weighted toward the first 60 days, then taper as cookie expirations compound.

    Run the numbers for your own traffic and conversion rates. If evergreen posts make up more than 60% of your page views and your primary affiliate programs use windows under 21 days, you’re likely leaving money on the table by not diversifying monetization.

    Want more revenue breakdowns like this? Subscribe to One Two Three Send and get operator-focused strategy every week—no fluff, no generic advice.

  • Patreon video hosting compresses uploads—here’s the bitrate cap

    If you’re running a membership site and uploading video directly to Patreon, you’re not serving the file you uploaded. Patreon re-encodes every video through its own compression pipeline, and the quality ceiling is lower than most creators realize.

    This isn’t mentioned in their help docs with any specificity. But if you’re producing tutorial content, screen recordings, or any video where detail matters, you’ll notice: edges blur, text becomes harder to read, and fine detail disappears.

    Here’s what’s actually happening, and what your alternatives are.

    The re-encoding pipeline

    Patreon accepts uploads up to 5 GB. But once the file hits their servers, it’s re-encoded to a maximum bitrate of approximately 3 Mbps for 1080p video. For 4K, the cap sits around 8 Mbps.

    For context, a locally rendered 1080p screen recording at 10 Mbps—common for something like a Camtasia or ScreenFlow export—will be crushed down by 70%. That’s where readability suffers. Code editors, spreadsheets, browser UI, anything with small text or fine lines gets softened.

    The audio track is re-encoded to 128 kbps AAC. That’s acceptable for most spoken-word content, but if you’re including music or high-fidelity audio, you’ll hear compression artifacts.

    Patreon also generates multiple resolution variants (1080p, 720p, 480p, 360p) regardless of what you upload. The adaptive player selects based on the viewer’s bandwidth. That’s good for delivery reliability, but you lose control over which version gets shown.

    When it matters

    If your content is talking-head video, interviews, or anything where the subject is well-lit and centered, Patreon’s compression is fine. The platform is optimized for that use case.

    But if you’re teaching software, showing design work, presenting data visualizations, or doing any screen-based tutorial content, the quality loss is immediately visible. Text at 12–14 pt becomes fuzzy. UI elements lose definition. Viewers squint.

    This also applies to animation or motion graphics with flat colors and hard edges. Compression algorithms handle gradients and organic textures better than sharp contrasts.

    What you can do instead

    The simplest workaround: host video elsewhere and embed or link from Patreon posts.

    Vimeo is the most common choice. A Vimeo Plus account ($12/month as of mid-2026) gives you 5 TB of annual upload capacity and lets you control compression settings. You can set a minimum bitrate, disable lower-resolution variants, and embed with privacy controls that restrict playback to specific domains or require a password.

    Upload your video to Vimeo, set the privacy to “Hide from Vimeo,” generate the embed code, and paste it into your Patreon post. Patreon allows iframe embeds in posts for patrons at any tier.

    Bunny.net Stream is a cheaper option if you’re comfortable with a little more setup. Pricing is usage-based: $5 per TB of storage and $1 per TB of bandwidth. For most solo operators, that’s well under $10/month. You upload via API or dashboard, and Bunny generates an embed player. You can set encoding profiles and control bitrate ceilings yourself.

    The trade-off: Bunny doesn’t have the same content discovery or social features Vimeo offers. But if you’re only using it as a private CDN for your membership, that doesn’t matter.

    Self-hosting on WordPress with a CDN is technically possible, but unless you’re already paying for significant bandwidth and storage, it’s rarely worth it. A 500 MB video file served to 200 members is 100 GB of bandwidth. Most shared hosting plans will throttle or surcharge you. If you’re on a VPS or dedicated plan and already using a service like BunnyCDN or Cloudflare Stream for delivery, it works—but for most operators, offloading to a dedicated video host is simpler.

    One more thing: downloadable video

    If your members expect to download video files—common for course content or archival access—Patreon does let you attach files to posts, including .mp4 files. Those are not re-encoded. The file you upload is the file they download.

    But downloads don’t get streamed previews, and most members won’t bother unless you explicitly frame it as an offline-access perk. Streaming is still the default expectation.

    If you’re running a course or tutorial membership and video quality matters, don’t assume Patreon’s hosting will preserve what you produced. Check a test upload at full screen on a typical laptop display. If text is hard to read, route the video through Vimeo or Bunny and embed it instead.

    Got a technical question about your online-business stack? Reply to this email—we cover one reader question every Sunday.

  • Affiliate link cloaking plugins slow page load—here’s the redirect math

    Affiliate link cloaking plugins slow page load—here’s the redirect math

    Affiliate link cloaking plugins slow page load—here's the redirect math
    Photo by Justin Morgan on Unsplash

    Most affiliate link cloaking plugins add a redirect layer between your reader’s click and the destination URL. That redirect costs time—anywhere from 40 milliseconds on a fast server to 150ms or more on shared hosting during traffic spikes.

    The redirect happens server-side. Your reader clicks a link like yoursite.com/recommends/tool, your WordPress installation receives the request, queries the database to match the slug to a destination URL, then sends a 301 or 302 response pointing the browser to the actual affiliate link. Only then does the affiliate network’s page start loading.

    For a single click, 80ms is invisible. But if you’re running a tools directory, a resource page with twenty affiliate links, or a comparison post where readers open multiple tabs, those redirects compound. And every millisecond between click and page load is a chance for the reader to close the tab or question whether the link is broken.

    How cloaking plugins handle redirects

    Popular plugins like Pretty Links, ThirstyAffiliates, and Lasso all work the same way: they register custom post types or rewrite rules in WordPress, store the destination URL in the database, and serve a redirect when the slug is requested.

    The redirect type matters. A 301 (permanent) tells browsers and search engines to cache the destination, which speeds up repeat visits but makes it harder to update links later. A 302 (temporary) doesn’t cache, so every click triggers a fresh database lookup. Most plugins default to 302 for affiliate links because affiliate URLs change—vendors update tracking parameters, programs shut down, or you switch networks.

    The database query is usually fast, but on shared hosting with limited MySQL resources or a bloated wp_posts table, that lookup can add 50–100ms. If your cloaking plugin also logs clicks (for internal analytics), it’s writing to the database on every redirect, which adds even more overhead during high-traffic periods.

    When the redirect tax is worth paying

    Cloaking makes sense in three situations.

    First: you’re managing dozens of affiliate links across multiple posts and need a central place to update URLs when programs change. Editing twenty posts manually every time a vendor changes their tracking subdomain is a maintenance nightmare. A redirect plugin lets you update once and propagate everywhere.

    Second: you want click tracking without sending data to Google Analytics or a third-party analytics tool. Some cloaking plugins offer built-in reporting—total clicks, top links, conversion estimates if you integrate with affiliate dashboards. If you’re already paying for the plugin and it replaces a separate analytics subscription, the redirect cost is justified.

    Third: you’re masking ugly affiliate URLs for reader trust. A raw ShareASale or Impact link with sixty-character tracking strings looks spammy. A clean /recommends/hosting slug feels intentional. This matters more for higher-ticket offers where readers scrutinize links before clicking.

    If none of those apply—if you have five affiliate links that never change, or you’re fine with raw URLs—skip the plugin. The redirect tax buys you nothing.

    One faster alternative: static rewrites

    If you’re on a VPS or managed WordPress host that lets you edit your Nginx or Apache config, you can bypass WordPress entirely and handle redirects at the web server level. Add a rewrite rule that maps /recommends/tool directly to the affiliate URL without touching PHP or MySQL.

    Here’s an Nginx example:

    location = /recommends/hosting {
      return 302 https://affiliate.network/your-link;
    }

    This cuts redirect time to 5–15ms because the web server handles it before WordPress even loads. The downside: you lose click tracking, and updating links means editing the config file and reloading the server. It’s faster but less flexible.

    For solo operators with a handful of stable affiliate links and access to server config, this is the lowest-latency option. For teams managing dozens of rotating links, a cloaking plugin is still the practical choice—just pick one that skips click logging if you don’t need it, and monitor redirect time with a tool like Pingdom or WebPageTest.

    One thing to check today

    Open your browser’s developer tools, go to the Network tab, and click one of your cloaked affiliate links. Look at the timing breakdown. If the redirect takes more than 100ms on average, your cloaking plugin is adding measurable friction. Consider switching to a lighter plugin, moving to server-level redirects for your top five links, or just using raw affiliate URLs where the redirect cost outweighs the benefit.

    Redirects aren’t evil, but they’re not free. Know what you’re paying for.

    Want more tactics like this? Subscribe to One Two Three Send for weekly breakdowns of the tools, trades, and traps that solo operators actually face.

  • Stripe Payment Links expire after inactivity—here’s the math

    Stripe Payment Links expire after inactivity—here’s the math

    Stripe Payment Links expire after inactivity—here's the math
    Photo by rupixen on Unsplash

    Stripe Payment Links are one of the fastest ways to collect money online. No custom checkout page, no embedded form, just a URL you drop into an email, a tweet, or a landing page. But there’s a catch most solo operators learn the hard way: Payment Links expire after 90 days of inactivity.

    Not 90 days from creation—90 days from the last completed transaction. If nobody buys through the link for three months, Stripe deactivates it. The URL still resolves, but customers see an error. No email notification. No dashboard warning. Just a dead link and lost revenue.

    How the expiration clock works

    Stripe Payment Links have two expiration modes: explicit and implicit. Explicit expiration is the one you set yourself—an end date or a maximum number of purchases. Implicit expiration is the 90-day inactivity rule, and it’s enabled by default on all Payment Links created after June 2025.

    The clock resets every time someone completes a purchase. If you sell one unit on day 89, the countdown starts over. But if your link sits unused for 90 consecutive days, it stops working. This affects evergreen products more than launches—if you’re selling a $50 course or a one-time audit and only move a few units per quarter, you’ll hit the limit.

    Stripe’s reasoning: unused links create support overhead and potential fraud exposure. Fair enough. But the lack of proactive alerts turns this into a silent failure.

    Where this breaks real workflows

    Payment Links show up in three common places: email sequences, social media bios, and static landing pages. If you’re running a welcome sequence that pitches a paid product on day 14, and that sequence hasn’t fired in three months because your list growth slowed, the link dies mid-funnel. Same for a Twitter bio link to a $20 template pack—if you don’t sell one every 90 days, it’s gone.

    The worst case: you’ve embedded the link in a PDF lead magnet or a YouTube video description. You can’t edit it after the fact. The only fix is to create a new Payment Link, update every instance, and hope you caught them all.

    Stripe’s dashboard doesn’t flag expired links in bulk. You have to open each one individually to check status. If you’re managing ten products across multiple Payment Links, that’s ten manual checks every quarter.

    How to prevent expiration without manual checks

    Three options. First, switch to Stripe Checkout Sessions via API. They don’t have the 90-day rule, but you lose the no-code convenience—you’ll need a server or a tool like Zapier to generate the session URL on demand.

    Second, use a redirect layer. Instead of linking directly to the Stripe Payment Link, use a short URL you control (Bitly, your own domain, whatever). When a Payment Link expires, you regenerate it in Stripe, then update the redirect target. Your public-facing URL never changes. This adds one extra HTTP request to the purchase flow, but it’s negligible.

    Third, set a calendar reminder to test-purchase through each Payment Link every 80 days. Use Stripe’s test mode if you want to avoid real charges, or complete a live transaction and immediately refund it. Not elegant, but it keeps the links active. If you’re running more than five products, this gets tedious fast.

    One thing that doesn’t work: adding the Payment Link to a Stripe Customer Portal. The expiration rule applies regardless of where the link lives. Same for embedding it in an iframe or wrapping it in a branded page. The 90-day countdown runs on Stripe’s side, not yours.

    What to do if a link already expired

    You can’t reactivate an expired Payment Link. You have to create a new one. Stripe preserves the product and price data, so it’s not a full rebuild—just a new link ID. But every external reference needs updating.

    Check your Stripe dashboard under “Payment Links” and filter by status. Expired links show as “Inactive.” If you find one, note where it was published: email sequences, social profiles, blog posts, PDFs, anywhere you dropped the URL. Then create the replacement and swap it in.

    For email sequences, this is straightforward if you’re using Beehiiv, MailerLite, or ConvertKit—edit the broadcast or automation step, replace the link, save. For static pages or social bios, same drill. For PDFs or videos, you’ll need the redirect-layer approach going forward.

    If you’re selling through multiple Payment Links and don’t want to babysit them, consider consolidating. One Payment Link per product is simpler to monitor than five variations for different traffic sources. Stripe’s analytics let you append UTM parameters to track source anyway, so you don’t lose attribution by using a single link.

    Bottom line: Stripe Payment Links are fast to set up, but they require maintenance. The 90-day inactivity expiration isn’t a bug—it’s policy. If you’re using them for evergreen products, build a check-in routine or switch to a URL structure you control. Otherwise, you’ll discover the problem when a customer emails to say your checkout is broken.

    Running a content-driven online business? One Two Three Send covers the tools, tactics, and infrastructure that solo operators actually use. Subscribe for weekly breakdowns—no fluff, just operator-to-operator details.

    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.

  • Newsletter ad networks pay net-60—cash flow math for solo operators

    Newsletter ad networks pay net-60—cash flow math for solo operators

    Newsletter ad networks pay net-60—cash flow math for solo operators
    Photo by John Vid on Unsplash

    If you’ve ever landed your first newsletter sponsor through an ad network, the initial thrill of monetisation quickly collides with a less exciting reality: you won’t see that money for two months.

    Most newsletter ad networks operate on net-60 payment terms. That means if you run a sponsor slot in your July 4 edition, you’ll receive payment around September 4—assuming the network processes on time. Some stretch to net-75 or net-90 during their first year of operation.

    For solo operators running lean, that delay isn’t just an accounting footnote. It’s a cash flow problem that can derail your ability to reinvest, hire help, or simply pay yourself on schedule.

    Why ad networks delay payment

    The delay isn’t arbitrary. Ad networks operate as intermediaries: they collect payment from sponsors, verify campaign performance, handle any disputes or makegoods, then distribute earnings to publishers.

    Sponsors themselves often pay the network on net-30 terms. The network adds another 30 days to process reporting, reconcile impressions or clicks, and batch payments to dozens or hundreds of publishers. If a sponsor disputes performance or requests a makegood, that clock resets.

    Networks also use the delay as working-capital cushion. They’re fronting the relationship with sponsors while waiting for your newsletter to deliver the agreed impressions. The 60-day window protects them if a publisher disappears mid-campaign or fails to hit contractual minimums.

    What net-60 does to your cash flow

    Let’s say you’re running a twice-weekly newsletter with 8,000 subscribers. You join an ad network in June and book your first sponsor at a $40 CPM for a single edition. That’s $320 gross revenue.

    You send the edition on June 15. The network takes a 30% cut, leaving you $224. You’ll receive that payment around August 15—two months later.

    If you’re booking sponsors every week, you’ll eventually reach a steady state where payments arrive regularly. But for the first 60 to 90 days, you’re working for free. If you’re trying to replace a salary or cover software costs, that gap matters.

    Operators who quit their day jobs often underestimate this. They calculate monthly revenue based on booked sponsors, not received payments. A $2,000 monthly sponsorship target sounds sustainable until you realise you won’t see any of it until October.

    When you can negotiate better terms

    Not all networks enforce net-60 universally. If you’re bringing a large or highly-targeted audience, you have leverage.

    Networks with exclusive partnerships—where you agree not to work with competing networks—sometimes offer net-30 as a trade. If you’re driving $5,000+ per month in sponsor revenue through a single network, ask. The worst they’ll say is no.

    Direct sponsors almost always pay faster. Net-30 is standard for direct deals, and some sponsors will prepay if you offer a small discount. A 5% discount on a $1,200 sponsorship costs you $60 but gets you paid 60 days earlier. Depending on your runway, that’s worth it.

    How to manage the gap

    If you can’t negotiate faster terms, plan for the delay from day one.

    Keep three months of operating expenses in reserve before you rely on sponsorship income. That’s not three months of salary—it’s three months of software subscriptions, domain renewals, contractor payments, and any other fixed costs. Sponsorship revenue should land in month four, not month one.

    Track payment dates in a separate spreadsheet. Note the send date, the expected payment date, and the actual payment date. Networks miss their own deadlines more often than they admit. If a payment is five days late, email finance. If it’s ten days late, escalate to your account manager.

    Some operators front-load their sponsor calendar: they book heavily in Q1, knowing they’ll be paid in Q2 when cash flow tightens. That works if you have the audience and the sponsor demand, but it’s fragile. One sponsor cancellation in January wipes out March’s expected income.

    The alternative: direct sponsorships and faster models

    Ad networks are convenient—they handle sales, contracts, and payment collection—but convenience costs you both margin and time.

    If you’re consistently booking sponsors through a network, you have proof of demand. That’s when it makes sense to test direct outreach. Direct sponsors pay faster, pay more (no network cut), and often become long-term partners.

    Subscription revenue from paid newsletters or memberships pays immediately. Stripe and PayPal deposits hit your account within two to seven days. If you’re choosing between ad-supported and subscription models, payment timing is a variable worth weighing alongside audience size and pricing strategy.

    Want more cash-flow breakdowns and monetisation math? Reply to this email with the payment term that surprised you most—we read every response.

  • Monetisation engine rewrite: when to rebuild vs. patch your stack

    Monetisation engine rewrite: when to rebuild vs. patch your stack

    Monetisation engine rewrite: when to rebuild vs. patch your stack
    Photo by Markus Winkler on Unsplash

    Most solo operators build their monetisation stack the same way: start with a Stripe payment link, add a membership plugin six months later, bolt on an affiliate dashboard when a partner asks, then integrate a course platform because someone said you should diversify revenue.

    Two years in, you’re running five tools that don’t talk to each other, reconciling payments across three dashboards, and manually updating access permissions in four places every time someone subscribes or cancels.

    At some point, patching stops working. The question isn’t whether to consolidate—it’s when the cost of duct tape exceeds the cost of a rewrite.

    The real cost of a fragmented stack

    Payment reconciliation is the obvious pain point. Stripe handles subscriptions, Gumroad processes one-off courses, and your WordPress membership plugin manages access. When someone emails asking why their renewal didn’t restore access, you’re checking three systems to find out one webhook failed silently two weeks ago.

    But the hidden cost is opportunity cost. Every new product idea requires evaluating whether your current stack can support it. Want to bundle a course with a membership? You’ll need to manually provision access in two places. Thinking about tiered pricing? Your membership plugin supports three tiers, but your affiliate dashboard only tracks two commission structures.

    Eventually you stop launching new offers not because you lack ideas, but because implementation friction makes every new SKU a week-long technical project.

    When patching still makes sense

    If your revenue is under $5,000 per month and you’re only managing one or two product types, duct tape is often the right call. The time cost of migrating platforms, rewriting checkout flows, and moving subscriber data outweighs the pain of logging into three dashboards.

    Same logic applies if you’re pre-product-market fit. If you’re still testing offers, trying pricing models, or experimenting with different monetisation channels, committing to a single consolidated platform too early locks you into assumptions you haven’t validated yet.

    The break-even point for most operators lands somewhere between $5,000 and $15,000 in monthly revenue. Below that, your time is better spent growing the business than optimising infrastructure. Above that, manual reconciliation starts costing more than platform migration.

    What a rewrite actually looks like

    Consolidation doesn’t mean moving everything to one tool—it means reducing integration points and eliminating manual reconciliation.

    For most solo operators, that means picking one system of record for customer data and access management, then connecting payment processors and content platforms as downstream dependencies. Stripe becomes the billing engine, your membership platform becomes the access controller, and everything else feeds off those two sources of truth.

    Practically, that might mean migrating from a Gumroad + WordPress membership plugin + manual Airtable tracking setup to Stripe Billing + MemberPress, with webhooks handling access provisioning automatically. Or consolidating three separate course platforms into one that handles subscriptions, one-off purchases, and affiliate payouts in a single dashboard.

    The migration itself usually takes two to four weeks of part-time work: exporting customer data, setting up the new stack in parallel, testing checkout and webhook flows, then switching DNS or payment links in a single cutover. Most operators underestimate webhook debugging time—expect to spend three to five hours confirming that subscription renewals, cancellations, and failed payments all trigger the correct access changes.

    The decision framework

    Ask three questions. First: how many hours per month do you spend reconciling payments, manually provisioning access, or troubleshooting why a customer’s subscription didn’t renew correctly? If the answer is under four hours, keep patching.

    Second: how many product ideas have you shelved in the last six months because your current stack couldn’t support them without significant custom development? If the answer is zero or one, your stack isn’t the bottleneck yet.

    Third: what’s your monthly revenue, and what would a four-week migration project cost in opportunity cost? If you’re at $3,000 per month and a rewrite means pausing all content production for a month, the math doesn’t work. If you’re at $12,000 per month and spending ten hours a month on manual reconciliation, you’re already paying for the migration in recurring time cost.

    Most operators wait too long. They tolerate mounting friction because migration feels like a big project with no immediate revenue upside. But every month you defer the rewrite, you’re accruing technical debt that makes the eventual migration harder—and you’re forgoing product ideas that your current stack can’t support.

    The right time to rebuild is usually six months before you think you need to.

    What’s your monetisation stack look like right now? Hit reply and tell me what you’re running—I’ll include the most interesting setups in a future breakdown.

  • Course platforms charge per student—here’s the breakpoint math

    Course platforms charge per student—here’s the breakpoint math

    Course platforms charge per student—here's the breakpoint math
    Photo: No machine-readable author provided. Avatar assumed (based on copyright claims). via Wikimedia Commons (CC BY-SA 3.0)

    Most solo operators pick a course platform based on feature lists or interface design. Then they hit 200 students and realize they chose the wrong pricing model.

    Course platforms use three billing structures: flat monthly fees, per-transaction percentages, and hybrid models that switch thresholds mid-growth. Each works beautifully at one scale and becomes expensive at another. The trick is knowing which breakpoint you’re approaching—and when to migrate before it costs you.

    Flat fee vs. percentage: the crossover point

    Teachable’s free plan takes 10% + $1 per transaction. The $59/month Basic plan drops that to 5%. The $159/month Pro plan eliminates transaction fees entirely.

    If you sell a $99 course, Teachable’s free plan costs you $10.90 per sale. At 15 sales per month, that’s $163.50 in fees. The $159 Pro plan saves you $4.50—but only if you stay above that threshold every single month.

    Podia charges $39/month with zero transaction fees at any volume. For the same 15 sales, you pay $39 flat. Teachable’s free tier costs you $163.50. That’s a $124.50 difference.

    But scale to 100 sales per month. Podia still charges $39. Teachable Pro at $159 with no transaction fees costs $159. Now Podia wins by $120/month. The crossover happens around 18–20 sales per month for a $99 product on this comparison.

    The math shifts with price point. A $29 course on Teachable’s free plan costs $3.90 per transaction. At 50 sales per month, that’s $195 in fees. Teachable Pro at $159 breaks even at 41 sales. Below that, you’re paying for a plan you don’t need yet.

    Hybrid models hide the real cost

    Thinkific’s free plan allows unlimited students but takes 10% + $1 per sale if you use their payment processing. Switch to the $49 Basic plan and fees drop to zero—but only if you bring your own Stripe account and pay Stripe’s 2.9% + $0.30.

    That 2.9% never goes away. Thinkific’s $49 plan isn’t zero-fee; it’s shifted-fee. For a $99 course, Stripe takes $3.17. Add the $49 monthly platform cost, and your first 16 sales are just covering the subscription.

    Kajabi charges $149/month with no transaction fees and includes email marketing, landing pages, and automation. If you’re paying for ConvertKit ($25/month) and Podia ($39/month) separately, Kajabi’s $149 starts looking reasonable at $64/month baseline. But only if you actually use the email tools. Most operators don’t migrate their list and end up paying for redundant infrastructure.

    When to switch—and when to stay

    Migration costs time. Expect two weeks to move a course with video hosting, email sequences, and payment workflows. If you’re within $30/month of breaking even on a new platform, wait. The opportunity cost of rebuilding usually outweighs the savings until the gap hits $50–75/month sustained over a quarter.

    Transaction fees hurt most when your product price is low and volume is inconsistent. A $29 course selling 10 units one month and 60 the next makes flat-fee planning impossible. Percentage models smooth that volatility—you pay more in good months, less in slow ones.

    Flat fees reward consistency. If you can count on 40+ sales per month, locking in a $99–159 plan with zero transaction fees caps your platform cost as a fixed line item. Your margin improves with every sale beyond breakeven.

    The edge cases that break assumptions

    Payment plan students count differently depending on the platform. Teachable charges transaction fees on each installment. Podia treats a payment-plan student as one enrollment and doesn’t re-bill you when the second charge processes. For a $297 course split into three $99 payments, that difference compounds.

    Refund handling varies. Some platforms refund their transaction fee when a student requests a refund. Others don’t. If your refund rate sits above 8%, that leaked margin adds up.

    Annual billing discounts look appealing but lock you in. Teachable offers two months free on annual plans. That’s $318 saved on the Pro plan—but only if you’re certain you won’t outgrow or downshift within 12 months. Most solo operators overestimate growth in year one and get stuck paying for capacity they don’t use until month nine.

    Run your actual numbers. Take last quarter’s sales count, average product price, and refund rate. Model it against three platforms with different fee structures. The winner isn’t always the one with the best brand or the sleekest interface—it’s the one that costs least at your actual volume, today and six months from now.

    What’s your current course platform costing you per student? Reply with your numbers—I’ll run the comparison and tell you if you’re leaving money on the table.

  • Affiliate link disclosure placement: where regulators actually look

    Affiliate link disclosure placement: where regulators actually look

    Most solo operators know they need to disclose affiliate relationships. Fewer know that where you put the disclosure matters as much as whether you include one at all.

    The FTC’s Endorsement Guides don’t just require disclosure—they require it to be “clear and conspicuous.” That’s a legal standard with specific implications for placement, and getting it wrong doesn’t just risk a warning letter. It undermines reader trust and can trigger platform penalties from Google, Amazon Associates, or your payment processor.

    Here’s what actually counts as compliant placement, based on FTC enforcement actions and platform policy updates through mid-2024.

    Proximity beats boilerplate

    A disclosure at the bottom of your page, buried in a footer, or tucked into a dedicated “disclosures” page doesn’t meet the FTC standard. The agency’s position is consistent: readers must see the disclosure before they click the affiliate link or make a purchasing decision.

    That means:

    • In blog posts, the disclosure needs to appear above or directly adjacent to the first affiliate link—not at the end of the article.
    • In email newsletters, it should sit in the body copy near the link itself, not just in a footer template.
    • In social media posts, it must be in the caption or the first line—not hidden behind a “see more” fold or buried in a comment.

    The FTC has cited cases where disclosures appeared on a separate page linked via “Advertising Disclosure” in small footer text. Those don’t count. If a reader has to hunt for context, the disclosure fails.

    Language that works (and doesn’t)

    “This post contains affiliate links” is the baseline, but it’s often not enough. The FTC wants readers to understand the material connection—that you earn money if they buy.

    Effective language includes:

    • “I earn a commission if you buy through this link.”
    • “This is an affiliate link—I get paid if you purchase.”
    • “Paid partnership with [Brand]. I receive compensation for purchases.”

    What doesn’t work:

    • Ambiguous terms like “supported by” or “in partnership with” without explaining compensation.
    • Abbreviations like “aff link” or “#ad” in contexts where the audience may not know what they mean.
    • Disclosures that only appear on hover states, alt text, or link titles—those aren’t visible enough.

    The standard isn’t whether you think it’s obvious. It’s whether a reasonable reader scrolling quickly would understand the relationship before they click.

    Platform-specific requirements stack on top

    FTC compliance is the floor. Individual affiliate programs often add stricter rules.

    Amazon Associates requires you to include the phrase “As an Amazon Associate I earn from qualifying purchases” on any page with Amazon links. That’s in addition to general proximity rules—it can’t just live in your site footer.

    Google’s ad policies flag pages where affiliate disclosures aren’t “immediately visible.” If your disclosure requires scrolling past the fold, your organic rankings can take a hit or your AdSense account can get flagged for policy review.

    Payment processors like Stripe and PayPal can freeze accounts if they receive chargebacks or complaints tied to unclear affiliate relationships. It’s rare, but it happens—especially if you’re selling info products that include affiliate upsells without clear disclosure in the checkout flow.

    When disclosure must repeat

    One disclosure at the top of a 2,000-word post isn’t enough if you’re linking to five different affiliate products throughout. The FTC’s guidance is that disclosure should appear “in close proximity” to each claim or link that could mislead.

    Practical implementation:

    • If you’re reviewing multiple products and each has affiliate links, include a line like “affiliate link” or “I earn from this” next to each product mention.
    • In list-style posts (“Top 5 tools for X”), add disclosure language under each tool’s heading, not just once at the intro.
    • In email, if you mention an affiliate link in the body and again in a P.S., disclose in both places.

    It feels redundant. That’s the point. The goal is to prevent any moment where a reader clicks without understanding the relationship.

    What to do now

    Audit your three highest-traffic affiliate pages. Open each in an incognito window and scroll as a first-time reader would. Ask:

    • Can I see the disclosure before I reach the first affiliate link?
    • Is the language clear enough that I’d understand I’m clicking a paid recommendation?
    • Does the disclosure repeat near every distinct affiliate link or product claim?

    If any answer is no, revise before you publish your next affiliate post. Compliance isn’t about legal paranoia—it’s about making sure your readers know what they’re clicking, which is the foundation of long-term trust in a content business.

    One Two Three Send covers the operational details that matter when you’re running a content business solo. If this was useful, subscribe for the next one.

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

  • Course completion rates hover around 15%—here’s what moves the needle

    Course completion rates hover around 15%—here’s what moves the needle

    The average online course completion rate sits between 10% and 20%. If you’re running a paid course as part of your content business, that number probably feels familiar—and frustrating.

    The usual advice—gamification, drip schedules, community access—sounds good in theory. But the data from operators actually running courses tells a different story about what moves completion rates and what’s mostly noise.

    What the numbers look like in practice

    Three operators shared their course metrics over the past 18 months. All three run evergreen courses priced between $149 and $497, sold primarily to their email lists.

    Operator A: A WordPress productivity course with 847 enrollments. Completion rate: 18%. Average time to finish: 6.3 weeks. Refund rate: 4.2%.

    Operator B: An SEO fundamentals course with 1,203 enrollments. Completion rate: 23%. Average time to finish: 9.1 weeks. Refund rate: 6.8%.

    Operator C: A newsletter monetization course with 614 enrollments. Completion rate: 14%. Average time to finish: 11.4 weeks. Refund rate: 3.1%.

    The spread is narrow. All three courses include video lessons, worksheets, and some form of community or Q&A access. Pricing and production quality didn’t predict completion—the $497 course had the lowest rate.

    Three changes that actually moved the needle

    Operator B added a single check-in email at the 72-hour mark. It’s not a drip sequence. It’s one manual email sent three days after purchase asking what section the student is working on and if anything’s blocking them. Response rate: 31%. Completion rate climbed from 19% to 23% over six months. The email takes four minutes to send per cohort of 20–30 buyers.

    Operator A cut the course from 22 lessons to 14. The original version tried to be comprehensive. The shorter version focused on three workflows and cut everything else. Completion rate went from 14% to 18%. Refund rate stayed flat. Students finished faster—5.1 weeks instead of 7.8—and left better reviews.

    Operator C introduced a 48-hour «finish line» challenge. Once a month, students who’ve completed 80% or more get an email with a 48-hour window to finish the last module and submit their final project. It’s not a hard deadline—the course stays open—but the nudge works. Completion among students who receive the email: 67%. Overall course completion rose from 11% to 14%.

    What didn’t work

    All three operators tried Facebook groups or Slack communities. Operator A’s group had 18% of enrollees join; 4% posted more than once. Operator B shut down their Slack after three months—too much moderation overhead for minimal engagement. Operator C kept a Circle community but stopped treating it as a completion lever.

    Gamification—badges, progress bars, leaderboards—showed no measurable impact on completion for any of the three. Operator B’s course platform (Teachable) includes progress tracking by default. Students who completed the course had the same interaction rate with progress indicators as students who dropped off after module two.

    Drip schedules were neutral to slightly negative. Operator A tested releasing one lesson per week versus full access on day one. Completion rates were statistically identical (17.8% vs. 18.1%), but students on the drip schedule were more likely to request refunds in week two, before the course was fully unlocked.

    The completion-rate mistake most operators make

    Chasing higher completion rates assumes completion is always the right goal. It’s not.

    Operator C’s course teaches newsletter monetization. Some students buy it, watch the sponsorship module, land their first sponsor, and never finish the rest. They got what they paid for. Refund rate is low. Testimonials are strong. Completion rate is 14%.

    The better metric: outcome rate. What percentage of students achieved the result the course promised? For Operator C, 41% of students reported landing a sponsor, affiliate deal, or paid subscription tier within 90 days. That’s nearly three times the completion rate—and the number that matters for retention and referrals.

    If you’re optimizing for completion, track it. But if you’re optimizing for business results, measure the outcome your course promises and work backward from there.

    Want more operator data like this? Reply and tell us what metrics you’re trying to move—we’ll find operators who’ve solved it and share what worked.