Category: Analytics

  • Google Analytics 4 doesn’t trust TikTok referrals. Here’s why.

    Google Analytics 4 doesn’t trust TikTok referrals. Here’s why.

    Google Analytics 4 doesn't trust TikTok referrals. Here's why.
    Photo: Saleemkce via Wikimedia Commons (CC BY-SA 4.0)

    You post a link to TikTok. Someone clicks. They land on your site. You check Google Analytics 4 an hour later, and the visit shows up under “direct / (none)” instead of TikTok.

    This isn’t a bug. It’s a design collision between how TikTok’s in-app browser works and how GA4 attributes traffic. The result: you undercount social performance and make bad decisions about where to spend effort.

    Why TikTok referrals disappear in GA4

    When someone clicks a link inside the TikTok app, it opens in TikTok’s own in-app browser. That browser strips or obscures HTTP referrer headers inconsistently—sometimes it passes tiktok.com, sometimes it passes nothing, and occasionally it passes an intermediate redirect domain TikTok uses internally.

    GA4 relies on referrer headers to classify traffic sources. If the header is missing or unrecognized, GA4 dumps the session into “direct / (none).” Even when the referrer does come through, GA4’s default channel grouping doesn’t always recognize TikTok variants (like t.tiktok.com or regional subdomains) as social traffic.

    The problem gets worse if your audience uses iOS and you have App Tracking Transparency prompts blocking data handoff between apps. In those cases, the session starts fresh on your site with zero context about where it came from.

    What this looks like in practice

    Run a TikTok campaign driving to a landing page. You see 400 clicks in TikTok’s analytics dashboard. GA4 shows 180 sessions from “tiktok.com” and another 150 sessions filed under “direct.” The math doesn’t add up, and you can’t tell which creative or caption drove the missing traffic.

    One operator I spoke with in August saw only 42% of their TikTok link clicks appear as social referrals in GA4. The rest scattered across direct, referral (from unrecognized domains), and a handful labeled “(other).” They were about to kill TikTok entirely until they cross-checked server logs and realized the traffic was real—just misattributed.

    How to fix attribution for TikTok links

    The most reliable fix: UTM parameters. Append ?utm_source=tiktok&utm_medium=social&utm_campaign=[your_campaign_name] to every link you post on TikTok. GA4 will honor UTM tags even when referrer headers fail, and you’ll get clean source/medium data in your reports.

    Keep the parameters short. TikTok doesn’t display full URLs in bios or comments, but long query strings make links look spammy and reduce click-through in practice. Stick to source, medium, and campaign. Skip content and term unless you’re running paid TikTok ads with multiple creatives.

    If you’re using a link shortener (Bitly, Rebrandly, or a self-hosted option), add UTM parameters to the destination URL before you shorten it. That way the shortlink preserves attribution even if TikTok’s app strips the referrer during the redirect.

    One more step: check your GA4 channel grouping rules. Go to Admin → Data display → Channel groups → Default channel grouping, and confirm that tiktok.com and common variants like m.tiktok.com and vt.tiktok.com are classified under “Social.” If they’re missing, add a custom rule matching source “tiktok” with medium “social” or “referral.”

    When to care about this and when to ignore it

    If TikTok drives less than 5% of your traffic, the attribution gap won’t move the needle. Your time is better spent on channels you can measure cleanly.

    But if you’re testing TikTok as a growth lever—posting daily, experimenting with hooks, or running link-in-bio offers—misattribution will kill your ability to learn what works. You’ll see flat referral numbers, assume TikTok doesn’t convert, and bail before you find the format that clicks.

    The same issue affects Instagram, Snapchat, LinkedIn’s mobile app, and even some Reddit clients. The pattern is identical: in-app browsers that don’t play nice with referrer headers. The fix is the same every time—UTM parameters on every link you post to social platforms.

    Want more breakdowns of analytics quirks that cost you traffic insights? Subscribe to One Two Three Send and get one operator-focused article like this every day.

  • Analytics event schemas: when to document yours and when to skip it

    Analytics event schemas: when to document yours and when to skip it

    Analytics event schemas: when to document yours and when to skip it
    Photo: Сергей Муштук via Wikimedia Commons (CC BY-SA 4.0)

    Event schemas are the structured definitions that describe what data gets sent to your analytics platform every time a user does something. Button click, page view, video play—each one can carry a payload of properties: timestamp, user ID, referrer, custom flags.

    Developer teams at larger companies maintain formal schema registries. Solo operators usually don’t. The question isn’t whether schemas matter—they do—but whether documenting them is worth the overhead when you’re the only person touching the data.

    When you don’t need formal schema docs

    If you’re running a content site with fewer than five custom events, you probably don’t need a schema document. You’re tracking newsletter signups, affiliate link clicks, maybe a video completion event. The properties are stable: email, source, timestamp. You wrote the tracking code yourself, and you check it every few months.

    The risk of breaking something is low. The cost of reverse-engineering your own work is also low—you can grep your codebase or check the analytics platform’s event explorer to see what’s being sent.

    Most solo operators fall into this bucket. If your event volume is under 10,000 per month and you’re not running multi-step funnels with conditional logic, a schema doc is bureaucracy you don’t need.

    When documentation becomes necessary

    Three scenarios change the calculus:

    You’re tracking the same event from multiple sources. Newsletter signup might fire from your homepage, a content upgrade modal, a footer form, and a Beehiiv embed. Each implementation might send slightly different properties—source vs. utm_source, page_url vs. referrer. Without a reference doc, you’ll end up with inconsistent data that breaks your funnel reports.

    You’re using event data to trigger automation. If a Zapier workflow or email sequence depends on a specific event property—say, plan_type equaling pro—you need to know exactly what values that field can take and when it gets set. One typo (Pro vs. pro) silently breaks the automation.

    Someone else will touch your tracking code. A VA, a contract developer, a co-founder. If they don’t know what content_id is supposed to contain, they’ll guess. And their guess will be wrong often enough to corrupt your historical data.

    What a useful schema doc actually includes

    Forget the enterprise playbook. You don’t need JSON Schema validators or versioned APIs. A solo operator’s schema doc is a spreadsheet or Notion table with four columns:

    • Event name: newsletter_signup
    • When it fires: “User submits email in any signup form”
    • Required properties: email, source, timestamp
    • Optional properties: utm_campaign, content_upgrade_title

    Add a fifth column for notes: edge cases, known bugs, deprecation plans. That’s it. Update it when you add a new event or change a property name. Review it once a quarter.

    The goal isn’t completeness—it’s preventing your future self from having to diff your entire codebase to remember whether course_completed sends a boolean or a percentage.

    The middle path: event naming conventions

    If you’re not ready to document every event but you want some structure, enforce a naming convention. Use a consistent verb-object pattern: clicked_affiliate_link, started_checkout, completed_video. Namespace related events: signup.newsletter, signup.course, signup.waitlist.

    This won’t prevent property drift, but it makes your event list readable six months from now. Most analytics platforms let you filter or group by prefix, so namespacing also improves your dashboard usability.

    When to revisit the decision

    Check your analytics event list every three months. If you see duplicate events with slightly different names—newsletter_signup and email_signup—or if you’re routinely surprised by what properties an event carries, it’s time to document.

    The threshold isn’t a specific event count. It’s when the cost of confusion exceeds the cost of maintaining a single reference table.

    Want more guides on analytics infrastructure for solo operators? Subscribe to One Two Three Send—every article is written for people running content businesses without a data team.

    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 combining analytics platforms—here’s what you lose

    Stop combining analytics platforms—here’s what you lose

    Stop combining analytics platforms—here's what you lose
    Photo by Anwaar Ali on Unsplash

    The conventional wisdom is clear: use Google Analytics 4 for traffic, Plausible for privacy-compliant page views, and your email platform’s built-in analytics for opens and clicks. Then roll it all into a spreadsheet or dashboard tool to get the “complete picture.”

    Except the picture you get is fiction.

    Combining analytics platforms doesn’t give you better data. It gives you incompatible data that looks coherent until you try to act on it. Each platform defines sessions differently, attributes conversions using conflicting models, and timestamps events in ways that don’t align. When you merge them, you’re not filling gaps—you’re multiplying errors.

    Session definitions don’t translate

    Google Analytics 4 ends a session after 30 minutes of inactivity by default. Plausible doesn’t use sessions at all—it counts page views and unique visitors within calendar-day boundaries. Your email platform measures “sessions” as the window between email send and the last recorded action, which might span hours or days depending on how the recipient interacts.

    When you try to correlate a GA4 session with a Plausible visit and an email click, you’re comparing three different time containers. A single user journey might show up as one session in GA4, two visits in Plausible (if they came back the next day), and three email interactions if they opened your newsletter twice and clicked a link hours apart.

    If you’re summing these to calculate “total engaged sessions,” you’ve just triple-counted the same person. If you’re using them to build a funnel, your conversion rate is wrong because the denominator and numerator come from different user universes.

    Attribution models conflict at merge time

    GA4 uses data-driven attribution by default, which spreads credit across multiple touchpoints based on observed conversion patterns. Plausible uses last-touch: the most recent referrer gets 100% credit. Your email tool attributes every conversion to the email campaign if the user clicked a link in the last seven days, regardless of what else they did.

    Let’s say someone clicks your newsletter link, then Googles your product name an hour later and converts. GA4 might split credit 40/60 between email and organic search. Plausible assigns it entirely to organic. Your email tool claims it as an email conversion.

    When you combine these sources into a single report, which number do you trust? If you add them, you’ve attributed 200% credit for one sale. If you pick one, you’ve discarded the others arbitrarily. If you try to deduplicate, you need a tiebreaker rule—and now you’re building a fourth attribution model on top of three existing ones.

    Event timestamps use different clocks

    Google Analytics 4 timestamps events in UTC and adjusts for your reporting time zone in the interface. Plausible records events in the server’s local time. Your email platform logs actions relative to when the email was sent, not when the action occurred in absolute terms.

    If you’re building a timeline of user behavior, you’ll see events out of order. An email click logged at 9:47 AM in your email tool might have happened at 11:47 AM UTC, which GA4 displays as 6:47 AM in US Central time. When you sort by timestamp to reconstruct the user journey, the sequence is wrong.

    This breaks any analysis that depends on order: funnel steps, time-to-conversion calculations, or dropout identification. You can’t tell whether someone abandoned your checkout before or after reading your follow-up email, because the clocks don’t agree.

    When combining platforms makes sense

    There are valid reasons to run multiple analytics tools. Privacy compliance might require a cookieless tracker alongside GA4. Transactional email analytics from Postmark give you delivery data that marketing platforms don’t surface. A/B testing tools record experiment assignments that aren’t visible in your main analytics.

    But these use cases don’t require merging the data. They require parallel tracking with clear boundaries. Use Plausible to answer privacy-safe questions about aggregate traffic. Use GA4 for user-level behavior and conversion funnels. Use your email tool for email-specific metrics like deliverability and unsubscribe rates. Don’t add them together.

    If you need cross-platform visibility, the solution isn’t a merged dashboard. It’s a single source of truth with proper event instrumentation. Pick one platform as your canonical analytics layer—usually GA4 for most operators—and send it clean, consistent events from every traffic source. Tag your email links with UTM parameters. Fire custom events when users complete key actions. Let the attribution model run inside one system, not across three.

    What to do instead

    Audit your current setup. If you’re pulling numbers from multiple dashboards and combining them manually, stop. Identify the decision each metric is supposed to inform, then pick the single platform best suited to answer it.

    For operators running content businesses, that usually means: GA4 for traffic and conversions, your email platform for email-specific performance, and one optional privacy-friendly tracker if you need cookieless data for compliance or audience trust.

    Don’t merge their outputs. Don’t build Frankenstein dashboards. And definitely don’t calculate conversion rates by dividing a Plausible visitor count into a GA4 goal total.

    Analytics platforms are tools, not puzzle pieces. Trying to fit them together doesn’t give you a complete picture—it gives you a blurry one.

    Want more straight talk about the tools that run your online business? Subscribe to One Two Three Send and get one operator-focused article in your inbox daily.

  • Google Analytics 4 event limits: when custom tracking stops recording

    Google Analytics 4 event limits: when custom tracking stops recording

    Google Analytics 4 event limits: when custom tracking stops recording
    Photo: Saleemkce via Wikimedia Commons (CC BY-SA 4.0)

    Google Analytics 4 enforces a hard limit of 500 distinct event names per property. Cross that threshold and GA4 stops recording new events entirely—no warning in the interface, no email alert, just silent data loss.

    Most solo operators discover this limit only after noticing gaps in their conversion funnels or realizing a new tracking event never logged a single hit. If you’ve layered on custom events for lead magnets, course enrollments, affiliate clicks, and content upgrades over months or years, you’re closer to the ceiling than you think.

    How the 500-event cap actually works

    GA4 counts every unique event name you send. That includes automatically collected events like page_view and session_start, recommended events like purchase and sign_up, and every custom event you’ve created.

    Once you hit 500, GA4 stops processing new event names. Existing events continue to log normally, but any event name it hasn’t seen before gets dropped. Parameters on existing events still work—so if you send button_click with a new button_id parameter, that logs fine. But a brand-new event called webinar_registration won’t appear anywhere.

    The limit applies at the property level, not per data stream. If you run multiple sites under one GA4 property, all domains share the same 500-event budget.

    Where event bloat comes from

    Three patterns push operators toward the limit faster than expected:

    Plugin-generated events. WordPress analytics plugins, form tools, and membership platforms often fire custom events for every interaction type. Install three plugins that each create 20 events, and you’ve burned through 60 slots without writing a single line of custom code.

    Developer handoffs. A contractor adds tracking for a product launch, then another developer implements event tracking for a new funnel six months later. No one audits what’s already there. Event names proliferate with slight variations—email_signup, email_sub, newsletter_subscribe—each consuming a separate slot.

    Abandoned experiments. You test a new lead magnet, set up tracking, then retire the offer. The event stays in your GA4 property forever, even if it hasn’t fired in a year. GA4 doesn’t archive or expire old event names automatically.

    How to audit your current event count

    GA4 doesn’t surface your total event count in the main interface. To see where you stand, open the Admin panel, navigate to Data display under the Property column, and click Events. Scroll through the list and count manually, or export the table to a spreadsheet.

    Pay attention to events with zero occurrences in the last 30 days—those are prime candidates for archiving. If an event hasn’t fired in three months and isn’t tied to a seasonal campaign, you probably don’t need it.

    Check your GTM container too. Tag Manager configurations often include events that were set up for A/B tests or one-off promotions and never removed. Each orphaned tag still counts against your limit if it ever fires, even once.

    What to do when you’re near the cap

    GA4 lets you mark events as archived, but archiving doesn’t free up slots. Archived events still count toward your 500-event limit—they just stop appearing in some reports. To actually reclaim space, you need to stop sending the event entirely and wait 24 hours for GA4’s backend to recognize it’s gone.

    The better fix: consolidate events using parameters. Instead of creating separate event names like download_ebook_seo, download_ebook_email, and download_ebook_productivity, send a single download_ebook event with a topic parameter. You’ll preserve granular reporting while using one event slot instead of dozens.

    For operators running multi-brand properties, consider splitting into separate GA4 properties. Each property gets its own 500-event limit, and you avoid cross-contamination between unrelated sites. The tradeoff: you lose consolidated reporting and need to manage multiple configurations.

    Before you hit the limit, document your event taxonomy. A simple spreadsheet listing every event name, what it tracks, and which tool or script sends it will save hours of forensic work later. Update it whenever you add new tracking, and review it quarterly to prune dead events.

    If you’re building a new analytics setup or migrating properties, start with a naming convention that uses parameters heavily. It’s easier to prevent event bloat than to clean it up after the fact.

    Spotted a gap in your GA4 setup or hit a tracking limit that cost you data? Reply and tell us—we cover the operational details other newsletters skip.

  • Analytics sampling: when your traffic report only counts 10% of visitors

    Analytics sampling: when your traffic report only counts 10% of visitors

    Analytics sampling: when your traffic report only counts 10% of visitors
    Photo: Saleemkce via Wikimedia Commons (CC BY-SA 4.0)

    Open your analytics dashboard, filter by a date range longer than 90 days, add a secondary dimension, and check the top-right corner. If you see a green or yellow shield icon in Google Analytics 4, or a percentage beneath your report in other platforms, you’re looking at sampled data—not your full dataset.

    Analytics sampling means the platform processes a subset of your traffic data and extrapolates the rest. It speeds up queries on large datasets, but it also introduces margin-of-error ranges that most operators never notice until a metric suddenly doesn’t match their records.

    When platforms trigger sampling

    Google Analytics 4 samples when your property exceeds 10 million events in the selected date range and you apply filters, secondary dimensions, or custom explorations. Standard reports stay unsampled; explorations and custom breakdowns do not.

    Adobe Analytics samples at the report-suite level when queries exceed processing thresholds. Matomo samples only if you enable the setting manually. Plausible and Fathom don’t sample at all—they process every event—but they also cap the complexity of queries you can run.

    The trigger isn’t daily traffic—it’s cumulative events in the query window. A site logging 120,000 events per day hits the GA4 sampling threshold after 84 days. Add a UTM breakdown or device-category filter, and the platform samples to return results faster than five seconds.

    What sampling skews most

    Aggregate metrics like total pageviews or sessions stay fairly accurate under sampling. Google claims 95% confidence intervals, which means your reported total might land within ±5% of the true figure.

    Segmented comparisons break down faster. If you’re comparing conversion rates between traffic sources, and one source represents 2% of your total traffic, sampling can miscount that slice by 20% or more. Small segments, long date ranges, and multiple filters compound the error.

    Funnel reports suffer worst. If your checkout funnel has five steps and you’re filtering by device type across six months, you’re stacking sampled data at every stage. A 3% error at step one becomes 8% by step four, and your abandonment-rate diagnosis points you in the wrong direction.

    How to spot sampling before it distorts decisions

    GA4 displays a green shield icon when sampling is under 10%, yellow when it’s higher. Click the icon to see the exact sample size and confidence interval. If your report says “based on 8.4% of sessions,” your margin of error is roughly ±3.4% for aggregate numbers and wider for segments.

    Check sampling before you:

    • Compare two time periods to measure campaign impact
    • Segment by UTM source, device, or geographic region
    • Build a funnel or path exploration longer than three steps
    • Export data to a spreadsheet for further analysis

    If you see yellow or red sampling warnings, narrow your date range, remove secondary dimensions, or export raw data to BigQuery and query it directly. GA4’s BigQuery export is unsampled and free for properties under 1 million events per day.

    Alternatives when you need unsampled precision

    Switch to standard reports instead of explorations when possible—those stay unsampled in GA4. For custom breakdowns, export to BigQuery and use SQL. The learning curve is steeper, but you get exact counts.

    Plausible and Fathom don’t sample, but they limit filtering depth. You can’t build multi-step funnels or apply three-layer segments, which keeps queries fast without statistical shortcuts.

    Matomo’s on-premise version lets you disable sampling entirely if your server can handle the query load. Expect 8–15 second page loads for complex reports on datasets over 50 million events.

    For conversion tracking and funnel analysis, many operators now run a dedicated event pipeline to a data warehouse—Snowplow, Segment, or RudderStack feeding into Redshift or ClickHouse—and only use GA4 for directional traffic trends. It’s overkill for a solo newsletter, but it’s standard past 500,000 monthly sessions.

    If you’re making budget or product decisions from a report with a yellow sampling badge, re-run the query with a tighter date range or fewer dimensions. A 5% error on total traffic is noise. A 15% error on your highest-converting UTM source sends you optimising the wrong channel.

    Want more breakdowns on the tools operators actually use? Subscribe to One Two Three Send—one article every morning, no sampling required.

  • Analytics event deduplication: when double-counting inflates conversions

    Analytics event deduplication: when double-counting inflates conversions

    Analytics event deduplication: when double-counting inflates conversions
    Photo: Nemo bis via Wikimedia Commons (CC BY-SA 3.0)

    You’re tracking conversions across multiple tools—Google Analytics, your email platform, maybe a CRM—and the numbers don’t match. One dashboard says you had 47 signups yesterday. Another says 52. A third claims 61.

    The culprit is often event deduplication, or more precisely, the lack of it. When the same user action triggers multiple tracking events without a shared identifier to merge them, you end up counting the same conversion two, three, or more times.

    This isn’t just a reporting nuisance. Inflated conversion counts make your funnel look healthier than it is, lead you to overspend on acquisition channels that aren’t actually performing, and break attribution when you’re trying to figure out what’s working.

    How duplicate events happen

    The most common scenario: you fire a tracking pixel on page load and via a JavaScript event listener. A user completes a signup form. The page reloads to a thank-you URL. Your analytics script fires once on form submission, once on the new page load, and if you’ve got server-side tracking hooked into your backend, possibly a third time when the database write completes.

    Each event looks legitimate in isolation. None of your dashboards know the others exist. You see three conversions. Reality: one person signed up.

    Another pattern: tracking the same conversion in both client-side and server-side systems without a deduplication key. Google Analytics records the event when the browser sends it. Your email platform records it when the API call creates the subscriber. Your payment processor records it when the webhook fires. Same user, same action, three separate counts.

    Single-page apps make this worse. If your React or Vue app doesn’t manage history state carefully, navigation events can fire duplicate pageviews. Add a tag manager that reinitializes on every route change, and you’re stacking events every time someone clicks a link.

    What actually deduplicates events

    Most analytics platforms offer deduplication, but it’s not automatic. Google Analytics 4 uses a combination of client ID, session ID, and timestamp to merge events that fire within a narrow window—usually a few seconds. If your duplicate fires outside that window, or if the client ID changes between events (common in cross-device scenarios), GA4 treats them as separate.

    Facebook Pixel and other ad-platform tracking use event IDs. If you pass the same eventID parameter with both a browser pixel and a server-side Conversion API call, the platform deduplicates them. But you have to implement it. The default setup doesn’t generate or pass event IDs automatically.

    Email platforms like MailerLite and Beehiiv deduplicate by email address when you’re tracking list growth, but if you’re sending conversion events via API and tracking form submissions via their embed code, you’ll still double-count unless you add a check in your own code to prevent firing both.

    How to catch and fix it

    Start by auditing where your conversions get tracked. Open your browser’s network inspector, complete a test conversion, and watch how many tracking requests fire. Look for:

    • Multiple requests to the same analytics endpoint within a few seconds
    • Duplicate event names with identical or near-identical timestamps
    • The same conversion being sent to different platforms without a shared transaction or session ID

    If you’re running server-side tracking, check your logs. Grep for the event name and see if the same user ID or session appears multiple times for a single action.

    Once you’ve identified duplicates, the fix depends on your stack. If you’re firing events both on form submit and page load, pick one and remove the other. If you’re using both client-side and server-side tracking, implement event IDs or transaction hashes so platforms can merge them. If you’re tracking across multiple tools, designate one as the source of truth for each conversion type and use it to reconcile the others.

    For Google Analytics, enable User-ID tracking and pass a consistent identifier across sessions and devices. For Facebook, generate a unique event ID server-side, store it in the user’s session, and pass it with both pixel and API calls. For email platforms, check whether a subscriber already exists before firing a secondary conversion event.

    When deduplication breaks

    Deduplication fails silently when identifiers don’t match. A user clears cookies between events. A session expires. A server-side call uses a hashed email while the client-side call uses a raw one. A mobile app and a web browser use different device IDs.

    Cross-domain tracking makes this worse. If your checkout lives on a different domain than your marketing site, and you haven’t configured cross-domain measurement correctly, every conversion looks like a new session with a new client ID. No deduplication happens because the platform doesn’t recognize them as the same user.

    The best defense: log your conversion events somewhere you control—a database table, a Google Sheet via API, a Slack channel—and compare counts across platforms weekly. When your internal log shows 50 conversions and your analytics dashboard shows 73, you know you have a deduplication problem.

    One Two Three Send covers the tools and workflows solo operators actually use. If you want sharp, specific takes on analytics, email platforms, and everything else in the online-business stack, subscribe below.

    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.

  • Analytics event naming: why inconsistency kills your funnel data

    Analytics event naming: why inconsistency kills your funnel data

    Analytics event naming: why inconsistency kills your funnel data
    Photo by 1981 Digital on Unsplash

    You set up event tracking six months ago. It worked. You added Google Analytics 4, maybe Plausible or Fathom, wired up a few conversions, and moved on.

    Now you’re trying to build a funnel report and half your events don’t match. button_click in one tool, Button Click in another, btn_clicked in your CRM. None of them talk to each other. Your attribution is broken before you even start analyzing.

    Event naming isn’t glamorous, but it’s the difference between actionable data and a dashboard full of question marks.

    Why event names diverge

    Most operators start tracking events one tool at a time. You add GA4, fire a sign_up event. Two months later, you install a heatmap tool and track signup_button. Your email platform logs Signup with a capital S. Your payment processor calls it account_created.

    Each name made sense in isolation. But now you’re trying to connect the dots across platforms, and nothing lines up.

    The problem gets worse when multiple people touch your tracking stack. A contractor adds events with camelCase. You prefer snake_case. Your VA uses sentence case because that’s what the UI suggested. Three months later, you have 47 events and no idea which ones measure the same thing.

    Renaming events after the fact is painful. GA4 lets you modify event names via the interface, but historical data stays unchanged. Most analytics tools don’t offer retroactive renaming at all. You either live with the mess or start over.

    What a naming convention actually needs

    A useful event naming system has three jobs: it prevents duplicates, it groups related events, and it survives handoffs to other people.

    Start with a consistent case format. Snake_case (button_click) works well because it’s readable, doesn’t break in spreadsheets, and most analytics platforms handle it without fuss. Avoid spaces, capital letters, and special characters unless your tool explicitly requires them.

    Use a namespace prefix for event categories. If you track multiple funnels—say, newsletter signups and course purchases—prefix each event with its domain: newsletter_signup_started, course_checkout_completed. This keeps related events grouped in alphabetical lists and makes filtering easier.

    Be specific about the action and the object. click is too vague. button_click is better. header_cta_click is best. When you’re looking at a list of 50 events three months from now, you want to know exactly what fired without opening the implementation code.

    Write it down. A shared Google Doc, a Notion page, a comment block in your tag manager—anywhere your future self and collaborators can check before adding a new event. Include the event name, where it fires, what it measures, and when it was added. This takes two minutes per event and saves hours of detective work later.

    How to audit what you have

    Pull a full event list from each tool you use. GA4 lets you export all events from the Events report. Plausible shows them under Goals. Your CRM probably has an API endpoint or a CSV export.

    Dump everything into a spreadsheet. Look for duplicates with different casing, pluralization, or verb tenses. form_submit and form_submitted probably measure the same thing. So do page_view and pageview.

    Group events by funnel stage or user journey. Which events represent awareness? Consideration? Conversion? If an event doesn’t clearly belong to a stage, it’s either redundant or poorly named.

    Decide which names to keep. Prioritize the ones already in your most critical reports. If you’ve been running a GA4 funnel for six months with checkout_started, don’t rename it to cart_checkout_begin just for consistency. Rename the outliers instead.

    For tools that allow it, create event mappings or modify event parameters to normalize naming without losing historical data. GA4’s “modify event” feature lets you rename events going forward while keeping old data intact. Not ideal, but better than a full reset.

    For tools that don’t support renaming, add a documented transition period. Fire both the old and new event names for 30 days, then retire the old one. This gives your dashboards time to adjust without dropping data.

    When to enforce the system

    New events should follow the convention from day one. Before you add anything, check the doc. If the name isn’t there, add it. If it conflicts with an existing event, revise it before you push the code live.

    Set up a monthly review. Scan your event list for anything that doesn’t match the pattern. If you find a rogue event, trace it back to the source and fix it. The longer you wait, the harder it gets.

    If you work with contractors or team members, include event naming rules in your onboarding docs. A two-paragraph explainer and a link to your event registry will prevent most mistakes.

    This isn’t about perfectionism. It’s about making sure the data you collect six months from now is still useful. Consistent event naming doesn’t make your funnels convert better, but it makes it possible to know why they don’t.

    Want more systems like this? Subscribe to One Two Three Send for weekly deep-dives on the tools and workflows that actually matter for online operators.

  • Analytics dashboard refresh rates: when ‘real-time’ is 15 minutes old

    Analytics dashboard refresh rates: when ‘real-time’ is 15 minutes old

    Analytics dashboard refresh rates: when 'real-time' is 15 minutes old
    Photo: Saleemkce via Wikimedia Commons (CC BY-SA 4.0)

    You refresh your analytics dashboard, see a spike in traffic, and make a decision. Twenty minutes later, the numbers change. The spike wasn’t real—it was a delayed batch update finally catching up.

    Most analytics platforms advertise “real-time” data, but the definition varies wildly. Some update every few seconds. Others label data “real-time” when it’s actually on a 10- or 15-minute delay. If you’re running paid campaigns, testing content, or troubleshooting a technical issue, that lag can cost you.

    Here’s what the refresh intervals actually look like across the tools solo operators use most.

    Google Analytics 4: real-time vs. standard reports

    GA4 splits its interface into two modes with completely different refresh schedules.

    The Realtime report updates every few seconds and shows activity from the last 30 minutes. It’s genuinely live. You can watch users land on pages, see referral sources, and track active sessions as they happen.

    Every other report in GA4—traffic acquisition, landing pages, conversions—runs on processed data that lags 24 to 48 hours. The interface doesn’t always make this obvious. You can select “today” as a date range, but the data you’re seeing might be incomplete or entirely missing if Google hasn’t finished processing it yet.

    This matters when you’re trying to measure same-day campaign performance. If you launch a newsletter at 9 a.m. and check your landing page traffic at noon, GA4’s standard reports might show zero visits even if 500 people clicked through. The Realtime report will show them; the rest of the dashboard won’t.

    Plausible, Fathom, and privacy-first tools

    Privacy-focused analytics platforms tend to update faster because they process less data and don’t rely on Google’s infrastructure.

    Plausible refreshes every 60 seconds. You’ll see new pageviews, referrers, and goals within a minute of them happening. There’s no separate “real-time” mode—the entire dashboard operates on the same refresh cycle.

    Fathom Analytics works similarly, with updates every 30 to 60 seconds depending on server load. Both tools are built for solo operators who want to check traffic without waiting for batch processing.

    The tradeoff: these platforms don’t offer the same segmentation depth as GA4. You get fast data, but fewer filtering options.

    Paid ad platforms: Facebook, Google Ads, LinkedIn

    Ad dashboards have their own refresh logic, and it’s slower than most operators expect.

    Facebook Ads Manager updates every 15 minutes for active campaigns. If you’re testing ad creative or adjusting budgets, you won’t see the impact of your changes until at least one refresh cycle passes. Conversion data—especially for events tracked via the Pixel—can lag an additional hour as Facebook attributes clicks and validates events.

    Google Ads refreshes every 3 hours for most metrics. Impressions and clicks appear faster, but conversion data tied to GA4 goals or imported offline events can take 6 to 24 hours to populate.

    LinkedIn Campaign Manager updates every 24 hours. You can’t optimise LinkedIn ads intraday—the platform doesn’t surface enough data to make that possible.

    If you’re split-testing ad creative, this lag forces you to wait longer than you’d expect before making decisions. A campaign that looks like it’s underperforming at 10 a.m. might show strong results by 2 p.m. once delayed conversions populate.

    What this means for decision-making

    The biggest mistake is treating delayed data as if it were complete. If you check your analytics dashboard and see low traffic or weak conversions, ask whether the platform has actually finished processing the time window you’re looking at.

    For same-day decisions—like killing an underperforming ad or tweaking a landing page—use tools with sub-60-second refresh rates. Plausible, Fathom, or GA4’s Realtime report are your best options.

    For campaign analysis and attribution, wait at least 48 hours before drawing conclusions. Conversion tracking, especially across multiple touchpoints, needs time to reconcile.

    And if you’re running a high-stakes launch—a product drop, a webinar, a sponsorship deal—set up multiple dashboards. Cross-reference GA4 Realtime with your email platform’s click tracking and your payment processor’s revenue feed. No single dashboard will give you the full picture on the same refresh cycle.

    Want more breakdowns like this? Subscribe to One Two Three Send—we cover the tools, tactics, and operational details solo operators actually need.

  • Google Analytics 4 session timeout: what 30 minutes actually measures

    Google Analytics 4 session timeout: what 30 minutes actually measures

    Google Analytics 4 session timeout: what 30 minutes actually measures
    Photo: Saleemkce via Wikimedia Commons (CC BY-SA 4.0)

    Google Analytics 4 ends a session after 30 minutes of inactivity by default. Most operators know that number, but fewer understand what the timer actually tracks—or how changing it affects every engagement metric in your dashboard.

    If you’re running a content site, newsletter archive, or documentation hub where readers spend time away from the tab, the standard timeout can fragment what should count as a single visit. Here’s how the mechanism works and when to adjust it.

    How the 30-minute timer starts and resets

    GA4 starts a session the moment someone lands on your site and fires the first pageview or event. The 30-minute countdown begins immediately. Every subsequent interaction—pageview, scroll, click event, video play—resets the timer back to zero.

    If someone reads an article for twelve minutes, opens a new tab to check email for eight minutes, then returns to click a link, GA4 sees continuous activity. The session persists because the gap never hit thirty minutes.

    But if that reader leaves the tab open, walks away for thirty-one minutes, then comes back and scrolls, GA4 registers a new session. Same browser, same tab, different session. That split changes your session count, pages-per-session average, and engagement rate.

    The timer is client-side and local to the browser. It doesn’t sync across devices. If someone starts reading on mobile during a commute and picks up the same article on desktop an hour later, those are always separate sessions—even if they’re logged in.

    When the default timeout distorts your metrics

    Thirty minutes works well for ecommerce and SaaS dashboards where sessions map to discrete tasks: browse products, compare plans, check out. Gaps longer than half an hour usually signal a different intent or context.

    Content sites see different behavior. A reader might open five tabs from your homepage, read each article for eight minutes over the course of an hour, and trigger five separate sessions because the gaps between tab switches exceeded the threshold.

    Documentation sites and tutorial hubs get hit hardest. Readers toggle between your guide and their own project. A thirty-minute threshold treats a single problem-solving session as three or four visits, deflating engagement time and inflating bounce rate.

    If your average GA4 session duration is under two minutes but you publish 10-minute reads, the timeout setting is likely splitting real reading sessions into fragments.

    Adjusting the session timeout in GA4

    You can change the session timeout in GA4’s data stream settings. Navigate to Admin → Data Streams → [your stream] → Configure tag settings → Adjust session timeout. The range is 1 to 120 minutes for inactivity timeout.

    Extending it to 60 or 90 minutes makes sense if your content encourages multi-tasking or requires readers to step away and return. Shortening it to 15 minutes can help if you want tighter attribution windows for fast-moving campaigns or live events.

    Changing the timeout doesn’t backfill historical data. GA4 applies the new setting only to sessions that start after you save the change. If you’re comparing month-over-month engagement metrics and you adjusted the timeout mid-period, your averages will be skewed.

    One non-obvious side effect: increasing session timeout also extends the window for attributing conversions to the original traffic source. If someone arrives from organic search, reads for twenty minutes, leaves for forty, then returns and subscribes, a 30-minute timeout attributes that conversion to direct traffic. A 60-minute timeout keeps the organic attribution intact.

    When not to change it

    If you’re running paid campaigns or affiliate tests and need to compare performance across tools, keep GA4’s timeout at the default. Most ad platforms and attribution tools assume a 30-minute session window. Diverging from that standard makes cross-platform reporting harder to reconcile.

    Similarly, if you’re part of a media network or benchmark group that shares analytics data, non-standard timeout settings make your engagement metrics incomparable. A 90-minute timeout will always show higher pages-per-session than a peer using 30 minutes, even if actual behavior is identical.

    And if your content is truly short-form—tweet threads, quick-hit news briefs, recipe cards—a longer timeout just adds noise. Sessions that stretch across an hour when your median read time is ninety seconds don’t reflect real engagement; they reflect open tabs.

    The default exists for a reason: it works for most sites most of the time. But if your engagement metrics don’t align with how readers actually use your content, the session timeout is one of the first settings worth testing.

    Want more analytics breakdowns like this? Subscribe to One Two Three Send for weekly deep-dives on the tools and settings that shape your business metrics.

  • Analytics custom dashboards: when pre-built templates mislead you

    Analytics custom dashboards: when pre-built templates mislead you

    Analytics custom dashboards: when pre-built templates mislead you
    Photo by Stephen Phillips – Hostreviews.co.uk on Unsplash

    Most analytics platforms ship with attractive templates. You connect your data source, the dashboard populates itself, and you get a grid of charts that look professional enough to screenshot for a board deck.

    The problem: those templates measure what the vendor thinks matters, not what actually drives your business. And because they look polished, operators assume they’re looking at the right metrics—until revenue stalls and the dashboard still shows green.

    What pre-built dashboards optimise for

    Analytics vendors design default templates to serve the widest possible audience. That means they prioritise:

    • Vanity metrics that trend upward. Page views, session counts, total subscribers. These make new users feel good and reduce churn during trial periods.
    • Metrics that showcase platform features. If the tool sells attribution modelling, the dashboard will surface multi-touch funnels—even if you’re a solo operator with one traffic source.
    • Industry averages that may not apply. E-commerce dashboards assume you care about cart abandonment rate. But if you sell a $2,000 course with a multi-week consideration cycle, cart behaviour is noise.

    The result: you spend every Monday morning reviewing a dashboard that tells you visits are up 12% but can’t explain why revenue per subscriber dropped.

    The metrics that actually matter depend on your model

    If you run a sponsored newsletter, your core dashboard should answer:

    • What’s my seven-day open rate by acquisition source?
    • Which posts drove the most sponsor link clicks?
    • What’s my subscriber-to-sponsor-ready ratio? (Sponsors care about engaged readers, not total list size.)

    If you sell a productised service with monthly retainers, you need:

    • Monthly recurring revenue vs. one-time project income.
    • Client lifetime value by acquisition channel.
    • Churn rate and leading indicators (missed payments, support ticket volume).

    If you monetise with affiliates and ad networks, track:

    • Revenue per thousand visitors by content category.
    • Affiliate conversion rate by product and placement.
    • Traffic source profitability after paid acquisition cost.

    None of these maps cleanly onto a Google Analytics 4 or Plausible default template. You have to build it yourself.

    When to abandon the template and start from scratch

    Here’s the test: open your current dashboard and ask, “If this metric moved 20% in either direction, would I change what I do this week?”

    If the answer is no, delete the widget.

    Then list the three business questions you asked yourself in the last 30 days. Examples:

    • “Why did last week’s post convert worse than the week before?”
    • “Which traffic source sends readers who actually buy?”
    • “Is my welcome sequence still working, or has open rate decayed?”

    Build one dashboard widget per question. If your analytics platform can’t answer it, you’re either tracking the wrong events or using the wrong tool.

    What good custom dashboards look like

    Effective operator dashboards are not beautiful. They’re a small grid—often just four to six widgets—that update weekly and drive a specific decision.

    A working example from a course creator I consulted for:

    • Widget 1: Revenue this month vs. same month last year.
    • Widget 2: Email-to-purchase conversion rate for the last four launches.
    • Widget 3: Refund rate by cohort (tracks product-market fit over time).
    • Widget 4: Traffic source breakdown for purchase-page visitors (not all visitors).

    That’s it. Four numbers. Every Monday, she knows whether to focus on traffic, conversion, or retention. The default Stripe dashboard showed gross volume and successful charges—impressive numbers that didn’t clarify what to do next.

    One dashboard, one decision

    If you’re still using a pre-built template, block an hour this week to rebuild from scratch. Start with one business question. Add only the metrics that answer it. If you can’t connect a widget to a decision you’ll make in the next 30 days, leave it out.

    The goal isn’t a dashboard that impresses a investor. It’s a dashboard that tells you what to do on Tuesday.

    What’s the one metric you check every week that actually changes how you work? Hit reply and tell me—I’m collecting examples for a deeper dive on operator-specific analytics setups.