# PostHog Problems & Issues 2026 - Missing Events, Replays & Big Bills

Source: https://www.tryorbye.com/products/posthog
Last analyzed: 2026-10-21
Try or Bye score: 71/100

## Verdict: Try

PostHog is worth trying for most users (score 71/100). Most reported issues: PostHog events not showing up because ad blockers block it; PostHog is overwhelming and has a steep learning curve; Why is my PostHog bill so high? Many separate usage meters. Not a good fit for: Marketers who only need traffic stats; Non-technical teams wanting a visual A/B testing editor; Teams wanting to self-host at scale. Users most often switch to Mixpanel, Amplitude, Hotjar.

## What it is

PostHog is an open-source product platform that bundles product analytics, web analytics, session replay, feature flags, A/B testing, surveys, error tracking, a data warehouse and more under one usage-based bill. It is built for engineers and product teams at startups and scale-ups who want to instrument their own app and query raw events with SQL, and it can be self-hosted (hobby deployment) or used on US/EU Cloud.

## Common errors & fixes

### PostHog Bill Too High

A high PostHog bill almost always comes from one or two meters: autocapture events, 100% replay sampling, feature flag requests in SPAs, or add-ons like identified events. Use the billable usage dashboard to find the source, then sample, trim and set billing limits.

1. **Find what's driving cost** — Create a dashboard from the billable usage template Break down usage by event, SDK library and product Check Organization > Billing for each product's usage and add-ons
2. **Cut events and recordings** — Restrict autocapture or switch noisy flows to custom capture In Session replay settings, lower the sample rate, raise the minimum duration or record only on triggers
3. **Reduce feature flag requests** — Avoid repeated reloadFeatureFlags() calls Update server SDKs to versions with ETag support so unchanged polls count as 1 request instead of 10 Increase the local evaluation poll interval (default 30 seconds)
4. **Set billing limits per product** — Open Organization settings > Billing Scroll to the product, click 'Set billing limit', enter a dollar amount and save Remember data above the limit is dropped permanently
5. **Ask about a refund for a spike** — For hobby or pre-revenue projects with a surprise first bill or a large spike, contact support via the in-app Help button and ask about PostHog's side project insurance

Full guide: https://www.tryorbye.com/products/posthog/issues/bill-too-high

### PostHog Blocked by Ad Blockers

Ad and tracking blockers block requests to PostHog's domains, which drops events, replays, flags and surveys. Route PostHog through your own subdomain with a reverse proxy; PostHog says this typically recovers 10-30% of events.

1. **Use PostHog's managed reverse proxy (free on Cloud)** — In PostHog, open the managed reverse proxy settings and add a subdomain such as e.yourdomain.com Create the CNAME record it shows in your DNS provider Set api_host to https://e.yourdomain.com in posthog.init() Set ui_host to https://us.posthog.com (or https://eu.posthog.com) so the toolbar keeps working
2. **Proxy through your own stack** — Add a rewrite in Next.js, Vercel, Netlify, Cloudflare, nginx or Caddy that forwards a path like /ingest to your region's ingestion host Forward /ingest/static to us-assets.i.posthog.com (eu-assets.i.posthog.com for EU) Set api_host to the proxied path and ui_host to the PostHog app domain
3. **Separate feature flag requests** — If only flags are affected, set the flags_api_host option to a proxied host Reload and confirm flags resolve with the blocker enabled
4. **Avoid obvious path names** — Use a neutral subdomain or path name rather than 'posthog' or 'analytics', which blocklists can match

Full guide: https://www.tryorbye.com/products/posthog/issues/blocked-by-ad-blockers

### PostHog Numbers Different From Google Analytics

PostHog and GA4 count visitors differently: ad blockers block GA more often, PostHog can merge one person across devices, bot filtering differs, and sessions end after 30 minutes of inactivity. Small gaps are normal; large ones mean one tool is blocked.

1. **Put both tools on equal footing** — Set up a reverse proxy for PostHog so blocked visitors are counted Compare the same date range, timezone and page filters
2. **Align session and bot settings** — Adjust session_idle_timeout_seconds if your other tool uses a different timeout Use custom_blocked_useragents to exclude extra bots, or opt_out_useragent_filter to include them
3. **Fix attribution gaps** — Add UTM parameters to shared links Set up cross-domain tracking for traffic between your own domains Enable the GeoIP transformation in Data pipelines if the world map is empty

Full guide: https://www.tryorbye.com/products/posthog/issues/different-from-google-analytics

### PostHog Events Not Showing Up

Missing PostHog events are usually caused by a misconfigured SDK (wrong project key or region host), ad blockers, an app filtering events, or ingestion delay. Check the Network tab for requests to /e, then the Ingestion warnings page.

1. **Verify the SDK sends requests** — Open your site, then DevTools > Network Filter for '/e' or your PostHog host and reload If no requests appear, check posthog.init() runs and the project token is correct If requests fail, enable debug mode and read the [PostHog.js] console lines
2. **Check the region host** — Open Project settings and note whether the project is US or EU Cloud Set api_host to the matching host (EU projects use https://eu.i.posthog.com) Optionally point api_host at webhook.site temporarily to confirm the library sends events at all
3. **Rule out ad blockers** — Disable your ad blocker or test in a clean browser profile If events appear, set up a reverse proxy (managed proxy or your own) for production
4. **Disable apps that filter events** — Open Data pipelines and check any Filter Out app or transformation Temporarily disable it, then all other enabled apps, to find the one dropping events
5. **Check ingestion warnings, status and limits** — Open the Ingestion warnings page in the app Check status.posthog.com for ingestion incidents Open Organization > Billing to see whether a billing limit stopped ingestion Send a test event with cURL and allow up to an hour before contacting support

Full guide: https://www.tryorbye.com/products/posthog/issues/events-not-showing

### PostHog Feature Flags Not Working or Undefined

Flags read as undefined or false on first render because they load asynchronously (about 100-500 ms). Bootstrap flags or wait for onFeatureFlags, call identify() before evaluating, and proxy flag requests past ad blockers.

1. **See why the flag didn't match** — Open the person's profile > Feature flags tab Read the match evaluation column for the flag
2. **Stop the flicker** — Bootstrap flag values in posthog.init() from your server Or hide the element until posthog.onFeatureFlags() fires In React, use the useFeatureFlagEnabled hook
3. **Identify before evaluating** — Call posthog.identify() as soon as the user is known, before reading flags If a property was just set, pass it via setPersonPropertiesForFlags() or in the getFeatureFlag() call
4. **Fix blocked or local evaluation cases** — Set flags_api_host to a proxied host or use a reverse proxy For server-side local evaluation, pass the person and group properties the condition needs, or simplify the condition

Full guide: https://www.tryorbye.com/products/posthog/issues/feature-flags-not-working

### PostHog Identify Merging Wrong Users

Different people end up as one person when identify() receives a generic ID (like 'null') or reset() isn't called on logout on shared devices. PostHog won't merge two already-identified users and logs a warning instead.

1. **Fix the IDs you send** — Only call identify() with a real unique user ID from your database Never send null, 'undefined' or shared IDs
2. **Reset on logout** — Call posthog.reset() in your logout handler so the next user on the device gets a new anonymous ID
3. **Identify early** — Call identify() right after login or signup, before capturing important events Check the person's Distinct IDs tab and $identify event to confirm the right IDs are linked
4. **Clean up bad data** — Use 'Split IDs' on a polluted person profile Use 'Reset deleted person' on the persons page to reuse a deleted distinct ID

Full guide: https://www.tryorbye.com/products/posthog/issues/identify-merging-users

### PostHog Pageviews Missing or Duplicated in Next.js

In the Next.js App Router and other SPAs, client-side navigation doesn't reload the page, so pageviews are missed or double counted. Set capture_pageview to false and capture $pageview on route change, or use the official @posthog/next package.

1. **Use the official Next.js package** — Install @posthog/next Add PostHogProvider and PostHogPageView to the root layout Note that bootstrapFlags makes the route dynamic, which is incompatible with static generation and ISR
2. **Capture pageviews manually** — Set capture_pageview: false in posthog.init() Create a client component that reads usePathname() and useSearchParams() and calls posthog.capture('$pageview') in an effect Wrap it in <Suspense> and mount it once in the root layout
3. **Rule out blocking** — Add a Next.js rewrite for /ingest to your PostHog region host and set api_host to /ingest Confirm the region (US or EU) matches your project

Full guide: https://www.tryorbye.com/products/posthog/issues/nextjs-pageviews

### PostHog Not Capturing Events in Playwright or Puppeteer Tests

PostHog's JS SDK treats automated browsers as bots, so Playwright, Puppeteer and Selenium runs send no events even though flags and identify still work. Confirm with ?__posthog_debug=true and override the bot signals if you need test events.

1. **Confirm bot filtering is the cause** — Load the page with ?__posthog_debug=true Look for 'likely bot' in the [PostHog.js] console lines
2. **Override bot signals in tests** — Before page scripts run, override the user agent, navigator.webdriver and navigator.userAgentData in your test setup Re-run and check the Network tab for /e requests
3. **Or include bots deliberately** — Set opt_out_useragent_filter: true in a test-only config; bot events are tagged with $browser_type

Full guide: https://www.tryorbye.com/products/posthog/issues/no-events-in-e2e-tests

### PostHog Replay Broken: Missing CSS, Fonts or Blank Screen

When a replay shows unstyled pages, missing fonts or a blank start, PostHog couldn't fetch your stylesheets or the first full snapshot arrived late. Allow PostHog in CORS, add crossorigin to stylesheet links, and check for blocked uploads.

1. **Allow PostHog to load your assets** — Add us.posthog.com or eu.posthog.com to your server's CORS allowed origins Add crossorigin="anonymous" to stylesheet link tags For SvelteKit SSR, set paths.relative to false
2. **Handle expiring assets** — Serve a fallback placeholder for signed image or video URLs that expire before playback
3. **Fix late or missing first snapshots** — Route PostHog through a reverse proxy so the first batch isn't blocked Update posthog-js to the latest version
4. **Reduce throttled elements** — Add the ph-no-capture class to heavy animated SVG or Lottie elements In Angular, run session replay outside the Angular zone

Full guide: https://www.tryorbye.com/products/posthog/issues/replay-missing-styles

### PostHog Session Replay Not Recording

Replays usually go missing because the session was sampled out, was shorter than the minimum duration, didn't match a URL trigger, or recorder.js was blocked by CSP or an ad blocker. The $recording_status property on the session's events tells you which.

1. **Read the recording status** — Open Activity, expand a recent event from the session Open Debug properties and click 'Check session recording status' Or query $recording_status and $session_recording_start_reason for the session in the SQL editor
2. **Adjust sampling, duration and triggers** — Open Project settings > Session replay Raise the sample rate or add a trigger for important flows Lower the minimum recording duration Remove or widen URL triggers; replace legacy authorized domains with URL triggers
3. **Check the SDK config and version** — Remove disable_session_recording or set it to false Run window.posthog.LIB_VERSION in the console and update posthog-js if it is old
4. **Allow PostHog in your CSP and proxy** — Look for CSP errors in the console Add PostHog domains to script-src, script-src-elem and connect-src (or default-src) If $sdk_debug_replay_flushed_size stays 0 while the buffer grows, unblock POST /s/ requests or route through a reverse proxy

Full guide: https://www.tryorbye.com/products/posthog/issues/session-replay-not-recording

### Why Is PostHog So Slow?

PostHog insights get slow when they scan 'All events' over long date ranges or use pdi.person.properties lookups. Filter on specific events, shorten the range and use person.properties; dashboards can also serve pre-computed results.

1. **Narrow the query** — Pick a specific event (or an action) instead of All events Shorten the date range Add property filters to reduce rows scanned
2. **Use faster person properties** — In SQL insights, use person.properties.<name> instead of pdi.person.properties.<name> unless you need the latest value
3. **Use dashboard pre-compute** — Keep 'Allow precompute' on in dashboard settings for faster tiles Turn it off only when you need live results
4. **Check for incidents** — Check status.posthog.com if everything is slow at once

Full guide: https://www.tryorbye.com/products/posthog/issues/slow-insights

### PostHog Surveys Not Showing

PostHog surveys don't appear when surveys are disabled in project settings or the SDK config, posthog-js is too old, or CSP, a proxy or an ad blocker blocks surveys.js. Run getActiveMatchingSurveys in the console to see what matches.

1. **Enable surveys** — Open Settings in the left sidebar and turn surveys on for the project/environment Remove disable_surveys and advanced_disable_feature_flags from posthog.init()
2. **Update and debug the SDK** — Run window.posthog.LIB_VERSION and update posthog-js Run posthog.getActiveMatchingSurveys(s => console.log(s)) to see which surveys match the current user
3. **Unblock surveys.js** — Allow PostHog domains in your CSP script-src and connect-src If you use a proxy, allow /static/surveys.js through it Test without ad blockers
4. **Fix targeting** — Capture the triggering event client-side, not from the backend Replace dynamic behavioral cohorts in person-property targeting with a static cohort

Full guide: https://www.tryorbye.com/products/posthog/issues/surveys-not-showing

### PostHog Toolbar or Heatmaps Not Loading

The PostHog toolbar (needed for heatmaps) fails when the page URL isn't authorized, CSP or an ad blocker blocks it, or ui_host isn't set behind a reverse proxy. Authorize the URL, allow PostHog in CSP and set ui_host.

1. **Authorize the URL** — In PostHog, open Launch Toolbar Add the exact URL of your site and click Save, then Launch
2. **Fix proxy and region settings** — Set ui_host to https://us.posthog.com or https://eu.posthog.com in posthog.init() EU projects should use eu-assets.i.posthog.com for assets
3. **Unblock the toolbar** — Allow PostHog domains in your CSP (Firefox is stricter than Chrome) Disable ad blockers while using the toolbar
4. **Handle routers that rewrite the hash** — Read the __posthog value from the URL hash before your router changes it Call posthog.loadToolbar() with it

Full guide: https://www.tryorbye.com/products/posthog/issues/toolbar-heatmaps-not-loading

## Common problems

- **PostHog events not showing up because ad blockers block it** (reliability): PostHog's own docs say the tracker can be blocked by ad blockers even on localhost, and that a reverse proxy typically increases captured events by 10-30%. Teams that skip the proxy see lower numbers than expected and gaps in funnels, flags and surveys.
- **PostHog is overwhelming and has a steep learning curve** (usability): The most repeated complaint on G2 and Trustpilot: with analytics, replay, flags, experiments, surveys, warehouse and more in one app, new users find the navigation cluttered and building events, funnels and dashboards takes time. Several reviewers say it gets more confusing as the team adopts more modules.
- **Why is my PostHog bill so high? Many separate usage meters** (pricing): Each product (events, recordings, flag requests, survey responses, exceptions, warehouse rows, destinations, logs) has its own free tier and per-unit price, plus add-ons such as identified events, group analytics and data pipelines. Pricing analyses note that replay, flags at scale and warehouse syncs are what push bills up, and feature-flag requests are easy to burn in single-page apps.
- **PostHog queries and insights are slow on large datasets** (performance): G2 and AWS Marketplace reviewers report that insights, live events and replay loading feel slow or inconsistent as data grows. PostHog's own troubleshooting docs advise filtering on a single event instead of 'All events', shortening date ranges and avoiding pdi.person.properties to speed queries up.
- **PostHog session replay not recording some sessions** (reliability): Replays go missing because of sampling, minimum-duration settings, URL triggers, CSP rules blocking recorder.js, ad blockers or users closing the tab before the first snapshot is sent. Reviewers also mention replays buffering or glitching during playback.
- **PostHog is built for engineers, not marketers** (usability): Setup, event design, SQL and identify() calls assume a developer. Reviewers note non-technical staff struggle to pull basic reports or get blocked by workspace permissions, and the A/B testing is code-first with no mature visual editor.
- **PostHog data doesn't match Google Analytics** (reliability): Visitor and pageview counts differ from GA, Plausible or Cloudflare because of ad blocking, cross-device identification, bot filtering and session timeouts. Teams lose time reconciling numbers and some reviewers say they doubt the accuracy of what they see.
- **Duplicate or missing pageviews in Next.js and SPAs** (integrations): In single-page apps and the Next.js App Router, automatic pageview capture can double count or miss client-side route changes. The common fix is turning off capture_pageview and capturing $pageview on route change, or using the official @posthog/next package.
- **PostHog identify() merges or splits users incorrectly** (usability): Generic distinct IDs (like 'null'), forgetting reset() on logout on shared devices, or calling identify() too late lead to merged or fragmented person profiles. PostHog refuses to merge two already-identified users and logs an ingestion warning, so mistakes need manual cleanup.
- **PostHog feature flags flicker or return undefined** (reliability): Flags take roughly 100-500 ms to load, so they read as disabled on first render unless you bootstrap them. Ad blockers, missing identify() calls and local evaluation without required properties also return undefined or None.
- **Data dropped forever after hitting a billing limit** (reliability): Billing limits protect your wallet, but once a product's limit is reached PostHog stops ingesting that product's data and the overflow cannot be recovered. Session replay filtering by person or event properties also stops working once the analytics limit is hit.
- **Self-hosting PostHog is heavy and limited to a hobby setup** (customization): PostHog stopped supporting Kubernetes deployments in 2023; the open-source hobby deployment runs on Docker Compose and needs at least 4 GB RAM (8 GB+ recommended), with community templates suggesting it suits roughly 1M events/day. Older setups that stored recordings in ClickHouse had to migrate.
- **Does PostHog slow down my website?** (performance): Third-party measurements put the core posthog-js library at roughly 52-57 KB gzipped, with replay code lazy-loaded. PostHog's docs acknowledge PageSpeed drops and suggest updating the snippet, placing it lower in the head, or using server-side tracking.

## What users like

- **Large free tier on every product and no per-seat fees**: Each month includes 1M analytics events, 5,000 recordings, 1M flag requests, 1,500 survey responses and 100,000 exceptions free, and paid usage has no base fee or seat charges. Reviewers repeatedly cite the free tier as the main reason they chose it.
- **Replaces several tools with one platform**: Analytics, web analytics, session replay, feature flags, experiments, surveys and error tracking share the same user data, so a replay can be opened from a funnel step or a flag tied to an experiment. Reviewers value cutting separate Mixpanel, Hotjar and LaunchDarkly subscriptions.
- **SQL access to raw events and a built-in data warehouse**: Engineers can query events with SQL and join them with synced sources such as Stripe or a database, instead of being limited to prebuilt reports.
- **Session replay tied to analytics and errors**: Trustpilot and G2 reviewers single out replays as a favorite feature, especially being able to jump from an event, error or funnel drop-off straight into the recording.
- **Open source, EU hosting and self-host option**: The code is open source, there is an EU Cloud region for data residency, and HIPAA BAA is available on the Boost package and up. Teams with strict privacy needs can run the hobby deployment themselves.
- **Transparent pricing and docs**: Every unit price is published, billing limits and usage alerts can be set per product, and troubleshooting docs are detailed. Pricing audits call its pricing page unusually transparent.

## Pricing

- **Free**: $0.00 (free)
- **Pay-as-you-go**: $0.00 (usage_based) — hidden costs: Add-ons are billed separately: identified events ($0.000198/event above 1M at the first tier), group analytics, data pipelines, mobile replay ($0.01/recording above 2,500), destinations, batch exports and logs. Each product has its own meter, so costs add up across products.
- **Boost**: $250.00 (monthly) — hidden costs: Platform fee on top of all usage charges
- **Scale**: $750.00 (monthly) — hidden costs: Platform fee on top of all usage charges
- **Enterprise**: $2000.00 (monthly) — hidden costs: Platform fee on top of all usage charges

## Who should and shouldn't use it

- **Early-stage startups with an engineering team** — Good fit: The free tier covers most products until real traction, there are no seat fees, and engineers can instrument everything in one SDK.
- **Developers and indie hackers** — Good fit: Generous free allowances, SQL access and open-source code; billing limits keep side projects from running up a bill.
- **Product teams replacing Mixpanel + Hotjar + LaunchDarkly** — Good fit: Analytics, replay and flags share one user model and one bill, so consolidation usually saves money and context switching.
- **Marketers who only need traffic stats** — Avoid: The interface and setup are built for engineers. A simple tool like Plausible or GA4 is faster to learn for pageviews and referrers.
- **Non-technical teams wanting a visual A/B testing editor** — Avoid: Experiments are code-first and there is no mature drag-and-drop editor or deep personalization rules.
- **High-traffic consumer apps** — Depends: Volume discounts are steep, but events, recordings and flag requests all scale with traffic; you need sampling, billing limits and event hygiene to keep costs predictable.
- **Privacy-sensitive or regulated companies** — Depends: EU hosting, self-host and HIPAA BAA (Boost, $250/mo) are available, but cookies are set by default and consent handling must be configured.
- **Teams wanting to self-host at scale** — Avoid: Only the hobby Docker Compose deployment is supported; large self-hosted installs are no longer a supported path.

## Alternatives

- **Mixpanel** (https://www.tryorbye.com/products/mixpanel): Switch for a more polished, marketer-friendly analytics UI and faster report building. You lose bundled replay depth, flags and SQL warehouse in one bill.
- **Amplitude** (https://www.tryorbye.com/products/amplitude): Pick it for mature behavioral analytics and governance at enterprise scale. Trade-off: more expensive contracts and less of an all-in-one developer toolkit.
- **Hotjar** (https://www.tryorbye.com/products/hotjar): Simpler heatmaps, recordings and surveys that non-technical teams can set up alone. Trade-off: no product analytics depth, flags or experiments.
- **Plausible Analytics** (https://www.tryorbye.com/products/plausible): Lightweight, cookieless web analytics for teams that only need traffic stats. Trade-off: no funnels per user, replay or feature flags.
- **Microsoft Clarity**: Free session recordings and heatmaps with no recording cap if replay is all you need. Trade-off: no product analytics, flags or experiments.
- **Segment** (https://www.tryorbye.com/products/segment): Use it when you mainly need to route event data to many tools rather than analyze it in one place. Trade-off: it is a CDP, not an analytics UI, and gets expensive.

## FAQ

### Is PostHog free?

Yes for most small projects. Every month includes 1M analytics events, 5,000 session recordings, 1M feature flag requests, 1,500 survey responses and 100,000 exceptions free. The Free plan is limited to 1 project and 1 year of data retention; adding a card moves you to pay-as-you-go with the same free tiers.

### Why is my PostHog bill so high?

Usually because several meters grew at once: events (often from autocapture), session recordings, feature flag requests in single-page apps, or add-ons like identified events and group analytics. Open the billable usage dashboard template to see which product and event drive cost, then sample replays, trim autocapture and set a billing limit per product.

### Is PostHog worth it?

For engineering-led startups, yes: one SDK gives analytics, replay, flags, experiments and surveys with no seat fees and a large free tier. It is less worth it for marketers who only need traffic numbers or teams without developers, who will find the interface overwhelming.

### Why are my PostHog events not showing up?

The most common causes are a misconfigured SDK (wrong project key or api_host region), ad blockers, an app or transformation filtering events, bot filtering in automated browsers, and ingestion delay. Check the browser Network tab for requests to /e, look at Ingestion warnings, and set up a reverse proxy for production.

### Does PostHog get blocked by ad blockers?

Yes. Requests to PostHog's domains are blocked by many ad and tracking blockers. PostHog recommends a reverse proxy through your own subdomain, which it says typically recovers 10-30% of events. The managed reverse proxy is free for Cloud users.

### Does PostHog slow down my website?

It adds a script of roughly 52-57 KB gzipped according to third-party measurements, loaded asynchronously, and replay code is lazy-loaded. If PageSpeed drops, update to the latest snippet, place it lower in the head, or move tracking server-side.

### Why is PostHog not recording sessions?

Check the replay sample rate, minimum duration and URL triggers in project replay settings, make sure disable_session_recording is not set, allow PostHog domains in your Content Security Policy, and test without ad blockers. The $recording_status property on events tells you whether a session was sampled out, buffering or disabled.

### Why doesn't PostHog match Google Analytics?

The tools count differently: ad blockers block GA more often, PostHog can merge one person across devices, both filter bots differently, and session timeouts differ (PostHog uses 30 minutes of inactivity by default). Small gaps are normal; large gaps usually mean one tool is being blocked.

### Can I self-host PostHog?

Yes, with the open-source hobby deployment on Docker Compose, which needs at least 4 GB RAM (8 GB+ recommended). PostHog ended Kubernetes support in May 2023, so large production self-hosted installs are not a supported path; most teams use PostHog Cloud (US or EU).

### Is PostHog GDPR compliant?

PostHog offers an EU Cloud region and a self-host option, but by default posthog-js sets a first-party cookie (ph_<token>_posthog, 365 days). If you need consent first, start in memory persistence and switch to localStorage+cookie after the user accepts.

### What happens when I hit a PostHog billing limit?

PostHog stops ingesting that product's data for the rest of the billing period, so you are not charged above the limit, but the data that arrives after the limit is lost permanently. The organization owner gets emails at 80% and 100% of the limit.

### Is PostHog good for non-technical users?

Not on its own. Reviewers consistently describe a steep learning curve and a cluttered interface, and setup requires a developer. Once a developer sets up events and dashboards, marketers can use saved reports, but tools like Hotjar or Plausible are easier for non-technical teams.

### What are the best PostHog alternatives?

Mixpanel or Amplitude for product analytics with a more polished UI, Hotjar or Microsoft Clarity for simple heatmaps and recordings, and Plausible for lightweight privacy-friendly web analytics.

### Why are my PostHog feature flags undefined on first load?

Flags take roughly 100-500 ms to load and read as disabled until they arrive. Bootstrap flag values at init (for example from your server) or hide the element until onFeatureFlags fires. Ad blockers and evaluating before identify() can also return wrong values.

---
Try or Bye aggregates problem patterns from user reviews, forums, and app stores. Methodology: https://www.tryorbye.com/methodology