<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:blog="https://posthog.com/blog"><channel><title><![CDATA[PostHog's RSS Feed]]></title><description><![CDATA[PostHog's RSS Feed]]></description><link>http://github.com/dylang/node-rss</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 03 Apr 2026 12:26:04 GMT</lastBuildDate><item><title><![CDATA[The best customer data platforms (CDPs) for developers, compared]]></title><description><![CDATA[The promise of a Customer Data Platform (CDP) is simple: collect data from everywhere, unify it into coherent customer profiles, and pipe it wherever…]]></description><link>https://posthog.com/blog/best-customer-data-platforms-for-developers</link><guid isPermaLink="false">f9c2cc45-1ce9-5cdc-b28a-ff0ce9e7045b</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>The promise of a Customer Data Platform (CDP) is simple: collect data from everywhere, unify it into coherent customer profiles, and pipe it wherever you need it. The reality is that most CDPs were designed for marketing teams running ad campaigns, not developers who care about instrumentation, data quality, and control.</p><p>If you&#x27;re a developer who wants flexible SDKs and APIs, predictable pipelines, raw data access via SQL, and integrations that fit into their existing tooling – not a black box optimized for ad platforms – you&#x27;re in the right place.</p><p>This guide compares the best CDPs for developers to help you collect, unify, query, and move customer data with confidence.</p><h2 id="what-features-do-you-need-in-a-cdp">What features do you need in a CDP?</h2><p>At a minimum, a CDP should include:</p><ul><li>Data collection from multiple sources (web, mobile, server, third-party tools)</li><li>Identity resolution to stitch together anonymous and known users</li><li>Audience segmentation and cohort building</li><li>Integrations with downstream tools (CRMs, ad platforms, email, warehouses)</li><li>Real-time or batch data syncing</li></ul><p>The best CDPs go further and give you <strong>analytics capabilities</strong> so you can actually answer questions with your data:</p><ul><li><strong>Event-based tracking</strong>, with full control over your data schema</li><li><strong>Funnels, retention, and cohort analysis</strong>, to understand user journeys</li><li><strong>Session replay and behavioral context</strong>, to see what users actually did</li><li><strong>SQL access and raw data exports</strong>, for custom queries and external tooling</li><li><strong>Data warehouse integration</strong>, so your CDP works with (not against) your existing stack</li><li><strong>Privacy-first design</strong>, to stay GDPR/CCPA compliant without extra work</li></ul><p>Here&#x27;s how some of the most popular CDPs compare:</p><p><div competitors="posthog,segment,rudderstack,mparticle,hightouch,tealium"></div></p><p>You might notice some absences: <strong>Salesforce Data Cloud</strong>, <strong>Adobe Real-Time CDP</strong>, and <strong>Treasure Data</strong> are all major enterprise players. They&#x27;re powerful, but they&#x27;re also designed for large marketing orgs with dedicated implementation teams and big budgets to match.</p><p>This guide focuses on tools that developers can actually evaluate, set up, and get value from without a long-winded implementation project.</p><h2 id="whats-the-best-cdp-with-analytics-for-developers">What&#x27;s the best CDP with analytics for developers?</h2><h3 id="1-posthog">1. PostHog</h3><p>PostHog takes a different approach to customer data: instead of being a CDP that bolts on analytics, it&#x27;s an all-in-one platform where CDP functionality works together with product analytics, web analytics, session replay, feature flags, experiments, error tracking, LLM observability, surveys, and more natively.</p><p>PostHog&#x27;s data pipeline provides full CDP capabilities through three core components:</p><ul><li><a href="/docs/cdp/sources"><strong>Sources</strong></a>: Ingest data from 20+ managed sources (Stripe, Hubspot, Salesforce, Snowflake, BigQuery, Google/Meta/LinkedIn/TikTok Ads, and more) or self-managed object storage (S3, GCS, Azure Blob). Data syncs automatically and can be joined with your product analytics data using the built-in data warehouse.</li><li><a href="/docs/cdp/transformations"><strong>Transformations</strong></a>: Clean and transform event data in real-time before it&#x27;s stored – including GeoIP enrichment, PII scrubbing, bot filtering, property standardization, and custom transformations written in Hog. Transformations are completely free with no volume limits.</li><li><a href="/docs/cdp/destinations"><strong>Destinations</strong></a>: Send data to dozens of tools in real-time or schedule batch exports to warehouses like Snowflake, BigQuery, Redshift, Postgres, and Databricks.</li></ul><p>Beyond data pipelines, <a href="/cdp">PostHog&#x27;s CDP</a> also handles event capture from <a href="/docs/libraries">client-side SDKs</a> and <a href="/docs/api">server-side APIs</a> and, unlike standalone CDPs, all that data is immediately available for analysis – no export required. Every event, user, and session <a href="/docs/data-warehouse/sql">can be queried with SQL</a>, <a href="/docs/product-analytics/funnels">visualized in funnels</a> and <a href="/docs/product-analytics/retention">retention charts</a>, or connected to a specific <a href="/docs/session-replay">session recording</a>. You can <a href="/docs/data/cohorts">build cohorts based on behavior</a>, <a href="/docs/experiments">run experiments on segments</a>, and see exactly what users did before churning – all in one place.</p><p>PostHog uses simple usage-based pricing with a <a href="/pricing">generous free tier</a>, so you can start collecting and analyzing data before committing to a long-term contract.</p><p><div></div></p><p><strong>Strengths:</strong></p><ul><li>CDP and analytics in one platform</li><li>Event-based insights, funnels, and retention built in</li><li>SQL access and raw data ownership</li><li>Flexible destinations and transformations</li><li>Strong developer tooling and APIs</li></ul><p><strong>Community:</strong></p><ul><li>PostHog is fully open source under the MIT license, actively maintained on <a href="https://github.com/PostHog/posthog">GitHub</a>.</li><li>The repository has 30k+ stars, 400+ contributors, and daily commits</li><li>Development happens <a href="/changelog">in public</a></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">PostHog is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Developers who want a CDP that doesn&#x27;t stop at data plumbing – and teams that want analytics and debugging in one workflow.</p></div></div><h3 id="2-segment">2. Segment</h3><p>Segment (now part of Twilio) is the original CDP and still the most widely adopted. It popularized the idea of a single API for customer data collection, and its tracking spec has become a de facto standard.</p><p>Segment&#x27;s core strength is data routing: install one SDK, define your events, and Segment handles sending that data to 700+ destinations – analytics tools, ad platforms, CRMs, warehouses, and more. This dramatically simplifies instrumentation and makes it easy to add or remove tools without rewriting tracking code.</p><p>On the analytics side, the platform now includes Unify for identity resolution and profile building, Twilio Engage for audience activation and journey orchestration, and native integrations with analytics tools like <a href="/blog/posthog-vs-amplitude">Amplitude</a> and <a href="/blog/posthog-vs-mixpanel">Mixpanel</a>. That being said, Segment still doesn&#x27;t include built-in product analytics, funnels, or session replay – you&#x27;ll need to pair it with another tool for that.</p><p>Pricing is based on Monthly Tracked Users (MTUs). There&#x27;s a free tier with 1,000 MTUs and 500K/mo Reverse ETL Records, a Team plan starting at $120/month for 10,000 MTUs and 1M/mo Reverse ETL Records, and custom Business pricing for larger deployments. CDP features (Unify, Engage) require custom pricing.</p><p><strong>Strengths:</strong></p><ul><li>Industry-standard tracking spec with excellent documentation</li><li>700+ pre-built integrations</li><li>Strong identity resolution with Unify</li><li>Reliable, battle-tested infrastructure at scale</li><li>Deep Twilio ecosystem integration (SMS, email, voice)</li></ul><p><strong>Community:</strong></p><ul><li>SDKs are open source on <a href="https://github.com/segmentio">GitHub</a></li><li>Large ecosystem of agencies and consultants</li><li>Active community forum</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Segment is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Teams that want a best-in-class data pipeline, comfortable pairing it with separate analytics and BI tools, and willing to pay for a premium, fully managed solution.</p></div></div><h3 id="3-rudderstack">3. RudderStack</h3><p>RudderStack is an open-source CDP built specifically for developers and data teams. It positions itself as a warehouse-native alternative to Segment, designed for teams that want their data warehouse (Snowflake, BigQuery, Redshift) to be the source of truth – not a vendor&#x27;s platform.</p><p>RudderStack&#x27;s architecture is different from traditional CDPs: instead of storing customer data in its own database, it routes data directly to your warehouse and lets you build identity resolution, audiences, and activation on top of your existing infrastructure. This means no data duplication, better governance, and lower vendor lock-in.</p><p>The platform includes event streaming (similar to Segment), transformations you can write in JavaScript or Python, identity stitching via Profiles, and reverse ETL to sync warehouse data back to tools. There&#x27;s also a visual audience builder, though it&#x27;s more limited than enterprise CDP offerings.</p><p>RudderStack offers a free tier for up to 250,000 events/month, with paid plans starting at $220/month for the Starter tier with 1M events/mo. Enterprise pricing is custom.</p><p><strong>Strengths:</strong></p><ul><li>Warehouse-native architecture – your data stays in your warehouse</li><li>Developer-friendly with Git-based workflows and custom transformations</li><li>Strong Segment compatibility (forked tracking specs)</li><li>200+ integrations including warehouses, streaming platforms, and tools</li><li>Open source and self-hostable</li></ul><p><strong>Community:</strong></p><ul><li>Open source on <a href="https://github.com/rudderlabs/">GitHub</a></li><li>4.3k+ stars, 100+ contributors</li><li>Active community Slack</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">RudderStack is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Data-savvy engineering teams who want a Segment alternative that keeps data in their warehouse, supports custom transformations, and doesn&#x27;t create another data silo.</p></div></div><h3 id="4-mparticle">4. mParticle</h3><p>mParticle is an enterprise CDP focused on real-time data orchestration, particularly for mobile-first companies. It&#x27;s used by brands like HBO Max, JetBlue, and Marks &amp; Spencer to unify customer data across apps, web, and backend systems.</p><p>mParticle&#x27;s core differentiator is its real-time processing engine: data flows through in milliseconds, enabling immediate personalization, suppression, and audience activation. The platform also has strong mobile SDK support, which makes it popular with app-heavy businesses.</p><p>On the analytics side, mParticle includes built-in data quality monitoring, identity analytics, and an AI-powered audience builder that can create predictive segments (likelihood to purchase, churn risk). However, like Segment, it doesn&#x27;t include product analytics – you&#x27;ll typically pair it with a standalone analytics or BI tool.</p><p>mParticle uses credit-based pricing aimed at enterprise teams. Customers commit to an upfront pool of credits, which are then consumed based on usage of each feature. All features are included by default, with no per-feature tiers or hard caps. Rates vary based on the size of commitment, meaning costs scale with data volume but require working with sales to estimate and manage spend.</p><p><strong>Strengths:</strong></p><ul><li>Real-time data processing with sub-second latency</li><li>Strong mobile SDK support</li><li>AI-powered predictive audiences</li><li>Robust data quality and governance tools</li><li>Hundreds of integrations including major ad and marketing platforms</li></ul><p><strong>Community:</strong></p><ul><li>Closed-source platform</li><li>Active partner ecosystem</li><li>Regular product updates via their blog</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">mParticle is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Mobile-first companies and large organizations that need robust identity management and audience orchestration at scale.</p></div></div><h3 id="5-hightouch">5. Hightouch</h3><p>Hightouch pioneered the &quot;composable CDP&quot; – a fundamentally different architecture where your data warehouse is the CDP. Instead of collecting and storing data in a separate platform, Hightouch sits on top of Snowflake, BigQuery, Databricks, or Redshift and activates the data that&#x27;s already there.</p><p>This approach has major advantages: no data duplication, no new data silos, full SQL access, and you can leverage all the modeling and transformation work your data team has already done. Hightouch syncs audiences, user attributes, and computed fields from your warehouse to 250+ destinations in real-time or on a schedule.</p><p>Hightouch has expanded beyond reverse ETL into a full composable CDP with Customer Studio (no-code audience builder), identity resolution, journey orchestration, and AI-powered decisioning. The platform is designed to give marketers self-service access to warehouse data without requiring SQL knowledge.</p><p>The free tier includes basic reverse ETL functionality. Paid plans (Composable CDP, AI Decisioning) are custom-priced based on usage.</p><p><strong>Strengths:</strong></p><ul><li>Warehouse-native – no data duplication or vendor lock-in</li><li>Leverages existing data infrastructure and models</li><li>No-code audience builder for non-technical users</li><li>250+ integrations</li><li>Fast implementation (days/weeks, not months)</li></ul><p><strong>Community:</strong></p><ul><li>Closed-source platform</li><li>Backed by Snowflake and Databricks (strategic investors)</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Hightouch is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Data teams with mature warehouse infrastructure who want to activate existing data without building another silo – especially if marketers need self-service audience access.</p></div></div><h3 id="6-tealium">6. Tealium</h3><p>Tealium is an enterprise CDP that grew out of tag management – and that heritage shows in its comprehensive data collection and integration capabilities. </p><p>Their Customer Data Hub consists of several products that work together delivering client-side data collection, server-side API data, identity resolution and audience activation, and machine learning-powered insights like churn prediction and purchase propensity.</p><p>The platform&#x27;s standout feature is its integration library: 1,300+ pre-built connectors to marketing, analytics, and data tools. Tealium also has strong real-time capabilities with patented &quot;visitor stitching&quot; technology for identity resolution, and robust privacy/compliance features (HIPAA, ISO 27001, SOC 2).</p><p>Tealium doesn&#x27;t include built-in product analytics, funnels, or session replay – you&#x27;ll pair it with external analytics tools.</p><p>Pricing is based on events collected and is custom-quoted. </p><p><strong>Strengths:</strong></p><ul><li>1,300+ pre-built integrations – largest in the CDP market</li><li>Strong tag management heritage with both client-side and server-side collection</li><li>Real-time identity resolution with patented visitor stitching</li><li>Robust privacy and compliance certifications (HIPAA, ISO 27001, SOC 2)</li><li>ML-powered predictive insights with Predict ML add-on</li><li>CloudStream for warehouse-native activation without data duplication</li></ul><p><strong>Community:</strong></p><ul><li>Closed-source platform</li><li>Strong partner and consultant ecosystem</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Tealium is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Mid-to-large enterprise teams with complex martech stacks who need comprehensive data collection, strong compliance features, and the largest integration library in the market.</p></div></div><h2 id="which-cdp-should-you-choose">Which CDP should you choose?</h2><ul><li>Want a CDP with built-in analytics features? <strong>PostHog</strong>.</li><li>Want an industry-standard data layer with 700+ integrations? <strong>Segment</strong>.</li><li>Want an open-source, warehouse-native alternative to Segment? <strong>RudderStack</strong>.</li><li>Need real-time data orchestration for a mobile-first app? <strong>mParticle</strong>.</li><li>Already have a data warehouse and want to activate it without building a new silo? <strong>Hightouch</strong>.</li><li>Need the largest integration library and enterprise-grade compliance? <strong>Tealium</strong>.</li></ul><h2 id="recommendations-by-team-type">Recommendations by team type</h2><h4 id="for-startups-and-small-teams">For startups and small teams</h4><ul><li><strong>PostHog</strong> if you want everything in one place – <a href="/product-analytics">analytics</a>, <a href="/session-replay">replay</a>, <a href="/feature-flags">flags</a>, <a href="/error-tracking">error tracking</a>, and <a href="/cdp">data pipelines</a> – without managing multiple vendors</li><li><strong>Segment</strong> (free tier) if you&#x27;re building a data layer and want maximum flexibility in tool choice</li></ul><h4 id="for-developer-first-teams">For developer-first teams</h4><ul><li><strong>PostHog</strong> for teams that <a href="/docs/libraries">SDKs in all their favorite languages</a>, customizable destinations and transformations, and <a href="/docs">docs</a> that make all this easy to self-serve</li><li><strong>RudderStack</strong> for teams that want a warehouse-native CDP with full control over transformations and routing</li></ul><h4 id="for-teams-with-their-own-warehouses">For teams with their own warehouses</h4><ul><li><strong>Segment</strong> if you have budget and want a mature, well-supported platform with broad integrations</li><li><strong>Hightouch</strong> if your data team has already invested in a warehouse and wants to activate that data</li></ul><h4 id="for-enterprises">For enterprises</h4><ul><li><strong>Tealium</strong> for complex martech stacks, 1,300+ integrations, and strong compliance (HIPAA, ISO 27001)</li><li><strong>mParticle</strong> for real-time orchestration, strong governance, and enterprise support</li><li><strong>Segment</strong> (Business tier) for teams already in the Twilio ecosystem</li><li><strong>PostHog</strong> if you want an <a href="/products">all-in-one platform</a> with strong governance and raw data access</li></ul><h4 id="for-warehouse-first-teams">For warehouse-first teams</h4><ul><li><strong>Hightouch</strong> if you want to activate existing warehouse data without building a new silo</li><li><strong>RudderStack</strong> if you also need event collection and want open-source infrastructure</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but PostHog is the best choice for a CDP if:</p><ul><li>You want data pipelines connected to analytics, session replay, feature flags, and more – all in one platform instead of stitching tools together</li><li>You value open source and transparent pricing</li><li>You want to try before you buy with 1 million events and 10K dispatches free every month</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out our <a href="/docs">docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is a CDP, actually?</summary><p>A <strong>Customer Data Platform (CDP)</strong> is software that collects customer data from multiple sources, creates unified customer profiles through identity resolution, and makes that data available for analysis and activation in other tools.</p><p>The key difference from a CRM or data warehouse is that CDPs specialize in <em>unifying</em> customer identities across touchpoints and <em>activating</em> that data in real-time across marketing, sales, and product tools.</p></details><details><summary>Do I need a CDP if I have a data warehouse?</summary><p>Not necessarily. If your warehouse is already your source of truth and your team is comfortable modeling data and building pipelines, you may not need a traditional CDP.</p><p>A CDP is most useful earlier in the data flow: it simplifies capturing events from apps and services, standardizing them, and reliably piping that data into your warehouse. Some CDPs also help move modeled data back out to other tools (often called reverse ETL), but many teams handle this with dedicated data pipeline tools like Fivetran or with native warehouse connectors.</p><p>In practice, a CDP reduces the amount of custom ingestion and plumbing you need to build. Whether that&#x27;s worth it depends on how much instrumentation and data movement you want to manage yourself versus outsourcing to a platform.</p></details><details><summary>What&#x27;s the difference between a CDP and a data warehouse?</summary><p>A <strong>data warehouse</strong> (Snowflake, BigQuery, Redshift) is a general-purpose storage and compute layer for structured data. It can hold customer data, but it doesn&#x27;t specialize in identity resolution or real-time activation.</p><p>A <strong>CDP</strong> is purpose-built for customer data: it collects from multiple sources, resolves identities, builds profiles, and syncs data to downstream tools. Some CDPs store data themselves; &quot;composable CDPs&quot; like Hightouch sit on top of your warehouse instead.</p><p>Tools like <strong>PostHog</strong> blur the line by including both a <a href="/data-stack">data warehouse</a> and CDP capabilities in one platform.</p><p>If you want to go deeper on how CDPs fit into a modern data stack, check out our <a href="/blog/cdp-vs-data-warehouse">guide on CDP vs data warehouse: which should you use and why</a>.</p></details><details><summary>What&#x27;s identity resolution and why does it matter?</summary><p><strong>Identity resolution</strong> is the process of stitching together data about the same person from different sources and devices. For example, connecting an anonymous website visitor to their email address after signup, then linking that to their mobile app activity.</p><p>Good identity resolution means your analytics tools have accurate, complete customer profiles – not fragmented data that treats one person as three different users.</p></details><details><summary>What&#x27;s the difference between deterministic and probabilistic identity resolution?</summary><p><strong>Deterministic</strong> identity resolution uses known identifiers (email, user ID, phone number) to match records. It&#x27;s highly accurate but only works when you have those identifiers.</p><p><strong>Probabilistic</strong> identity resolution uses signals like IP address, device fingerprint, and behavior patterns to infer matches. It can resolve more identities but with lower confidence.</p><p>Most developer-focused CDPs use deterministic resolution. Enterprise CDPs often include probabilistic matching for marketing use cases.</p></details><details><summary>What&#x27;s a &quot;composable CDP&quot;?</summary><p>A <strong>composable CDP</strong> is a CDP architecture where your data warehouse serves as the storage layer instead of the CDP vendor&#x27;s platform. Tools like Hightouch and Census sit on top of your warehouse and provide identity resolution, audience building, and syncing – without duplicating your data.</p><p>The benefit is less vendor lock-in and better data governance. The tradeoff is you need a mature data warehouse setup first.</p></details><details><summary>How do CDPs handle privacy and consent?</summary><p>CDPs vary widely in their privacy features. Most support consent management integrations and can filter data based on user preferences. Some (like Segment and mParticle) include built-in consent enforcement; others rely on upstream tools.</p><p>For GDPR/CCPA compliance, look for: consent-based data collection, easy data deletion (right to erasure), and controls over which downstream tools receive PII.</p></details><details><summary>What should I look for in CDP pricing?</summary><p>CDP pricing typically scales with:</p><ul><li><strong>Monthly Tracked Users (MTUs)</strong>: unique users identified per month</li><li><strong>Events</strong>: number of data points ingested</li><li><strong>Destinations</strong>: number of tools you sync data to</li><li><strong>Features</strong>: identity resolution, audiences, and activation often cost extra</li></ul><p>Watch for: low free tiers that force early upgrades, steep MTU-based scaling, and feature-gated pricing where core CDP functionality requires enterprise plans.</p></details><details><summary>Can I use a CDP without being a large enterprise?</summary><p>Yes. Tools like <strong>PostHog</strong>, <strong>Segment</strong>, and <strong>RudderStack</strong> have generous free tiers that work well for startups.</p><p>If you&#x27;re small, you might get more value from an all-in-one tool (like <strong>PostHog</strong>) that includes analytics and data routing, rather than paying for a standalone CDP and separate analytics platform.</p></details><details><summary>Do CDPs include product analytics?</summary><p>Most traditional CDPs (Segment, mParticle, Hightouch) do <strong>not</strong> include product analytics. They&#x27;re designed to collect and route data to analytics tools, not replace them.</p><p><strong>PostHog</strong> is an exception, and a good example of a CDP with analytics features: it includes full product analytics, session replay, feature flags, and experiments alongside CDP functionality – so you can analyze data without exporting it to another tool.</p></details><details><summary>Which CDP is best for developers?</summary><p><strong>PostHog</strong> and <strong>RudderStack</strong> are the most developer-friendly options. Both are open source (or have open-source cores), offer SQL access, and support custom transformations.</p><p><strong>Segment</strong> is well-documented and has excellent SDKs, but the platform itself is closed-source and enterprise-priced.</p></details><details><summary>Which CDP is best for app developers, specifically?</summary><p>For <strong>mobile-first teams</strong>, <strong>mParticle</strong> is purpose-built for apps with strong iOS and Android SDKs, real-time event streaming, and deep integrations with mobile attribution and marketing tools.</p><p>For <strong>product-led apps</strong> where you want analytics, experimentation, and data routing in one platform, <strong>PostHog</strong> offers native mobile SDKs (iOS, Android, React Native, Flutter) alongside <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, and <a href="/feature-flags">feature flags</a> – so you can understand user behavior and ship improvements without stitching together multiple tools.</p><p><strong>Segment</strong> is also a solid choice if you need a broad integration library and plan to pair it with separate analytics tools.</p></details><details><summary>Can I self-host a CDP?</summary><p>Yes. <strong>RudderStack</strong> offers self-hosted options with complete data ownership. This is useful for teams with strict compliance requirements, data residency needs, or who want to avoid vendor lock-in.</p><p>The tradeoff is operational complexity – you&#x27;ll need to maintain the infrastructure yourself.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best error tracking tools for developers, compared]]></title><description><![CDATA[Every developer has shipped a bug that slipped through tests: no one is perfect. What matters is how quickly you find out, understand the cause, and…]]></description><link>https://posthog.com/blog/best-error-tracking-tools</link><guid isPermaLink="false">4ef6ae79-09c4-544d-9c1f-959ef89ece9e</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Every developer has shipped a bug that slipped through tests: no one is perfect. What matters is how quickly you find out, understand the cause, and ship a fix. Enter, error tracking tools.</p><p>A good error tracking tool will give you context, not just stack traces: it&#x27;ll show you what the user did right before the exception, which release it came from, and what else broke as a result.</p><p>This guide compares the most popular error tracking tools for developers right now, what features they do and don&#x27;t offer, and who they&#x27;re built for, so you can decide which one is right for your needs.</p><h2 id="what-features-do-you-need-in-your-error-tracking-tool">What features do you need in your error tracking tool?</h2><p>At a minimum, most good error tracking tools will offer things like:</p><ul><li>Real-time error capture and grouping</li><li>Full stack traces, source maps, and contextual metadata</li><li>Alerts and assignment workflows for triage</li><li>SDKs for major languages and frameworks</li><li>Integration with CI/CD, logs, and performance data</li></ul><p>The absolute best error tools tend to go a bit further by including things like:</p><ul><li><p><strong>Integration with session replay:</strong> Useful for linking session recordings to real user sessions, so you can better understand the context of when an error occurs and debug the steps.</p></li><li><p><strong>Integration with product analytics:</strong> Useful so you can correlate the impact of errors on product usage, conversion, and revenue.</p></li><li><p><strong>Very broad SDK and framework support:</strong> Support for the likes of Next.js, Python, and React are typical among all the tools in this list, but some tools go deeper by offering SDKs for less popular frameworks, and even video game engines like Unreal Engine and Unity.</p></li></ul><p>Here&#x27;s how some of the most popular error tracking tools compare at a glance:</p><p><div competitors="posthog,sentry,rollbar,bugsnag,glitchtip,signoz"></div></p><h2 id="whats-the-best-error-tracking-tool-for-developers">What&#x27;s the best error tracking tool for developers?</h2><h3 id="1-posthog">1. PostHog</h3><p>PostHog is an all-in-one developer platform that goes beyond error tracking and stack traces by combining <a href="/error-tracking">error tracking</a>, <a href="/session-replay">session replay</a>, <a href="/product-analytics">analytics</a>, and <a href="/feature-flags">feature flags</a> into one platform. </p><p>Each exception can be linked to the related session replay, user, and feature flag version. You can also view the user&#x27;s actions, console output, and API calls leading up to the issue, then ship a fix behind a feature flag, test it, and measure the impact in analytics without ever having to switch between tools.</p><p>PostHog also <a href="/docs/error-tracking/capture">supports autocapture of unhandled exceptions</a>, <a href="/docs/error-tracking/monitoring">filter by error type</a>, and <a href="/docs/error-tracking/alerts">set event-based alerts</a> that trigger when specific issues occur, and offers built in <a href="/llm-analytics">LLM analytics</a> for teams that need to observe and optimize AI products as well.</p><p><strong>Strengths:</strong></p><ul><li>Replay-linked debugging</li><li>Full user and session context</li><li>Transparent usage-based pricing with configurable caps</li><li>Unified suite: analytics, feature flags, surveys, experiments, LLM analytics and more</li></ul><p><strong>Community:</strong></p><ul><li><p>PostHog is fully open source under the MIT license and actively maintained at <a href="https://github.com/PostHog/posthog">https://github.com/PostHog/posthog</a>. </p></li><li><p>The <a href="https://github.com/PostHog/posthog">repository</a> has 29.8k+ stars, 360+ contributors, and sees daily commits from both the core team and community.</p></li><li><p><a href="/changelog">Most development happens in public</a>, including product discussions and roadmap planning.</p></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">PostHog is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Teams that want an integrated view of errors, user behavior, and product analytics in one place. It&#x27;s also a great choice for any team that&#x27;s building AI apps, since you get error tracking and an <a href="/blog/best-open-source-llm-observability-tools">LLM observability tool</a> inside one platform as well.</p></div></div><p><div></div></p><h3 id="2-sentry">2. Sentry</h3><p>Sentry is a mature, battle-tested error and performance monitoring tool used across industries. It&#x27;s stable, deeply integrated, and built for teams who value visibility over novelty.</p><p><a href="/blog/posthog-vs-sentry">Sentry</a> has earned its reputation by being the tool developers turn to when uptime and reliability are non-negotiable. It provides rich grouping, detailed stack traces, breadcrumbs, release tracking, and performance monitoring across frontend, backend, and mobile SDKs. </p><p>It&#x27;s highly scalable, with strong alerting and triage workflows.</p><p><strong>Strengths</strong></p><ul><li>Wide SDK coverage and proven reliability</li><li>Performance tracing to identify slow transactions</li><li>Self-host option available</li><li>Mature ecosystem and integrations</li></ul><p><strong>Community</strong>  </p><ul><li><p>Sentry is licensed under the Functional Source License (FSL), which they describe as eventually open source (it restricts certain commercial and competitive uses until it later converts to a permissive open-source license)</p></li><li><p>It&#x27;s one of the <a href="https://github.com/getsentry/sentry">most-starred monitoring tools</a>, with ~42k stars and 800+ contributors on GitHub.  </p></li><li><p>The team is highly active with weekly releases and there&#x27;s a large selection of community supported SDKs as well.</p></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Sentry is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Established teams running large-scale web or mobile applications needing reliability and deep insight, or game developers working with the Unreal and Unity engines.</p></div></div><h3 id="3-rollbar">3. Rollbar</h3><p><a href="/blog/best-rollbar-alternatives">Rollbar</a> connects errors directly to deploys, releases, and regressions. It&#x27;s built for teams who deploy constantly and need to know the moment something breaks in production.</p><p>Their superpower is speed. Rollbar specializes in tracking when new releases cause errors, and integrates with GitHub, GitLab, Jira, and Slack, automatically associating new exceptions with recent deployments.</p><p>If you value velocity and automation over depth, this is a tool that can help you ship multiple times a day without fear.</p><p><strong>Strengths</strong></p><ul><li>Release tracking and rollback detection</li><li>Strong CI/CD and issue tracker integrations</li><li>Automations for regression alerts and triage</li></ul><p><strong>Community</strong>  </p><ul><li><p>Rollbar maintains several open SDK repositories across languages, including <a href="https://github.com/rollbar/rollbar.js">rollbar.js</a>, <a href="https://github.com/rollbar/pyrollbar">rollbar-python</a>, and <a href="https://github.com/rollbar/rollbar-java">rollbar-java</a>. </p></li><li><p>Each repo has hundreds of stars and regular maintenance, though the core product itself is proprietary.</p></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Rollbar is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Fast-moving engineering teams that ship code multiple times a day and need to pinpoint exactly which commit, branch, or release introduced a new exception.</p></div></div><h3 id="4-bugsnag">4. Bugsnag</h3><p>Bugsnag is a leading tool for mobile and frontend error monitoring focused on app stability metrics.</p><p>It was built around the insight that not every error is made equal; it measures crash-free sessions, calculates stability scores, and surfaces the most impactful issues first so teams can prioritize issues that have the greatest impact on real-world experience. </p><p>Their clean dashboards and SDK coverage across iOS, Unity, React Native, Android, and web make it a go-to for app developers.</p><p><strong>Strengths</strong></p><ul><li>Excellent mobile SDKs and coverage</li><li>Stability and health metrics help prioritize fixes</li><li>Integrates with common mobile CI/CD pipelines</li></ul><p><strong>Community</strong>  </p><ul><li><p>Bugsnag&#x27;s core platform is closed source, but it maintains open SDKs for most major platforms (<a href="https://github.com/bugsnag/bugsnag-js">JavaScript</a>, <a href="https://github.com/bugsnag/bugsnag-android">Android</a>, <a href="https://github.com/bugsnag/bugsnag-unity">Unity</a>, and others). </p></li><li><p>Each repo has hundreds to a few thousand stars, and updates are frequent.</p></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Bugsnag is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Mobile and frontend teams focused on improving user stability and retention by combining error data with usage metrics.</p></div></div><h3 id="5-glitchtip">5. GlitchTip</h3><p>GlitchTip is an open-source, privacy-friendly alternative to Sentry. It&#x27;s a lightweight, predictable error tracker that&#x27;s yours to run however you want.</p><p>Its Sentry API compatibility means you can often switch without changing SDKs. GlitchTip&#x27;s simplicity is also its strength: no over-engineered dashboards, no surprise upgrades, no opaque billing – just a clean UI, grouped errors, and self-hosted reliability for small teams. </p><p>It&#x27;s a compelling choice for smaller engineering teams or privacy-sensitive organizations.</p><p><strong>Strengths</strong></p><ul><li>Easy deployment with Docker</li><li>Free and privacy-friendly</li><li>Maintains Sentry protocol compatibility</li></ul><p><strong>Community</strong>  </p><ul><li><p><a href="https://mastodon.online/@glitchtip">GlitchTip</a> is fully open source under the MIT license, with active contributions from the developer community. </p></li><li><p>It&#x27;s a lightweight alternative to Sentry with regular maintenance and transparent development.</p></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">GlitchTip is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Small teams or organizations that value control and simplicity over feature depth.</p></div></div><h3 id="6-signoz">6. SigNoz</h3><p>SigNoz is an open-source observability platform built on OpenTelemetry.</p><p>It collects metrics, traces, and errors into one open-source platform designed to replace proprietary APM tools like <a href="/blog/best-datadog-alternatives">Datadog</a> or New Relic. It&#x27;s self-hostable, cost-effective, and ideal for teams standardizing on open telemetry stacks.</p><p><strong>Strengths</strong></p><ul><li>Unified tracing, metrics, and error monitoring</li><li>OpenTelemetry-native and vendor-neutral</li><li>No licensing lock-in</li></ul><p><strong>Community</strong>  </p><ul><li><p><a href="https://github.com/SigNoz/signoz">SigNoz</a> is open source under the Apache 2.0 license, with 24k+ stars and a rapidly growing contributor base. </p></li><li><p>It&#x27;s one of the most active OpenTelemetry-native observability projects and ships frequent updates.</p></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">SigNoz is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Backend or infrastructure teams who prefer open frameworks and self-hosted observability.</p></div></div><h2 id="which-error-tracking-tool-should-you-choose">Which error tracking tool should you choose?</h2><ul><li>Want an all-in-one platform that connects errors to user sessions, analytics, feature flags, experiments, and more? Go with <strong><a href="/error-tracking">PostHog</a></strong>.  </li><li>Need deep stack traces, transaction tracing, and mature triage workflows? <strong>Sentry</strong> is the proven choice.  </li><li>Shipping constantly and need instant visibility into which release broke what? Choose <strong>Rollbar</strong>.  </li><li>Focused on mobile or frontend stability metrics like crash-free sessions? <strong>Bugsnag</strong> is a good fit.  </li><li>Want a simple, self-hosted option compatible with Sentry clients? Try <strong>GlitchTip</strong>.  </li><li>Prefer an open-source observability stack built on OpenTelemetry? <strong>SigNoz</strong> is probably the answer.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but PostHog is the best choice for error tracking if:</p><ul><li>You want errors connected to session replays, feature flags, and analytics so you can see not just what broke, but who was affected and what they were doing</li><li>You value open source and transparent pricing</li><li>You want to try before you buy with 100k exceptions free every month</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out our <a href="/docs">docs</a> to do it yourself.</p><p><div></div></p><h2 id="faq">FAQ</h2><details><summary>What&#x27;s the best error tracking tool for developers?</summary><p>If you want full context, including stack traces, user sessions, and console logs, <strong>PostHog</strong> is the best choice. It combines error tracking, session replay, analytics, and feature flags in one platform. For large-scale reliability and performance monitoring, <strong>Sentry</strong> is another strong option.</p></details><details><summary>What&#x27;s the difference between PostHog and Sentry?</summary><p><strong>Sentry</strong> focuses primarily on deep error monitoring and performance tracing. <strong>PostHog</strong> provides a broader context by combining error tracking with product analytics, session replays, feature flags, and more.</p></details><details><summary>Are there open-source error tracking tools?</summary><p>Yes. <strong>PostHog</strong>, <strong>Sentry</strong>, and <strong>GlitchTip</strong> all offer open-source editions. These options are ideal for teams who want full data ownership and flexibility in how they run their error tracking systems.</p></details><details><summary>Which error tracking tool integrates best with CI/CD workflows?</summary><p><strong>Rollbar</strong> integrates deeply with CI/CD pipelines and tools like GitHub, GitLab, Slack, and Jira. It automatically ties new errors to specific releases, helping teams detect regressions right after deployment.</p></details><details><summary>Which error tracking tool is best for mobile apps?</summary><p><strong>Bugsnag</strong> is built for mobile error tracking and app stability. It supports iOS, Android, and other major mobile SDKs and provides useful metrics like crash-free sessions and stability scores to help teams prioritize fixes.</p></details><details><summary>Which is the cheapest error tracking tool?</summary><p><strong>PostHog</strong> offers transparent, usage-based pricing with generous free tiers across all products. Most small teams can use PostHog entirely for free, and its billing caps prevent surprise overages. Open-source tools like GlitchTip are also cost-effective for teams comfortable managing their own hosting.</p></details><details><summary>What are the best Datadog alternatives for error tracking?</summary><p>If your focus is on application-level errors and user experience rather than infrastructure monitoring, <strong>PostHog</strong> and <strong>Sentry</strong> are the best Datadog alternatives. For teams who prefer open-source observability platforms, <strong>SigNoz</strong> is an excellent choice built on OpenTelemetry.</p></details><details><summary>How is PostHog different from other error tracking tools?</summary><p>PostHog is more than an error tracker – it gives developers full context by combining <a href="/products">all the tools needed to build a successful product</a> in one platform.  </p><ul><li><strong>All-in-one toolkit:</strong> <a href="/product-analytics">Product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, <a href="/llm-analytics">LLM analytics</a>, and <a href="/error-tracking">error tracking</a>  </li><li><strong>Developer-first:</strong> Transparent APIs, SQL query builder, open source, and a public roadmap  </li><li><strong>Transparent pricing:</strong> Generous free tiers and <a href="/pricing">usage-based billing</a>  </li><li><strong>Trusted by teams:</strong> Used by <a href="/customers">Supabase, Lovable, ElevenLabs, ResearchGate</a>, and more</li></ul></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best feature flag software for developers, compared]]></title><description><![CDATA[There's "ready" and then there's "ready for everyone"; if you've ever scrambled to revert a deploy, you know the difference. Maybe an edge case breaks…]]></description><link>https://posthog.com/blog/best-feature-flag-software-for-developers</link><guid isPermaLink="false">2fe9be1c-e56c-5d4d-8e32-cc0162af8823</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>There&#x27;s &quot;ready&quot; and then there&#x27;s &quot;ready for everyone&quot;; if you&#x27;ve ever scrambled to revert a deploy, you know the difference.</p><p>Maybe an edge case breaks on mobile, maybe the feature tanks conversion for a segment you didn&#x27;t test, or maybe your new onboarding flow confuses more people than it helps. </p><p><a href="/blog/what-is-a-feature-flag">This is where feature flags come in</a>: you ship the code when it&#x27;s ready, and you control who sees it separately.</p><p>This guide compares the best feature flag tools for developers – what they do well, where they fall short, and which one fits your workflow best.</p><h2 id="what-features-do-you-need-in-your-feature-flag-tool">What features do you need in your feature flag tool?</h2><p>At its core, a feature flag tool lets you <a href="/blog/decouple-deployment-from-release">toggle features on or off</a> for specific users, groups, or percentages of traffic without redeploying code. But the best tools are a lot more than flip switches.</p><p>Most solid feature flag tools include:</p><ul><li>Boolean and multivariate flag types</li><li>Percentage-based and targeted rollouts</li><li>Environment management (dev, staging, production)</li><li>SDKs for major languages and frameworks</li><li>A dashboard for everyone to manage flags</li></ul><p>Developer-focused tools often go further with:</p><ul><li><strong>Local evaluation</strong> so flag checks don&#x27;t add latency or depend on network calls</li><li><strong>Built-in experimentation</strong> to measure the impact of a flag, not just toggle it</li><li><strong>Analytics integration</strong> so you can trace a conversion drop back to a specific flag variant</li><li><strong>Stale flag detection</strong> to prevent feature flags from becoming permanent technical debt</li><li><strong>Audit logs and approval workflows</strong> for governance in larger teams</li></ul><h2 id="whats-the-best-feature-flag-tool-for-developers">What&#x27;s the best feature flag tool for developers?</h2><h3 id="1-posthog">1. PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2026_02_11_at_09_54_29_2x_96f74a428a.png" alt="PostHog"/></p><p>PostHog is an all-in-one developer platform where <a href="/feature-flags">feature flags</a> aren&#x27;t a standalone product – they&#x27;re woven into a broader workflow that includes <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/logs">logs</a>, and more.</p><p>This means you can <a href="/docs/feature-flags/phased-rollout">roll out a feature to 10% of users</a>, <a href="/docs/session-replay/how-to-watch-recordings">watch session replays of those users</a>, check whether the flag variant increased conversion, <a href="/docs/error-tracking/capture">catch any errors it triggered</a>, and <a href="/docs/surveys/creating-surveys">get feedback about their experience</a> – all without leaving the platform.</p><p>PostHog supports boolean and multivariate flags, percentage rollouts, user and group targeting, JSON payloads for <a href="/docs/feature-flags/remote-config">remote configuration</a>, and <a href="/docs/feature-flags/local-evaluation">local evaluation</a> for low-latency flag checks. It also powers PostHog&#x27;s <a href="/experiments">experimentation</a> features, so you can go from &quot;ship it behind a flag&quot; to &quot;measure its impact with statistical significance&quot; in a few clicks.</p><p>PostHog uses <a href="/pricing">usage-based pricing</a> with a free tier of 1 million feature flag requests per month – enough for most early-stage teams. You can also set billing caps to prevent surprise charges, and eligible startups can get $50k in free credits through the <a href="/startups">PostHog for Startups program</a>.</p><p><strong>Strengths:</strong></p><ul><li>Feature flags with full analytics, replay, and error context</li><li>Boolean, multivariate, and JSON payload flags</li><li>Local evaluation for low-latency server-side checks</li><li>Usage-based pricing with generous free tier and billing caps</li><li>Unified suite: analytics, experiments, error tracking, session replay, surveys, LLM analytics, and more</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">PostHog is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Developers who want feature flags as part of a complete build-measure-learn workflow, and startups that want to replace multiple tools with one platform.</p></div></div><p><div></div></p><h3 id="2-launchdarkly">2. LaunchDarkly</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_09_T16_54_54_518_Z_a5d2bb524a.png" alt="LaunchDarkly"/></p><p><a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a> is the most established feature flag platform and the go-to choice for many organizations. It was built specifically for feature management at scale, and it shows in the depth of its targeting rules, governance features, and SDK support.</p><p><a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> supports complex boolean logic, multi-dimensional targeting (users, devices, organizations), progressive rollouts, approval workflows, and audit logging. It features a broad SDK coverage, and the streaming architecture delivers flag updates in near real-time without polling.</p><p>More recently, it has expanded into experimentation, release monitoring, and AI model configuration. It also offers &quot;guarded releases&quot; that automatically roll back changes when performance metrics degrade.</p><p>The trade-off is cost. Their pricing is based on client-side MAUs, and can scale quickly. It also doesn&#x27;t include session replay or error tracking, so you&#x27;ll need separate tools for those.</p><p><strong>Strengths:</strong></p><ul><li>Sophisticated targeting and governance features</li><li>Broad SDK coverage across web, mobile, backend, and edge</li><li>Streaming architecture for near real-time flag updates</li><li>Guarded releases with automated rollback</li><li>Strong enterprise compliance (SOC 2, HIPAA, FedRAMP)</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">LaunchDarkly is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Large engineering teams that need enterprise-grade feature management with deep governance, compliance, and the broadest possible SDK support.</p></div></div><h3 id="3-growthbook">3. GrowthBook</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_09_T17_08_40_989_Z_7b265c5d2c.png" alt="GrowthBook"/></p><p><a href="/blog/posthog-vs-growthbook">GrowthBook</a> is an open-source platform built around the idea that every feature release should be measurable. It combines feature flags with a powerful experimentation engine that connects directly to your data warehouse, making it a strong pick for data-savvy teams.</p><p>Its feature flag capabilities include targeting rules, percentage rollouts, prerequisite flags, and JSON payloads. You can also turn any flag into an A/B test, define metrics via SQL, and analyze results using Bayesian or Frequentist statistical engines without exporting data or wiring up a separate tool.</p><p><a href="/blog/best-growthbook-alternatives">GrowthBook</a> is free to self-host; the cloud version has a free tier for up to 3 users, with paid plans starting at $40/user/month for features like multi-armed bandits, product analytics, access control, and more.</p><p><strong>Strengths:</strong></p><ul><li>Open source and self-hostable with no usage limits</li><li>Warehouse-native experimentation engine</li><li>Strong statistical analysis (Bayesian, Frequentist, CUPED)</li><li>Lightweight SDK</li><li>Transparent SQL-based metric definitions</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">GrowthBook is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Data teams and engineers who want experimentation built into their feature release workflow, with full control over their data.</p></div></div><h3 id="4-unleash">4. Unleash</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_10_T16_08_10_906_Z_d2c3735ab7.png" alt="Unleash"/></p><p>Unleash is an <a href="/blog/best-open-source-feature-flag-tools">open-source feature flag platform</a> designed for teams that need full control over their infrastructure. It’s used in production by large orgs, including Visa, where data sovereignty and compliance aren&#x27;t optional.</p><p>Unleash focuses on doing feature flags well without trying to be an analytics or experimentation platform. It supports progressive rollouts, kill switches, custom activation strategies, and environment management. Under the hood, it&#x27;s a Node.js and TypeScript backend that uses PostgreSQL for storage, and it&#x27;s straightforward to deploy via Docker or Kubernetes.</p><p>Their OSS is positioned as a single-environment setup, and teams that need multiple environments with governance features typically upgrade to Enterprise for things like RBAC, audit logs, and change requests, plus SSO and SCIM.</p><p><strong>Strengths:</strong></p><ul><li>Open source and fully self-hostable</li><li>Simple, reliable architecture (Node.js + PostgreSQL)</li><li>Strong compliance and governance features on paid plans</li><li>Broad SDK coverage including community-maintained options</li><li>No vendor lock-in – your data stays in your infrastructure</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Unleash is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Engineering teams in regulated industries that need self-hosted feature flags with enterprise-grade security, audit trails, and full data control.</p></div></div><h3 id="5-flagsmith">5. Flagsmith</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_10_T16_09_52_621_Z_86c1ee217a.png" alt="Flagsmith"/></p><p><a href="/blog/best-flagsmith-alternatives">Flagsmith</a> is an <a href="/blog/best-open-source-feature-flag-tools">open-source feature flag</a> and remote configuration platform that gives teams flexibility in how they deploy. You can run it as SaaS, on a private cloud, or fully on-premises – a rare combination that makes it a strong fit for security-conscious organizations.</p><p>It supports boolean and multivariate flags, user segments, percentage rollouts, A/B testing, remote config, and scheduled flags. Its Edge API routes requests to the nearest data center for low-latency evaluation, and it supports local evaluation for server-side SDKs.</p><p>One area where Flagsmith differs from platforms like PostHog is that it isn&#x27;t trying to be a full product analytics suite. </p><p>It includes testing features, but if you want deep behavioral analysis, funnels, retention, or replay-led debugging, you&#x27;ll typically pair it with your existing analytics stack. Their free tier includes 50,000 requests per month, and paid plans start at $45/month.</p><p><strong>Strengths:</strong></p><ul><li>Open source with flexible deployment options (SaaS, private cloud, on-prem)</li><li>Remote configuration alongside feature flags</li><li>Edge API for low-latency global flag delivery</li><li>Clean, intuitive management interface</li><li>Strong compliance posture for regulated industries</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Flagsmith is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Security-conscious teams that need deployment flexibility and remote configuration, with the option to self-host on their own infrastructure.</p></div></div><h3 id="6-statsig">6. Statsig</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_10_T16_10_58_425_Z_edf21cb1a8.png" alt="Statsig"/></p><p><a href="/blog/posthog-vs-statsig">Statsig</a> was built by ex-Facebook engineers who wanted to bring Meta&#x27;s internal experimentation infrastructure to every team. The result is a platform that combines feature flags, experimentation, analytics, and session replay in one unified system.</p><p><a href="/blog/best-statsig-alternatives">Statsig&#x27;s</a> standout is its experimentation engine. Every feature flag can be turned into an experiment with automatic metric tracking, CUPED variance reduction, and sequential testing. The platform also includes product analytics, funnels, and session replay, giving teams a full picture of how flags impact user behavior.</p><p>It markets unlimited flag and config checks on every tier, and the free tier includes 2M events per month plus session replay volume. In practice, that means you can run a lot of flags without paying for every flag check, costs scale mainly with how much you measure and replay.</p><p><strong>Strengths:</strong></p><ul><li>Feature flags are free and unlimited at every tier</li><li>Advanced experimentation with CUPED and sequential testing</li><li>Integrated analytics and session replay</li><li>Warehouse-native deployment option for data control</li><li>30+ SDKs with edge computing support</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Statsig is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Product and engineering teams that want to run high-velocity experiments as part of every feature release, with advanced statistical methods built in.</p></div></div><h3 id="7-devcycle">7. DevCycle</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_10_T16_12_28_211_Z_ba266982d4.png" alt="DevCycle"/></p><p>DevCycle is a feature flag platform that prioritizes speed, simplicity, and tight integration with existing development workflows. It&#x27;s designed for teams that want to manage flags the same way they manage code – with Git-based workflows, CLI tools, and IDE integrations.</p><p>DevCycle supports boolean and multivariate flags, percentage rollouts, user targeting, and environment management. It integrates with GitHub and Jira for flag lifecycle management, and includes built-in stale flag detection to help teams clean up technical debt.</p><p>What sets DevCycle apart is its obsession with developer workflow. It supports CLI and IDE-first ways to work with flags, plus integrations with tools like GitHub and Jira so flags show up naturally in code review and planning. And their edge and local-bucketing style options help keep evaluation fast without you managing a full flag platform yourself.</p><p>DevCycle offers a free tier for up to 1,000 MAUs, with paid plans based on MAU volume.</p><p><strong>Strengths:</strong></p><ul><li>Developer-first workflows with CLI and IDE integrations</li><li>Git-based flag management</li><li>Built-in stale flag detection and cleanup tools</li><li>Edge-based evaluation for low latency</li><li>Fast setup and lightweight SDK</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">DevCycle is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Engineering teams that want a fast, lightweight feature flag tool that fits into Git-based workflows without the overhead of a full platform.</p></div></div><details><summary>Honorable mentions</summary><ul><li><p><strong>ConfigCat:</strong> A privacy-first feature flag service with fixed, predictable pricing and a generous free tier (10M requests/month). All evaluations happen locally via SDKs pulling from a global CDN. It doesn&#x27;t collect end-user data, which simplifies GDPR compliance. The trade-off is no experimentation, analytics, or CI/CD integration – it&#x27;s intentionally lightweight. Best for teams that want simple, reliable flags without complexity.</p></li><li><p><strong>Harness:</strong> Harness acquired <strong>Split</strong> in May 2024 and merged its experimentation engine into the broader Harness CI/CD platform. The result is feature flags that go through the same governance and verification workflows as code changes, with A/B testing and metric ingestion from tools like Segment and Sentry. Best for enterprise DevOps teams that want flags tightly integrated into their CI/CD pipeline.</p></li></ul></details><h2 id="which-feature-flag-tool-should-you-choose">Which feature flag tool should you choose?</h2><ul><li>Want to ship behind a flag, measure the impact, and catch errors without switching tools? <strong><a href="/feature-flags">PostHog</a></strong></li><li>Need enterprise-grade governance, compliance, and the widest SDK coverage? <strong>LaunchDarkly</strong></li><li>Want open-source flags with a warehouse-native experimentation engine? <strong>GrowthBook</strong></li><li>Need self-hosted flags with full data sovereignty for regulated industries? <strong>Unleash</strong></li><li>Want deployment flexibility with remote config and an open-source core? <strong>Flagsmith</strong></li><li>Need advanced experimentation with free unlimited flags? <strong>Statsig</strong></li><li>Prefer a lightweight, developer-first tool with Git-based workflows? <strong>DevCycle</strong></li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><h4 id="for-high-growth-startups">For high-growth startups</h4><ul><li><strong>PostHog</strong> for transparent pricing, a generous free tier, and a single platform that replaces multiple SaaS tools</li><li><strong>GrowthBook</strong> if your team wants open-source experimentation connected to your warehouse</li></ul><h4 id="for-enterprise-and-large-engineering-teams">For enterprise and large engineering teams</h4><ul><li><strong>LaunchDarkly</strong> for the most sophisticated targeting, governance, and compliance features</li><li><strong>Unleash</strong> if you need self-hosted flags with enterprise-grade audit trails and RBAC</li><li><strong>Statsig</strong> for high-velocity experimentation at scale without paying per flag check</li></ul><h4 id="for-developers-and-engineering-heavy-teams">For developers and engineering-heavy teams</h4><ul><li><strong>PostHog</strong> if you want flags tightly integrated with analytics, replay, and error tracking</li><li><strong>DevCycle</strong> if you want something lightweight that fits into Git and CI/CD workflows</li><li><strong>GrowthBook</strong> if you want to self-host and measure every release with experiments</li></ul><h4 id="for-teams-in-regulated-industries">For teams in regulated industries</h4><ul><li><strong>Unleash</strong> for full self-hosting, data sovereignty, and compliance certifications</li><li><strong>Flagsmith</strong> for flexible deployment options (SaaS, private cloud, on-prem) with strong governance</li><li><strong>LaunchDarkly</strong> if you need SOC 2, HIPAA, or FedRAMP compliance from a managed platform</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but PostHog is the best choice for feature flags if:</p><ul><li>You want flags connected to your entire suite of data tools, so you can roll out features safely and see exactly how they impact user behavior</li><li>You value open source and transparent pricing</li><li>You want to try before you buy with 1 million feature flag requests free every month</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out our <a href="/docs/feature-flags/start-here">docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What are feature flags, and why should developers use them?</summary><p><strong>Feature flags</strong> (also called feature toggles) let you control which users see a feature without redeploying code. They&#x27;re used for progressive rollouts, A/B testing, kill switches, and <a href="/product-engineers/trunk-based-development">trunk-based development</a>. Instead of maintaining long-lived feature branches, you merge code behind a flag and control its visibility separately.</p></details><details><summary>What&#x27;s the best feature flag tool for developers?</summary><p><strong>PostHog</strong> if you want flags integrated with analytics, experiments, and error tracking in one platform. <strong>LaunchDarkly</strong> if you need the deepest feature management capabilities and enterprise governance. <strong>GrowthBook</strong> if you want open-source flags with built-in experimentation.</p></details><details><summary>What&#x27;s the difference between PostHog and LaunchDarkly?</summary><p><strong>LaunchDarkly</strong> is a dedicated feature management platform built for enterprise-scale flag operations. It has the most sophisticated targeting rules, governance workflows, and SDK coverage, but doesn&#x27;t include analytics, session replay, or error tracking.</p><p><strong>PostHog</strong> takes a different approach by embedding feature flags into an all-in-one developer platform. You can roll out a flag, watch session replays of affected users, check analytics for impact, and catch errors – all without switching tools. It&#x27;s more affordable for most teams but doesn&#x27;t match LaunchDarkly&#x27;s depth in pure feature management.</p><p>Choose <strong>LaunchDarkly</strong> if feature flag governance is your primary concern. Choose <strong>PostHog</strong> if you want flags as part of a broader build-measure-learn workflow. <a href="/blog/posthog-vs-launchdarkly">Learn more about the differences in our PostHog vs LaunchDarkly comparison guide</a>. </p></details><details><summary>What are the best LaunchDarkly alternatives?</summary><p>The best LaunchDarkly alternatives depend on what you&#x27;re optimizing for:</p><ul><li><strong><a href="/feature-flags">PostHog</a></strong> if you want feature flags bundled with <a href="/products">a broad suite of developer tools</a>, so you can measure the impact of every rollout without switching tools.</li><li><strong><a href="/blog/best-growthbook-alternatives">GrowthBook</a></strong> if you want an open-source, warehouse-native alternative with strong experimentation.</li><li><strong><a href="/blog/best-statsig-alternatives">Statsig</a></strong> if you want advanced experimentation with free unlimited flags and built-in analytics.</li><li><strong><a href="/blog/best-flagsmith-alternatives">Flagsmith</a></strong> if you need flexible deployment options (SaaS, private cloud, on-prem) with an open-source core.</li><li><strong>Unleash</strong> if you need full self-hosting and data sovereignty for regulated industries.</li><li><strong>DevCycle</strong> if you want a lightweight, Git-based developer workflow.</li></ul><p>For a full breakdown, see our guide to the <a href="/blog/best-launchdarkly-alternatives">best LaunchDarkly alternatives and competitors</a>.</p></details><details><summary>Are there open-source feature flag tools?</summary><p>Yes. <strong>PostHog</strong>, <strong>GrowthBook</strong>, <strong>Unleash</strong>, and <strong>Flagsmith</strong> all have open-source editions. GrowthBook and Unleash are commonly self-hosted by teams that want maximum control over data and infrastructure. Keep in mind that open-source editions can differ from paid plans in governance features like multi-environment management, RBAC, and approvals.</p></details><details><summary>Can feature flags cause technical debt?</summary><p>Yes. Feature flags that are never cleaned up become &quot;stale flags&quot; – dead code paths that add complexity and make the codebase harder to maintain. Good feature flag hygiene includes setting expiry dates, using stale flag detection, and treating flag removal as part of the feature lifecycle.</p></details><details><summary>Which is the cheapest feature flag tool?</summary><p><strong>Statsig</strong> offers unlimited free feature flags at every pricing tier and includes 2M events per month. <strong>PostHog</strong> includes 1 million free feature flag requests per month with transparent usage-based pricing. <strong>GrowthBook</strong> and <strong>Unleash</strong> are both free to self-host with no usage limits.</p></details><details><summary>Which feature flag tool integrates best with analytics?</summary><p><strong>PostHog</strong> has the tightest integration since analytics, session replay, and feature flags are all built into the same platform. <strong>Statsig</strong> also includes built-in analytics and experimentation. For tools without native analytics – like <strong>Unleash</strong> and <strong>Flagsmith</strong> – you&#x27;ll need to integrate with external analytics platforms.</p></details><details><summary>Which feature flag tool is best for mobile apps?</summary><p><strong>PostHog</strong> supports iOS, Android, React Native, and Flutter with native SDKs. <strong>LaunchDarkly</strong> has the broadest SDK coverage across platforms, and <strong>Flagsmith</strong> focuses heavily on low-latency delivery via its Edge API, which can be helpful for global mobile performance.</p></details><details><summary>Do I need a feature flag tool, or can I build my own?</summary><p>You can build a basic flag system with config files or a database table. But as your needs grow – targeting rules, percentage rollouts, multi-environment support, audit logs, experimentation – the engineering cost of maintaining a homegrown system adds up fast. Most teams find it&#x27;s <a href="/blog/feature-flags-as-a-service">worth adopting a purpose-built feature flag tool</a> once they have more than a handful of flags.</p></details><details><summary>How is PostHog different from other feature flag tools?</summary><p><strong>PostHog</strong> is more than a feature flag tool. It gives developers full context by combining all the tools needed to build a successful product in one platform.</p><ul><li><strong>All-in-one toolkit:</strong> <a href="/product-analytics">Product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, <a href="/llm-analytics">LLM analytics</a>, and <a href="/error-tracking">error tracking</a></li><li><strong>Developer-first:</strong> Transparent APIs, <a href="/docs/product-analytics/sql">SQL query builder</a>, <a href="/docs">docs</a> that let you self-serve, open source, and a <a href="/roadmap">public roadmap</a></li><li><strong>Transparent pricing:</strong> Generous free tiers and <a href="/pricing">usage-based billing</a></li><li><strong>Trusted by teams:</strong> Used by <a href="/customers">Supabase, Lovable, ElevenLabs, ResearchGate</a>, and more</li></ul></details><details><summary>What are the best feature flag tools in 2026?</summary><p>Based on our research, the best feature flag tools for developers right now are:</p><ol><li><strong><a href="/feature-flags">PostHog</a></strong> – Best all-in-one platform with flags, analytics, experiments, and error tracking</li><li><strong>LaunchDarkly</strong> – Best for enterprise governance, compliance, and SDK coverage</li><li><strong>GrowthBook</strong> – Best open-source option with warehouse-native experimentation</li><li><strong>Unleash</strong> – Best for self-hosted flags with full data sovereignty</li><li><strong>Flagsmith</strong> – Best for flexible deployment (SaaS, private cloud, on-prem)</li><li><strong>Statsig</strong> – Best for advanced experimentation with free unlimited flags</li><li><strong>DevCycle</strong> – Best for lightweight, Git-based developer workflows</li></ol><p>For a deeper look at open-source options specifically, see our guide to the <a href="/blog/best-open-source-feature-flag-tools">best open-source feature flag tools</a>.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[7 best session replay tools for mobile apps]]></title><description><![CDATA[There are plenty of  session replay tools  out there, but not all of them support mobile, and those that do vary significantly in depth, platform…]]></description><link>https://posthog.com/blog/best-mobile-app-session-replay-tools</link><guid isPermaLink="false">78614df3-b669-504f-aed4-505a9faa9781</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/v1721983244/posthog.com/contents/hog-mobile-replay.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are plenty of <a href="/blog/best-session-replay-tools">session replay tools</a> out there, but not all of them support mobile, and those that do vary significantly in depth, platform support, and what they capture alongside replays.</p><p>This guide covers the seven best mobile session replay tools: what they do better, which frameworks they cover (iOS, Android, Flutter, React Native...), where they fall short, and who they&#x27;re actually for.</p><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2026_03_26_at_13_19_27_2x_9f924243c4.png" alt="posthog"/></p><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="/">PostHog</a> (that&#x27;s us 👋) is an all-in-one developer platform built to enable engineers to create better products. It includes <a href="/session-replay">session replays</a> and a whole bunch more, such as <a href="/product-analytics">product analytics</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/error-tracking">error tracking</a>, <a href="/experiments">experiments</a>, and <a href="/feature-flags">feature flags</a>.</p><p>It&#x27;s designed for product-minded engineers, founders, growth teams, and product managers who need to move fast and iterate based on reliable, actionable insights.</p><h4 id="supported-features">Supported features</h4><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Supported platforms</strong><div class="text-sm text-secondary mt-1">Mobile platforms where session replay is available</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Android, iOS, React Native, Flutter, Unity (alpha)</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Filter recordings by user or event</strong><div class="text-sm text-secondary mt-1">Find specific recordings by filtering for users or events</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI summaries</strong><div class="text-sm text-secondary mt-1">AI-generated summaries of session recordings</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Beta</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Conditional recording</strong><div class="text-sm text-secondary mt-1">Only capture the sessions you want based on conditions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Privacy masking for sensitive content</strong><div class="text-sm text-secondary mt-1">Automatic and manual masking of sensitive user data</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage taps</strong><div class="text-sm text-secondary mt-1">Identify repetitive taps made out of frustration</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Dead taps</strong><div class="text-sm text-secondary mt-1">Detect taps on elements that do not respond or trigger an action</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Crash reports</strong><div class="text-sm text-secondary mt-1">Learn what happens before a crash without complex debugging or reproduction</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog has <a href="/pricing">transparent pricing</a> based on usage. It&#x27;s free to get started and completely free for the first 2,500 mobile recordings and 5,000 web ones per month. </p><p>After this, pricing starts at $0.0100 per mobile recording, and recordings cost progressively less the more you use. This makes PostHog significantly cheaper than all the other companies on this list (apart from <a href="#3-microsoft-clarity">Microsoft Clarity</a>).</p><h3 id="why-do-companies-use-posthog">Why do companies use PostHog?</h3><p>According to <a href="https://www.g2.com/products/posthog/reviews">G2 reviews</a>, companies use PostHog because:</p><ol><li><p><strong>It&#x27;s many tools in one:</strong> PostHog can replace tools like <a href="/blog/posthog-vs-mixpanel">Mixpanel</a> (analytics), <a href="/blog/best-uxcam-alternatives">UXCam</a> (session replay), and <a href="/blog/posthog-vs-statsig">Statsig</a> (A/B testing and feature flags). This simplifies workflows and ensures all product data is in one place.</p></li><li><p><strong>They need a complete picture of users:</strong> PostHog includes every tool necessary to understand users and build better products. This means creating funnels to track conversion, watching replays to see where users get stuck, and testing solutions with A/B tests.</p></li><li><p><strong>Pricing is transparent and scalable:</strong> Reviewers appreciate how PostHog&#x27;s pricing scales as they grow. There&#x27;s a <a href="/pricing">generous free tier</a>. Companies eligible for <a href="/startups">PostHog for Startups</a> also get $50k in additional free credits.</p></li></ol><blockquote><h4 id="bottom-line">Bottom line</h4><p>PostHog is the best choice for teams who want mobile session replay connected to a complete suite of developer products – <a href="/docs/llm-analytics">LLM analytics</a> if you&#x27;re building AI products, <a href="/feature-flags">feature flags</a>, <a href="/error-tracking">error tracking</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, and more. It is especially worth it for startups and scaleups thanks to its generous free tier and powerful offerings.</p></blockquote><p><div></div></p><h2 id="2-logrocket">2. LogRocket</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1722525793/posthog.com/contents/logrocket123123.png" alt="LogRocket"/></p><h3 id="what-is-logrocket">What is LogRocket?</h3><p><a href="/blog/posthog-vs-logrocket">LogRocket</a> is a product experience platform that focuses on helping product managers, engineers, and support teams fix issues. In addition to session replay, it provides tools to identify the most impactful issues, such as crash reports, stack traces, performance monitoring, and product analytics.</p><h4 id="supported-features-1">Supported features</h4><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">LogRocket<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-logrocket">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Supported platforms</strong><div class="text-sm text-secondary mt-1">Mobile platforms where session replay is available</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Android, iOS, React Native, Flutter</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Filter recordings by user or event</strong><div class="text-sm text-secondary mt-1">Find specific recordings by filtering for users or events</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI summaries</strong><div class="text-sm text-secondary mt-1">AI-generated summaries of session recordings</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Conditional recording</strong><div class="text-sm text-secondary mt-1">Only capture the sessions you want based on conditions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Privacy masking for sensitive content</strong><div class="text-sm text-secondary mt-1">Automatic and manual masking of sensitive user data</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage taps</strong><div class="text-sm text-secondary mt-1">Identify repetitive taps made out of frustration</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Dead taps</strong><div class="text-sm text-secondary mt-1">Detect taps on elements that do not respond or trigger an action</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Crash reports</strong><div class="text-sm text-secondary mt-1">Learn what happens before a crash without complex debugging or reproduction</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h3 id="how-much-does-logrocket-cost">How much does LogRocket cost?</h3><p><a href="/blog/best-logrocket-alternatives">LogRocket&#x27;s</a> free tier includes 1,000 sessions/month with 1 month data retention.</p><p>Its <strong>Team</strong> plan starts at $69/month for up to 10k sessions and includes most session replay features, but excludes other features such as product analytics, Galileo AI, and some error tracking features.</p><p>The <strong>Professional</strong> plan starts at $295/month and includes all their features, but requires an annual commitment.</p><h3 id="why-do-companies-use-logrocket">Why do companies use LogRocket?</h3><p>Reviewers on <a href="https://www.g2.com/products/logrocket/reviews">G2</a> use LogRocket for:</p><ol><li><p><strong>Identifying problems:</strong> LogRocket&#x27;s combination of error tracking, performance monitoring, and session replay makes it uniquely powerful at finding bugs and issues.</p></li><li><p><strong>Improves user experience:</strong> LogRocket helps reviews fix issues with their apps. Reviewers find it provides all the tools to improve their user experience, mostly by solving what&#x27;s wrong rather than feedback and planning.</p></li><li><p><strong>High usability:</strong> LogRocket provides a lot of functionality out of the box. It captures the details users need, provides useful visualizations, and automatically triages some issues.</p></li></ol><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>LogRocket is the best choice for teams building React Native apps who need Redux state capture alongside session replay. Galileo AI also sets it apart by proactively surfacing struggle patterns across sessions, so you&#x27;re not waiting to discover problems.</p></blockquote><h2 id="3-uxcam">3. UXCam</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1722526111/posthog.com/contents/Analyze_event_in_session.jpg" alt="UXCam"/></p><h3 id="what-is-uxcam">What is UXCam?</h3><p><a href="/blog/best-uxcam-alternatives">UXCam</a> is a platform built primarily for mobile apps (although they&#x27;ve recently added web support). It includes a full-suite of analytics features as well as session replays, heatmaps, crash analytics, and an integrated AI analyst.</p><p>It&#x27;s designed to provide deep insights into user behavior, helping product managers understand how users interact with their apps.</p><h4 id="supported-features-2">Supported features</h4><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">UXCam</div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Supported platforms</strong><div class="text-sm text-secondary mt-1">Mobile platforms where session replay is available</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Android, iOS, React Native, Flutter</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Filter recordings by user or event</strong><div class="text-sm text-secondary mt-1">Find specific recordings by filtering for users or events</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI summaries</strong><div class="text-sm text-secondary mt-1">AI-generated summaries of session recordings</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Privacy masking for sensitive content</strong><div class="text-sm text-secondary mt-1">Automatic and manual masking of sensitive user data</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage taps</strong><div class="text-sm text-secondary mt-1">Identify repetitive taps made out of frustration</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Dead taps</strong><div class="text-sm text-secondary mt-1">Detect taps on elements that do not respond or trigger an action</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Crash reports</strong><div class="text-sm text-secondary mt-1">Learn what happens before a crash without complex debugging or reproduction</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="how-much-does-uxcam-cost">How much does UXCam cost?</h3><p>UXCam&#x27;s free plan includes 3,000 sessions/month with 6 months of replay retention. Paid plans require a sales conversation – no public pricing is available.</p><h3 id="why-do-companies-use-uxcam">Why do companies use UXCam?</h3><p>Looking at <a href="https://www.g2.com/products/uxcam/reviews">G2 reviews</a>, companies choose UXCam to:</p><ol><li><p><strong>Insights on user behavior:</strong> Shows what they are doing, where their attention is going, and how they are spending their time. Users love the realizations they get with UXCam&#x27;s tools.</p></li><li><p><strong>It&#x27;s easy to use:</strong> Reviewers note how easy UXCam is to set up and use. This means they can go from idea to actionable learnings quickly.</p></li><li><p><strong>Heatmaps and scrollmaps:</strong> Seeing clicks and scroll depth works well and creates actionable insights for design and product teams. Helps improve UX and page designs.</p></li></ol><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>UXCam is ideal for product managers who need in-depth insights into user behavior. Despite opaque pricing, its ease of use and actionable insights make it a valuable tool.</p></blockquote><h2 id="4-microsoft-clarity">4. Microsoft Clarity</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1722526729/posthog.com/contents/clarity-mobile.png" alt="clarity"/></p><h3 id="what-is-microsoft-clarity">What is Microsoft Clarity?</h3><p><a href="/blog/best-microsoft-clarity-alternatives">Microsoft Clarity</a> is a 100% free session replay tool that supports most replay features and heatmaps. It integrates with <a href="/blog/posthog-vs-ga4">Google Analytics 4</a>, so you can view your GA data in Clarity.</p><p>It includes most of the session replay features you would expect, but doesn&#x27;t support any additional features that some of the other choices on this list do, like crash reports or debug logs.</p><h4 id="supported-features-3">Supported features</h4><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Clarity</div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Supported platforms</strong><div class="text-sm text-secondary mt-1">Mobile platforms where session replay is available</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Android, iOS, React Native</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Filter recordings by user or event</strong><div class="text-sm text-secondary mt-1">Find specific recordings by filtering for users or events</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI summaries</strong><div class="text-sm text-secondary mt-1">AI-generated summaries of session recordings</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Conditional recording</strong><div class="text-sm text-secondary mt-1">Only capture the sessions you want based on conditions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Privacy masking for sensitive content</strong><div class="text-sm text-secondary mt-1">Automatic and manual masking of sensitive user data</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Dead taps</strong><div class="text-sm text-secondary mt-1">Detect taps on elements that do not respond or trigger an action</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Crash reports</strong><div class="text-sm text-secondary mt-1">Learn what happens before a crash without complex debugging or reproduction</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h3 id="how-much-does-microsoft-clarity-cost">How much does Microsoft Clarity cost?</h3><p>Clarity is completely free – no session limits, no paid tiers, ever. </p><p>The trade-off is worth understanding before you adopt it: Clarity is free because Microsoft uses the anonymized behavioral data it collects to improve its own machine learning models and products. </p><h3 id="why-do-companies-use-microsoft-clarity">Why do companies use Microsoft Clarity?</h3><p>According to <a href="https://www.g2.com/products/microsoft-microsoft-clarity/reviews">reviews on G2</a> and <a href="https://www.capterra.com/p/236349/Microsoft-Clarity/">Capterra</a>, it&#x27;s because:</p><ol><li><p><strong>It&#x27;s easy to set up and use:</strong> Setting up Clarity doesn&#x27;t require much technical knowledge and users mostly like the simple user interface.</p></li><li><p><strong>It helps uncover how users navigate:</strong> Clarity users are mostly using it to understand how people navigate their app and identify opportunities for improvement.</p></li><li><p><strong>It&#x27;s free:</strong> The short 30-day retention limit is easy to forgive when it&#x27;s free.</p></li></ol><blockquote><h4 id="bottom-line-3">Bottom line</h4><p>If you only care about session replay and dont need other features, Clarity is the obvious choice - especially if you&#x27;re already using Google Analytics. On the other hand, software engineers will find Clarity&#x27;s lack of debug logs disappointing.</p></blockquote><h2 id="5-smartlook">5. Smartlook</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1722526687/posthog.com/contents/smartlook-mobile.webp" alt="Smartlook"/></p><h3 id="what-is-smartlook">What is Smartlook?</h3><p>Smartlook combines session replays, product analytics, and crash reports to help teams understand user experience across both web and mobile. </p><p>It supports the broadest range of mobile SDKs on this list, making it one of the few tools that works for game developers as well as traditional app teams. </p><p>Wireframe mode is a standout feature for privacy-sensitive apps, replacing UI elements with abstract representations so you can analyze behavior without capturing sensitive content.</p><h4 id="supported-features-4">Supported features</h4><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Smartlook</div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Supported platforms</strong><div class="text-sm text-secondary mt-1">Mobile platforms where session replay is available</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>iOS, Android, React Native, Flutter, Unity, Unreal Engine, Cocos, Cordova/Ionic, Xamarin, Harmony OS</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Filter recordings by user or event</strong><div class="text-sm text-secondary mt-1">Find specific recordings by filtering for users or events</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Privacy masking for sensitive content</strong><div class="text-sm text-secondary mt-1">Automatic and manual masking of sensitive user data</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage taps</strong><div class="text-sm text-secondary mt-1">Identify repetitive taps made out of frustration</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Dead taps</strong><div class="text-sm text-secondary mt-1">Detect taps on elements that do not respond or trigger an action</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Crash reports</strong><div class="text-sm text-secondary mt-1">Learn what happens before a crash without complex debugging or reproduction</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="how-much-does-smartlook-cost">How much does Smartlook cost?</h3><p>Smartlook&#x27;s free plan records up to 3k sessions and includes most of their replay features. Its pro plan includes all replay features and starts at $55/month for 5k sessions, and pricing becomes progressively cheaper with more monthly sessions.</p><h3 id="why-do-companies-use-smartlook">Why do companies use Smartlook?</h3><p>According to <a href="https://www.g2.com/products/smartlook/reviews">G2</a> reviewers, Smartlook users benefit from:</p><ol><li><p><strong>The integration between replays and events:</strong> Smartlook connects event-based analytics and sessions. This enables users to dive deeper into user behavior than a single tool provides.</p></li><li><p><strong>Understanding visitor pain points:</strong> The analytics and visualizations make it easy to understand where users are running into trouble. Reviews use this to improve the user experience and conversion in these areas.</p></li><li><p><strong>Real user monitoring:</strong> Smartlook shows how real users are using your app and monitors the quality of their experiences. Reviewers use it to figure out what areas are confusing or used improperly.</p></li></ol><blockquote><h4 id="bottom-line-4">Bottom line</h4><p>Smartlook&#x27;s broad SDK support makes it the best choice for game developers and teams building on less common frameworks like Unity, Unreal Engine, or Xamarin. For standard iOS/Android teams, the retroactive event tracking and cross-platform journey tracking are the standout reasons to pick it over alternatives.</p></blockquote><h2 id="6-fullstory">6. FullStory</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1722526812/posthog.com/contents/fullstory.png" alt="FullStory"/></p><h3 id="what-is-fullstory">What is FullStory?</h3><p><a href="/blog/posthog-vs-fullsotry">FullStory</a> describes itself as behavioral data analytics platform, which is code for session replay and <a href="/blog/best-mobile-app-analytics-tools">mobile app analytics</a>, with a side of product analytics.</p><p>It uses autocapture to record everything retroactively, and StoryAI to generate session summaries and surface behavioral opportunities automatically.</p><h4 id="supported-features-5">Supported features</h4><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">FullStory<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-fullstory">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Supported platforms</strong><div class="text-sm text-secondary mt-1">Mobile platforms where session replay is available</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Android, iOS, React Native, Flutter</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Filter recordings by user or event</strong><div class="text-sm text-secondary mt-1">Find specific recordings by filtering for users or events</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI summaries</strong><div class="text-sm text-secondary mt-1">AI-generated summaries of session recordings</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Conditional recording</strong><div class="text-sm text-secondary mt-1">Only capture the sessions you want based on conditions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Privacy masking for sensitive content</strong><div class="text-sm text-secondary mt-1">Automatic and manual masking of sensitive user data</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage taps</strong><div class="text-sm text-secondary mt-1">Identify repetitive taps made out of frustration</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Dead taps</strong><div class="text-sm text-secondary mt-1">Detect taps on elements that do not respond or trigger an action</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Crash reports</strong><div class="text-sm text-secondary mt-1">Learn what happens before a crash without complex debugging or reproduction</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Android &amp; Flutter</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="how-much-does-fullstory-cost">How much does FullStory cost?</h3><p><a href="/blog/best-fullstory-alternatives">FullStory&#x27;s</a> free plan (FullStoryFree) includes 30,000 sessions/month with 12 months of data retention (but limited features). Paid plans aren&#x27;t published publicly and require contacting sales</p><h3 id="why-do-companies-use-fullstory">Why do companies use FullStory?</h3><p>According to reviews on <a href="https://www.g2.com/products/fullstory/reviews">G2</a>, companies use FullStory for:</p><ol><li><p><strong>Easier collaboration:</strong> As an accessible tool for non-technical users, FullStory facilitates collaboration between product, UX, and engineering teams by allowing all teams to access useful, reliable data.</p></li><li><p><strong>Viewing user issues:</strong> Support teams use FullStory to replay sessions to understand user hard-to-replicate problems, and identify bugs that need fixing.</p></li><li><p><strong>Improving conversion:</strong> FullStory users like to combine funnel insights with replays of user sessions to understand pain points and improve conversion.</p></li></ol><blockquote><h4 id="bottom-line-5">Bottom line</h4><p>For a complete behavioral analytics suite, FullStory is a solid choice. Users wanting more features, like error tracking or A/B testing should switch to other choices.</p></blockquote><h2 id="7-contentsquare">7. Contentsquare</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1722526862/posthog.com/contents/contensquare.webp" alt="contentsquare"/></p><h3 id="what-is-contentsquare">What is Contentsquare?</h3><p><a href="/blog/best-contentsquare-alternatives">Contentsquare</a> is a digital experience analytics platform that combines heatmaps, customer journey analysis, frustration scoring, session replay, and AI-powered insights to help find and fix issues and friction points. </p><p>It acquired <a href="/blog/posthog-vs-hotjar">Hotjar</a> in 2021 and <a href="/blog/posthog-vs-heap">Heap</a> in 2023, making it one of the largest DX platforms in the market. It&#x27;s built for large organizations that need to understand and optimize user behavior at scale across web and mobile.</p><h4 id="supported-features-6">Supported features</h4><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Contentsquare</div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Supported platforms</strong><div class="text-sm text-secondary mt-1">Mobile platforms where session replay is available</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Android, iOS, React Native</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Filter recordings by user or event</strong><div class="text-sm text-secondary mt-1">Find specific recordings by filtering for users or events</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Conditional recording</strong><div class="text-sm text-secondary mt-1">Only capture the sessions you want based on conditions</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage taps</strong><div class="text-sm text-secondary mt-1">Identify repetitive taps made out of frustration</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Dead taps</strong><div class="text-sm text-secondary mt-1">Detect taps on elements that do not respond or trigger an action</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Crash reports</strong><div class="text-sm text-secondary mt-1">Learn what happens before a crash without complex debugging or reproduction</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="how-much-does-contentsquare-cost">How much does Contentsquare cost?</h3><p>Contentsquare offers a free plan that includes 200,000 monthly sessions, replays, heatmaps, funnels, error monitoring, and surveys. Only 5% of sessions are recorded on their free plan though (a max of 10k per month) with 1 month retention and limited features (like filters). </p><p>The Growth plan starts from 7,000 monthly sessions with 13 months of data access and adds zone-based heatmaps, journey analysis, impact quantification, and Sense AI. </p><p>Higher tiers (Pro, Enterprise) are available with custom pricing via sales.</p><p>Worth noting: product analytics is a separate add-on, not included in the core plans.</p><h3 id="why-do-companies-use-contentsquare">Why do companies use Contentsquare?</h3><p>According to <a href="https://www.g2.com/products/contentsquare/reviews">G2</a> reviews, people like Contentsquare because:</p><ol><li><p><strong>Data visualization and analysis:</strong> Users like that Contentsquare makes it easy to visualize and analyze large data sets. Advanced features make it easier to identify and fix problems big and small.</p></li><li><p><strong>Improve your UI and UX:</strong> Contentsquare makes it easy to understand the impact of various design elements on a screen. This helps developers understand the impact of elements on conversion rate, revenue, and user journeys.</p></li><li><p><strong>Detailed session replays:</strong> Users appreciate being able to match quantitative data with qualitative data, giving them a better understanding of how best to solve problems.</p></li></ol><blockquote><h4 id="bottom-line-6">Bottom line</h4><p>Contentsquare is purpose-built for large enterprises with high traffic volumes and dedicated analytics teams. For most teams, the cost and complexity are hard to justify – PostHog, Smartlook, or LogRocket offer most of the same capabilities at a fraction of the price.</p></blockquote><h2 id="which-mobile-session-replay-tool-should-you-choose">Which mobile session replay tool should you choose?</h2><ul><li>Want replay connected to product analytics, feature flags, error tracking, and more in one platform? <strong>PostHog</strong>.</li><li>Need powerful debugging tools – console logs, network monitoring, Redux state capture? <strong>LogRocket</strong>.</li><li>Building a mobile app and need retention, cohort analysis, and crash analytics alongside replay? <strong>UXCam</strong>.</li><li>Want something completely free with no session limits? <strong>Microsoft Clarity</strong>.</li><li>Need replay across web and mobile with retroactive event tracking – or building on Unity, Unreal Engine, or Xamarin? <strong>Smartlook</strong>.</li><li>Want enterprise-grade replay with a generous free tier to evaluate? <strong>FullStory</strong>.</li><li>Large enterprise needing zone-based heatmaps and impact quantification? <strong>Contentsquare</strong>.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but PostHog is the best choice for mobile session replay if:</p><ul><li>You want replay connected to analytics, feature flags, error tracking, and more in one platform</li><li>You value open source and transparent pricing</li><li>You want to try before you buy – 2,500 mobile replays free every month, no credit card required</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out our <a href="/docs">docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What should I look for in a mobile session replay tool?</summary><p>The key things to evaluate when choosing a mobile session replay tool:</p><ul><li><strong>Platform support:</strong> Does it support your stack? Not all tools support all frameworks.</li><li><strong>What&#x27;s captured alongside replay:</strong> Crash reports, console logs, network requests, and performance data add debugging context that replay alone can&#x27;t provide.</li><li><strong>Heatmaps:</strong> Touch, gesture, and scroll heatmaps help you understand aggregate behavior across users, not just individual sessions.</li><li><strong>Privacy controls:</strong> Mobile apps often handle sensitive data. Look for configurable masking, PII detection, and compliance with GDPR and CCPA.</li><li><strong>Integration with analytics:</strong> Replay is most powerful when connected to funnels, retention, and event data so you can jump from a metric to the sessions behind it.</li><li><strong>Pricing model:</strong> Most tools price by session volume. Check whether mobile replays are counted separately from web replays.</li></ul></details><details><summary>When should you consider a dedicated mobile replay tool?</summary><p>You need a dedicated mobile replay tool if:</p><ul><li>You have a native iOS or Android app, not just a mobile website</li><li>You use cross-platform frameworks like React Native or Flutter</li><li>You need crash analytics linked to session context</li><li>You need touch and gesture heatmaps, not just click maps</li></ul><p>If you only have a mobile website (not a native app), most web session replay tools will work fine. </p><p>See our guide to the <a href="/blog/best-session-replay-tools">best session replay tools</a> for web-focused options.</p></details><details><summary>What is the best free mobile session replay tool?</summary><p><strong><a href="/blog/best-microsoft-clarity-alternatives">Microsoft Clarity</a></strong> is completely free with no session limits. </p><p><strong>PostHog</strong>&#x27;s free tier includes 2,500 mobile recordings/month plus product analytics, feature flags, error tracking and more. </p><p><strong>FullStory&#x27;s</strong> free plan includes 30,000 sessions/month with 12-month retention (but limited features). </p><p><strong>UXCam</strong> and <strong>Smartlook</strong> both offer free plans with 3,000 sessions/month.</p></details><details><summary>What is the difference between web and mobile session replay?</summary><p><strong>Web session replay</strong> captures DOM changes in a browser – it reconstructs what happened by replaying HTML, CSS, and JavaScript events. </p><p><strong>Mobile session replay</strong> hooks into the native rendering pipeline of iOS or Android to capture screen state, touch gestures, swipes, and taps. </p><p>The technical approach is fundamentally different, which is why most web replay tools can&#x27;t simply add mobile support – they need dedicated mobile SDKs and a different capture architecture.</p></details><details><summary>Do mobile session replay tools affect app performance?</summary><p>All tools on this list are designed to have minimal performance impact. Recording is typically done on a background thread, data is buffered and uploaded when the app goes into the background, and SDKs are lightweight (usually adding less than 1MB to app binary size). </p><p>That said, it&#x27;s worth testing with your specific app – recording-heavy apps or those with complex animations may see more overhead than simple utility apps.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[7 best free open source business intelligence tools right now]]></title><description><![CDATA[Not everyone has money to dish out for an enterprise Tableau contract, and not everyone wants to send their data to Looker (Google) either.  Free and…]]></description><link>https://posthog.com/blog/best-open-source-business-intelligence-tools</link><guid isPermaLink="false">55ce0f42-3f55-5c48-8e18-f0d964352178</guid><dc:creator><![CDATA[Ian Vanagas]]></dc:creator><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Not everyone has money to dish out for an enterprise Tableau contract, and not everyone wants to send their data to Looker (Google) either. </p><p>Free and open source business intelligence tools solve both these problems by making BI accessible and keeping you in control of your data.</p><p>The challenge becomes choosing the best one. To help you, we&#x27;ve put together this list of the top free and open source business intelligence tools you can use.</p><details><summary>How are these tools being evaluated?</summary><p>We evaluated these tools based on their:</p><ul><li>Ability to connect to data sources, query them with SQL, and build dashboards</li><li>Their open source credentials (GitHub stars, license, etc.)</li><li>Their unique positioning in the business intelligence space</li></ul></details><details><summary>What is the best business intelligence tool for startups?</summary><p><a href="#1-posthog">PostHog</a> provides startups like <a href="/customers/headshotpro">HeadshotPro</a>, with a full suite of tools they need to build a great product, including pre-built <a href="/docs/web-analytics">web</a> and <a href="/docs/revenue-analytics">revenue analytics</a> dashboards, simple connectors for their existing data sources (<a href="/docs/data-warehouse/sources/postgres">Postgres</a>, <a href="/docs/data-warehouse/sources/stripe">Stripe</a>, <a href="/docs/data-warehouse/sources/hubspot">Hubspot</a>, etc.), and a bunch more.</p></details><details><summary>What is the best business intelligence tool for data analysts?</summary><p><a href="#2-metabase">Metabase</a> provides a comprehensive set of database connectors as well as powerful query building and visualization tools that make it easy for data analysts to build dashboards and insights.</p></details><details><summary>What is the best business intelligence tool for infra engineers?</summary><p><a href="#5-grafana">Grafana</a> provides engineers with the &quot;intelligence&quot; their looking for: observability, monitoring, and more for their infrastructure. They also provide a ton of plugins for all the tools and services engineers use.</p></details><details><summary>What is the best business intelligence tool for product managers?</summary><p>Because it can easily combine product and business data, <a href="#1-posthog">PostHog</a> is the best business intelligence tool for product managers. It enables them to get a complete view of their product while also providing the advanced <a href="/docs/data-warehouse/query">SQL querying</a> they need to go deeper.</p></details><h2 id="what-are-the-best-free-and-open-source-bi-tools-right-now">What are the best free and open source BI tools right now?</h2><h3 id="1-posthog">1. PostHog</h3><ul><li>License: MIT</li><li>GitHub stars: 32.1k as of March 2026</li><li><a href="https://github.com/PostHog/posthog">PostHog on GitHub</a></li></ul><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2025_09_09_at_17_05_35_2x_42e293fddd.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2025_09_09_at_17_05_50_2x_8d74438a4a.png" alt="PostHog" classes="rounded"></div><p>PostHog is an all-in-one developer platform that combines business intelligence with several other developer-focused tools, such as <a href="/product-analytics">product</a> and <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/surveys">surveys</a>, and more.</p><p>Its business intelligence stack contains three key pieces:</p><ol><li><p>A <a href="/data-stack">data warehouse</a> that stores data captured into PostHog and syncs with external sources you already use, like <a href="/docs/data-warehouse/sources/stripe">Stripe</a>, <a href="/docs/data-warehouse/sources/hubspot">Hubspot</a>, <a href="/docs/data-warehouse/sources/postgres">Postgres</a>, <a href="/docs/data-warehouse/sources/google-sheets">Google Sheets</a>, <a href="/docs/data-warehouse/sources/s3">S3</a>, <a href="/docs/data-warehouse/sources/snowflake">Snowflake</a>, and more.</p></li><li><p><a href="/docs/product-analytics">Product analytics</a> which provides a simple but powerful interface for building dashboards and insights including trends, funnels, retention graphs, user paths, and more. </p></li><li><p>An <a href="/docs/data-warehouse/query">SQL editor</a> for direct access to your data along with its own set of visualizations and customization.</p></li></ol><h4 id="what-makes-posthog-special">What makes PostHog special?</h4><p>PostHog has the flexibility of a business intelligence tool, while including a full suite of tools product and engineering teams need to build successful products. You have less data spaghetti trying to connect them all together. </p><p>For example, not only can you analyze <a href="/docs/experiments/data-warehouse">A/B tests from warehouse data</a> in PostHog, but you can actually set up and run them natively using our experimentation and feature flag products. You don&#x27;t need to set up four different products, just PostHog.</p><p><a href="/ai">PostHog AI</a> can also generate and fix SQL queries, answer questions about your data, and more. The <a href="/docs/model-context-protocol">MCP server</a> enables your <a href="/newsletter/building-ai-agents">AI agents</a> and tools to directly interact with PostHog&#x27;s products.</p><p>PostHog comes with 1 million events and 1 million rows synced for free every month, and has <a href="/pricing">transparent and usage-based pricing</a>.</p><p>You can use the <a href="/wizard">setup wizard</a> to get started in minutes – no credit card required.</p><p><div></div></p><h4 id="faq">FAQ</h4><details><summary>What tools does PostHog replace?</summary><p>PostHog is less of a traditional replacement for tools like Looker and Tableau and more a replacement for your suite of dev tools like <a href="/blog/posthog-vs-amplitude">Amplitude</a>, <a href="/blog/posthog-vs-mixpanel">Mixpanel</a>, <a href="/blog/posthog-vs-fullstory">Fullstory</a>, <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a>, <a href="/blog/posthog-vs-hotjar">Hotjar</a>, <a href="/blog/posthog-vs-sentry">Sentry</a>, and <a href="/blog/best-survicate-alternatives">Survicate</a>.</p></details><details><summary>Can it connect to my data warehouse?</summary><p>Yes. PostHog can connect to many of the popular data warehouse providers including <a href="/docs/data-warehouse/sources/s3">S3</a>, <a href="/docs/data-warehouse/sources/r2">R2</a>, <a href="/docs/data-warehouse/sources/gcs">GCS</a>, <a href="/docs/data-warehouse/sources/snowflake">Snowflake</a>, <a href="/docs/data-warehouse/sources/bigquery">BigQuery</a>, and more.</p></details><details><summary>Is there a hosted version?</summary><p>Yes. PostHog&#x27;s hosted Cloud version and all of its business intelligence features are free to use. It comes with 1 million events and 1 million rows synced for free every month. Beyond this, pricing is usage-based and <a href="/pricing">totally transparent</a>.</p></details><details><summary>Does PostHog have AI query generation?</summary><p>Yes. PostHog AI can generate and fix SQL queries for you, answer questions about your data, and more.</p></details><h3 id="2-metabase">2. Metabase</h3><ul><li>License: AGPLv3</li><li>GitHub stars: 46.5k as of March 2026</li><li><a href="https://github.com/metabase/metabase">Metabase on GitHub</a></li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/metabase_fa7dbf71d9.png" alt="Metabase"/></p><p>Metabase is an <a href="/blog/best-open-source-analytics-tools">open source analytics tool</a> that easily connects to your existing database. </p><p>Once connected, Metabase offers an easy to use and powerful query builder. Visualizations can be built with or without SQL. Within these, users can drill down to filter, breakout, or view the source table.</p><p>Once built, Metabase then enables teams to build and organize with dashboards and collections. They also provide permissioning to ensure only the right people have access to sensitive insights.</p><h4 id="what-makes-metabase-special">What makes Metabase special?</h4><p>Metabase is praised for its simplicity. It really is easy to connect to a data source and start querying fast. Its visualization builder is just as simple, with a clean UI that doesn&#x27;t require a power user to figure out. This means non-analysts can self-serve their data needs.</p><h4 id="faq-1">FAQ</h4><details><summary>What tools does Metabase replace?</summary><p>Metabase is a simpler alternative to BI tools like Tableau, Power BI, and Looker, but it misses some of the powerful data modeling that these tools provide. It is also similar to the SQL + viz tools like Mode, Superset, and Redash.</p></details><details><summary>Can it connect to my data warehouse?</summary><p>Metabase can connect to a bunch of popular databases including BigQuery, ClickHouse, Databricks, MongoDB, PostgreSQL, Redshift, Snowflake, and more.</p></details><details><summary>Is there a hosted version?</summary><p>Metabase Cloud provides a fully managed Metabase instance hosted in your region. They offer a free 14-day trial, then starts at $85 per month plus $5 per month per user.</p></details><details><summary>Does Metabase have AI query generation?</summary><p>Yes. Metabot lets you generate SQL queries, summarize charts, and answer docs questions.</p></details><h3 id="3-superset">3. Superset</h3><ul><li>License: Apache 2.0</li><li>GitHub stars: 71k as of March 2026</li><li><a href="https://github.com/apache/superset">Superset on GitHub</a></li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/superset_6f35a66cc9.jpg" alt="Superset"/></p><p>Apache Superset is a modern, open source exploration and visualization platform. Superset formed out of a 2015 Airbnb hackathon project.</p><p>It provides both no-code and SQL options for queries and 40+ pre-installed visualizations. In terms of “modernity”, it&#x27;s lightweight, scalable, and integrates with any SQL-based database, including cloud-native and petabyte-scale ones. </p><h4 id="what-makes-superset-special">What makes Superset special?</h4><p>Superset provides a few meta tools for making insight creation easier.</p><ol><li>A semantic layer for quickly defining custom dimensions and metrics. These abstractions map SQL to be more human-friendly.</li><li>Datasets which are subsets of data that make chart creation easier and queries more performant. This aims to be a middle point between a query-centric approach and a semantic-centric one.</li></ol><h4 id="faq-2">FAQ</h4><details><summary>What tools does Superset replace?</summary><p>Like Metabase, Superset generally replaces business intelligence tools like Tableau and Power BI as well as SQL + viz tools like Mode and Metabase. On top of this, its semantic layer is a lighter version of LookML and dbt metrics.</p></details><details><summary>Can it connect to my data warehouse?</summary><p>Superset can query data from any “SQL-speaking” datastore or data engine including Redshift, BigQuery, Snowflake, PostgreSQL, Databricks, and more.</p></details><details><summary>Is there a hosted version?</summary><p>Preset provides a scalable, enterprise-hosted version of Superset. It&#x27;s a company founded by the creator of Superset, Maxime Beauchemin.</p></details><details><summary>Does Superset have AI query generation?</summary><p>Preset&#x27;s <em>AI Assist</em> lets you write SQL queries with ease, but is only available on their professional and enterprise plans.</p></details><h3 id="4-grafana">4. Grafana</h3><ul><li>License: AGPLv3</li><li>GitHub stars: 72.7k as of March 2026</li><li><a href="https://github.com/grafana/grafana">Grafana on GitHub</a></li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/grafana_dashboard_english_2fe2b3cb4d.png" alt="Grafana"/></p><p>Grafana is an open source observability platform that centralizes metrics, logs, traces, and profiles. It provides observability for big infrastructure providers, monitoring for popular services, and connectors for other tools. </p><p>Once all this data is captured or connected, Grafana provides over 100 data visualization options to build all sorts of dashboards. It also provides more tools for making use of this data like alerts, transformations, and annotations.</p><h4 id="what-makes-grafana-special">What makes Grafana special?</h4><p>Grafana is one of the most mature tools on this list. It was founded in 2014, is valued at over $6B, has acquired companies like k6 and Amixr to add to its product suite, and has a massive library of data source and visualization plugins.</p><p>This means they are very popular with their core customer: infrastructure engineers. For these people, they provide a majority of tools they need like logging with Loki, tracing with Tempo, metrics with Mimir, and visualization with Grafana.</p><h4 id="faq-3">FAQ</h4><details><summary>What tools does Grafana replace?</summary><p>Grafana focuses on replacing monitoring visualization, and logging tools like Kibana, <a href="/blog/best-datadog-alternatives">Datadog</a>, New Relic, and Splunk.</p></details><details><summary>Can it connect to my data warehouse?</summary><p>Grafana can query a bunch of tools you already use like Snowflake, Splunk, Datadog, Linux, AWS, Docker, ClickHouse, PostgreSQL, Redshift, and more.</p></details><details><summary>Is there a hosted version?</summary><p>Grafana Cloud provides all the key features of Grafana without the overhead of maintaining your own stack. Its free tier provides 10k metrics, 50GB logs, traces, and profiles with a 14-day retention, and more.</p></details><details><summary>Does Grafana have AI query generation?</summary><p>Some data sources, like Azure Data Explorer, have AI query generation. Grafana has other AI features though, like incident summarization.</p></details><h3 id="5-evidence">5. Evidence</h3><ul><li>License: MIT</li><li>GitHub stars: 6k as of March 2026</li><li><a href="https://github.com/evidence-dev/evidence">Evidence on GitHub</a></li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/evidence_c0c74bbd76.png" alt="Evidence"/></p><p>Evidence is a modern frontend for data work. It focuses on providing a modern design and dev experience for building polished and performant data products like articles and dashboards. </p><p>It has focused on ensuring its query engine provides high performance on huge queries, and its data products provide a high quality experience for both internal and external teams. </p><p>The cloud version also has SOC 2 certification, row-level security, and other features enterprises expect from tools like these.</p><h4 id="what-makes-evidence-special">What makes Evidence special?</h4><p>In Evidence, everything is code. This means it combines SQL, markdown, and its templating language to provide a simple, but powerful development environment for their data products.</p><p>It also means they can do real-time syntax validation, version control, and testing. The cloud version adds AI tools to help users generate and edit this code based on natural language.</p><h4 id="faq-4">FAQ</h4><details><summary>What tools does Evidence replace?</summary><p>Evidence replaces the standard suite of dashboard builders like Tableau, Looker, and Power BI as well as the data notebook tools like Hex and Jupyter.</p></details><details><summary>Can it connect to my data warehouse?</summary><p>Evidence can be configured to connect to a range of data sources like BigQuery, Snowflake, Redshift, PostgreSQL, Databricks, and more.</p></details><details><summary>Is there a hosted version?</summary><p>Evidence Studio is the cloud version of Evidence. Released in June 2025, it provides a more expressive syntax, a fully web-based dev environment, and agentic AI to help you write queries.</p></details><details><summary>Does Evidence have AI query generation?</summary><p>Evidence&#x27;s AI agent can look up documentation, check your schema, and write queries (and Markdown) for you.</p></details><h3 id="6-redash">6. Redash</h3><ul><li>License: BSD-2</li><li>GitHub stars: 28.3k as of March 2026</li><li><a href="https://github.com/getredash/redash">Redash on GitHub</a></li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/redash_b3a8f5a223.png" alt="Redash"/></p><p>Redash is a tool that enables you to easily connect to your data sources, query them with SQL, and build dashboards for your team.</p><p>It supports a range of:</p><ol><li>SQL, NoSQL, big data, and API data sources from Redshift to MySQL to Postgres. </li><li>Charts and visualizations from boxplots to maps to funnels.</li></ol><p>Beyond this, Redash also provides alerts, an API to extend its functionality, SSO, and access controls. </p><h4 id="what-makes-redash-special">What makes Redash special?</h4><p>Redash is a narrower product than the other alternatives on this list. It focuses more on:</p><ol><li>Providing a great query writing experience with autocomplete, keyboard shortcuts, snippets, and results caching.</li><li>Creating useful dashboards with their collection of visualizations and sharing tools.</li></ol><p>Because of this simpler feature set, Redash can be simpler and lighter to self host.</p><h4 id="faq-5">FAQ</h4><details><summary>What tools does Redash replace?</summary><p>Redash provides a simple replacement for SQL + viz tools like Mode, Metabase, and Superset as well as the more powerful BI tools like Tableau and Looker Studio.</p></details><details><summary>Can it connect to my data warehouse?</summary><p>Redash supports a range of SQL, NoSQL, and big data tools including Redshift, ClickHouse, Databricks, PostgreSQL, and more.</p></details><details><summary>Is there a hosted version?</summary><p>Redash doesn&#x27;t have a hosted version. After being acquired by Databricks, it was shut down in November 2021. Other hosting services, like <a href="https://render.com/docs/deploy-redash">Render</a>, do offer a template for it though.</p></details><details><summary>Does Redash have AI query generation?</summary><p>Redash doesn&#x27;t have AI query generation.</p></details><h3 id="7-lightdash">7. Lightdash</h3><ul><li>License: MIT</li><li>GitHub stars: 5.6k as of March 2026</li><li><a href="https://github.com/lightdash/lightdash">Lightdash on GitHub</a></li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/lightdash_63940e2642.webp" alt="Lightdash"/></p><p>Lightdash makes it easy to turn your dbt project into BI dashboards easily.</p><p>Once set up leveraging your existing dbt models, it makes creating visualizations easy. These don&#x27;t require SQL and instead rely on their data catalog, pre-built metrics, and point and click explorer. It also includes an AI analyst co-pilot to help users self-serve their data needs. </p><p>Although reliant on dbt, Lightdash also provides integrations for warehouses, version control tools (like GitHub), alerting (Slack), and sharing. This helps it easily connect to your existing stack. </p><h4 id="what-makes-lightdash-special">What makes Lightdash special?</h4><p>Lightdash has connected itself deeply to dbt. It literally markets itself as “The BI platform built for dbt.” Like Evidence, this lets teams manage everything (like dashboards) as code.</p><p>Lightdash&#x27;s developer focus doesn&#x27;t stop there. They also provide version controls, staging, automated testing, and CI/CD toolings. </p><h4 id="faq-6">FAQ</h4><details><summary>What tools does Lightdash replace?</summary><p>Lightdash replaces BI tools like Looker (especially closely as their metric layer is modeled after LookML), Tableau, and Power BI. It also replaces the SQL + viz tools mentioned earlier.</p></details><details><summary>Can it connect to my data warehouse?</summary><p>Lightdash is reliant on dbt and has fewer integrations than other tools on this list, but still includes warehouses like Snowflake, PostgreSQL, Redshift, BigQuery, and Databricks.</p></details><details><summary>Is there a hosted version?</summary><p>Lightdash has a cloud hosted option that requires zero configuration, is updated daily, and enables unlimited users and visualizations. It starts at $800 per month with a 21-day free trial.</p></details><details><summary>Does Lightdash have AI query generation?</summary><p>Lightdash provides context-specific AI analysts that automatically select the most relevant models and metrics, build queries, and present insights. </p></details><h2 id="which-open-source-bi-tool-should-you-choose">Which open source BI tool should you choose?</h2><ul><li>Need one BI platform for your whole product stack – analytics, session replay, feature flags, error tracking, and more included? <strong>PostHog</strong>.</li><li>Need fast, accessible dashboards for non-technical users with a new semantic layer? <strong>Metabase</strong>.</li><li>Building an enterprise data platform with a semantic layer and 40+ visualization types? <strong>Superset</strong>.</li><li>Running infrastructure and need observability dashboards, alerting, and real-time monitoring? <strong>Grafana</strong>.</li><li>Want to build polished data products with code-first workflows and version control? <strong>Evidence</strong>.</li><li>Need a simple, lightweight self-hosted SQL + dashboard tool with minimal overhead? <strong>Redash</strong>.</li><li>Already using dbt and want a BI layer that treats dashboards as code? <strong>Lightdash</strong>.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think you&#x27;ll love PostHog if:</p><ul><li>You value transparency (we&#x27;re open source and open core)</li><li>You want an all in one platform, keeping your data in one place</li><li>You want to try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>)</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What are BI tools?</summary><p>Business intelligence (BI) tools help teams connect to data sources, query them, and turn the results into dashboards and visualizations that decision-makers can understand and act on. </p><p>They&#x27;re typically used for reporting on business metrics (e.g. revenue, operations, marketing performance) rather than tracking user behavior in a product.</p></details><details><summary>What features do you need in a BI tool?</summary><p>A good open source BI tool gives you visibility into your data without locking you into a proprietary platform. Most solid tools include:</p><ul><li><strong>SQL query editor</strong> for writing and running queries directly against your database</li><li><strong>Visual query builder</strong> for non-technical users who don&#x27;t want to write SQL</li><li><strong>Dashboard and chart builder</strong> for sharing insights across your team</li><li><strong>Database connectors</strong> for the sources you already use (Postgres, BigQuery, Snowflake, etc.)</li><li><strong>Self-hosting options</strong> so your data doesn&#x27;t leave your infrastructure</li></ul><p>More advanced tools add:</p><ul><li><strong>Semantic layer</strong> for defining reusable metrics and dimensions across your org</li><li><strong>AI query generation</strong> for writing SQL from natural language</li><li><strong>Embedded analytics</strong> for putting dashboards in your own product</li><li><strong>Scheduling and alerts</strong> for keeping teams informed without manual checks</li><li><strong>Version control and CI/CD</strong> for treating dashboards as code</li></ul></details><details><summary>What is the difference between BI tools and product analytics?</summary><p><strong>BI tools</strong> connect to your existing databases and data warehouses to query, visualize, and share business data – revenue, operations, marketing performance, and so on. They&#x27;re built around SQL and dashboards.</p><p><strong>Product analytics tools</strong> are designed specifically to track user behavior in your product – events, funnels, retention, user paths, and cohorts. They typically handle their own event ingestion and are optimized for behavioral data rather than general-purpose SQL queries.</p><p><strong>PostHog</strong> bridges both: it captures product events natively and connects to your external data sources through a built-in data warehouse, so you can query product and business data together in one place.</p></details><details><summary>What is the difference between data analytics and business intelligence?</summary><p>The terms are often used interchangeably, but <strong>business intelligence</strong> is typically backward-looking – it answers &quot;what happened?&quot; by reporting on historical data through dashboards and scheduled reports. </p><p><strong>Data analytics</strong> is broader and includes forward-looking analysis: finding patterns, building models, and answering &quot;why did it happen?&quot; and &quot;what might happen next?&quot;</p><p>In practice, most BI tools are optimized for the reporting layer. </p><p>Data analytics tools go deeper – running ad hoc queries, statistical analysis, and cohort breakdowns on behavioral data.</p><p> <strong>PostHog</strong> sits closer to the data analytics end: it&#x27;s less about static revenue dashboards and more about understanding user behavior, running experiments, and making product decisions from live data.</p></details><details><summary>What is the best free and open source business intelligence tool? </summary><p>We&#x27;re biased, but we think <a href="#1-posthog">PostHog</a> is one of the best free BI tools around, especially for startups and scale-ups who also need things like product analytics, feature flags, experiments, and error tracking.</p><p>It offers easy connectors to the sources you already use, easy-to-use visualizations, and a full SQL querying, and it puts all your data in one place so you can query product and company data together. </p><p>There&#x27;s a generous free tier of 1 million events and 1 million rows synced for free every month if you <a href="/signup">sign up for our Cloud hosted version</a>, too.</p><p>If you don&#x27;t want an all-in-one platform like PostHog, the next best option is <a href="#2-metabase">Metabase</a>.</p></details><details><summary>Should I self-host a BI tool?</summary><p>It depends on your team&#x27;s infrastructure capacity and data requirements. Self-hosting gives you full control over where your data lives – important for teams with strict data residency or compliance requirements. But it also means managing upgrades, backups, and scaling yourself.</p><p>For most teams, a managed cloud option (PostHog Cloud, Metabase Cloud, Grafana Cloud) is the lower-effort path. For teams with existing DevOps capacity or strict data sovereignty requirements, self-hosting Metabase or Superset is a strong option.</p></details><details><summary>Can I use PostHog as a BI tool?</summary><p>Yes. PostHog includes a <a href="/data-stack">data warehouse</a> that syncs with external sources like Stripe, HubSpot, Postgres, Snowflake, and BigQuery. </p><p>You can query this data alongside your product events using PostHog&#x27;s <a href="/docs/data-warehouse/query">SQL editor</a>, build dashboards, and share insights across your team – all from the same platform where you run product analytics, session replay, and feature flags.</p></details><details><summary>What is the best open source alternative to Tableau?</summary><p><strong>Superset</strong> is the most direct open source alternative to Tableau for enterprise data teams – it has 40+ visualization types, a semantic layer, and scales to petabyte-level data. </p><p><strong>Metabase</strong> is a simpler, more accessible alternative for teams that want Tableau-like dashboards without the complexity. </p><p>For product and engineering teams, <strong>PostHog</strong> covers most BI needs alongside product analytics in a single platform.</p></details><div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[7 best free open source LLM observability tools right now]]></title><description><![CDATA[To build LLM-powered apps, developers need to know how users are using their app.  LLM observability tools help them do this by capturing LLM provider…]]></description><link>https://posthog.com/blog/best-open-source-llm-observability-tools</link><guid isPermaLink="false">8e0735f2-3638-5964-841f-69e8cd7cba3b</guid><dc:creator><![CDATA[Ian Vanagas]]></dc:creator><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/Film_Noir_Hog_Evals_beta_announcement_blog_95685493eb.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>To build LLM-powered apps, developers need to know how users are using their app. </p><p>LLM observability tools help them do this by capturing LLM provider requests and generations, then visualizing and aggregating them. This helps developers monitor, debug, and improve their apps. </p><p>To help you pick the best of these tools, we put together this list. All of the following products:</p><ol><li>Integrate with popular LLM providers like OpenAI, Anthropic, and Vercel AI SDK to capture generations.</li><li>Let you view individual generations and traces from your app.</li><li>Calculate and display an aggregated metrics dashboard with cost, latency, and more.</li><li>Are open source and self-hostable.</li><li>Have a free hosted version (minus one of them…)</li></ol><h2 id="1-posthog">1. PostHog</h2><ul><li>License: MIT</li><li>GitHub stars: 32.1k as of March 2026</li><li><a href="https://github.com/PostHog/posthog">PostHog on GitHub</a></li></ul><p><a href="/">PostHog</a> is an all-in-one developer platform that combines <a href="/llm-analytics">LLM observability</a> with several other developer-focused tools, such as <a href="/product-analytics">product</a> and <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, and <a href="/surveys">surveys</a>.</p><p>Its LLM observability product (known as <a href="/docs/llm-analytics">LLM analytics</a>) integrates with popular LLM providers, captures details of generations, provides an aggregated metrics dashboard, and more.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_04_07_at_11_06_21_678982e3a9.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_04_07_at_11_06_47_ffbe6e44cc.png" alt="PostHog" classes="rounded"></div><h4 id="what-makes-posthog-special">What makes PostHog special?</h4><p>PostHog’s LLM analytics app works with the rest of our dev tool suite. This means you can visualize LLM-related data along product and business data, create custom queries using <a href="/docs/product-analytics/sql">SQL</a>, view <a href="/docs/session-replay">session replays</a> of AI interactions, <a href="/tutorials/llm-ab-tests">A/B test prompts</a>, and more.</p><p>Two features worth highlighting for teams iterating on LLM apps:</p><ul><li><p><strong><a href="/docs/llm-analytics/prompt-management">Prompt management</a> (beta):</strong> Create and version prompts directly in PostHog. Prompts are fetched at runtime via the SDK with caching and fallback support, so you can update them without code deploys. Non-engineers can iterate on prompts from the UI, and every change creates an immutable version you can compare, restore, or link to traces to see which prompt versions drive which outputs.</p></li><li><p><strong><a href="/docs/llm-analytics/evals">Evaluations</a> (beta):</strong> Score LLM outputs automatically or with human review to track quality over time – not just whether API calls succeed, but <a href="/blog/stop-ai-slop">whether they&#x27;re actually good</a>.</p></li></ul><p>PostHog’s hosted Cloud version and all of its LLM analytics features are free to use. It comes with 100k LLM observability events for free every month with 30 day retention. Beyond this, pricing is usage-based and <a href="/pricing">totally transparent</a>. </p><p>Use the <a href="/wizard">setup wizard</a> to get started in minutes – no sales call or elaborate configuration needed.</p><p><div></div></p><h2 id="2-langfuse">2. Langfuse</h2><ul><li>License: MIT</li><li>GitHub stars: 23.3k as of March 2026</li><li><a href="https://github.com/langfuse/langfuse">Langfuse on GitHub</a></li></ul><p><a href="/docs/llm-analytics/integrations/langfuse-posthog">Langfuse</a> (recently acquired by ClickHouse) is an open source LLM engineering platform. It provides LLM call tracking and tracing, prompt management, evaluation, datasets, and more. These give LLM app developers tools they need for their entire workflow.</p><p>Langfuse can be self-hosted for free. If you prefer a managed service, Langfuse Cloud is free to use up to 50k events per month and 2 users, but this only includes 30 day data access. Pricing beyond this starts at $29/m for 100k events with additional events at $8/m more.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/langfuse_6db7c2d9e7.png" alt="Langfuse dashboard"/></p><h4 id="what-makes-langfuse-special">What makes Langfuse special?</h4><p>Langfuse is one of the original tools in the LLM observability space. This means it has a wide range of tools for LLM app developers to use and have been instrumental in defining what they look like. </p><p>It also claims to be the most used open LLMOps platform. Beyond its early entry, this is thanks to its integrations with most LLM providers and agent frameworks, native SDKs for Python and JavaScript, and its ability to act as an OpenTelemetry backend</p><p>Langfuse is also the most fully-featured LLM observability tool. Its pricing page lists a huge 78 features from session tracking to batch exports to SOC2 compliance. </p><h2 id="3-opik">3. Opik</h2><ul><li>License: Apache 2.0</li><li>GitHub stars: 18.3k as of March 2026</li><li><a href="https://github.com/comet-ml/opik">Opik on GitHub</a></li></ul><p>Opik is an open source platform for evaluating, testing, and monitoring LLM apps. It provides tracing, annotations, a prompt and model playground, evaluation, and more. It’s built by Comet, an end-to-end model evaluation platform for developers.</p><p>Opik’s free hosted plan provides 25k spans per month with unlimited team members and a 60-day data retention. Beyond this, its Pro plan is $19 per month for 100k spans per month with every extra 100k spans costing $5.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/opik_7fcc9b0840.png" alt="Opik dashboard"/></p><h4 id="what-makes-opik-special">What makes Opik special?</h4><p>Thanks to Opik’s integration with Comet, it’s the only tool on this list that appeals to LLM developers, not just LLM <em>app</em> developers. This means it is ideal for teams training and hosting models of their own, not just using the LLM providers. </p><h2 id="4-openllmetry">4. OpenLLMetry</h2><ul><li>License: Apache 2.0</li><li>GitHub stars: 6.9k as of March 2026</li><li><a href="https://github.com/traceloop/openllmetry">OpenLLMetry on GitHub</a></li></ul><p>OpenLLMetry is an open-source observability product for LLM applications based on OpenTelemetry. It was built by Traceloop and recommends using its SDK to capture data. </p><p>Traceloop is free up to 50k spans per month and 5 seats, but this only provides 24-hour data retention. Beyond this, you’ll need to talk to sales. </p><p>OpenLLMetry can capture data from a range of LLM providers, vector DBs, and LLM frameworks. It can then send this data to a range of supported destinations from Traceloop to <a href="/blog/best-datadog-alternatives">Datadog</a> to Honeycomb.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/openllmetry_aa916c3921.png" alt="OpenLLMetry dashboard"/></p><h4 id="what-makes-openllmetry-special">What makes OpenLLMetry special?</h4><p>With its range of extensions and destinations, OpenLLMetry is very likely to integrate with the observability tools you already use. </p><p>It integrates with the broader OpenTelemetry ecosystem, meaning it can instrument things like your database, API calls, and more. Their semantic conventions for LLM were also adopted by the OpenTelemetry project. </p><h2 id="5-phoenix">5. Phoenix</h2><ul><li>License: Elastic License 2.0</li><li>GitHub stars: 8.9k as of March 2026</li><li><a href="https://github.com/Arize-ai/phoenix">Phoenix on GitHub</a></li></ul><p>Phoenix is an open source AI observability platform. It provides tracing, evaluation, experiments, prompt management, and more. It works out-of-the-box with frameworks like LlamaIndex and LangChain as well as LLM providers like OpenAI, Bedrock, and more. It’s built by Arize AI, a unified AI observability and evaluation platform. </p><p>Arize doesn’t provide a free hosted version of Phoenix. Their product, AX Pro, starts at $50 per month for 10k spans and up to 3 users.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/phoenix_fb7498c189.png" alt="Phoenix"/></p><h4 id="what-makes-phoenix-special">What makes Phoenix special?</h4><p>Similar to OpenLLMetry, Phoenix works well with OpenTelemetry thanks to a set of conventions and plugins that are complimentary to OpenTelemetry. This means Phoenix can more easily integrate into your existing Telemetry stack. </p><p>Like Opik, Phoenix is connected to a broader AI development platform. Unique to Arize’s platform is their observability tools for ML and computer vision helping developers debug and improve these systems.</p><h2 id="6-helicone">6. Helicone</h2><ul><li>License: Apache 2.0</li><li>GitHub stars: 5.3k as of March 2026</li><li><a href="https://github.com/Helicone/helicone">Helicone on GitHub</a></li></ul><p><a href="/docs/llm-analytics/integrations/helicone-posthog">Helicone</a> is an open source platform for monitoring, debugging, and improving LLM applications. Beyond integrations with popular LLM providers, tracing, and an aggregate analytics dashboard, Helicone provides more tools like prompt management and evals. </p><p>Recently acquired by Mintlify, it will continue operating in maintenance mode.</p><p>Its hosted version is free up to 10,000 requests with some features limited to the $79/m pro and $799/m team plans. The costs for requests beyond the first 10,000 is unknown, though.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/helicone_0a6eeadac6.png" alt="Helicone dashboard"/></p><h4 id="what-makes-helicone-special">What makes Helicone special?</h4><p>Helicone provides purpose-built tools for improving LLMs, like its prompt playground, prompt management, evaluation scoring, and feedback. This helps developers improve their LLM applications.</p><p>For developers focused on performance and reliability concerns, Helicone also contains both proxy and async interfaces for integrating with LLM providers. This ensures Helicone is only on your critical path if you want it to be. </p><h2 id="which-llm-observability-tool-should-you-choose">Which LLM observability tool should you choose?</h2><ul><li>Want LLM observability running alongside product analytics, session replay, A/B testing, feature flags, and more in one platform for full visibility? <strong>PostHog</strong></li><li>Need the most fully-featured LLM observability platform? <strong>Langfuse</strong></li><li>Building or fine-tuning models as well as LLM apps? <strong>Opik</strong> (via Comet)</li><li>Already using OpenTelemetry and want LLM instrumentation to fit into your existing stack? <strong>OpenLLMetry</strong></li><li>Need AI observability beyond LLMs – including ML models and computer vision? <strong>Phoenix</strong></li><li>Want purpose-built tools for improving LLM outputs through prompt iteration and evals? <strong>Helicone</strong> </li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think you&#x27;ll love PostHog if:</p><ul><li>You want LLM observability connected to the rest of your product data – session replays, feature flags, A/B testing, and analytics all in one place</li><li>You&#x27;re already using PostHog, so adding LLM analytics requires no extra setup or contract</li><li>You want to try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>)</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs/llm-analytics">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is LLM observability?</summary><p>LLM observability is the practice of monitoring and understanding how your LLM-powered application behaves in production. It typically includes capturing individual LLM calls (inputs, outputs, latency, token usage), aggregating metrics across requests, and providing tools to debug issues and improve model performance.</p><p>It&#x27;s similar to traditional application observability, but focused on the unique characteristics of LLM systems – non-deterministic outputs, high token costs, prompt sensitivity, and the challenge of evaluating quality.</p></details><details><summary>What features do you need in an LLM observability tool?</summary><p>A good LLM observability tool gives you visibility into how your AI-powered app is performing in production. Most solid tools include:</p><ul><li><strong>Tracing and logging</strong> to capture individual LLM calls, inputs, outputs, and latency</li><li><strong>Cost tracking</strong> to monitor token usage and spend across providers and models</li><li><strong>Aggregated dashboards</strong> for monitoring performance trends over time</li><li><strong>Self-hosting options</strong> so you keep full control of your data and model inputs</li></ul><p>More advanced tools go further with:</p><ul><li><strong>Prompt management</strong> for versioning, testing, and deploying prompts</li><li><strong>Evaluation and evals</strong> to score model outputs automatically or with human review</li><li><strong>Datasets</strong> for curating examples and running regression tests</li><li><strong>Integration with product analytics</strong> so you can connect LLM performance to user behavior</li><li><strong>OpenTelemetry compatibility</strong> for teams with existing observability infrastructure</li></ul></details><details><summary>When should you consider an LLM observability tool?</summary><p>If you&#x27;re building an LLM-powered app and have shipped to real users, you need one. Common signals that you&#x27;re ready:</p><ul><li>You&#x27;re not sure which prompts or models are causing user drop-off</li><li>You&#x27;re spending more on tokens than expected and don&#x27;t know where the cost is going</li><li>You have no visibility into latency spikes or failure rates</li><li>You want to run evals or compare model versions systematically</li></ul><p>Most tools on this list are free to start, so there&#x27;s no reason to wait.</p></details><details><summary>Do I need a separate LLM observability tool if I already use PostHog?</summary><p>No. PostHog&#x27;s <a href="/docs/llm-analytics">LLM analytics</a> product is built into the platform, so if you&#x27;re already using PostHog for product analytics or session replay, you can add LLM observability without any additional setup or contract. You get 100k LLM events free per month.</p><p><a href="docs/llm-analytics/start-here">Getting started</a> is easy; once you install the SDK, it will handle all the heavy lifting. Use your LLM provider as normal and we&#x27;ll capture everything automatically.</p></details><details><summary>What&#x27;s the difference between LLM observability and traditional application monitoring?</summary><p><strong>Traditional application monitoring</strong> focuses on things like error rates, latency, and uptime – binary metrics where something either works or doesn&#x27;t. </p><p><strong>LLM observability</strong> adds a quality dimension: you need to evaluate whether model outputs are actually good, not just whether the API call succeeded. This is why tools like Langfuse and Opik invest heavily in evals, human review, and prompt management – capabilities that don&#x27;t exist in traditional APM tools.</p></details><details><summary>Are these tools compatible with all LLM providers?</summary><p>Most tools on this list support the major providers – OpenAI, Anthropic, Google Gemini, and AWS Bedrock – as well as popular frameworks like LangChain, LlamaIndex, and Vercel AI SDK. Coverage varies by tool. <strong>Langfuse</strong> and <strong>PostHog</strong> have the broadest integration coverage.</p><p>For specific provider support, check each tool&#x27;s documentation.</p></details><h2 id="related-reading">Related reading</h2><ul><li><a href="/docs/llm-analytics">PostHog LLM analytics documentation</a></li><li><a href="/tutorials/llm-ab-tests">How to A/B test LLM prompts with PostHog</a></li><li><a href="/blog/best-error-tracking-tools">The best error tracking tools</a> – if you&#x27;re also instrumenting the rest of your app alongside the LLM parts</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs LogRocket]]></title><description><![CDATA[Want to know how PostHog and LogRocket compare? If you remember nothing else, remember these two things: LogRocket  is a frontend monitoring tool that…]]></description><link>https://posthog.com/blog/posthog-vs-logrocket</link><guid isPermaLink="false">cf166202-41ad-58c2-9143-3bd8a5383e19</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-logrocket/posthog-vs-logrocket.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Want to know how PostHog and LogRocket compare? If you remember nothing else, remember these two things:</p><ol><li><p><strong>LogRocket</strong> is a frontend monitoring tool that helps developers detect and solve issues.</p></li><li><p><strong>PostHog</strong> goes beyond just frontend monitoring by integrating powerful <a href="/product-analytics">analytics</a>, <a href="/session-replay">session replay</a>, <a href="/error-tracking">error tracking</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, and more into one platform.</p></li></ol><h2 id="how-is-posthog-different">How is PostHog different?</h2><h3 id="1-posthog-replaces-multiple-tools">1. PostHog replaces multiple tools</h3><p><a href="/blog/best-logrocket-alternatives">LogRocket</a> is a narrow tool. It does one thing, frontend monitoring, and it does it well. PostHog includes many of the same tools, such as <a href="/docs/session-replay">session replay</a>, <a href="/docs/error-tracking">error tracking</a>, and console logs, but augments them with powerful dev tools, such as <a href="/docs/product-analytics">product analytics</a>, <a href="/docs/feature-flags">feature flags</a>, <a href="/docs/experiments">A/B testing</a>, <a href="/docs/surveys">surveys</a>, and more. It&#x27;s everything you need to both squash bugs <em>and</em> understand every aspect of user behavior.</p><h3 id="2-posthog-is-for-engineers-technical-users-builders">2. PostHog is for engineers, technical users, <em>builders</em></h3><p>PostHog is designed from the ground up to meet the needs of developers, and product-focused engineers. Session replay includes advanced tools for debugging errors and performance issues, while feature flags make it easy to test, and roll out, new features at scale. You get <a href="/docs/product-analytics/sql">SQL access</a>, an <a href="/docs/model-context-protocol">MCP server</a>, a fully documented <a href="/docs/api">API</a>, and <a href="/docs/libraries">SDKs</a> for every major platform.</p><h3 id="3-transparent-pricing-generous-free-tiers">3. Transparent pricing, generous free tiers</h3><p>Our <a href="/pricing">pricing</a> is 100% transparent. There are no hidden fees or surprise overages – what you see is exactly what you&#x27;ll pay.</p><p>We also default to charging as little as possible while still making a sensible margin, and every product comes with a generous free tier. In fact, more than 90% of companies use PostHog for free!</p><p>Getting started takes minutes. Our <a href="/wizard">AI setup wizard</a> handles framework detection, SDK configuration, and initial event setup automatically – so you&#x27;re capturing data without any manual instrumentation work.</p><p><div></div></p><h2 id="comparing-posthog-and-logrocket">Comparing PostHog and LogRocket</h2><p>PostHog and LogRocket overlap on session replay and frontend monitoring, but diverge significantly on breadth. PostHog includes a wider range of tools that LogRocket doesn&#x27;t offer, while LogRocket focuses on doing frontend debugging exceptionally well.</p><p><div competitors="posthog,logrocket"></div></p><h3 id="product-analytics">Product analytics</h3><p>While LogRocket offers some product analytics features, it isn&#x27;t primarily a product analytics tool and lacks many things product managers and engineers require. PostHog is a more capable product analytics app, offering advanced features such as correlation analysis, custom formulas, and a flexible SQL query editor.</p><ul><li><p><strong>Correlation analysis:</strong> Enables you to <a href="/docs/product-analytics/correlation">automatically find correlated events or properties</a> which affect the conversion rate of users within a funnel. LogRocket doesn&#x27;t offer any such automated correlation discovery, meaning users must search for correlating factors without assistance.</p></li><li><p><strong>SQL access:</strong> PostHog gives you full access to your data by <a href="/docs/sql">writing your own SQL queries</a>. LogRocket doesn&#x27;t offer SQL access.</p></li></ul><p><div competitors="posthog,logrocket"></div></p><h3 id="session-replay">Session replay</h3><p>Both PostHog and LogRocket offer developer-focused <a href="/blog/best-session-replay-tools">session replay tools</a> that goes beyond what dedicated UX research tools like <a href="/blog/posthog-vs-hotjar">Hotjar</a> provide.</p><ul><li><p><strong>Redux/state capture:</strong> LogRocket captures Redux and Vuex state at the moment of each action – a powerful feature for debugging React and Vue apps. PostHog doesn&#x27;t have native state management capture.</p></li><li><p><strong>AI session summaries:</strong> PostHog includes <a href="/docs/posthog-ai/session-summaries">AI-powered session summaries</a> as part of PostHog AI. LogRocket has Galileo AI, which proactively surfaces user struggle patterns and UX recommendations across sessions.</p></li></ul><p><div competitors="posthog,logrocket"></div></p><h3 id="error-tracking">Error tracking</h3><p>LogRocket focuses on frontend JavaScript error tracking paired with session replay – you see the error alongside the full replay context of what the user was doing. </p><p>PostHog&#x27;s <a href="/error-tracking">error tracking</a> connects exceptions to session replays, user behavior, and feature flag changes, but is less mature than <a href="/blog/best-error-tracking-tools">dedicated tools for deep observability workflows</a>.</p><p><div competitors="posthog,logrocket"></div></p><h3 id="sdks-and-tracking">SDKs and tracking</h3><p>Both PostHog and LogRocket support broad tracking options, manual event instrumentation, and autocapture. PostHog supports a wide range of web, mobile, and server libraries, although not all features are available across all of them. LogRocket lacks server-side library support.</p><p><div competitors="posthog,logrocket"></div></p><h3 id="data-pipelines">Data pipelines</h3><p>PostHog offers <a href="/cdp">more than 50 integrations</a>, while LogRocket offers slightly fewer. Both tools integrate with popular third-party services.</p><p><div competitors="posthog,logrocket"></div></p><h4 id="popular-integrations">Popular integrations</h4><p>See our <a href="/data-stack/integrations-library">library</a> for a full list.</p><p><div competitors="posthog,logrocket"></div></p><h3 id="compliance">Compliance</h3><p>Both PostHog and LogRocket are SOC 2 certified and GDPR-ready. PostHog adds HIPAA compliance, cookieless tracking, and an open-source codebase you can audit – useful for teams in regulated industries or with strict data residency requirements.</p><p><div competitors="posthog,logrocket"></div></p><h2 id="when-to-choose-posthog-vs-logrocket">When to choose PostHog vs LogRocket</h2><ul><li><p>Want session replay connected to feature flags, A/B testing, product analytics, error tracking, and more – all in one platform with transparent pricing? Go with <strong>PostHog</strong>.</p></li><li><p>Need debugging with a focus on front-end engineering workflows? <strong>LogRocket</strong> is built for that.</p></li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><p><strong>For engineering-led product teams</strong></p><ul><li><strong>PostHog</strong> – SQL access, open-source code, an <a href="/docs/model-context-protocol">MCP server</a> for AI coding tools, feature flags, error tracking, and session replay connected to your full analytics. Everything lives in one platform with a shared data model.</li></ul><p><strong>For frontend engineers debugging production issues</strong></p><ul><li><strong>LogRocket</strong> – Galileo AI proactive issue surfacing and session replay paired with console logs and network monitoring are purpose-built for front-end debugging workflows. PostHog&#x27;s replay is strong but doesn&#x27;t match LogRocket here.</li></ul><p><strong>For teams who need feature flags and A/B testing</strong></p><ul><li><strong>PostHog</strong> – LogRocket has no feature flags or experiments natively. PostHog includes both, tightly integrated with analytics and session replay so you can measure impact and filter replays by flag variant.</li></ul><p><strong>For teams building AI products</strong></p><ul><li><strong>PostHog</strong> – <a href="/llm-analytics">LLM analytics</a> tracks model performance, token costs, latency, and traces. The <a href="/docs/model-context-protocol">MCP server</a> lets AI coding tools like Cursor and Claude Code query your product data without leaving the editor. LogRocket doesn&#x27;t offer AI observability tooling.</li></ul><p><strong>For privacy-conscious and regulated organizations</strong></p><ul><li>Both are SOC 2 certified and GDPR-ready. <strong>PostHog</strong> adds open-source code, cookieless tracking, EU data residency, and HIPAA compliance. LogRocket supports GDPR and CCPA but is closed source and doesn&#x27;t publish HIPAA compliance.</li></ul><p><strong>For early-stage startups</strong></p><ul><li><strong>PostHog</strong> – A generous free tier across every product (1M events, 5k replays, 1M flag requests/mo), transparent pricing you can model in advance, and <a href="/startups">startups can qualify for $50k in free credits</a>. LogRocket&#x27;s free tier is limited to 1,000 sessions/month with 1 month of data retention.</li></ul><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What&#x27;s the difference between PostHog and LogRocket?</summary><p><strong>LogRocket</strong> is a frontend monitoring tool focused on session replay, JavaScript error tracking, and performance profiling. One standout features for engineering teams is Galileo AI, which proactively surfaces user struggle patterns and UX issues without manual review.</p><p><strong>PostHog</strong> is an all-in-one developer platform combining <a href="/session-replay">session replay</a>, <a href="/product-analytics">product analytics</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/error-tracking">error tracking</a>, <a href="/surveys">surveys</a>, and more. The platform includes SQL access, an MCP server for AI coding tools, and an open-source codebase.</p><p>The key difference is scope: <strong>LogRocket</strong> is optimized for frontend engineers who want focused debugging tooling. <strong>PostHog</strong> is optimized for engineering-led teams who want to measure, experiment, and ship – all from one platform.</p></details><details><summary>Does LogRocket have feature flags or A/B testing?</summary><p>No. LogRocket doesn&#x27;t offer native feature flags, A/B testing, or experimentation. You&#x27;d need a separate tool like LaunchDarkly, Statsig, or PostHog for this.</p><p><strong>PostHog</strong> includes both <a href="/feature-flags">feature flags</a> and <a href="/experiments">experimentation</a> natively, tightly integrated with analytics and session replay. You can roll out features gradually, measure experiment impact on funnels and retention, and filter session replays to specific flag variants.</p></details><details><summary>Does PostHog have Redux state capture like LogRocket?</summary><p>Not natively. LogRocket&#x27;s Redux/Vuex state management capture is one of its strongest differentiators for React and Vue engineering teams – you can see the exact application state at the moment something went wrong.</p><p>PostHog&#x27;s session replay captures console logs, network requests, DOM events, and performance metrics, but not Redux state directly. If Redux state capture is essential to your debugging workflow, LogRocket is the better choice for that specific use case.</p></details><details><summary>Can PostHog replace LogRocket?</summary><p>For most teams, yes. PostHog covers session replay, error tracking, and product analytics – and adds feature flags, A/B testing, and surveys that LogRocket doesn&#x27;t have.</p><p>Check out the <a href="/blog/best-logrocket-alternatives">best LogRocket alternatives</a> if you&#x27;re evaluating multiple options.</p></details><details><summary>How much does LogRocket cost?</summary><p>LogRocket&#x27;s free Developer tier covers 1,000 sessions/month with 1 month of data retention. Team plans start at $69/month and scale by session count and user seats. Professional is custom pricing and includes performance monitoring and advanced reporting.</p></details><details><summary>How much does PostHog cost?</summary><p>PostHog uses transparent, usage-based <a href="/pricing">pricing</a>. It&#x27;s free to get started – no credit card required – and every month you get 1 million analytics events, 5,000 session replays, and 1 million feature flag requests for free.</p><p>After the free tier, you pay only for what you use, and pricing gets cheaper at scale. You can set billing limits per product to avoid surprises. Volume discounts and <a href="/startups">startup credits of $50k</a> are available. More than 90% of PostHog users stay on the free tier.</p></details><details><summary>Does PostHog offer EU hosting?</summary><p>Yes. PostHog offers EU-hosted cloud with data stored exclusively in the EU. PostHog is SOC 2 certified, GDPR-ready, and HIPAA-ready, with cookieless tracking options and an open-source codebase you can audit.</p><p>LogRocket supports GDPR and CCPA compliance but doesn&#x27;t publish EU-specific data residency options.</p></details><details><summary>Is there a free LogRocket alternative?</summary><p>Yes. PostHog&#x27;s free tier covers 5,000 session replays/month – 5x LogRocket&#x27;s 1,000 – plus product analytics, feature flags, and more. Microsoft Clarity is completely free with unlimited sessions (though it has no product analytics or error tracking). Hotjar has a free tier for basic heatmaps and recordings.</p></details><details><summary>Does LogRocket have an MCP server?</summary><p>Yes, LogRocket has an MCP server that lets you query session data from AI coding tools. PostHog also has an <a href="/docs/model-context-protocol">MCP server</a> that connects your full product data – analytics, feature flags, session replays, and more – to tools like Cursor and Claude Code.</p></details><details><summary>Where can I learn more about session replay tools beyond PostHog and LogRocket?</summary><p>For a broader comparison, check out our full guide to the <a href="/blog/best-logrocket-alternatives">best LogRocket alternatives</a>, which covers FullStory, Sentry, Glassbox, Smartlook, and Hotjar. For a wider view across the session replay market, see our guide to the <a href="/blog/best-session-replay-tools">best session replay tools for developers</a>.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The most popular PostHog alternatives, compared]]></title><description><![CDATA[PostHog is a developer platform that combines  product analytics ,  web analytics ,  session replay ,  feature flags ,  experiments ,  error tracking…]]></description><link>https://posthog.com/blog/posthog-alternatives</link><guid isPermaLink="false">0f00ea4e-59e8-5f75-9d35-c694bbce2846</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-alternatives/posthog-alternatives.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog is a developer platform that combines <a href="/product-analytics">product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, <a href="/surveys">surveys</a>, and more. </p><p>As an all-in-one platform, it replaces <em>a lot</em> of legacy tools. PostHog is great if you:</p><ol><li>Need quantitative <em>and</em> qualitative insights into user behavior</li><li>Want easy control over new features roll outs, kill switches, and feature gating</li><li>Desire one integrated tool over a complex stack of discrete solutions</li></ol><p>This guide covers the most popular PostHog alternatives honestly – what they&#x27;re good at, where they fall short, and who they&#x27;re actually for.</p><details><summary>What does PostHog actually do?</summary><p>PostHog is a product development platform that includes:</p><ul><li><strong><a href="/ai">PostHog AI</a>:</strong> Built-in AI tools including an MCP server, natural language querying, AI-powered session summaries, and more.</li><li><strong><a href="/product-analytics">Product analytics</a>:</strong> Funnels, retention, user paths, cohorts, and trends. SQL access for power users.</li><li><strong><a href="/session-replay">Session replay</a>:</strong> Watch real user sessions with console logs, network monitoring, and a DOM explorer.</li><li><strong><a href="/feature-flags">Feature flags</a>:</strong> Roll out features to specific users or groups without redeploying.</li><li><strong><a href="/experiments">Experiments</a>:</strong> Run multivariate experiments tied directly to your analytics data.</li><li><strong><a href="/error-tracking">Error tracking</a>:</strong> Monitor exceptions linked to session replays and user behavior.</li><li><strong><a href="/surveys">Surveys</a>:</strong> Targeted, multi-step surveys with NPS, CSAT, and PMF templates.</li><li><strong><a href="/web-analytics">Web analytics</a>:</strong> Traffic sources, pageviews, UTM tracking, and conversion goals.</li><li><strong><a href="/docs/llm-analytics">LLM analytics</a>:</strong> Track token usage, latency, costs, and user feedback across your AI pipelines.</li><li><strong><a href="/data-warehouse">Data warehouse</a>:</strong> Query your external data sources alongside PostHog data in one place.</li><li><strong><a href="/cdp">CDP</a>:</strong> Send data to and from PostHog with a library of integrations and transformations.</li><li><strong><a href="/logs">Logs</a>:</strong> Capture and search log data alongside your analytics and session replays.</li><li><strong><a href="/workflows">Workflows</a>:</strong> Automate actions and notifications based on product events.</li></ul><p>It&#x27;s priced per product with a <a href="/pricing">generous free tier</a> – 90% of companies use PostHog for free!</p><p>PostHog is built by engineers, for engineers. Everything is open source, and the <a href="/docs/model-context-protocol">MCP server</a> means your AI coding assistant can query your product data without leaving your editor.</p></details><details><summary>When should you consider a PostHog alternative?</summary><p>PostHog isn&#x27;t the right fit for everyone. You might want an alternative if:</p><ul><li><strong>You need product tours or in-app guides</strong> – PostHog has no no-code guide builder for tooltips, walkthroughs, or banners. <a href="/blog/posthog-vs-pendo">Pendo</a> is the go-to here.</li><li><strong>You need multi-touch attribution</strong> – PostHog doesn&#x27;t have marketing attribution modeling. <a href="/blog/posthog-vs-amplitude">Amplitude</a> is stronger for growth and marketing teams who need this.</li><li><strong>You only need one specific tool for a lightweight use case</strong> – For example, you just want cookieless, privacy-friendly traffic stats with a minimal script and no consent banners, a focused tool like <a href="/blog/posthog-vs-plausible">Plausible</a> or <a href="/blog/best-fathom-alternatives">Fathom</a> might be simpler and cheaper than a full platform.</li><li><strong>You prefer to fully self-host</strong> – PostHog can be self-hosted, but it&#x27;s operationally complex at scale. Tools like <a href="/blog/posthog-vs-matomo">Matomo</a> or <a href="/blog/best-open-source-session-replay-tools">OpenReplay</a> are designed with self-hosting as the primary deployment model.</li></ul></details><details><summary>Is it hard to deploy PostHog?</summary><p>Not at all for PostHog Cloud. Our <a href="/wizard">AI setup wizard</a> walks you through installation and configuration in a few minutes – run the command, answer a few questions, and you&#x27;re tracking events. No credit card required, and you don&#x27;t need to jump on a sales call. Most teams are up and running within a single session.</p><p><div></div></p><p>If you want to go further, PostHog has <a href="/docs/libraries">SDKs for every major platform and framework</a>, and the docs cover everything from basic pageview tracking to advanced group analytics and feature flag targeting.</p><p>Self-hosting is a different story – it&#x27;s more involved and requires managing your own infrastructure. </p><p>For most teams, PostHog Cloud (with US or <a href="/blog/posthog-cloud-eu">EU hosting options</a>) is the right choice.</p></details><details><summary>Is PostHog for me?</summary><p>If one or more of these sounds like you, yes:</p><ul><li><strong>You&#x27;re an engineer or technical founder</strong> – PostHog is built for people who like SQL, MCPs, APIs, and open-source code. You&#x27;ll feel at home.</li><li><strong>You&#x27;re an early-stage startup or solo founder launching your MVP</strong> – The free tier covers most early-stage needs, and <a href="/startups">PostHog for Startups</a> offers $50k in additional credits. You won&#x27;t need to swap tools as you scale.</li><li><strong>You&#x27;re building an AI product</strong> – PostHog has first-class support for <a href="/llm-analytics">LLM analytics</a>, error tracking for AI pipelines, and an MCP server that connects your product data to your AI coding tools.</li><li><strong>You don&#x27;t want to pay upfront</strong> – No credit card, no sales call, no minimum contract. You only pay when you exceed the <a href="/pricing">(very generous) free tier</a>.</li><li><strong>You want one source of truth</strong> – Instead of stitching together multiple tools (Mixpanel, LaunchDarkly, Sentry, and Hotjar), PostHog gives you the same capabilities and keeps all your product data in one place. Start with one product and expand into others without ever having to migrate your data.</li></ul><p>If you&#x27;re primarily a marketer, a non-technical product manager, or a customer success team that needs in-app guides, PostHog might not be the best fit. </p><p>Keep reading to explore the alternatives.</p></details><p><div></div></p><h2 id="amplitude">Amplitude</h2><ul><li><strong>Founded:</strong> 2012</li><li><strong>Similar to:</strong> Mixpanel, Heap</li><li><strong>Best known for:</strong> Product analytics</li><li><strong>Useful for:</strong> Product managers, growth and marketing teams</li></ul><h3 id="what-is-amplitude">What is Amplitude?</h3><p><a href="/blog/posthog-vs-amplitude">Amplitude</a> is a product analytics platform with a strong focus on behavioral analytics, retention, and growth. It&#x27;s well-established in the product analytics space and has built a broader platform that includes a CDP and a separate A/B testing product (Amplitude Experiment). </p><p><a href="/blog/best-amplitude-alternatives">Amplitude</a> is particularly strong for marketing and growth teams who need multi-touch attribution and predictive analytics.</p><h3 id="key-features">Key features</h3><ul><li><strong>Behavioral analytics:</strong> Charts, funnels, user paths, and retention with a polished interface.</li><li><strong>Predictive analytics:</strong> AI-powered forecasting and propensity scoring.</li><li><strong>Multi-touch attribution:</strong> Track the full marketing funnel and channel impact on conversion.</li><li><strong>Guides and Surveys:</strong> Behavior-based in-app tooltips, walkthroughs, NPS surveys, and popups triggered by cohorts and behavioral data.</li><li><strong>Amplitude CDP:</strong> Built-in customer data platform for managing user data and identity resolution.</li><li><strong>Amplitude Experiment:</strong> Separate A/B testing product with feature flagging.</li><li><strong>Amplitude AI:</strong> A suite of AI capabilities including AI Agents, AI Feedback, and an MCP server for querying Amplitude data from Claude, Cursor, and other AI tools.</li></ul><h3 id="how-does-amplitude-compare-to-posthog">How does Amplitude compare to PostHog?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Amplitude<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-amplitude">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Paid add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/logs"><strong>Logs</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Search and analyze your application logs with OpenTelemetry.</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/workflows"><strong>Workflows</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Automate workflows with your product data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI assistant</strong><div class="text-sm text-secondary mt-1">Use AI to assist with tasks and queries</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Transparent pricing</strong><div class="text-sm text-secondary mt-1">Clear, upfront pricing with no hidden fees</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="key-differences">Key differences</h3><ol><li><p><strong>Marketing vs. engineering focus:</strong> Amplitude offers multi-touch attribution, predictive forecasting, a CDP, and AI Visibility (which tracks how your brand appears in LLMs), which PostHog doesn&#x27;t have. PostHog is designed for engineers and product teams: both have MCP servers, but PostHog adds SQL access, open-source code, error tracking, and logs. It also <a href="/changelog">ships relentlessly</a> – new features land every week, which tends to matter to engineering teams who want their tools to keep up.</p></li><li><p><strong>AI capabilities:</strong> Both have AI assistants and MCP servers for querying data from tools like Claude and Cursor. Amplitude&#x27;s AI Feedback stands out for marketing teams – it aggregates and synthesizes user signals from Zendesk, G2, Reddit, app store reviews, and more into prioritized product insights. PostHog has first-class <a href="/docs/llm-analytics">LLM analytics</a> for AI product teams – tracking token usage, latency, costs, and user feedback across AI pipelines – something Amplitude doesn&#x27;t have.</p></li><li><p><strong>Pricing:</strong> </p></li></ol><ul><li><p>Amplitude&#x27;s free Starter plan includes 10K MTUs (up to 10M events), 1,000 session recordings, and unlimited feature flags – enough for early exploration, but teams that need behavioral cohorts, advanced segmentation, or feature experimentation will need to upgrade. Growth and Enterprise pricing requires contacting sales.</p></li><li><p>PostHog&#x27;s free tier covers 1 million analytics events, 5,000 web session replays, 100k flag requests and more with no MTU cap. Pricing is <a href="/pricing">transparent and entirely usage-based</a>, with discounts for bulk purchases.</p></li></ul><blockquote><h4 id="bottom-line">Bottom line</h4><p>Amplitude is the better choice for growth and marketing teams who need multi-touch attribution and predictive analytics. PostHog is the better choice for engineering and product teams who want session replay, feature flags, error tracking, LLM analytics, and more alongside their core analytics.</p></blockquote><h2 id="mixpanel">Mixpanel</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-vs-mixpanel/posthog-vs-mixpanel.jpeg" alt="mixpanel posthog"/></p><ul><li><strong>Founded:</strong> 2009</li><li><strong>Similar to:</strong> Amplitude, Heap</li><li><strong>Best known for:</strong> Product analytics</li><li><strong>Useful for:</strong> Product managers and growth teams</li></ul><h3 id="what-is-mixpanel">What is Mixpanel?</h3><p><a href="/blog/posthog-vs-mixpanel">Mixpanel</a> is a platform that has expanded significantly beyond its analytics-only roots. It launched a full Experiments product with feature flagging and statistical analysis, and added session replay and heatmaps to their lineup in 2024. </p><p><a href="/blog/best-mixpanel-alternatives">Mixpanel</a> is strong on event-based analysis, funnel visualization, and its usage-based pricing model, which makes it popular with startups.</p><h3 id="key-features-1">Key features</h3><ul><li><strong>Event analytics:</strong> Trends, funnels, user paths, and retention analysis.</li><li><strong>Experiments:</strong> End-to-end A/B testing with feature flags, cohort targeting, sticky bucketing, and statistical significance across primary, secondary, and guardrail metrics.</li><li><strong>Session replay:</strong> Available on all plans (10k replays/month free), integrated directly with funnel and cohort analysis.</li><li><strong>Heatmaps:</strong> Click and scroll heatmaps built into the same workflow as analytics and replay.</li><li><strong>Metric trees:</strong> Interactive, living frameworks that map relationships between metrics, track goals, and connect experiment results to business outcomes.</li><li><strong>Warehouse connectors:</strong> Sync data bidirectionally with BigQuery, Snowflake, Redshift, and Databricks.</li><li><strong>Spark AI:</strong> Natural language querying across your analytics data.</li></ul><h3 id="how-does-mixpanel-compare-to-posthog">How does Mixpanel compare to PostHog?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Mixpanel<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-mixpanel">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/logs"><strong>Logs</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Search and analyze your application logs with OpenTelemetry.</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/workflows"><strong>Workflows</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Automate workflows with your product data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI assistant</strong><div class="text-sm text-secondary mt-1">Use AI to assist with tasks and queries</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Transparent pricing</strong><div class="text-sm text-secondary mt-1">Clear, upfront pricing with no hidden fees</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="key-differences-1">Key differences</h3><ol><li><p><strong>Scope:</strong> Mixpanel and PostHog now overlap more than they used to – both have analytics, session replay, A/B testing, and feature flags. Where PostHog pulls ahead is error tracking, surveys, logs, CDP, LLM analytics, and data warehouse. Where Mixpanel stands out: metric trees (interactive frameworks that map relationships between metrics, connect experiment results to business outcomes, and track goals in a living dashboard), and a funnel and path analysis UI that non-technical users might find more approachable than PostHog&#x27;s.</p></li><li><p><strong>Developer experience:</strong> PostHog is open source and has an MCP server that lets engineers query their product data directly from AI coding tools like Cursor and Claude. Mixpanel is more accessible to non-technical users but offers less for engineering-led teams who want to inspect the codebase or integrate deeply with their dev tooling.</p></li><li><p><strong>Pricing:</strong></p></li></ol><ul><li><p>Mixpanel&#x27;s free plan includes up to 1M events/month and 10K session replays, but features such as cohorts, custom properties, and feature flags are not available; their startup program gives eligible companies (under 5 years old, under $8M raised) their first year completely free – 1B events, 500k replays, all features unlocked.</p></li><li><p>PostHog&#x27;s free tier includes 1M analytics events, 5,000 session replays, 1M feature flag requests, <a href="/pricing">and much more</a>; <a href="/startups">PostHog for Startups</a> offers $50k in credits for qualifying early-stage companies.</p></li></ul><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>Mixpanel is a strong choice for teams who want polished product analytics with session replay, A/B testing, and metric trees in one focused tool. Once you also need error tracking, surveys, logs, or a data warehouse, the case for PostHog gets significantly stronger.</p></blockquote><h2 id="fullstory">FullStory</h2><ul><li><strong>Founded:</strong> 2014</li><li><strong>Similar to:</strong> LogRocket, Hotjar</li><li><strong>Best known for:</strong> Session replay</li><li><strong>Useful for:</strong> Product managers, UX researchers, customer support</li></ul><h3 id="what-is-fullstory">What is FullStory?</h3><p><a href="/blog/posthog-vs-fullstory">FullStory</a> is a digital experience intelligence platform best known for <a href="/blog/best-session-replay-tools">session replay</a>. It captures every user interaction automatically and lets teams search, filter, and analyze sessions without manual event setup. </p><p><a href="/blog/best-fullstory-alternatives">FullStory</a> is particularly popular with enterprise UX and customer experience teams who need to diagnose friction, understand user journeys at scale, and share session evidence across product, support, and design.</p><h3 id="key-features-2">Key features</h3><ul><li><strong>Session replay:</strong> Full DOM capture with autocapture of all user interactions.</li><li><strong>Heatmaps:</strong> Click, scroll, and cursor movement heatmaps.</li><li><strong>Frustration signals:</strong> Automatic detection of rage clicks, dead clicks, and error clicks.</li><li><strong>DX Data:</strong> FullStory&#x27;s proprietary behavioral data layer for querying sessions retroactively.</li><li><strong>Funnels and journeys:</strong> Visualize user flows and drop-off points.</li><li><strong>Guides and Surveys:</strong> No-code product tours, onboarding checklists, banners, smart tips, and in-app NPS surveys triggered based on behavioral data.</li><li><strong>StoryAI:</strong> Built-in AI agents that automatically summarize sessions, surface friction points prioritized by conversion impact, and answer behavioral questions in natural language.</li></ul><h3 id="how-does-fullstory-compare-to-posthog">How does FullStory compare to PostHog?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">FullStory<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-fullstory">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/logs"><strong>Logs</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Search and analyze your application logs with OpenTelemetry.</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/workflows"><strong>Workflows</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Automate workflows with your product data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI assistant</strong><div class="text-sm text-secondary mt-1">Use AI to assist with tasks and queries</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Transparent pricing</strong><div class="text-sm text-secondary mt-1">Clear, upfront pricing with no hidden fees</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="key-differences-2">Key differences</h3><ol><li><p><strong>Session replay depth:</strong> FullStory&#x27;s replay tooling – frustration signal detection, cursor heatmaps, and DX Data retroactive querying – is more mature than PostHog&#x27;s for dedicated UX research. PostHog&#x27;s replay is strong for product and engineering use cases but less focused on pure UX research workflows.</p></li><li><p><strong>Feature breadth:</strong> PostHog includes feature flags, A/B testing, error tracking, logs, and more. FullStory is primarily a session replay and analytics tool (which also features Guides &amp; Surveys) – teams using it typically need other tools to cover the rest of the stack.</p></li><li><p><strong>Pricing and access:</strong> PostHog offers 5,000 free session replays per month with <a href="/pricing">transparent, self-serve pricing</a>. FullStory&#x27;s pricing is opaque – getting started requires a conversation with sales.</p></li></ol><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>FullStory is the better choice for dedicated UX research teams who need advanced heatmaps and frustration signal detection and have budget for an enterprise contract. PostHog is the better choice for product and engineering teams who want session replay as part of a broader platform – and who want transparent pricing and a free tier.</p></blockquote><h2 id="heap">Heap</h2><ul><li><strong>Founded:</strong> 2013</li><li><strong>Similar to:</strong> Mixpanel, Amplitude</li><li><strong>Best known for:</strong> Product analytics</li><li><strong>Useful for:</strong> Product managers, marketing teams</li></ul><h3 id="what-is-heap">What is Heap?</h3><p><a href="/blog/posthog-vs-heap">Heap</a> was acquired by <a href="/blog/best-contentsquare-alternatives">Contentsquare</a>. Contentsquare is in the process of migrating Heap customers onto its own platform. If you&#x27;re evaluating Heap as a new tool, it&#x27;s worth knowing that you may be migrated to Contentsquare rather than Heap long-term.</p><p><a href="/blog/best-heap-alternatives">Heap&#x27;s</a> key innovation was autocapture combined with retroactive event definition – you capture everything, then define what matters later. This remains genuinely useful for teams who don&#x27;t know what they&#x27;ll need to analyze in advance.</p><h3 id="key-features-3">Key features</h3><ul><li><strong>Autocapture:</strong> Capture every user interaction automatically, define events retroactively.</li><li><strong>Visual labeling:</strong> Tag events through a visual interface without code.</li><li><strong>Session replay:</strong> Available through the Heap platform.</li><li><strong>Funnels and paths:</strong> Analyze user journeys and drop-off points.</li><li><strong>Sense AI:</strong> Chat-based AI analyst that answers plain-language questions about user behavior, builds charts on demand, and suggests follow-up questions.</li><li><strong>Illuminate:</strong> A data science layer that automatically surfaces insights from your behavioral data – including top events influencing conversion and group suggestions to identify high-impact segments – without requiring you to know what to look for in advance.</li><li><strong>Data connectors:</strong> Sync to data warehouses including BigQuery and Snowflake.</li></ul><h3 id="how-does-heap-compare-to-posthog">How does Heap compare to PostHog?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/logs"><strong>Logs</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Search and analyze your application logs with OpenTelemetry.</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/workflows"><strong>Workflows</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Automate workflows with your product data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI assistant</strong><div class="text-sm text-secondary mt-1">Use AI to assist with tasks and queries</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Transparent pricing</strong><div class="text-sm text-secondary mt-1">Clear, upfront pricing with no hidden fees</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="key-differences-3">Key differences</h3><ol><li><strong>Retroactive event definition:</strong> Heap&#x27;s visual labeling is genuinely powerful – you can define and retroactively apply event definitions without code or engineering support. PostHog&#x27;s autocapture captures everything too, but labeling events requires more technical involvement.</li><li><strong>Feature breadth:</strong> Heap covers session replay, web analytics, and heatmaps alongside its analytics core – but PostHog goes further with feature flags, experiments, error tracking, surveys, logs, and more. The Contentsquare merger may also eventually give Heap users access to an even broader feature set as the platforms converge.</li><li><strong>Pricing:</strong> </li></ol><ul><li><p>Heap&#x27;s free plan covers up to 10k monthly sessions with core analytics and 6 months of data history. Growth and Pro plans are usage-based with custom pricing – you need to install the snippet to get an estimate, and session replay is an add-on rather than included. </p></li><li><p>PostHog&#x27;s free tier covers 1M analytics events and 5,000 session replays with <a href="/pricing">transparent, self-serve pricing</a> and no sales call required.</p></li></ul><blockquote><h4 id="bottom-line-3">Bottom line</h4><p>Heap&#x27;s retroactive event labeling remains genuinely useful for non-technical teams, but, if you&#x27;re evaluating it today, it&#x27;s worth understanding the broader Contentsquare platform and how it fits into your needs.</p></blockquote><h2 id="logrocket">LogRocket</h2><ul><li><strong>Founded:</strong> 2016</li><li><strong>Similar to:</strong> FullStory</li><li><strong>Best known for:</strong> Session replay and front-end monitoring</li><li><strong>Useful for:</strong> Customer support, engineering teams</li></ul><h3 id="what-is-logrocket">What is LogRocket?</h3><p><a href="/blog/posthog-vs-logrocket">LogRocket</a> positions itself between FullStory and <a href="/blog/posthog-vs-sentry">Sentry</a> – it combines session replay with front-end error monitoring and some product analytics. </p><p>It&#x27;s popular with engineering teams who want a developer-focused session replay tool with performance monitoring built in. <a href="/blog/best-logrocket-alternatives">LogRocket</a> has also added Galileo, an AI layer that surfaces issues and recommendations proactively. </p><h3 id="key-features-4">Key features</h3><ul><li><strong>Session replay:</strong> Full DOM replay with console logs, network requests, and Redux state.</li><li><strong>Front-end monitoring:</strong> JavaScript error tracking and performance profiling.</li><li><strong>Heatmaps:</strong> Click, rage click, and scroll maps.</li><li><strong>Product analytics:</strong> Basic funnels, user paths, and conversion tracking.</li><li><strong>Galileo AI:</strong> Proactive issue detection and UX recommendations.</li></ul><h3 id="how-does-logrocket-compare-to-posthog">How does LogRocket compare to PostHog?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">LogRocket<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-logrocket">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/logs"><strong>Logs</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Search and analyze your application logs with OpenTelemetry.</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/workflows"><strong>Workflows</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Automate workflows with your product data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI assistant</strong><div class="text-sm text-secondary mt-1">Use AI to assist with tasks and queries</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Transparent pricing</strong><div class="text-sm text-secondary mt-1">Clear, upfront pricing with no hidden fees</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="key-differences-4">Key differences</h3><ol><li><strong>Session replay focus:</strong> LogRocket&#x27;s replay tooling includes Redux/state management capture and Galileo AI proactive issue detection – features aimed squarely at front-end engineers. PostHog&#x27;s replay is broader, connecting sessions directly to feature flags, experiments, and funnel analysis.</li><li><strong>Product analytics:</strong> PostHog&#x27;s product analytics are significantly deeper – cohorts, retention, paths, SQL access, and group analytics. LogRocket&#x27;s analytics are basic and supplementary to its replay core.</li><li><strong>Pricing:</strong> </li></ol><ul><li><p>LogRocket&#x27;s free tier covers 1,000 sessions/month with 1 month of data retention. Paid plans start at $69/month for 10k sessions on a monthly commitment (annual plans are cheaper). Session replay is the core product – analytics, heatmaps, and error tracking are included, but you&#x27;re primarily paying for session volume. </p></li><li><p>PostHog&#x27;s free tier covers 5,000 session replays plus 1M analytics events, feature flags, and more; <a href="/pricing">pricing is transparent and usage-based</a> across the whole platform.</p></li></ul><blockquote><h4 id="bottom-line-4">Bottom line</h4><p>LogRocket is a strong choice for engineering teams who want developer-focused session replay with front-end performance monitoring. PostHog is the better choice if you also need deep product analytics, feature flags, A/B testing, or a single platform for your whole stack.</p></blockquote><h2 id="which-posthog-alternative-should-you-choose">Which PostHog alternative should you choose?</h2><p>Choose...</p><ul><li><strong>Amplitude</strong> if you&#x27;re a growth or marketing team that needs multi-touch attribution, predictive analytics, or AI-powered brand visibility in LLMs. Amplitude has built a genuine marketing platform, while PostHog is more geared towards technical users.</li><li><strong>Mixpanel</strong> if you want polished product analytics with session replay, A/B testing, and feature flags but don&#x27;t need the broader PostHog platform. The free tier is generous and the startup program is excellent.</li><li><strong>FullStory</strong> if dedicated UX research is your primary use case and you have enterprise budget. Its session replay tooling – frustration signals, StoryAI, Guides &amp; Surveys – is more mature than PostHog&#x27;s for deep qualitative research.</li><li><strong>LogRocket</strong> if you&#x27;re a front-end engineering team that wants session replay connected to Redux state, console logs, and network monitoring. Strong for debugging workflows, though you&#x27;ll need other tools alongside it.</li><li><strong>Heap</strong> if autocapture and retroactive event definition appeal to you – it&#x27;s a solid tool. Just make sure you understand what the full Contentsquare platform looks like before committing.</li></ul><details><summary>Honourable mentions</summary><p>These tools didn&#x27;t make the main list but are worth knowing about depending on your use case.</p><p><strong><a href="/blog/posthog-vs-pendo">Pendo</a></strong> is the go-to if you need no-code in-app guidance – tooltips, walkthroughs, banners, and onboarding checklists your CS or product team can build without engineering. PostHog has no equivalent. Pricing is enterprise-only and requires a sales call.</p><p><strong><a href="/blog/posthog-vs-sentry">Sentry</a></strong> is the standard for application error monitoring – detailed stack traces, source maps, performance profiling, release tracking, and AI-powered Autofix that suggests code fixes. PostHog also has <a href="/error-tracking">error tracking</a>, but Sentry is an undeniable option when it comes to deep engineering observability.</p><p><strong><a href="/blog/posthog-vs-hotjar">Hotjar</a></strong> (acquired by ContentSquare) is a lightweight session replay and heatmap tool popular with marketing and UX teams. Good entry point if you just need replay and heatmaps.</p><p><strong><a href="/blog/posthog-vs-growthbook">GrowthBook</a></strong> is an open-source A/B testing and feature flagging platform. If experimentation is your primary need and you want full control over your data and infrastructure, GrowthBook is worth evaluating. PostHog&#x27;s experiments are more integrated but GrowthBook&#x27;s statistical engine is more flexible.</p><p><strong><a href="/blog/best-vwo-alternatives">VWO</a></strong> and <strong>AB Tasty</strong> are website experimentation platforms aimed at marketing and CRO teams – visual editors, no-code test creation, personalization, and funnel analysis. The two companies are merging soon. PostHog&#x27;s experiments require more technical setup; these tools are built for non-engineers running conversion optimization programs.</p><p><strong><a href="/blog/posthog-vs-statsig">Statsig</a></strong> is a feature flagging and experimentation platform popular with engineering teams who want rigorous statistical analysis, warehouse-native data pipelines, and scalable flag infrastructure. More technically focused than PostHog&#x27;s experiments, less of a full analytics platform.</p><p><strong><a href="/blog/posthog-vs-plausible">Plausible</a> and <a href="/blog/best-fathom-alternatives">Fathom</a></strong> are privacy-friendly, cookieless web analytics tools. If all you need is traffic stats – pageviews, referrers, UTMs – without consent banners or complex setup, either is simpler and cheaper than PostHog. Neither has product analytics, session replay, or feature flags.</p></details><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the honest version.</p><p>PostHog is the best choice if:</p><ul><li>You want one platform with a full suite of tools, keeping all your data and user context in one place.</li><li>You&#x27;re a startup, an engineer, or a technical product team that values SQL access, an MCP server, and open-source code.</li><li>You want to try before you commit – PostHog is fully self-serve with a generous free tier and no sales call required.</li></ul><p>It&#x27;s free to get started with no credit card required. Our <a href="/wizard">AI setup wizard</a> handles configuration in minutes.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is the best free PostHog alternative?</summary><p>For product analytics, <strong>Mixpanel</strong> has the most comparable free tier to PostHog. For session replay specifically, <strong>Microsoft Clarity</strong> is free and unlimited (though not open source). For error tracking, <strong>Sentry</strong> has a free tier. </p><p>But PostHog&#x27;s free tier – 1M analytics events, 5,000 replays, 1M feature flag requests, and more per product – is the most comprehensive single-platform free tier available.</p></details><details><summary>Can PostHog replace Mixpanel?</summary><p>Yes, for most teams. PostHog covers everything Mixpanel does (funnels, retention, user paths, cohorts) and adds session replay, feature flags, A/B testing, and error tracking.</p><p>See our <a href="/blog/posthog-vs-mixpanel">PostHog vs Mixpanel</a> comparison for details or get started with <a href="/migrate/managed-migrations">our managed migration</a> for an easy switch.</p></details><details><summary>Can PostHog replace Amplitude?</summary><p>For engineering and product teams, yes. For growth and marketing teams who rely on multi-touch attribution and predictive analytics, Amplitude has capabilities PostHog doesn&#x27;t. </p><p>See our <a href="/blog/posthog-vs-amplitude">PostHog vs Amplitude</a> comparison or get started with <a href="/migrate/managed-migrations">our managed migration</a> for an easy switch.</p></details><details><summary>Can PostHog replace FullStory?</summary><p>For most session replay use cases, yes. FullStory has more advanced heatmaps and frustration signal detection, so dedicated UX research teams may find it more powerful. But PostHog&#x27;s session replay covers most needs – and comes with analytics, feature flags, and error tracking included. </p><p>See our <a href="/blog/posthog-vs-fullstory">PostHog vs FullStory</a> comparison.</p></details><details><summary>Does PostHog have in-app guides like Pendo?</summary><p>No. PostHog doesn&#x27;t have a no-code in-app guide builder for tooltips, walkthroughs, or banners. If in-app guidance is a core requirement, <a href="/blog/posthog-vs-pendo">Pendo</a> is the better choice. </p><p>PostHog does have surveys for collecting in-app user feedback.</p></details><details><summary>What&#x27;s the best PostHog alternative for enterprise?</summary><p>For enterprise product analytics, <strong>Amplitude</strong> has the most established enterprise track record. For enterprise session replay, <strong>FullStory</strong> has deep enterprise integrations and a mature DX Data layer.</p><p>PostHog also has an enterprise plan with SSO, SAML, and a dedicated customer success team.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Open source (and self-hosted) session replay tools]]></title><description><![CDATA[Open-source analytics  is great when you need hard numbers, but hard numbers don't give you the full picture.  What else do you need to do?  Talk to…]]></description><link>https://posthog.com/blog/best-open-source-session-replay-tools</link><guid isPermaLink="false">8b70ae4d-1187-5c9a-9236-fc027c610cbf</guid><dc:creator><![CDATA[Hanna Crombie]]></dc:creator><pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/open-source-hotjar-alternatives/replayhog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><a href="/blog/best-open-source-analytics-tools">Open-source analytics</a> is great when you need hard numbers, but hard numbers don&#x27;t give you the full picture. </p><p>What else do you need to do? <a href="/blog/10x-engineers-do-user-interviews">Talk to users</a>? Sure. Gather feedback? That&#x27;s useful, too. But, for us, there&#x27;s nothing better than watching session replays for understanding a user&#x27;s pain points.</p><p>Replays (aka session recordings) are a great way to understand:</p><ul><li>What causes bugs and user frustration.</li><li>Where users are getting stuck on your site.</li><li>Hesitation at different stages of your funnel.</li><li>How your users are interacting with individual elements of your product.</li></ul><p><a href="/blog/posthog-vs-hotjar">Hotjar</a> (now part of Contentsquare) and <a href="/blog/posthog-vs-fullstory">Fullstory</a> are popular session replay products, but they&#x27;re expensive, inflexible, and primarily designed with marketing teams. </p><p>In this guide, we&#x27;re looking at <a href="/blog/best-hotjar-alternatives">Hotjar alternatives</a> that are either free or open source, particularly session replay tools. </p><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/session-replay.png" alt="PostHog"/></p><p><a href="/">PostHog</a> (that&#x27;s us 👋) is an all-in-one developer platform that includes <a href="/session-replay">session replay</a>, <a href="/product-analytics">product analytics</a>, <a href="/heatmaps">heatmaps</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/error-tracking">error tracking</a>, <a href="/surveys">surveys</a>, and more. </p><p>This means it&#x27;s not just an open source session replay tool, but a full replacement for tools like <a href="/blog/best-hotjar-alternatives">Hotjar</a>, <a href="/blog/best-fullstory-alternatives">FullStory</a>, <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a>, and <a href="/blog/best-sentry-alternativs">Sentry</a>.</p><p>PostHog&#x27;s <a href="/docs/session-replay">session replay</a> includes console logs, network activity, a DOM explorer, and performance metrics so you can identify the root cause of bugs without leaving the replay. You can filter recordings by user, event, feature flag, or any combination of properties, save playlists of related sessions, and export recordings offline for safe keeping. </p><p><a href="/ai">AI session summaries</a> automatically surface key moments and issues, so you don&#x27;t have to watch every recording in full. All of PostHog&#x27;s tools work together natively – jump from a funnel drop-off directly into a relevant replay, or see which feature flag a user was on when they hit a bug.</p><h3 id="who-is-posthog-for">Who is PostHog for?</h3><p>PostHog is ideal for startups, <a href="/product-engineer/what-is-a-product-engineer">product-minded developers</a>, and product teams. Unlike Hotjar and Fullstory, it&#x27;s designed for technical users. Its broad range of features means PostHog can replace several tools.</p><p>It also supports replay for mobile apps running that use Android, iOS, React Native, and Flutter SDKs, making it a good option if you&#x27;re also looking for a tool that offers <a href="/blog/hotjar-for-mobile-ios-android-react-native-flutter">Hotjar features for mobile apps</a>.</p><h3 id="key-features">Key features</h3><ul><li><strong>Session replay:</strong> Console logs, network activity, DOM explorer, and performance metrics. Filter recordings by user, event, or feature flag. Export recordings offline. AI session summaries automatically surface key moments and issues without watching every recording.</li><li><strong>Mobile replay:</strong> Native SDKs for iOS, Android, React Native, and Flutter with 2,500 free mobile recordings per month.</li><li><strong>Heatmaps:</strong> Visualize clicks (including rage clicks), scroll depth, and mouse movement.</li><li><strong>Error tracking:</strong> Monitor exceptions and stack traces connected directly to session replays.</li><li><strong>Product analytics:</strong> Funnels, user paths, retention, trends, and SQL access for custom queries.</li><li><strong>Privacy controls:</strong> CSS selectors to block sensitive data. Cookieless tracking available.</li></ul><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog is free up to 1 million captured events, 5,000 web recordings, and 2,500 mobile recordings per month, and you can set billing limits to avoid surprise bills. </p><blockquote><h4 id="bottom-line">Bottom line</h4><p>PostHog is the best open source session replay tool if you want more than just replay. Its generous free tier, mobile support, and tight integration with analytics, feature flags, and error tracking make it the most complete option on this list.</p></blockquote><p><div></div></p><h2 id="2-openreplay">2. OpenReplay</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-hotjar-alternatives/img2_OpenReplay.png" alt="OpenReplay - open source session replay"/></p><p><strong>OpenReplay</strong> is an open-source <a href="/blog/best-microsoft-clarity-alternatives">alternative to Microsoft Clarity</a> that offers more advanced, technical features for engineers on top of basic session replay. Its tooling is particularly effective for application state and customer support. It has some basic analytics features, such as funnel analysis, though it falls some way short of feature-complete product analytics tools.</p><h3 id="who-is-openreplay-for">Who is OpenReplay for?</h3><p>OpenReplay is a developer-friendly tool. It allows engineers to see how users are interacting with their web apps, respond to issues faster, and troubleshoot problems with users.</p><h3 id="key-features-1">Key features</h3><ul><li><strong>Session replay:</strong> Pixel-perfect recordings with event timelines, network activity, console logs, and JS error capture.</li><li><strong>DevTools:</strong> Reproduce bugs as if they happened in your own browser, with application state, GraphQL queries, and 40+ metrics.</li><li><strong>Co-browsing:</strong> Live screen sharing with users via WebRTC – no third-party software required.</li><li><strong>Heatmaps:</strong> Click and scroll heatmaps added in recent releases.</li><li><strong>Product analytics:</strong> Basic funnel analysis and conversion tracking.</li><li><strong>Spot:</strong> A Chrome extension for recording bugs directly from the browser with full technical context attached.</li></ul><h3 id="how-much-does-openreplay-cost">How much does OpenReplay cost?</h3><p>OpenReplay has three cloud plans and a free self-hosted option. </p><ul><li>The <strong>Free</strong> cloud plan is $0 and includes up to 1,000 sessions/month, 2 users, 1 project, and 30-day data retention. </li><li>The <strong>Serverless</strong> plan is $5.95 per 1,000 sessions/month with unlimited users and projects, also with 30-day retention. </li><li>The <strong>Dedicated</strong> plan starts at $0.25/hour (roughly $179/month) and gives you a dedicated VM with configurable data retention, SSO/SAML, conditional recording, and data residency across 35+ regions. </li></ul><p>The <strong>self-hosted open source edition</strong> is completely free and includes all core features.</p><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>OpenReplay is the best self-hosted option for developer teams that need advanced debugging tools and full data sovereignty. Its co-browsing feature is unique among open source tools. The tradeoff is that self-hosting requires real DevOps resources to deploy and maintain at scale.</p></blockquote><h2 id="3-sentry">3. Sentry</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_03_12_T19_18_34_436_Z_d79ea5531f.png" alt="Sentry"/></p><p><a href="/blog/posthog-vs-sentry">Sentry</a> is a source-available application monitoring platform primarily known for error tracking and performance monitoring. </p><p>Session replay was added in 2023 and is tightly integrated with Sentry&#x27;s error data: when an exception fires, the session replay for the affected user is automatically linked, giving you the full interaction context without any additional investigation.</p><h3 id="who-is-sentry-for">Who is Sentry for?</h3><p>Sentry is for developers and engineering teams, not UX or product teams. Sentry approaches replay from an error-first perspective – it&#x27;s most valuable when you want to understand what a user was doing right before something broke.</p><h3 id="key-features-2">Key features</h3><ul><li><strong>Session replay:</strong> Video-like reproduction of user interactions including page visits, mouse movements, clicks, taps, and scrolls.</li><li><strong>Error-linked replay:</strong> Every error automatically links to the relevant session replay for instant context.</li><li><strong>Performance monitoring:</strong> Web vitals, transaction tracing, and frontend performance data alongside replays.</li><li><strong>Error tracking:</strong> Real-time exception monitoring with stack traces across dozens of languages and frameworks.</li><li><strong>Self-hosting:</strong> Full self-hosted deployment available free.</li></ul><h3 id="how-much-does-sentry-cost">How much does Sentry cost?</h3><p>Sentry has four plans. </p><ul><li>The <strong>Free</strong> plan is $0 and includes 1 user, error monitoring, and 50 session replays/month. </li><li>The <strong>Team</strong> plan is $26/month with unlimited users and 50 replays included, with additional replays available at usage-based rates. </li><li>The <strong>Business</strong> plan is $80/month and adds unlimited custom dashboards and anomaly detection. </li><li><strong>Enterprise</strong> pricing is custom. </li></ul><p>All plans include 50 session recordings. Self-hosting is free via Docker Compose, though it&#x27;s designed for simpler deployments rather than large-scale production use.</p><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>Sentry is the best option if your team already uses it for error monitoring and wants to add session replay without a new vendor. It&#x27;s not a standalone replay tool – it&#x27;s most valuable when replay is part of a broader error and performance monitoring workflow.</p></blockquote><h2 id="4-uxwizz">4. UXWizz</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-hotjar-alternatives/img3_UXWizz.png" alt="UXWizz - self hosted session replay"/></p><p><strong>UXWizz</strong> is a self-hosted product analytics tool offering visitor insights, session recording, heatmaps, segments, and basic A/B testing.</p><p>It offers a lightweight version of session recording that only stores the URL of the page and the user actions. This is designed to optimize your data storage and remove the manual maintenance otherwise required by UXWizz.</p><h3 id="who-is-uxwizz-for">Who is UXWizz for?</h3><p>UXWizz is a good choice for individuals and small businesses who want quick, qualitative insights and session recordings. A Wordpress plugin is also available.</p><h3 id="key-features-3">Key features</h3><ul><li><strong>Session recording:</strong> Lightweight and full DOM recording modes.</li><li><strong>Heatmaps:</strong> Click, move, and scroll heatmaps.</li><li><strong>Visitor segmentation:</strong> Filter and group visitors by behavior, device, or custom properties.</li><li><strong>A/B testing:</strong> Basic split testing built in.</li><li><strong>Error tracking:</strong> Monitor and log JavaScript errors.</li><li><strong>AI analysis:</strong> Ask AI to generate stats and charts using natural language queries.</li><li><strong>WordPress plugin:</strong> Easy installation for WordPress sites.</li></ul><h3 id="how-much-does-uxwizz-cost">How much does UXWizz cost?</h3><p>UXWizz is self-hosted only with a one-time license fee. </p><ul><li>The <strong>Personal</strong> license is $299 and covers unlimited websites, visitors, recordings, and heatmaps for a single user.</li><li>The <strong>Company</strong> license is $799 and adds unlimited dashboard users for teams. Both include one year of free support and updates, with extensions available as paid add-ons. </li><li>The <strong>Agency</strong> license is $2,490 and includes white-labeling, custom branding, custom dashboard pages, domain limits per user, and up to 5 servers – intended for agencies managing analytics on behalf of clients. </li></ul><p>All tiers include one year of free support and updates, with extensions available as paid add-ons. There is no cloud version and no free tier, though a free trial is available.</p><blockquote><h4 id="bottom-line-3">Bottom line</h4><p>UXWizz is a good fit for individuals and small businesses who want basic self-hosted analytics and session recording without a monthly bill. The single-developer maintenance model is a real risk for long-term reliability, but the one-time pricing makes it a low-stakes option to try.</p></blockquote><h2 id="5-uxlens">5. UXlens</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-hotjar-alternatives/img4_UXlens.png" alt="UXlens - self hosted session replay"/></p><p><strong>UXlens</strong> is a developer-first session recording tool that provides insight into user interface and conversion issues. It does not include any additional analytics tools, but does have useful segment filtering features that help businesses locate blocks in their funnel.</p><h3 id="who-is-uxlens-for">Who is UXlens for?</h3><p>UXlens is a good choice for UX designers and product teams who want to study the impact of their UI on the user journey without spending too much.</p><h3 id="key-features-4">Key features</h3><ul><li><strong>Session recording:</strong> Lightweight recordings focused on user interactions.</li><li><strong>Segment filtering:</strong> Customizable filters to track sessions by user segment, device, or page.</li><li><strong>Privacy by default:</strong> Input elements masked by default to protect user data.</li><li><strong>Self-hosting:</strong> Docker-based self-hosted deployment available.</li></ul><h3 id="how-much-does-uxlens-cost">How much does UXlens cost?</h3><p>UXlens offers both cloud subscriptions and self-hosted lifetime licenses. Cloud plans start at <strong>$6/month</strong> (Starter, 6,000 recordings) and go up to <strong>$70/month</strong> (Business Plus, 80,000 recordings), with Professional at $12/month (12k) and Business at $30/month (32k). </p><p>All cloud plans include a 30-day recording history and conversion funnels. Enterprise plans are available on request.</p><p>Self-hosted lifetime licenses start at <strong>$200 one-time</strong> (Startup – up to 3 websites, 10 admin seats) and <strong>$500 one-time</strong> (Agency – unlimited websites, 10 admin seats). An Agency Plus tier with REST API access is available on a yearly basis (contact for pricing), and a free license is available for non-commercial and personal use.</p><blockquote><h4 id="bottom-line-4">Bottom line</h4><p>UXlens is a minimal, affordable session recording tool for small teams who just need the basics. It lacks the depth of analytics and developer tools found in PostHog, OpenReplay, or Sentry, but its low price point and self-hosting option make it worth considering for simple use cases.</p></blockquote><h2 id="6-matomo">6. Matomo</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-hotjar-alternatives/Matomo-session-recording.png" alt="Matomo - open source GA alternative"/></p><p><a href="/blog/posthog-vs-matomo">Matomo</a> is an open web analytics platform. Touted as an alternative to Google Analytics, Matomo is largely focused on understanding marketing website analytics. Session recording is available as an add-on via the on-premise marketplace.</p><h3 id="who-is-matomo-for">Who is Matomo for?</h3><p><a href="blog/best-matomo-alternatives">Matomo</a> is mainly built with marketing and content teams in mind, offering insights into website content engagement for optimization of user journeys. Features like session recording are part of a wider set of tools that are useful for product teams as well, but they aren&#x27;t included in Matomo&#x27;s open source release.</p><p>To learn more, read our <a href="/blog/posthog-vs-matomo">PostHog vs Matomo comparison</a>.</p><h3 id="key-features-5">Key features</h3><ul><li><strong>Web analytics:</strong> Traffic, referrers, goals, funnels, and acquisition analysis.</li><li><strong>Session recording:</strong> Available as a paid add-on for self-hosted; included in cloud Business plan.</li><li><strong>Heatmaps:</strong> Click and scroll heatmaps, also a paid add-on for self-hosted.</li><li><strong>GDPR compliance:</strong> Built-in consent management and EU data hosting options.</li><li><strong>Self-hosting:</strong> Full on-premise deployment with no data sent to third parties.</li></ul><h3 id="how-much-does-matomo-cost">How much does Matomo cost?</h3><p>Matomo On-Premise is free and open source – the core analytics platform costs nothing to self-host, with optional paid plugins available separately. </p><p>Matomo Cloud is priced by monthly hit volume: starting at <strong>$26/month</strong> for 50,000 hits, $42/month for 100,000 hits, $85/month for 300,000 hits, and scaling up to $399/month for 2 million hits and beyond. </p><p>All cloud plans include 150 session recordings and 1,500 heatmap pageviews per month, but it&#x27;s unclear how this scales. Enterprise plans for very high volumes are available on request.</p><blockquote><h4 id="bottom-line-5">Bottom line</h4><p>Matomo is the best option on this list if you primarily want website analytics and want session recording as a secondary add-on. The session recording feature is not included in the free open source release, which limits its appeal compared to tools where replay is a core feature.</p></blockquote><h2 id="which-open-source-session-replay-tool-should-you-choose">Which open source session replay tool should you choose?</h2><ul><li>Want an all-in-one platform with session replay, product analytics, feature flags, error tracking, and more? Go with <strong>PostHog</strong>.</li><li>Need a powerful self-hosted option with advanced DevTools, co-browsing, and strict data residency requirements? Choose <strong>OpenReplay</strong>.</li><li>Already using Sentry for error monitoring and want replay without adding another vendor? Stick with <strong>Sentry</strong>.</li><li>Want basic self-hosted recording and heatmaps with no monthly fees? <strong>UXWizz</strong> or <strong>UXlens</strong> are your best bets.</li><li>Need open source web analytics with session recording as part of the package? Try <strong>Matomo</strong>.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think PostHog is the best open source session replay tool if:</p><ul><li>You want session replay tightly connected to product analytics, feature flags, and error tracking.</li><li>You need mobile replay (iOS, Android, React Native, Flutter) on all plans including free.</li><li>You want transparent, usage-based pricing with a generous free tier and no sales calls.</li><li>You want open source code you can audit, self-host, or contribute to.</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">AI setup wizard</a> handles configuration in minutes, or check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is open source session replay?</summary><p>Open source session replay tools record how users interact with your website or app – clicks, scrolls, mouse movements, and form interactions – and let you replay those sessions to understand user behavior. </p><p>Unlike proprietary tools like Hotjar or FullStory, open source tools give you access to the source code, the ability to self-host, and full control over your data. This matters for teams with strict privacy requirements, data residency needs, or who simply want to avoid vendor lock-in.</p></details><details><summary>What&#x27;s the difference between open source and self-hosted session replay?</summary><p><strong>Open source</strong> means the source code is publicly available and you can audit, modify, or contribute to it. </p><p><strong>Self-hosted</strong> means you run the tool on your own infrastructure rather than using a vendor&#x27;s cloud. </p><p>Most open source session replay tools can be self-hosted, but not all self-hosted tools are open source. For example, Sentry uses a Business Source License (source-available, not fully open source) but can still be self-hosted for free.</p></details><details><summary>Which open source session replay tool has the best free tier?</summary><p><strong>PostHog</strong> has the most <a href="/pricing">generous free cloud tier</a>: 5,000 web session replays, 2,500 mobile replays, and 1 million analytics events per month. </p><p><strong>OpenReplay</strong> and <strong>Sentry</strong> offer free self-hosted versions with no usage limits if you&#x27;re willing to manage your own infrastructure. </p></details><details><summary>Which tools support mobile session replay?</summary><p><strong>PostHog</strong> is the strongest option for mobile, supporting iOS, Android, React Native, and Flutter with 2,500 free mobile recordings per month included on all plans. <strong>OpenReplay</strong> has added mobile support in recent releases (iOS and Android). <strong>Sentry</strong> supports session replay for mobile apps. Most other tools on this list are web-only.</p></details><details><summary>Is Highlight.io still available?</summary><p>Highlight.io was acquired by <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a> in March 2025. Existing accounts are being migrated to LaunchDarkly&#x27;s observability platform; it is no longer recommended as a standalone tool for new deployments.</p></details><details><summary>What happened to Hotjar?</summary><p><a href="/blog/posthog-vs-hotjar">Hotjar</a> merged into Contentsquare. New customers sign up through Contentsquare, and existing Hotjar customers are being migrated to the Contentsquare platform. </p><p>The core Hotjar tools (session replay, heatmaps, surveys) still exist within Contentsquare&#x27;s offering. See our guide to <a href="/blog/best-hotjar-alternatives">Hotjar alternatives</a> for more.</p></details><details><summary>What are the best session replay tools overall (not just open source)?</summary><p>The top session replay tools in 2026 include:</p><ul><li><strong><a href="/session-replay">PostHog</a></strong> – Best all-in-one for engineering teams with analytics, feature flags, and error tracking</li><li><strong><a href="/blog/best-microsoft-clarity-alternatives">Microsoft Clarity</a></strong> – Best completely free option with unlimited recordings</li><li><strong><a href="/blog/smartlook-alternatives">Smartlook</a></strong> – Best for mobile-first apps with crash reports</li><li><strong><a href="/blog/posthog-vs-logrocket">LogRocket</a></strong> – Best for frontend debugging with performance monitoring</li><li><strong><a href="/blog/best-fullstory-alternatives">FullStory</a></strong> – Best for frustration signal detection and UX analytics</li></ul><p>See our full guide to the <a href="/blog/best-session-replay-tools">best session replay tools</a> for more options.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The 9 best GA4 alternatives for apps and websites]]></title><description><![CDATA[Google Analytics 4  is one of the most widely deployed analytics tools in the world – and one of the most complained about too. The transition from…]]></description><link>https://posthog.com/blog/ga4-alternatives</link><guid isPermaLink="false">3bcfd808-dd94-5373-9f18-611991d7df5d</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-ga4/posthog-vs-ga4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="/blog/posthog-vs-ga4">Google Analytics 4</a> is one of the most widely deployed analytics tools in the world – and one of the most complained about too.</p><p>The transition from Universal Analytics forced millions of users onto a platform that thinks and behaves very differently. </p><p>GA4&#x27;s event-based model is more powerful than its predecessor in theory, but in practice, many teams find it harder to use, harder to query, and harder to trust. Add in data sampling on large exploration queries, a 14-month retention limit, <a href="/blog/best-gdpr-compliant-analytics-tools">privacy concerns under GDPR</a>, <a href="/blog/google-analytics-cost">opaque pricing</a>, and a UI that frustrates marketers and developers alike – and it&#x27;s easy to understand why so many teams are looking for alternatives.</p><p>Whether you&#x27;re leaving GA4 for privacy reasons, because you&#x27;ve outgrown its free tier limits, or because you simply need more than web analytics, this guide covers the best GA4 alternatives available today.</p><details><summary>What is the difference between Universal Analytics and GA4?</summary><p>The core difference is how each tool tracks activity.</p><p><strong>Universal Analytics</strong> was session-based – designed for a time when desktop websites were the norm and cookies were uncontroversial. It&#x27;s good at tracking sessions, pageviews, and traffic sources, with pre-defined reports that made it easy for marketing teams to do their jobs without data science support.</p><p><strong>Google Analytics 4</strong> is event-based – designed to track what people actually do, like clicking a button or completing (or abandoning) an action. Its model is more flexible and powerful, but it lacks many of the pre-defined reports UA users relied on, and its emphasis on exporting to Looker Studio or BigQuery is harder for teams without analytics support.</p></details><details><summary>Why do people dislike GA4?</summary><p>If event-based tracking is more powerful, why do so many people complain about GA4? Users tend to fall into one of three camps:</p><ol><li><p><strong>Users who miss pre-defined reports</strong> – GA4 removed many of the reports teams relied on. Things are harder to find, and there&#x27;s no guarantee popular reports will return.</p></li><li><p><strong>Teams without data science support</strong> – GA4 caters more to large enterprises and app developers. Its reliance on Looker Studio and BigQuery exports is a barrier for small business and marketing teams who don&#x27;t have analytics engineers.</p></li><li><p><strong>App developers who need more</strong> – Despite courting app developers, GA4 still falls short of alternatives that pulled users away from Universal Analytics in the first place. For many, it&#x27;s too little, too late.</p></li></ol><p>Some teams also avoid GA4 for privacy reasons. GA4 is not GDPR-compliant by default – it requires additional configuration including consent banners and Consent Mode v2. The 2023 EU-U.S. Data Privacy Framework resolved the underlying data transfer concern, though the framework remains subject to legal and political uncertainty.</p></details><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/hogflix-dashboard.png" alt="posthog"/></p><ul><li><strong>Best for:</strong> Startups, engineers, and product teams</li><li><strong>Tracking method:</strong> Event-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span> (via self-hosting or EU Cloud)</li><li><strong>GA data import:</strong> <span class="text-red text-lg">✖</span></li></ul><p><a href="/">PostHog</a> (that&#x27;s us 👋) is an <a href="/products">all-in-one developer platform</a> that includes <a href="/web-analytics">web analytics</a>, <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/error-tracking">error tracking</a>, <a href="/experiments">experiments</a>, <a href="/surveys">user surveys</a>, and more – pretty much everything you need to track user behavior in an app or website. </p><p>This means it&#x27;s not just a GA4 alternative, but also a replacement for tools like <a href="/blog/best-mixpanel-alternatives">Mixpanel</a>, <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a>, and <a href="/blog/best-fullstory-alternatives">FullStory</a>. </p><p>Typical PostHog users are engineers and product managers at startups and mid-size companies, such as <a href="/customers/elevenlabs">ElevenLabs</a>, <a href="/customers/supabase">Supabase</a>, and <a href="/customers/lovable">Lovable</a>.</p><p>Like GA4, PostHog is an <a href="/docs/data/events">event-based platform</a>. It&#x27;s priced per event captured, though it offers a generous <a href="/pricing">1 million events for free</a> each month, so many users can use it for free.</p><h3 id="how-does-posthog-compare-to-ga4">How does PostHog compare to GA4?</h3><p>PostHog gives you all the web analytics of GA4 and far more on top. Where GA4 is a marketing analytics tool, PostHog is a full product development platform. This means that, in addition to tracking user behavior, you can also use PostHog to run A/B tests, set up feature flags, record user sessions, and even survey users. </p><p>GA4 doesn&#x27;t have any of these features built-in, so you&#x27;d need to integrate with other tools to get the same functionality.</p><p>Read our <a href="/blog/posthog-vs-ga4">PostHog and Google Analytics comparison</a> for an in-depth look at the differences</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between PostHog and GA4</summary><ul><li>PostHog includes session replay, feature flags, A/B testing, error tracking, and surveys; GA4 offers none of these.</li><li>GA4 integrates natively with Google Ads, Search Console, and the broader Google Marketing Platform; PostHog doesn&#x27;t have native ad platform integrations yet, but <a href="/docs/web-analytics/marketing-analytics">marketing analytics features</a> are currently in beta.</li><li>PostHog offers EU hosting with data stored exclusively in the EU; GA4 doesn&#x27;t offer EU-only data residency.</li><li>PostHog is HIPAA-ready with a BAA available; GA4 is not HIPAA-compliant.</li><li>PostHog is open source; GA4 is closed source.</li><li>PostHog offers cookieless tracking; GA4 relies on cookies by default.</li></ul></details><details><summary>Main similarities between PostHog and GA4</summary><ul><li>Both offer web analytics with traffic breakdown, UTM tracking, and conversion tracking.</li><li>Both support event-based tracking with autocapture and custom events.</li><li>Both are SOC 2 certified.</li><li>Both support real-time data views.</li><li>Both offer free tiers that are sufficient for most small to mid-size teams.</li><li>Both integrate with Segment, Zapier, and other popular tools.</li></ul></details><blockquote><h4 id="bottom-line">Bottom line</h4><p>PostHog is the best GA4 alternative for engineering and product teams who need more than just web analytics. It covers everything GA4 does and adds a full stack of product tools, all with transparent pricing and a generous free tier.</p></blockquote><p><div></div></p><h2 id="2-matomo">2. Matomo</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/matomo-screenshot.png" alt="Matomo - open source analytics tools"/></p><ul><li><strong>Best for:</strong> Content, marketing and e-commerce websites</li><li><strong>Tracking method:</strong> Session-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-green text-lg">✔</span></li></ul><p><a href="/blog/posthog-vs-matomo">Matomo</a> is one of the most popular Google Analytics alternatives around. Like UA, it&#x27;s based on a session-based tracking model, and it even allows new users to import data from an existing Google Analytics account.</p><p>It also shares some weaknesses inherent in Universal Analytics. While <a href="/blog/best-matomo-alternatives">Matomo</a> has added more advanced analytics features, it&#x27;s better suits traditional website analytics than tracking desktop and mobile apps. Like PostHog, it&#x27;s open source, so can be self-hosted if you prefer.</p><h3 id="how-does-matomo-compare-to-ga4">How does Matomo compare to GA4?</h3><p>Matomo is session-based like Universal Analytics, making it a more natural migration path for teams who preferred the old Google Analytics model. It gives you full data ownership and GDPR compliance without the complexity of GA4.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Matomo<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-matomo">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Limited</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Matomo and GA4</summary><ul><li>Matomo is session-based like Universal Analytics; GA4 is event-based. Matomo is a more natural migration for UA users.</li><li>Matomo can import historical data from Google Analytics; GA4 cannot import historical data from other tools.</li><li>Matomo can be self-hosted for full data ownership; GA4 is cloud-only.</li><li>Matomo doesn&#x27;t sample data on any plan; GA4 free applies sampling to large exploration queries.</li><li>GA4 integrates natively with Google Ads and Search Console; Matomo doesn&#x27;t.</li><li>GA4 has a large free tier; Matomo&#x27;s cloud is paid (free for self-hosted).</li></ul></details><details><summary>Main similarities between Matomo and GA4</summary><ul><li>Both offer web analytics with traffic breakdown, referrers, and conversion tracking.</li><li>Both support custom event tracking.</li><li>Both offer goal tracking and funnel analysis.</li><li>Both support integrations with popular CMS and ecommerce platforms.</li></ul></details><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>Matomo is closest you&#x27;ll get to a Universal Analytics-style experience. It&#x27;s session-based and was explicitly conceived as European alternative to Google Analytics. It has plenty of features, too, though some may find the interface a little dated. It&#x27;s especially well-suited to publishers, privacy-conscious organizations, and teams in regulated industries.</p></blockquote><h2 id="3-kissmetrics">3. Kissmetrics</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/kissmetrics.png" alt="kissmetrics"/></p><ul><li><strong>Best for:</strong> Marketing and e-commerce websites</li><li><strong>Tracking method:</strong> Event-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-red text-lg">✖</span></li></ul><p><strong>Kissmetrics</strong> is all about tracking marketing ROI. As a result, it doesn&#x27;t track what Kissmetrics deems vanity metrics like bounce rate, time on page, exits, etc. It does, however, track most essential website metrics, and makes it easy to understand the impact of organic and paid marketing activity.</p><p>One of its key features is the Populations report, which groups users into key cohorts, such as those who have recently activated trials, or are at risk of churning. You can also create custom funnel reports, and track user paths through your website.</p><h3 id="how-does-kissmetrics-compare-to-ga4">How does Kissmetrics compare to GA4?</h3><p>Kissmetrics and GA4 serve different masters. GA4 is built for traffic and marketing attribution. Kissmetrics is built for understanding customers and driving revenue – it intentionally excludes &quot;vanity metrics&quot; like bounce rate and time on page, focusing instead on what actually drives growth.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Kissmetrics</div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Partial</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Partial</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Kissmetrics and GA4</summary><ul><li>Kissmetrics is person-based (every action tied to an individual); GA4 is event-based with session context.</li><li>Kissmetrics focuses on revenue analytics and customer lifetime value; GA4 focuses on traffic, acquisition, and marketing attribution.</li><li>Kissmetrics deliberately excludes &quot;vanity metrics&quot; like bounce rate; GA4 tracks them all.</li><li>GA4 is free; Kissmetrics starts at $25.99/month.</li><li>GA4 integrates natively with Google Ads and Search Console; Kissmetrics does not.</li><li>Kissmetrics includes email campaign automation; GA4 does not.</li></ul></details><details><summary>Main similarities between Kissmetrics and GA4</summary><ul><li>Both offer funnel analysis and conversion tracking.</li><li>Both support cohort analysis.</li><li>Both track custom events and user behavior.</li><li>Both offer A/B testing capabilities.</li></ul></details><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>Kissmetrics is a great platform for sophisticated marketing teams who want to track the impact of their work on revenue. It&#x27;s overkill for basic website analytics use cases, but a good option for mature businesses looking for a robust alternative to Google Analytics.</p></blockquote><h2 id="4-telemetrydeck">4. TelemetryDeck</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/telemetrydeck.png" alt="telemetrydeck"/></p><ul><li><strong>Best for:</strong> Mobile apps</li><li><strong>Tracking method:</strong> Event-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-red text-lg">✖</span></li></ul><p>While it can be used on websites, <strong>TelemetryDeck</strong> is primarily a privacy-minded analytics tool for mobile apps. As such, it uses an event-based tracking model – TelemetryDeck calls them signals. It has first-party SDKs for Swift (iOS, macOS etc. apps), Kotlin (Android and Java apps), and Javascript (Node and web apps).</p><p>TelemetryDeck makes it easy for app developers to track things like active users, OS version, app version, and basic user metadata like user location. It also supports basic retention and conversion funnel insights. TelemetryDeck doesn&#x27;t collect any personally identifiable metadata, so you don&#x27;t need tracking consent banners.</p><h3 id="how-does-telemetrydeck-compare-to-ga4">How does TelemetryDeck compare to GA4?</h3><p>TelemetryDeck does far less than GA4 by design. It&#x27;s intentionally lean – no user profiles, no revenue tracking, no ad attribution. What it offers is privacy-safe app analytics with zero compliance overhead, which is a compelling tradeoff for many indie developers and privacy-focused teams.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">TelemetryDeck</div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Partial</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Basic analysis only</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between TelemetryDeck and GA4</summary><ul><li>TelemetryDeck collects no personally identifiable information by design; GA4 collects user-level data and requires GDPR consent management.</li><li>TelemetryDeck doesn&#x27;t require cookie consent banners; GA4 does in most EU contexts.</li><li>TelemetryDeck is focused on app analytics (iOS, Android, Flutter, React Native); GA4 is primarily web-focused.</li><li>GA4 has a large free tier but no transparent pricing; TelemetryDeck has a free tier (100k signals/month) with transparent, usage-based pricing after that.</li><li>GA4 integrates with Google Ads; TelemetryDeck has no ad platform integrations.</li><li>TelemetryDeck lacks user profiles and revenue tracking; GA4 includes both.</li></ul></details><details><summary>Main similarities between TelemetryDeck and GA4</summary><ul><li>Both support event-based tracking.</li><li>Both offer funnels and retention analysis.</li><li>Both support multiple platforms including iOS, Android, and web.</li><li>Both offer real-time dashboards.</li></ul></details><blockquote><h4 id="bottom-line-3">Bottom line</h4><p>TelemetryDeck is a good option for those who want basic app analytics, but it falls short of feature parity with GA4. It&#x27;s not a full GA4 replacement for teams that need revenue tracking, ad attribution, or user profiles – but it&#x27;s a great fit for indie developers and privacy-first teams.</p></blockquote><h2 id="5-plausible">5. Plausible</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/plausible-screenshot.png" alt="Plausible Analytics - open source analytics tools"/></p><ul><li><strong>Best for:</strong> Content and marketing websites</li><li><strong>Tracking method:</strong> Session-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-green text-lg">✔</span></li></ul><p><a href="/blog/posthog-vs-plausible">Plausible</a> is a leader in the trend of lightweight, privacy-orientated analytics tools. It&#x27;s easy to use and doesn&#x27;t collect any personally identifiable information. This makes it ideal for complying with GDPR, but this comes at the cost of functionality. </p><p><a href="/blog/best-plausible-alternatives">Plausible</a> can only track very basic website metrics like pageviews, session duration, and referrer information. This makes it useless for apps, and significantly less powerful than Google Analytics and other alternatives in this list.</p><p>But, if you just want basic website analytics, it gets the job done, and won&#x27;t adversely impact the performance of your website thanks to its lightweight tracking script.</p><h3 id="how-does-plausible-compare-to-ga4">How does Plausible compare to GA4?</h3><p>Plausible covers the basics of web analytics without the complexity. It&#x27;s not a like-for-like GA4 replacement – it lacks user profiles, advanced segmentation, and the depth of reporting GA4 offers. But for teams who just want simple, trustworthy traffic data without GDPR headaches, it&#x27;s hard to beat.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Plausible<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-plausible">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Business plan only</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Plausible and GA4</summary><ul><li>Plausible collects no personal data and requires no cookie consent banners; GA4 does.</li><li>Plausible&#x27;s script is under 1KB; GA4&#x27;s is ~45KB.</li><li>GA4 has far deeper analytics: user profiles, cohorts, advanced segmentation, predictive insights. Plausible is intentionally basic.</li><li>Plausible is open source and can be self-hosted; GA4 is cloud-only.</li><li>GA4 integrates with Google Ads; Plausible doesn&#x27;t.</li></ul></details><details><summary>Main similarities between Plausible and GA4</summary><ul><li>Both offer web analytics with traffic sources, pageviews, and bounce rate.</li><li>Both support UTM tracking and campaign attribution.</li><li>Both support custom event tracking and goal conversion.</li><li>Both can import data from Google Analytics.</li></ul></details><blockquote><h4 id="bottom-line-4">Bottom line</h4><p>While it lacks many of the advanced features of GA4, Plausible is a good option for content and marketing teams who just want easy to use, basic website analytics.</p></blockquote><h2 id="6-vercel-web-analytics">6. Vercel Web Analytics</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/vercel.png" alt="vercel analytics"/></p><ul><li><strong>Best for:</strong> Content and marketing websites</li><li><strong>Tracking method:</strong> Event-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-red text-lg">✖</span></li></ul><p><strong>Vercel Web Analytics</strong> is a privacy-friendly analytics tool included in all Vercel plans. Like Plausible, it tracks basic website metrics like pageviews, unique users, time on page, and referrers. It doesn&#x27;t collect personally identifiable information, so can be used without cookie banners.</p><p>Other useful features include a Speed Insights tool for keeping track of your website&#x27;s Core Web Vitals. You can also set up custom events to track conversions.</p><h3 id="how-does-vercel-web-analytics-compare-to-ga4">How does Vercel Web Analytics compare to GA4?</h3><p>Vercel Web Analytics is a convenience product, not a GA4 replacement. If you&#x27;re already on Vercel, it&#x27;s worth enabling for basic traffic data. If you need more depth – funnels, user paths, retention, ad attribution – you&#x27;ll need a dedicated analytics tool.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Vercel Web Analytics</div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Plus/Enterprise</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>via Speed Insights</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Via integrations</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Vercel Web Analytics and GA4</summary><ul><li>Vercel Analytics collects no PII and requires no cookie consent; GA4 does.</li><li>GA4 is far more capable: user profiles, cohorts, segmentation, funnel analysis, ad attribution, and more.</li><li>Vercel Analytics only works for sites hosted on Vercel; GA4 works anywhere.</li><li>Vercel Analytics includes Core Web Vitals monitoring out of the box; GA4 doesn&#x27;t.</li></ul></details><details><summary>Main similarities between Vercel Web Analytics and GA4</summary><ul><li>Both offer basic web analytics: pageviews, visitors, and referrers.</li><li>Both support custom event tracking and conversion goals.</li><li>Both offer real-time data.</li></ul></details><blockquote><h4 id="bottom-line-5">Bottom line</h4><p>Vercel Web Analytics is a nice value-add for any front-end dev using Vercel&#x27;s frontend-as-a-service. There&#x27;s certainly no need to deploy another privacy-first analytics tool (e.g. Plausible, Fathom) if you&#x27;re already using Vercel, though it falls a long way short of a genuine Google Analytics alternative. If you need more than what it offers, consider deploying PostHog or Matomo.</p></blockquote><h2 id="7-piwik-pro">7. Piwik PRO</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/piwik-pro.png" alt="piwik pro"/></p><ul><li><strong>Best for:</strong> Content, marketing and e-commerce websites</li><li><strong>Tracking method:</strong> Session-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-red text-lg">✖</span></li></ul><p><strong>Piwik PRO</strong> is a commercial spinoff of Matomo – Matomo used be called Piwik. As such, there are some similarities between the two, such as session-based tracking and superficial UX similarities.</p><p>Piwik PRO&#x27;s main differentiators are enterprise level support and the integration of a customer data platform (CDP). Like Matomo, it also puts an emphasis on privacy compliance by integrating a consent manager.</p><h3 id="how-does-piwik-pro-compare-to-ga4">How does Piwik PRO compare to GA4?</h3><p>Piwik PRO is particularly strong for regulated industries and enterprise teams that need GDPR compliance, consent management, and EU data residency in a single package. It&#x27;s less self-serve than GA4 but offers more control.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Piwik Pro</div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Limited</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Piwik PRO and GA4</summary><ul><li>Piwik PRO includes a built-in consent manager and CDP; GA4 requires separate tools for both.</li><li>Piwik PRO can be self-hosted on-premise; GA4 is cloud-only.</li><li>GA4 has a large free tier but no transparent pricing; Piwik PRO has a free tier (up to 500k actions/month) with paid plans for higher volumes.</li><li>GA4 integrates natively with Google Ads and Search Console; Piwik PRO doesn&#x27;t.</li><li>Piwik PRO is session-based like Universal Analytics; GA4 is event-based.</li><li>Piwik PRO requires a sales conversation for enterprise features; GA4 is entirely self-serve.</li></ul></details><details><summary>Main similarities between Piwik PRO and GA4</summary><ul><li>Both offer web analytics with traffic breakdown, referrers, and conversion tracking.</li><li>Both support custom event tracking.</li><li>Both offer funnels and user journey analysis.</li><li>Both support integrations with popular marketing tools.</li></ul></details><blockquote><h4 id="bottom-line-6">Bottom line</h4><p>Unsurprisingly, Piwik PRO&#x27;s roots in Matomo make it a popular choice for users who are familiar with Universal Analytics. It&#x27;s less feature-rich than Matomo in some respects, but may be a better choice for larger organizations who require more support and scale.</p></blockquote><h2 id="8-fathom">8. Fathom</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/gdpr-compliant-analytics/fathom.png" alt="Fathom - GDPR compliant analytics"/></p><ul><li><strong>Best for:</strong> Content and marketing websites</li><li><strong>Tracking method:</strong> Session-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-green text-lg">✔</span></li></ul><p><a href="/blog/best-fathom-alternatives">Fathom</a> is another leading privacy-focused analytics tool that&#x27;s similar in scope to Plausible. It&#x27;s ideal for small and medium-size marketing websites, but it lacks the deeper features typical Google Analytics users will demand.</p><p>For a deep dive, check out <a href="/blog/posthog-vs-fathom">PostHog vs Fathom Analytics</a> too.</p><h3 id="how-does-fathom-compare-to-ga4">How does Fathom compare to GA4?</h3><p>Like Plausible, Fathom is intentionally simple. It provides clean, unsampled web analytics data without the privacy concerns or interface complexity of GA4. It&#x27;s not for teams that need advanced segmentation, user-level data, or ad attribution – but it&#x27;s excellent for what it does.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Fathom<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-fathom">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Fathom and GA4</summary><ul><li>Fathom collects no personal data and requires no cookie consent banners; GA4 does.</li><li>Fathom is intentionally basic – no user profiles, cohorts, or advanced segmentation.</li><li>Fathom is paid (starts at $15/month); GA4 is free.</li><li>GA4 has far deeper analytics capabilities and integrates with Google Ads.</li><li>Fathom uses EU-owned infrastructure for all data processing; GA4 doesn&#x27;t offer EU-only data residency.</li><li>Fathom includes uptime monitoring; GA4 does not.</li></ul></details><details><summary>Main similarities between Fathom and GA4</summary><ul><li>Both offer web analytics with traffic sources, pageviews, and bounce rate.</li><li>Both support UTM tracking and campaign attribution.</li><li>Both support custom event tracking and goal conversion.</li><li>Both can import data from Google Analytics.</li></ul></details><blockquote><h4 id="bottom-line-7">Bottom line</h4><p>There isn&#x27;t much to choose between Fathom and Plausible. Again, if you want lightweight website analytics without the feature bloat of Google, you can&#x27;t go wrong with Fathom.</p></blockquote><h2 id="9-counter">9. Counter</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/counter.png" alt="counter"/></p><ul><li><strong>Best for:</strong> Content and personal websites</li><li><strong>Tracking method:</strong> Session-based</li><li><strong>GDPR compliance:</strong> <span class="text-green text-lg">✔</span></li><li><strong>GA data import:</strong> <span class="text-red text-lg">✖</span></li></ul><p><strong>Counter</strong> is a free and <a href="/blog/best-open-source-analytics-tools">open source analytics</a> tool that operates a &quot;pay what you want&quot; model. It&#x27;s by no means a feature-complete alternative to GA4, but it&#x27;s ideal if you want to track basic website activity like visits, referral data, and user properties (device, platform, browser etc.).</p><p>Counter&#x27;s creators can offer it for free because it only collects aggregated data, reducing the complexity and load on the server, while also improving data privacy. To count unique users, Counter uses a combination of techniques including the browser&#x27;s cache, <code>sessionStorage</code>, and referrer inspection.</p><h3 id="how-does-counter-compare-to-ga4">How does Counter compare to GA4?</h3><p>Counter is about as minimal as analytics gets. It does just enough to answer &quot;how many people visited my site and where did they come from?&quot; For personal projects, blogs, and indie developers who don&#x27;t need anything more, it&#x27;s a compelling free alternative.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Counter</div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Pageviews</strong><div class="text-sm text-secondary mt-1">Track visitors and their views</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bounce rate</strong><div class="text-sm text-secondary mt-1">See the percentage of users that leave after one pageview</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Traffic breakdown</strong><div class="text-sm text-secondary mt-1">See where your visitors and conversions are coming from</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Partial</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>UTM tracking</strong><div class="text-sm text-secondary mt-1">Track marketing campaigns with UTM tags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web vitals</strong><div class="text-sm text-secondary mt-1">Monitor the performance of your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User profiles</strong><div class="text-sm text-secondary mt-1">Track personally-identifiable user info like name, email, and usage data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Anonymous</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>EU hosting</strong><div class="text-sm text-secondary mt-1">Access and store your data in the EU</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Counter and GA4</summary><ul><li>Counter only collects aggregated data; GA4 collects individual user-level event data.</li><li>Counter is free with no usage limits; GA4 is also free but with data retention and sampling limits.</li><li>Counter&#x27;s feature set is extremely minimal; GA4 offers deep analytics, segmentation, and attribution.</li><li>Counter has no integrations with ad platforms or external tools; GA4 connects to Google&#x27;s entire marketing stack.</li><li>Counter can be self-hosted; GA4 cannot.</li><li>Counter requires no consent banners; GA4 requires them in most EU contexts.</li></ul></details><details><summary>Main similarities between Counter and GA4</summary><ul><li>Both offer basic web analytics: visits, referrers, and device breakdown.</li><li>Both require no personally identifiable information.</li></ul></details><blockquote><h4 id="bottom-line-8">Bottom line</h4><p>Counter is a great choice if you have basic needs. It does most of the things the popular privacy-first analytics tools offer, but does so for free. The simple interface is easy to understand, though it doesn&#x27;t allow you to drill down deeply into individual page performance like Fathom or Plausible.</p></blockquote><h2 id="which-ga4-alternative-should-you-choose">Which GA4 alternative should you choose?</h2><p>Here&#x27;s a quick guide based on what you need:</p><p><strong>For engineering and product teams who need more than web analytics:</strong></p><ul><li><strong>PostHog</strong> – <a href="/web-analytics">Web analytics</a>, <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/error-tracking">error tracking</a>, <a href="/surveys">surveys</a>, and more in one developer platform. Best if you want to replace GA4 and several other tools with transparent pricing.</li></ul><p><strong>For a familiar Universal Analytics-style replacement:</strong></p><ul><li><strong>Matomo</strong> – Session-based analytics with GA data import and self-hosting. Best for teams migrating from Universal Analytics who want full data ownership.</li><li><strong>Piwik PRO</strong> – Best for enterprise teams in regulated industries (healthcare, finance, government) who need a CDP and consent manager alongside analytics.</li></ul><p><strong>For revenue and marketing analytics:</strong></p><ul><li><strong>Kissmetrics</strong> – Person-based analytics tied to revenue and LTV. Best for e-commerce and SaaS teams who want to understand which channels and features drive revenue.</li></ul><p><strong>For privacy-first lightweight web analytics:</strong></p><ul><li><strong>Plausible</strong> – Clean, GDPR-compliant web analytics with no cookies or consent banners. Best for content sites and marketing websites that want simple, trustworthy data.</li><li><strong>Fathom</strong> – Very similar to Plausible, with EU-owned infrastructure and uptime monitoring. Best for privacy-conscious teams willing to pay slightly more.</li><li><strong>Counter</strong> – Free, minimal web analytics. Best for personal projects and indie developers who just need basic traffic data.</li></ul><p><strong>For app developers:</strong></p><ul><li><strong>TelemetryDeck</strong> – Privacy-safe analytics for iOS, Android, Flutter, and React Native apps with no consent banners required.</li><li><strong>PostHog</strong> – Full-featured analytics for iOS, Android, React Native, and Flutter with session replay, feature flags, and error tracking. Best if you need more than privacy-safe event counts.</li></ul><p><strong>For teams already on Vercel:</strong></p><ul><li><strong>Vercel Web Analytics</strong> – Easiest to implement with zero configuration. Not a full GA4 replacement but good enough for basic traffic data.</li></ul><p><strong>For early-stage startups:</strong></p><ul><li><strong>PostHog</strong> – A <a href="/pricing">generous free tier</a> (1M events, 5,000 replays, 1M feature flag requests) plus up to <a href="/startups">$50k in credits</a> for eligible startups. One platform that scales from first users to product-market fit.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think PostHog is the best GA4 replacement if:</p><ul><li>You need more than web analytics – session replay, feature flags, A/B testing, and error tracking all in one place.</li><li>You want transparent, usage-based pricing without a sales call.</li><li>You&#x27;re an engineering or product team who wants SQL access, open-source code, and APIs.</li><li>You want to try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>).</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">AI setup wizard</a> handles configuration in minutes, or check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>Why are people looking for Google Analytics alternatives?</summary><p>Common reasons include: GA4 is harder to use than Universal Analytics, data sampling affects accuracy on large exploration queries, the 14-month data retention limit on the free tier is restrictive, privacy concerns and GDPR compliance are complicated under GA4, and many teams need more than web analytics – session replay, feature flags, error tracking – that GA4 simply doesn&#x27;t offer.</p></details><details><summary>What&#x27;s the best free Google Analytics alternative?</summary><p><strong>PostHog</strong> offers the most complete free tier: 1 million analytics events, 5,000 session replays, 1 million feature flag requests, and 1,500 survey responses per month. <strong>Plausible</strong> and <strong>Fathom</strong> are both paid but have free trials. <strong>Counter</strong> is completely free. </p></details><details><summary>What&#x27;s the best privacy-friendly Google Analytics alternative?</summary><p>For lightweight web analytics, <strong>Plausible</strong> and <strong>Fathom</strong> are the strongest options – both are cookieless, GDPR-compliant by default, and collect no personally identifiable information. <strong>TelemetryDeck</strong> is the best option for app developers who need privacy-safe analytics without consent banners. <strong>PostHog</strong> and <strong>Matomo</strong> both support EU hosting, cookieless tracking, and HIPAA compliance for teams with more advanced requirements. </p><p>See our guide to <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR-compliant analytics tools</a> for a full breakdown.</p></details><details><summary>What&#x27;s the best GA4 alternative for startups?</summary><p><strong>PostHog</strong> is the best option for early-stage companies. Beyond the generous free tier, startups can apply for <a href="/startups">PostHog for Startups</a> to get $50,000 in additional credits. One platform that covers analytics, replays, feature flags, and more from day one means you don&#x27;t have to swap tools as you scale.</p></details><details><summary>What&#x27;s the best GA4 alternative for developers?</summary><p><strong>PostHog</strong> is built for developers – SQL access, MCP server for AI coding tools, open-source codebase, extensively documented APIs, and SDKs for every major platform. <strong>TelemetryDeck</strong> is a good lightweight option for app developers who prioritize privacy.</p></details><details><summary>What&#x27;s the best GA4 alternative for session replay?</summary><p><strong>PostHog</strong> includes session replay with console logs, network monitoring, a DOM explorer, and performance metrics – tightly integrated with analytics. </p><p>For standalone session replay, see our guide to the <a href="/blog/best-session-replay-tools">best session replay tools</a>.</p></details><details><summary>Can I migrate historical data from GA4 to another tool?</summary><p><strong>Matomo</strong> and <strong>Plausible</strong> both support importing data from Google Analytics. <strong>PostHog</strong> doesn&#x27;t directly import GA4 data, but you can run both tools in parallel during a transition period and use PostHog&#x27;s <a href="/docs/migrate/google-analytics">historical migration docs</a> for guidance.</p></details><details><summary>Does GA4 have session replay?</summary><p>No. GA4 does not include session replay. If you need session replay alongside web analytics, consider <strong>PostHog</strong> (which integrates replay with analytics, feature flags, and error tracking) or <strong>Hotjar</strong> (now part of Contentsquare).</p></details><details><summary>Does GA4 have feature flags or A/B testing?</summary><p>No. GA4 does not offer native feature flags or A/B testing. <a href="/blog/optimize-to-posthog">Google Optimize</a> (GA4&#x27;s A/B testing product) was shut down in 2023. For feature flags and experimentation tightly integrated with analytics, <strong>PostHog</strong> is the best alternative. </p><p>See our guide to the <a href="/blog/best-launchdarkly-alternatives">best LaunchDarkly alternatives</a> for more options.</p></details><details><summary>What are the best web analytics tools in 2026?</summary><p>The <a href="/blog/best-web-analytics-tools">top web analytics tools in 2026</a> include:</p><ul><li><strong><a href="/web-analytics">PostHog</a></strong> – Best all-in-one for engineering teams wanting analytics, replay, feature flags, and more</li><li><strong><a href="/blog/posthog-vs-plausible">Plausible</a></strong> – Best lightweight, privacy-focused option</li><li><strong><a href="/blog/posthog-vs-matomo">Matomo</a></strong> – Best self-hosted GA alternative with full data ownership</li><li><strong><a href="/blog/best-fathom-alternatives">Fathom</a></strong> – Best for privacy-conscious teams wanting simple analytics with EU infrastructure</li><li><strong><a href="/blog/posthog-vs-amplitude">Amplitude</a></strong> – Best for enterprise product analytics with a built-in CDP</li><li><strong><a href="/blog/posthog-vs-mixpanel">Mixpanel</a></strong> – Best for product managers wanting event-based analytics</li></ul><p>See our full guide to the <a href="/blog/best-web-analytics-tools">best web analytics tools</a> for more options.</p></details><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Google Analytics 4]]></title><description><![CDATA[PostHog and  Google Analytics 4 (GA4)  are both popular tools for understanding how users interact with your website or app – but they're built with…]]></description><link>https://posthog.com/blog/posthog-vs-ga4</link><guid isPermaLink="false">8bf77d0c-1501-5312-8def-e34fc8164780</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-ga4/posthog-vs-ga4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog and <a href="/blog/ga4-alternatives">Google Analytics 4 (GA4)</a> are both popular tools for understanding how users interact with your website or app – but they&#x27;re built with very different goals.</p><p><strong>GA4</strong> is designed to track traffic, campaigns, and user behavior across websites and apps, with tight integration into Google&#x27;s advertising ecosystem. It&#x27;s one of the most widely deployed analytics tools in the world, and the default choice for teams who want marketing and attribution data in a familiar interface.</p><p><strong>PostHog</strong> is an all-in-one developer platform that combines all the tools developers need in one place, with a single login and a single contract.</p><p>If you&#x27;re looking for a <a href="/blog/ga4-alternatives">GA4 alternative</a> – whether for privacy reasons, because you need more than web analytics, or because you&#x27;ve outgrown GA4&#x27;s free tier limits – this comparison will help you decide if PostHog is the right fit.</p><h2 id="how-is-posthog-different">How is PostHog different?</h2><h3 id="1-were-an-all-in-one-platform">1. We&#x27;re an all-in-one platform</h3><p>PostHog combines <a href="/product-analytics">product analytics</a> and <a href="/web-analytics">web analytics</a> with <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/error-tracking">error tracking</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, a baked-in <a href="/docs/data-warehouse">data warehouse</a>, and more into one tightly integrated platform. Everything you need from a single app with a single contract. A <em>genuine</em> single source of truth for your product and customer data.</p><p>GA4 is a powerful web analytics tool, but it doesn&#x27;t include session replay, feature flags, A/B testing, error tracking, or surveys. For those features, you&#x27;d need separate tools like <a href="/blog/posthog-vs-fullstory">FullStory</a>, <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a>, and <a href="/blog/posthog-vs-optimizely">Optimizely</a>, and a way to stitch the data together.</p><h3 id="2-its-built-for-developers">2. It&#x27;s built for developers</h3><p>This means you get support from the engineers who <em>actually build the product</em>, <a href="/docs/api">extensively documented APIs</a>, an <a href="/docs/model-context-protocol">MCP server</a> for querying your data directly from AI coding tool, and a <a href="/docs/product-analytics/sql">SQL query builder</a> so you can analyze data how you want. </p><p>We&#x27;re open source, so you can inspect <a href="https://github.com/PostHog">our source code</a>. And we ship fast – check out <a href="/changelog">the weekly changelog</a> to see what&#x27;s new.</p><p>GA4 is primarily designed for marketers and growth teams. It integrates tightly with Google Ads and the broader Google Marketing Platform, but offers limited developer-facing tooling.</p><h3 id="3-transparent-and-cheap-pricing-forever">3. Transparent and cheap pricing (forever)</h3><p>We default to charging as little as possible while still making a profit – we also have a generous free tier on all our products. We can do this because we&#x27;re efficient. We don&#x27;t splurge on D-list comedians to host an annual convention you&#x27;ll never attend. Want to know how much we&#x27;ll charge? See our <a href="/pricing">pricing calculator</a>.</p><p>GA4&#x27;s core product is free, but once you hit the limits of the free tier you&#x27;ll need to evaluate GA360, which starts at approximately <a href="/blog/google-analytics-cost">$50,000/year according to third party sources</a> (Google doesn&#x27;t publish pricing).</p><p><div></div></p><h2 id="comparing-posthog-and-google-analytics">Comparing PostHog and Google Analytics</h2><h3 id="analytics">Analytics</h3><p>GA4 is primarily built for web analytics, so this is where the comparison matters most. PostHog&#x27;s <a href="/web-analytics">web analytics</a> dashboard covers all the core metrics – traffic sources, pageviews, sessions, UTM tracking, and more – while also adding capabilities GA4 lacks, like cookieless tracking and web vitals monitoring.</p><p><div competitors="posthog,ga4"></div></p><p>PostHog goes significantly deeper on product analytics – including features like <a href="/docs/product-analytics/group-analytics">group analytics</a> for analyzing behavior at the account or company level (ideal for B2B SaaS), SQL queries, correlation analysis, and more.</p><p><div competitors="posthog,ga4"></div></p><p>You can also go deeper on user behavior by utilizing <a href="/docs/toolbar/heatmaps">heatmaps</a>, scrollmaps, formulas, and the <a href="/docs/product-analytics/sql">custom SQL insights</a>.</p><p><div competitors="posthog,ga4"></div></p><h3 id="does-posthog-have-reports-dimensions-and-other-ga4-features">Does PostHog have reports, dimensions, and other GA4 features?</h3><p>Yes, PostHog has much of the same functionality as Google Analytics, but we use different terminology. Here’s a quick comparison of the two:</p><p><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td><strong>GA name</strong></td><td><strong>PostHog equivalent</strong></td><td></td></tr></thead><tbody><tr><td>Report</td><td>Insight</td><td>Query and filter analytics data and visualize results. Types include trends, funnels, retention, and more.</td></tr><tr><td>Dimensions</td><td>Properties</td><td>Additional details added to events, persons, and groups such as location, browser, and status.</td></tr><tr><td>View</td><td>Dashboard</td><td>A collection of insights displayed together.</td></tr><tr><td>Audience</td><td>Persons</td><td>Represents a user or set of users who create events, potentially filtered by properties or behaviors.</td></tr><tr><td>Segment</td><td>Filter</td><td>A way to create a subset of your data.</td></tr><tr><td>Goals and conversions</td><td>Actions</td><td>An event or collection of events representing a target behavior.</td></tr><tr><td>Client ID</td><td>Distinct ID</td><td>A unique identifier for a user.</td></tr><tr><td>Measurement ID</td><td>Project Token</td><td>The unique identifier for your project, used to send data to your PostHog instance.</td></tr></tbody></table></div></p><p>See our <a href="/blog/google-analytics-to-posthog">guide to PostHog for Google Analytics users</a> for more help on making the switch.</p><h3 id="platform">Platform</h3><p>When you choose PostHog, you get more than analytics.</p><p><div competitors="posthog,ga4"></div></p><h3 id="integrations">Integrations</h3><p>It&#x27;s hard to import data into Google Analytics because:</p><ol><li>The data type and format you&#x27;re allowed to <a href="https://support.google.com/analytics/answer/10071301">import</a> is restrictive.</li><li>You either need to constantly upload CSV files manually, or set up an SFTP server to automatically do this for you.</li></ol><p>In contrast, PostHog is built to be your single source of truth, so it&#x27;s simple to import data from other sources using our <a href="/docs/data-warehouse">built-in data warehouse</a>, or send PostHog data to other tools using our <a href="/docs/cdp/destinations">realtime destinations</a>.</p><p>Below is a comparison of some of the most popular apps – see our <a href="/docs/cdp">data pipeline</a> and <a href="/docs/data-warehouse">warehouse docs</a> for a complete list of integrations.</p><p><div competitors="posthog,ga4"></div></p><h3 id="security-and-compliance">Security and compliance</h3><p>PostHog makes <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR compliance</a> easy by letting you choose where your data is hosted: EU or US. </p><p>Google also offers various <a href="https://support.google.com/analytics/answer/9019185">privacy controls</a>, but you can&#x27;t choose where your data is stored – a meaningful concern for teams in regulated industries or those serving EU users.</p><p><div competitors="posthog,ga4"></div></p><h2 id="when-to-choose-posthog-vs-google-analytics-4">When to choose PostHog vs Google Analytics 4</h2><ul><li>Want an all-in-one developer platform that goes beyond <a href="/web-analytics">web analytics</a> with <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/error-tracking">error tracking</a>, and more – all in one place? Go with <strong>PostHog</strong>.</li><li>Need deep integration with Google Ads, Search Console, and the broader Google Marketing Platform for marketing attribution and campaign reporting? <strong>GA4</strong> is built for that.</li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><p><strong>For engineering-led product teams</strong></p><ul><li><strong>PostHog</strong> – SQL access, MCP server, open-source codebase, error tracking, and LLM analytics. Everything a developer needs to understand users, ship features, and debug problems without leaving the platform.</li></ul><p><strong>For marketing and growth teams</strong></p><ul><li><strong>GA4</strong> – Best-in-class integration with Google Ads, Search Console, and Google&#x27;s attribution ecosystem. If your team lives in Google&#x27;s marketing stack, GA4 is the natural fit.</li></ul><p><strong>For product managers and UX teams</strong></p><ul><li><strong>PostHog</strong> – Funnels, retention, session replay, and surveys in one place means PMs can answer behavioral questions and gather user feedback without stitching together multiple tools.</li></ul><p><strong>For B2B SaaS companies</strong></p><ul><li><strong>PostHog</strong> – <a href="/docs/product-analytics/group-analytics">Group analytics</a> enables account-level analysis, so you can understand behavior at the company level, not just the individual user level. </li></ul><p><strong>For privacy-conscious and regulated organizations</strong></p><ul><li><strong>PostHog</strong> – <a href="/blog/posthog-cloud-eu">EU hosting</a> with data stored exclusively in the EU, HIPAA-readiness, cookieless tracking, and raw data access via the built-in data warehouse. GA4 doesn&#x27;t offer HIPAA compliance or EU-only data residency.</li></ul><p><strong>For content and media sites</strong></p><ul><li><strong>GA4</strong> – If your primary need is understanding content performance, audience demographics, and ad revenue attribution across a high-traffic publishing site, GA4&#x27;s native integrations with Google AdSense, Ad Manager, and Search Console are hard to beat. </li></ul><p><strong>For early-stage startups</strong></p><ul><li><strong>PostHog</strong> – A single platform that covers analytics, replays, feature flags, and more from day one. The <a href="/pricing">generous free tier</a> includes 1 million events, 5,000 session replays, and 1 million feature flag requests per month. <a href="/startups">Startups can also qualify for $50k in free credits</a>.</li></ul><p><strong>For enterprise teams</strong></p><ul><li><strong>Tied</strong> – GA360 offers unsampled reporting, 50-month data retention, and deep Google Marketing Platform integration for large marketing organizations. PostHog offers SSO enforcement, a BAA for HIPAA compliance, priority support, and a complete product development stack with transparent pricing. </li></ul><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>How much do PostHog and Google Analytics cost?</summary><p><strong>Google Analytics 4</strong> is free for most users. However, there are limits: GA4 free caps data retention at 14 months, applies data sampling to large exploration queries (over 10M events), and limits the BigQuery export to 1 million events per day.</p><p>For teams that consistently hit these limits, <strong>Google Analytics 360 (GA360)</strong> is the enterprise tier. Pricing isn&#x27;t publicly listed – it&#x27;s sold through Google&#x27;s reseller network and can land at anywhere from 50-150k+/year.</p><p><strong>PostHog</strong> uses transparent, usage-based <a href="/pricing">pricing</a>. It&#x27;s free to get started – no credit card required. Every month you get 1 million analytics events, 5,000 web session replays, 1 million feature flag requests, 1,500 survey responses, and more for free. </p><p>After the free allowance, you pay only for what you use, with pricing that scales down at volume. You can set per-product billing caps to avoid surprises.</p></details><details><summary>Does PostHog offer a free trial?</summary><p>With PostHog, it&#x27;s free to get started – no trial needed. You get a generous monthly free allowance of events, replays, feature flag requests, and more. If you stay within those limits, PostHog is free forever. </p><p>See our <a href="/pricing">pricing page</a> for the full breakdown.</p></details><details><summary>Can I migrate from Google Analytics to PostHog?</summary><p>Yes – see our <a href="/docs/migrate/google-analytics">Google Analytics to PostHog migration guide</a> for step-by-step instructions. You can also run PostHog alongside GA4 during a transition period, since both can be deployed simultaneously.</p></details><details><summary>Does PostHog block bots by default?</summary><p>Yes, <strong>PostHog</strong> automatically filters known bots from your event data. See the <a href="/docs/product-analytics/troubleshooting#does-posthog-block-bots-by-default">full blocklist in our docs</a>. </p><p>In GA4, bot filtering is also on by default, but the filter lists differ – this can cause discrepancies between the two tools.</p></details><details><summary>What about ad blockers?</summary><p>We recommend <a href="/docs/advanced/proxy">deploying a reverse proxy</a>, which lets you send events to PostHog using your own domain. Events sent from your own domain are far less likely to be intercepted by tracking blockers, giving you more complete data. </p><p>We have reverse proxy setup guides for AWS CloudFront, Caddy, Cloudflare, Netlify, Vercel, Railway, and more.</p></details><details><summary>Does PostHog have session replay?</summary><p>Yes. <strong>PostHog</strong> includes <a href="/session-replay">session replay</a> with console logs, network request monitoring, a DOM explorer, performance metrics, and AI-powered session summaries – built for debugging as much as UX analysis. </p><p>GA4 does not include session replay.</p></details><details><summary>Does PostHog have feature flags and A/B testing?</summary><p>Yes. PostHog includes both <a href="/feature-flags">feature flags</a> and <a href="/experiments">experiments</a> natively, tightly integrated with analytics and session replay. GA4 does not offer either of these features.</p></details><details><summary>Does GA4 support BigQuery export for free?</summary><p>Yes – as of recent updates, GA4 includes a free native BigQuery export, capped at 1 million events per day. This is a significant improvement over the historical restriction that required GA360. If you exceed 1 million events/day, you&#x27;ll need GA360, which removes the daily cap.</p><p>Not that you asked, but PostHog also has a <a href="/docs/cdp/batch-exports/bigquery">BigQuery batch export</a>. </p></details><details><summary>Is PostHog GDPR-compliant and HIPAA-compliant?</summary><p>Yes. <strong>PostHog</strong> offers EU-hosted cloud with data stored exclusively in the EU, HIPAA-readiness (with BAA available on platform packages), cookieless tracking, and SOC 2 certification. </p><p>GA4 does not support HIPAA and doesn&#x27;t offer EU-only data residency.</p></details><details><summary>Are there discounts for non-profits and startups?</summary><p>Yes. Non-profit organizations can contact our team and <a href="/handbook/growth/sales/contract-rules">are typically eligible for a discount</a>. </p><p>Startups can apply for $50,000 in free credits (plus additional perks) through the <a href="/startups">PostHog for Startups program</a>.</p></details><details><summary>What are the best alternatives to Google Analytics in 2026?</summary><p>The <a href="/blog/ga4-alternatives">top GA4 alternatives</a> include:</p><ul><li><strong><a href="/web-analytics">PostHog</a></strong> – Best all-in-one platform for product and engineering teams wanting analytics, replay, feature flags, experiments, and more together</li><li><strong><a href="/blog/posthog-vs-plausible">Plausible</a></strong> – Best lightweight, privacy-focused option for simple web analytics</li><li><strong><a href="/blog/posthog-vs-matomo">Matomo</a></strong> – Best self-hosted GA alternative with full data ownership</li><li><strong><a href="/blog/posthog-vs-amplitude">Amplitude</a></strong> – Best for marketing-led teams needing advanced product analytics and MTU-based pricing</li><li><strong><a href="/blog/posthog-vs-mixpanel">Mixpanel</a></strong> – Best for product teams wanting event-based analytics with a clean UI</li></ul><p>See our full guide to <a href="/blog/ga4-alternatives">GA4 alternatives</a> for more options.</p></details><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we built automatic clustering for LLM traces]]></title><description><![CDATA[Traditional clickstream product analytics (like button clicks and page views) is one of the most important datasets for anyone trying to build a…]]></description><link>https://posthog.com/blog/llm-analytics-clustering-how-it-works</link><guid isPermaLink="false">4171f726-a5f8-5590-a446-d5d7fad6ea46</guid><dc:creator><![CDATA[Andy Maguire]]></dc:creator><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/LLM_Analytics_Clusters_5a354100e4.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Traditional clickstream product analytics (like button clicks and page views) is one of the most important datasets for anyone trying to build a successful product. Backend observability data – metrics, logs, traces – are operational, but equally essential.</p><p>In the age of AI, though, we have a different kind of data that mashes aspects of both together. I&#x27;m talking about the LLM <a href="/docs/llm-analytics/traces">traces</a> and <a href="/docs/llm-analytics/generations">generations</a> your AI agent or agentic workflows produce as they get stuff done.</p><p>This data is crucial for seeing whether your agent is <a href="/blog/stop-ai-slop">actually doing its job</a>. It&#x27;s also rich with insights about how your users are using AI features, what they&#x27;re trying to do, and even how they feel about the whole interaction.</p><p>Think about all your interactions with an AI in the last week and all the subtle (or not so subtle) emotional signals embedded in them. By analyzing these signals in aggregate, AI product teams can discover usage patterns, outlier behaviors, and problem areas.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/angry_chatbot_exchange_blackedout2_e7d4c9762e.png" alt="An angry chatbot exchange"/></p><p><div>One of my recent interactions trying to chat with my airline about tickets.</div></p><p>Usually, analysis of these signals would take a set of complex queries and calculations, but since we have all this data in PostHog and we deal with this sort of complexity all the time, we built it for you.</p><p>It&#x27;s aptly named &quot;Clustering.&quot; We probably should have called it &quot;Agentic AI-driven magic AI unicorn insights agentic&quot; but engineers aren&#x27;t the best at <a href="/blog/why-we-killed-our-ai-product-assistant">naming AI things</a>.</p><p>Here&#x27;s how the whole pipeline works under the hood, with links to the code if you want to dig deeper. If you just want to see it in action, skip to the <a href="#a-concrete-example">demo</a>.</p><h2 id="the-complete-clustering-pipeline">The complete clustering pipeline</h2><p>Here&#x27;s the overall flow from raw traces to clustered insights:</p><ol><li><strong>Ingest</strong> - Traces and generations land as PostHog events</li><li><strong>Text representation</strong> - Convert each trace to a readable text format</li><li><strong>Sample</strong> - Hourly sampling of N traces/generations</li><li><strong>Summarize</strong> - LLM-powered structured summarization</li><li><strong>Embed</strong> - Generate embedding vectors from summaries</li><li><strong>Cluster</strong> - UMAP dimensionality reduction + HDBSCAN clustering</li><li><strong>Label</strong> - An AI agent names and describes each cluster</li><li><strong>Display</strong> - Clusters tab with scatter plot and distribution chart</li></ol><h3 id="design-considerations">Design considerations</h3><p>Before diving into the steps, here are the main considerations we kept coming back to and the choices we made for each:</p><ul><li><strong>Huge traces</strong> - Some traces are enormous and can&#x27;t just be thrown at an LLM. Our answer: the uniform downsampling described below in <a href="#step-1-from-json-blobs-to-readable-text">step 1</a>. We iteratively drop lines while preserving the overall structure, so even massive traces fit within context limits, although this is at the cost of some accuracy/quality.</li><li><strong>Keeping costs sane</strong> - Running LLM summarization on every single trace would cost a <em>lot</em>. So we sample a small random subset each hour, use GPT-4.1 nano for summarization (fast and cheap), and are planning to move to the OpenAI Batch API to optimize further, as well as some BYOK approaches for &quot;on demand&quot; steering and triggering of the whole pipeline.</li><li><strong>One-size-fits-all vs. custom summaries</strong> - It&#x27;s hard to have a single general summary schema that works perfectly for every type of trace we might see. Ideally, users could steer or bring their own prompts and structured outputs. For now, we started with a general-purpose prompt and summary schema that works well across most use cases, but enabling user-defined summarization is a potential future improvement.</li><li><strong>No existing embeddings to lean on</strong> - PostHog doesn&#x27;t already have a RAG system or embeddings index over all LLM analytics events. Rather than building that infrastructure first, we took a shortcut: convert traces to text, summarize them with an LLM, then embed the summaries. This gives us high-quality, semantically rich vectors without needing a full RAG pipeline - and the summaries are useful on their own as a feature.</li><li><strong>Zero-config by default, customizable when you need it</strong> - The Temporal workflows just run in the background. As you send traces to LLM Analytics, clustering will just work once there&#x27;s enough data to sample from. No setup needed — but if you want more control, you can now create <a href="/docs/llm-analytics/clusters#managing-clustering-jobs">clustering jobs</a> to steer what gets clustered (more on this below).</li><li><strong>User steering</strong> - We recently shipped <a href="/docs/llm-analytics/clusters#managing-clustering-jobs">clustering jobs</a>, which let you define up to five independent clustering configurations per project. Each job can target a specific analysis level (traces or generations) and apply event filters to scope which data gets included — for example, you could create a job that only clusters traces from a specific model or a particular user segment. Jobs run automatically during the next scheduled cycle.</li></ul><h2 id="step-1-from-json-blobs-to-readable-text">Step 1: From JSON blobs to readable text</h2><p>Traces are ingested into <a href="/docs/llm-analytics">LLM Analytics</a> as normal PostHog events. They have their own loose schema around special <a href="/docs/llm-analytics/basics"><code>$ai_*</code> properties</a> – covering everything from <a href="/docs/llm-analytics/generations">generations</a> and <a href="/docs/llm-analytics/spans">spans</a> to <a href="/docs/llm-analytics/sessions">sessions</a> – but also the flexibility of general PostHog events, which means they generally work with any other PostHog feature out of the box.</p><p>This gives us a blob of JSON with some expected <code>$ai_</code> properties, and even within each property, the structure and format can vary wildly depending on the LLM provider, framework, or how users have <a href="/docs/llm-analytics/installation">instrumented their own agents</a>.</p><p>So we need to figure out how to get from this bag of JSON to something a clustering algorithm can work with – we need numbers. And whenever you need numbers with LLMs, it often means you need embeddings. Our task is to figure out what embeddings to generate that will be useful downstream.</p><p>We can&#x27;t just throw some massive JSON blob at an LLM and expect it to produce a great summary. It might be okay, but we can do better by putting ourselves in the shoes of our LLM: if I can create a general text representation where I myself can easily &quot;read&quot; a trace, then that&#x27;ll also be a great input for summarization. We be <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">context engineering</a> like the AI hipsters we aspire to be.</p><p>So we built a process that renders each trace (or any event in it) as a clean, simple text representation – essentially an ASCII tree with line numbering. The idea here is just some simple text so you can &quot;read&quot; the trace, you know, as a human.</p><p>Here&#x27;s what it looks like in the PostHog UI:</p><div videoLight="https://res.cloudinary.com/dmukukwp6/video/upload/text_view_612c564208.mp4" alt="Text representation view in PostHog" classes="rounded"></div><p>You can see the full text representation for this trace in <a href="https://gist.github.com/andrewm4894/4bd7706e1c0d7c700d8acc44719cd181" target="_blank" rel="noopener noreferrer">this gist</a> — it&#x27;s a real example from one of my side projects (a daily factoids chatbot that got into a surprisingly deep conversation about mantis shrimp vision and digital signal processing). Point being, if its easier for me as a human to grok what&#x27;s going on, the LLM should be able to do a decent job of summarizing it with less risk of getting side tracked by all the other gnarly metadata and structure in the raw JSON.</p><p>The line numbering (<code>L001:</code>, <code>L002:</code>) is important – it gives the downstream summarization LLM a way to reference specific parts of the trace, which makes the structured output much more useful.</p><blockquote><p>You can see how this is generated in <a href="https://github.com/PostHog/posthog/blob/master/products/llm_analytics/backend/text_repr/formatters/trace_formatter.py" target="_blank" rel="noopener noreferrer"><code>trace_formatter.py</code></a>.</p></blockquote><h3 id="handling-huge-traces">Handling huge traces</h3><p>Some traces are just too big. We use uniform downsampling to shrink them – picking every Nth line from the body while preserving the header. The sampler notes what percentage of lines were kept, and the gaps in line numbers tell the LLM that content was omitted. Using the <a href="https://gist.github.com/andrewm4894/4bd7706e1c0d7c700d8acc44719cd181" target="_blank" rel="noopener noreferrer">mantis shrimp trace from the gist</a>, here&#x27;s a snippet of what a downsampled version might look like:</p><pre><code>L001: ----------------------------------------------------------
L002:
[SAMPLED VIEW: ~40% of 136 lines shown]
L003: AVAILABLE TOOLS: 1
L005:   web_search(max_results?: integer, query?: any)
L012: [1] SYSTEM
L018: Factoid text: The mantis shrimp can perceive 12-16 types
       of color receptors compared to humans&#x27; 3...
L035: [2] USER
L037: huh - explain this more to me
L041: [3] ASSISTANT
L045:   - web_search(query=&quot;mantis shrimp vision 12 vs 16...&quot;)
L049: [4] TOOL
L051: {&quot;query&quot;: &quot;mantis shrimp vision...&quot;, &quot;results&quot;: [...]}
L059: [5] ASSISTANT
L061: It seems counterintuitive, right?...
L077: [6] USER
L079: any relation at all to something like DSP or FFT?
L101: [9] ASSISTANT
L103: That is a brilliant connection!...
L122: [10] USER
L124: oh interesting - k bye i love you
L130: [1] ASSISTANT
L132: Haha, well that escalated quickly! I love you too...
L136: **K bye!**
</code></pre><p>Notice the <code>[SAMPLED VIEW: ~40% of 136 lines shown]</code> header and the jumps in line numbers (e.g., L051 → L059, L079 → L101). The LLM can still follow the conversation flow – the structure and key turns are preserved, just with less detail in between. This works well in practice because the same context often gets passed back and forth within each step of a trace.</p><blockquote><p>See how downsampling works in <a href="https://github.com/PostHog/posthog/blob/master/products/llm_analytics/backend/text_repr/formatters/message_formatter.py" target="_blank" rel="noopener noreferrer"><code>message_formatter.py</code></a>.</p></blockquote><h2 id="step-2-summarization">Step 2: Summarization</h2><p>Now that we have a readable text representation, we can summarize it. We sample N traces per hour (cost management – we&#x27;re not summarizing <em>everything</em>) and send each text representation to an LLM for structured summarization.</p><p>The key word there is <strong>structured</strong>. Rather than asking for a free-text summary, we ask for a specific schema:</p><pre><code class="language-python"># Simplified summarization schema
# See: schema.py

class SummarizationResponse(BaseModel):
    title: str              # Short descriptive title
    flow_diagram: str       # ASCII flow of the trace steps
    summary_bullets: list[SummaryBullet]  # Key points with line refs
    interesting_notes: list[str]          # Anything unusual or notable

class SummaryBullet(BaseModel):
    bullet: str             # The summary point
    line_refs: list[str]    # e.g., [&quot;L003&quot;, &quot;L015&quot;] - back-references
</code></pre><blockquote><p>See the full summarization schema in <a href="https://github.com/PostHog/posthog/blob/master/products/llm_analytics/backend/summarization/llm/schema.py" target="_blank" rel="noopener noreferrer"><code>schema.py</code></a></p></blockquote><p>We use GPT-4.1 nano for this – it&#x27;s fast, cheap, and the structured output mode means we get reliable, parseable results every time. The line references back to the text representation are particularly useful: they let the summary stay grounded in the actual trace data rather than hallucinating. You can read the actual prompts we use in <a href="https://github.com/PostHog/posthog/blob/master/products/llm_analytics/backend/summarization/prompts/system_detailed.djt" target="_blank" rel="noopener noreferrer"><code>system_detailed.djt</code></a> and <a href="https://github.com/PostHog/posthog/blob/master/products/llm_analytics/backend/summarization/prompts/user.djt" target="_blank" rel="noopener noreferrer"><code>user.djt</code></a>. If you have sensitive data in your traces, we made sure clustering works with <a href="/docs/llm-analytics/privacy-mode">privacy mode</a> which controls what gets sent.</p><p>These summaries appear as <code>$ai_trace_summary</code> and <code>$ai_generation_summary</code> events in your project every hour. They also power the on-demand <a href="/docs/llm-analytics/summarization">trace summarization</a> feature you can use to quickly understand any individual trace or generation without reading through the full conversation.</p><p>Ideally we would enable users the ability to steer and customize this part of the flow – maybe you want a different summary schema, or you want to add specific questions for the LLM to answer in the summary. We&#x27;re considering this for the future, but for now we started with a general-purpose schema that works decently across most use cases.</p><h3 id="why-structured-output-matters">Why structured output matters</h3><p>Structured output is better than a raw summary for one critical reason: downstream embedding quality. When we embed a title + flow diagram + specific bullets with line references, we get a much higher signal representation than embedding a wall of free text. The LLM has already done the work of extracting what matters.</p><blockquote><p><strong>Why not RAG?</strong> We considered building a full RAG system – chunking traces, building indices, retrieving at query time. But the complexity of doing that well at PostHog&#x27;s scale (billions of events across thousands of teams) made us reach for a simpler approach first. Summarization-first means each trace becomes a small, self-contained artifact that&#x27;s easy to embed and cluster. We may still build RAG for features like natural language search, but for clustering, this works well.</p></blockquote><h2 id="step-3-embedding">Step 3: Embedding</h2><p>Once we have summaries, we <a href="https://github.com/PostHog/posthog/blob/master/ee/hogai/llm_traces_summaries/tools/embed_summaries.py" target="_blank" rel="noopener noreferrer">format them back into plain text</a> – title, flow diagram, bullets, and notes concatenated together, with line numbers stripped to reduce noise – and <a href="/docs/llm-analytics/embeddings">embed</a> them using OpenAI&#x27;s <code>text-embedding-3-large</code> model, giving us a 3,072-dimensional vector for each summary.</p><p>Why embed the enriched summary instead of the raw trace? Because the summary lives in a higher-level semantic space. Raw traces contain a lot of noise – <a href="/docs/llm-analytics/calculating-costs">token counts, model versions</a>, repeated system prompts. The summary captures the <em>intent</em> and <em>flow</em>, which is exactly what we want our <a href="/docs/llm-analytics/clusters">clusters</a> to be organized around.</p><p>So now, for each trace or generation, we have 3,072 numbers. Time for the fun part.</p><h2 id="step-4-clustering">Step 4: Clustering</h2><p>This is where we lean on more &quot;old school&quot; traditional ML techniques. There are still several areas where LLMs haven&#x27;t eaten the world: recommender engines, clustering, time series modeling, tabular model building, and getting well-calibrated numbers for regression problems. For all of these, you&#x27;re still better off equipping your agent with the tools to formulate and run traditional algorithms on the data, rather than asking it to do the calculations directly.</p><h3 id="dimensionality-reduction">Dimensionality reduction</h3><p>We can&#x27;t just cluster the raw 3,072-dimensional vectors – the <a href="https://en.wikipedia.org/wiki/Curse_of_dimensionality">curse of dimensionality</a> would make distances meaningless. So we first need to reduce dimensions while preserving the important structure.</p><p>We run <a href="https://umap-learn.readthedocs.io/">UMAP</a>, an algorithm for reducing high-dimensional data while preserving local structure, twice with different goals:</p><pre><code>3072-D embeddings
     ↓
┌────┴────┐
↓         ↓
100-D     2-D
(UMAP)   (UMAP)
↓         ↓
HDBSCAN   Scatter plot
</code></pre><ul><li><strong>3072 → 100 dimensions</strong> for clustering: <code>min_dist=0.0</code> packs similar points tightly together, which is what HDBSCAN wants.</li><li><strong>3072 → 2 dimensions</strong> for visualization: <code>min_dist=0.1</code> keeps some visual separation so the scatter plot is readable.</li></ul><h3 id="hdbscan">HDBSCAN</h3><p>UMAP&#x27;s job was dimensionality reduction — compressing 3,072 dimensions into something workable while preserving structure. HDBSCAN is the algorithm that actually finds the clusters by scanning the reduced space for dense regions of similar points and grouping them together. For the actual clustering, we use <a href="https://hdbscan.readthedocs.io/">HDBSCAN</a> on the 100-D reduced embeddings:</p><pre><code class="language-python"># Simplified clustering pipeline
# See: clustering.py

import umap
import hdbscan
import numpy as np

def cluster_embeddings(embeddings: np.ndarray):
    &quot;&quot;&quot;Run the full clustering pipeline.&quot;&quot;&quot;

    # Normalize embeddings
    norms = np.linalg.norm(embeddings, axis=1, keepdims=True)
    normalized = embeddings / norms

    # UMAP for clustering (100-D)
    reducer_cluster = umap.UMAP(
        n_components=100,
        min_dist=0.0,
        metric=&quot;cosine&quot;,
    )
    embeddings_100d = reducer_cluster.fit_transform(normalized)

    # UMAP for visualization (2-D)
    reducer_viz = umap.UMAP(
        n_components=2,
        min_dist=0.1,
        metric=&quot;cosine&quot;,
    )
    embeddings_2d = reducer_viz.fit_transform(normalized)

    # HDBSCAN clustering on 100-D embeddings
    clusterer = hdbscan.HDBSCAN(
        cluster_selection_method=&quot;eom&quot;,
        min_cluster_size=5,
    )
    labels = clusterer.fit_predict(embeddings_100d)

    return labels, embeddings_2d
</code></pre><blockquote><p>See the full UMAP + HDBSCAN pipeline in <a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/clustering.py" target="_blank" rel="noopener noreferrer"><code>clustering.py</code></a></p></blockquote><p>HDBSCAN has some nice properties for our use case:</p><ul><li><strong>No need to pick k</strong> (number of clusters) in advance - it figures this out automatically based on density.</li><li><strong>Noise cluster</strong> - items that don&#x27;t fit any cluster get assigned to cluster -1. These &quot;outliers&quot; can be interesting edge cases you might want to explore.</li><li><strong><code>cluster_selection_method=&quot;eom&quot;</code></strong> (Excess of Mass) tends to produce more granular, interpretable clusters compared to the &quot;leaf&quot; method.</li></ul><p>After this step, every trace or generation has an integer cluster ID. But an integer doesn&#x27;t tell you much – we need to make these meaningful.</p><h2 id="step-5-the-labeling-agent">Step 5: The labeling agent</h2><p>Now we have clusters with integer IDs. Cluster 0 has 47 traces, cluster 1 has 23, cluster -1 (noise) has 8. Not exactly actionable.</p><p>This is where we bring AI back in – specifically, a <a href="https://langchain-ai.github.io/langgraph/">LangGraph</a> ReAct agent powered by GPT-5.2. Its job is to explore the clusters and come up with meaningful labels and descriptions. </p><blockquote><p>You can read the agent&#x27;s system prompt in <a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/prompts.py" target="_blank" rel="noopener noreferrer"><code>prompts.py</code></a>.</p></blockquote><p>The agent has access to 8 tools:</p><table><thead><tr><th>Tool</th><th>Purpose</th></tr></thead><tbody><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L17" target="_blank" rel="noopener noreferrer"><code>get_clusters_overview</code></a></td><td>High-level stats: cluster sizes, counts</td></tr><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L39" target="_blank" rel="noopener noreferrer"><code>get_all_clusters_with_sample_titles</code></a></td><td>Quick scan of what&#x27;s in each cluster</td></tr><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L79" target="_blank" rel="noopener noreferrer"><code>get_cluster_trace_titles</code></a></td><td>All trace titles for a specific cluster</td></tr><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L121" target="_blank" rel="noopener noreferrer"><code>get_trace_details</code></a></td><td>Full summary for a specific trace</td></tr><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L152" target="_blank" rel="noopener noreferrer"><code>get_current_labels</code></a></td><td>See labels assigned so far</td></tr><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L171" target="_blank" rel="noopener noreferrer"><code>set_cluster_label</code></a></td><td>Set name + description for one cluster</td></tr><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L189" target="_blank" rel="noopener noreferrer"><code>bulk_set_labels</code></a></td><td>Set labels for multiple clusters at once</td></tr><tr><td><a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent/tools.py#L212" target="_blank" rel="noopener noreferrer"><code>finalize_labels</code></a></td><td>Signal that labeling is complete</td></tr></tbody></table><p>The agent starts with a bulk-labeling phase: it calls <code>get_all_clusters_with_sample_titles</code> for an overview, then uses <code>bulk_set_labels</code> to assign initial labels to every cluster. This guarantees coverage — if the agent hits a token limit or error later, no cluster is left unlabeled.</p><p>Then it moves to refinement. For clusters that seem ambiguous, it drills deeper with <code>get_cluster_trace_titles</code> and <code>get_trace_details</code>, then calls <code>set_cluster_label</code> to update individual labels. Finally, it calls <code>finalize_labels</code> to signal completion.</p><blockquote><p>See the agent tools and prompts in <a href="https://github.com/PostHog/posthog/tree/master/posthog/temporal/llm_analytics/trace_clustering/labeling_agent" target="_blank" rel="noopener noreferrer"><code>labeling_agent/</code></a></p></blockquote><h2 id="step-6-orchestration-with-temporal">Step 6: Orchestration with Temporal</h2><p>All of this needs to run reliably across thousands of teams. We use <a href="https://temporal.io/">Temporal</a> workflows to orchestrate the pipeline.</p><p>A daily coordinator workflow discovers eligible teams (those with enough recent trace data), then spawns child workflows in batches – up to 4 concurrent workflows at a time to manage load. These workflows:</p><ol><li>Fetch recent embeddings</li><li>Run clustering pipeline (UMAP + HDBSCAN)</li><li>Run labeling agent</li><li>Emit cluster events</li></ol><blockquote><p>See the orchestration workflow in <a href="https://github.com/PostHog/posthog/blob/master/posthog/temporal/llm_analytics/trace_clustering/coordinator.py" target="_blank" rel="noopener noreferrer"><code>coordinator.py</code></a></p></blockquote><p>The output of each child workflow is a set of <code>$ai_trace_clusters</code> and <code>$ai_generation_clusters</code> events. These are standard PostHog events, which means the <a href="/docs/llm-analytics/clusters">clusters tab</a> in the UI is just querying events like everything else in PostHog.</p><h2 id="a-concrete-example">A concrete example</h2><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/OlOMc70-k8A" title="LLM Analytics clusters demo" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p>Here&#x27;s what you&#x27;re seeing in the demo:</p><ul><li><strong>Scatter plot</strong> - Each dot is a trace, positioned using the 2-D UMAP coordinates. Colors represent cluster assignments. You can immediately see which groups of traces are similar and how they relate spatially.</li><li><strong>Cluster distribution</strong> - A bar chart showing how many traces landed in each cluster, with the agent-generated labels. This gives you a quick sense of what your users are actually doing.</li><li><strong>Drill-down</strong> - Click into any cluster to see the individual traces, their summaries, and the full details. This is where you find the patterns - maybe 40% of your traces are &quot;user asking for refund status&quot; and you didn&#x27;t even know.</li></ul><p>The noise cluster (labeled &quot;Outliers&quot;) often contains the most interesting one-off traces – edge cases, unusual workflows, or bugs that don&#x27;t fit any pattern. Pair this with <a href="/docs/llm-analytics/evaluations">evaluations</a> (our LLM-as-a-judge feature) to automatically score the quality of generations within each cluster.</p><h2 id="steering-with-clustering-jobs">Steering with clustering jobs</h2><p>Since launching this pipeline, we&#x27;ve added <a href="/docs/llm-analytics/clusters#managing-clustering-jobs">clustering jobs</a> — a way to create independent clustering configurations so you can steer what gets analyzed. Instead of one big clustering run across all your data, you can define up to five jobs per project, each with its own analysis level (traces or generations) and event filters.</p><p>For example, you might create separate jobs for:</p><ul><li>Traces from your production GPT-4o agent</li><li>Generations from your RAG pipeline</li><li>Only traces where a specific custom property matches (e.g., <code>$ai_model = &quot;claude-sonnet-4-20250514&quot;</code>)</li></ul><p>Each job runs automatically during the next scheduled cycle, and the run selector on the Clusters page shows which job produced each run. See the <a href="/docs/llm-analytics/clusters#managing-clustering-jobs">clustering jobs docs</a> for the full setup guide.</p><h2 id="try-it-now">Try it now</h2><p>If you&#x27;re already using <a href="/llm-analytics">LLM Analytics</a> in PostHog, clustering runs automatically – no configuration needed. Want more control? Set up <a href="/docs/llm-analytics/clusters#managing-clustering-jobs">clustering jobs</a> to define exactly what gets clustered. If you&#x27;re not using LLM Analytics yet, you can <a href="/docs/llm-analytics/start-here">get started in minutes</a> with SDKs for <a href="/docs/llm-analytics/installation/openai">OpenAI</a>, <a href="/docs/llm-analytics/installation/anthropic">Anthropic</a>, <a href="/docs/llm-analytics/installation/langchain">LangChain</a>, <a href="/docs/llm-analytics/installation/vercel-ai">Vercel AI</a>, and <a href="/docs/llm-analytics/installation">many more</a>.</p><p><div to="https://app.posthog.com/llm-analytics/clusters">Try clusters in PostHog</div></p><h2 id="further-reading">Further reading</h2><ul><li><strong><a href="/docs/llm-analytics/clusters">Clusters documentation</a></strong> - Setup guide and feature overview</li><li><strong><a href="/docs/llm-analytics/custom-properties">Custom properties</a></strong> - Attach your own metadata to traces for richer clustering</li><li><strong><a href="/docs/llm-analytics/privacy-mode">Privacy mode</a></strong> - Control what trace data gets sent to PostHog</li><li><strong>Feedback</strong> - Leave feedback directly on the <a href="/docs/llm-analytics/clusters">clusters docs page</a>, email us at <a href="mailto:team-llm-analytics@posthog.com">team-llm-analytics@posthog.com</a>, or start a thread in the <a href="/community">community</a></li></ul><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The 7 best HIPAA-compliant analytics tools]]></title><description><![CDATA[If you're building a healthcare app or handling protected health information (PHI), your analytics tool is more than just a product decision – it's a…]]></description><link>https://posthog.com/blog/best-hipaa-compliant-analytics-tools</link><guid isPermaLink="false">4ab7a802-c1b9-520d-bcdb-b2d2f54cfa48</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hipaa-compliant-ab-testing/hipaa.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#x27;re building a healthcare app or handling protected health information (PHI), your analytics tool is more than just a product decision – it&#x27;s a legal one too; using the wrong tool can expose you to serious HIPAA liability.</p><p>The good news: there are solid options. This guide covers the best HIPAA-compliant analytics tools available right now, whether you need a Business Associate Agreement (BAA), a self-hosted deployment, or both.</p><h2 id="what-is-hipaa">What is HIPAA?</h2><p>Passed in 1996, HIPAA (Health Insurance Portability and Accountability Act) defines the legal requirements for securing and handling health information, and the severe penalties for failing to do so.</p><p>Data protected under HIPAA is called <a href="/blog/what-is-personal-data-pii">Protected Health Information</a> (PHI), or ePHI if it is digitized. It includes any data that can be used to identify the past, current or future health status of an individual.</p><p>This includes test results and diagnoses, but also birthdays, ethnicity, gender and other information. Even an IP address can be considered ePHI under HIPAA.</p><p>While similar in some respects to the EU&#x27;s General Data Protection Regulation (GDPR), HIPAA applies specifically to companies handling the PHI of US-based customers. Companies that also need to comply with the GDPR should see our guide to <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR-compliant analytics</a>.</p><p>There are two ways to be HIPAA-compliant while using analytics tools:</p><ol><li><a href="/best-open-source-analytics-tools">Self-host your analytics</a>, so data remains totally within your control.</li><li>Sign a Business Associate Agreement (BAA) with a third-party analytics tool.</li></ol><h2 id="what-is-a-business-associate-agreement-baa">What is a Business Associate Agreement (BAA)?</h2><p>Some services enable HIPAA compliance through the creation of a <a href="https://www.hhs.gov/hipaa/for-professionals/covered-entities/sample-business-associate-agreement-provisions/index.html">Business Associate Agreement</a> (US Department of Health). This is a contract with a service provider to ensure that they are jointly compliant and liable for services they provide.</p><p>It&#x27;s worth noting that, because BAAs expose third-parties to increased risk and scrutiny, they are often an expensive option and/or require users to purchase a higher tier of license.</p><p>Some analytics tools, such as <a href="/blog/ga4-alternatives">Google Analytics</a>, don&#x27;t offer BAAs and are therefore not HIPAA-compliant.</p><h2 id="the-best-hipaa-compliant-analytics-tools">The best HIPAA-compliant analytics tools</h2><h3 id="1-posthog">1. PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/hogflix-dashboard.png" alt="PostHog"/></p><p><a href="/">PostHog</a> is a developer platform that combines <a href="/product-analytics">product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, <a href="/surveys">user surveys</a>, and a lot more.</p><p>It gives you every tool you need to understand user behavior and, unlike typical analytics tools that rely on third-party integrations, all these tools work together seamlessly.</p><p>Being an all-in-one platform has two further benefits:</p><ol><li>PostHog can replace multiple products – e.g. <a href="/blog/best-mixpanel-alternatives">Mixpanel</a> for product analytics, <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> for feature management, <a href="/blog/best-sentry-alternatives">Sentry</a> for error tracking, etc.</li><li>You only need to sign one BAA to get all these tools, reducing legal complexity and risk.</li></ol><h4 id="posthog-and-hipaa-compliance">PostHog and HIPAA compliance</h4><ul><li><strong>Self-hostable:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA plan:</strong> <a href="/platform-packages">Platform packages</a> – $250/mo</li></ul><p>A BAA is available on PostHog&#x27;s <a href="/platform-packages">platform packages</a>, which also includes priority support and generous free usage limits for all tools – e.g. 1 million free analytics events every month. You can also self-host the open-source edition of PostHog, but this isn&#x27;t recommended as it&#x27;s provided without guarantee or support.</p><p><div></div></p><h3 id="2-mixpanel">2. Mixpanel</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/mixpanel.png" alt="Mixpanel - hipaa analytics tools"/></p><p><a href="/blog/posthog-vs-mixpanel">Mixpanel</a> is a product analytics tool with genuinely strong funnel and behavioral analysis – useful for healthcare teams tracking complex user journeys. It added session replay and feature flags in late 2025, which means more functionality under a single BAA than before.</p><p>That said, surveys and error tracking still aren&#x27;t included natively, so you&#x27;d likely need additional tools – and separate BAAs – for those.</p><h4 id="mixpanel-and-hipaa-compliance">Mixpanel and HIPAA compliance</h4><ul><li><strong>Self-hostable:</strong> <span class="text-red text-lg">✖</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA plan:</strong> Contact sales for pricing</li></ul><p>A BAA is available on Mixpanel&#x27;s Enterprise plan.</p><p><strong>See also:</strong> <a href="/blog/best-mixpanel-alternatives">The most popular Mixpanel alternatives</a></p><h3 id="3-countly">3. Countly</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/countly-screenshot.png" alt="Countly - open source analytics tools"/></p><p><strong>Countly</strong> is an analytics platform for mobile, web, and desktop applications that also offers add-ons for remote configuration, A/B testing, and user surveys. Support for app crash and error reports, and push notifications, makes it particularly well-suited to <a href="/blog/best-mobile-app-analytics-tools">mobile app analytics</a>.</p><h4 id="countly-and-hipaa-compliance">Countly and HIPAA compliance</h4><ul><li><strong>Self-hostable:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA available:</strong> <span class="text-red text-lg">✖</span></li></ul><p>Countly doesn&#x27;t offer a BAA for HIPAA compliance on its hosted cloud, but it does offer the option to either:</p><ol><li>Self-host the product on your own.</li><li>Deploy it to a private cloud managed by Countly.</li></ol><p>This makes Countly a good option if you&#x27;d prefer to <a href="/blog/best-open-source-analytics-tools">self-host your analytics</a>.</p><h3 id="4-freshpaint">4. Freshpaint</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hipaa-compliant-ab-testing/freshpaint.png" alt="freshpaint"/></p><p><strong>Freshpaint</strong> isn&#x27;t an analytics tool per se, it&#x27;s more of an analytics event tracker and customer data platform (CDP) that&#x27;s specifically designed for healthcare companies.</p><p>Freshpaint sits between data sources (e.g. data warehouses) and third-party data destinations and ensures no PHI is passed between them. This means you can continue to use non-HIPAA compliant tools, such as <a href="/blog/ga4-alternatives">Google Analytics</a>, safe in the knowledge you&#x27;re not accidentally passing PHI into them.</p><h4 id="freshpaint-and-hipaa-compliance">Freshpaint and HIPAA compliance</h4><ul><li><strong>Self-hostable:</strong> <span class="text-red text-lg">✖</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA plan:</strong> Contact sales for pricing</li></ul><p>Freshpaint is a cloud-only product specifically designed for healthcare companies, so it offers a BAA (available on the Compliance plan, which requires a custom quote).</p><h3 id="5-piwik-pro">5. Piwik PRO</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/piwik-pro.png" alt="piwik pro"/></p><p><strong>Piwik PRO</strong> is a commercial analytics and customer data platform spun out of the open-source analytics tool, <a href="/blog/best-matomo-alternatives">Matomo</a>. As such, it&#x27;s more a web analytics tool than other options in this list, though you can use it on mobile and web apps. Because it&#x27;s based on Europe, Piwik PRO is popular among companies also seeking GDPR compliance – it has a built-in compliance manager to assist with this, too.</p><h4 id="piwikpro-and-hipaa-compliance">PiwikPRO and HIPAA compliance</h4><ul><li><strong>Self-hostable:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA plan:</strong> Contact sales for pricing</li></ul><p>PiwikPRO offers HIPAA compliance as part of its PRO Enterprise plan, either by signing a BAA or by self-hosting, giving you maximum flexibility.</p><h3 id="6-amplitude">6. Amplitude</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-vs-amplitude/amplitude-screenshot.png" alt="amplitude"/></p><p><a href="/blog/posthog-vs-amplitude">Amplitude</a> sits somewhere between PostHog and Mixpanel. It&#x27;s a product analytics tool at its core, but also has extra features such as session replay, feature flags, A/B testing, and Guides &amp; Surveys. It also has anomaly detection, which will automatically flag when certain metrics fall outside expected trends, and creating insights based on natural language questions like &quot;signups in the last 30 days.&quot;</p><h4 id="amplitude-and-hipaa-compliance">Amplitude and HIPAA compliance</h4><ul><li><strong>Self-hostable:</strong> <span class="text-red text-lg">✖</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA plan:</strong> Contact sales for pricing</li></ul><p>Amplitude offers a BAA on its Enterprise plan, which includes advanced security features and custom data governance controls. You can also use its product analytics tool on top of a Snowflake data warehouse, which may be an option for HIPAA compliance if you&#x27;re already storing analytics data in Snowflake.</p><p><strong>See also:</strong> <a href="/blog/best-amplitude-alternatives">The most popular Amplitude alternatives</a></p><h2 id="which-hipaa-compliant-analytics-tool-should-you-choose">Which HIPAA-compliant analytics tool should you choose?</h2><ul><li>Want one platform for product analytics, session replay, feature flags, and more – with a single BAA covering everything? <strong><a href="/platform-packages">PostHog</a></strong></li><li>Need a focused product analytics tool with a BAA and strong funnel analysis? <strong>Mixpanel</strong></li><li>Want to self-host your analytics without signing a BAA? <strong>Countly</strong></li><li>Already using non-HIPAA-compliant tools and need a PHI firewall in front of them? <strong>Freshpaint</strong></li><li>Need web analytics and a CDP with both BAA and self-hosting options? <strong>Piwik PRO</strong></li><li>Want retention-focused product analytics with a BAA and warehouse-native options? <strong>Amplitude</strong></li></ul><p><div></div></p><h2 id="faq">FAQ</h2><details><summary>Who does HIPAA apply to?</summary><p>HIPAA applies to &quot;covered entities,&quot; such as healthcare providers who transmit any health information in electronic form, health plans, and healthcare clearinghouses. Mobile apps fall under HIPAA if they store protected health information (PHI) and share it with any covered entity.</p><p>HIPAA also applies to &quot;business associates,&quot; which, according to the <a href="https://www.hhs.gov/hipaa/for-professionals/covered-entities/sample-business-associate-agreement-provisions/index.html">US Department of Health and Human Services</a>, are &quot;a subcontractor that creates, receives, maintains, or transmits protected health information on behalf of another business associate.&quot;</p><p>Under HIPAA, the analytics tools in this guide would all be considered business associates.</p></details><details><summary>What is PHI (Protected Health Information)?</summary><p>Protected Health Information (PHI) is any information about health status, provision of healthcare, or payment for healthcare that can be linked to an individual.</p><p>This includes medical records, laboratory results, billing information, and any other information that identifies an individual and relates to their past, present, or future physical or mental health condition, treatment, or payment for healthcare services.</p></details><details><summary>Is self-hosting analytics better than signing a BAA?</summary><p>There&#x27;s no objectively correct answer. In theory, self-hosting is preferable as it means you don&#x27;t share any data with third-parties, and thus don&#x27;t need to sign a BAA at all.</p><p>But self-hosting also presents additional risks. You&#x27;re wholly liable for ensuring your analytics infrastructure is secure, which can be challenging without internal expertise. If that&#x27;s the case, it may be better to rely on a HIPAA-compliant business associate who has experience hosting analytics at scale.</p></details><details><summary>Does Google Analytics support HIPAA compliance?</summary><p>No. <a href="/blog/posthog-vs-ga4">Google Analytics</a> does not offer a BAA and is not suitable for use with protected health information. </p><p>If you&#x27;re in healthcare, you&#x27;ll need to either use a HIPAA-compliant analytics tool or route your data through a healthcare-specific CDP like Freshpaint that filters out PHI before it reaches non-compliant destinations.</p></details><details><summary>Is Heap HIPAA compliant?</summary><p>No – <a href="/blog/posthog-vs-heap">Heap</a> does not offer a BAA and is not HIPAA compliant. This has been a long-standing limitation, and it didn&#x27;t change when <a href="/blog/best-contentsquare-alternatives">Contentsquare</a> acquired Heap. </p><p>Contentsquare itself also does not sign BAAs, meaning neither the standalone Heap product nor the broader Contentsquare platform (which also includes <a href="/blog/posthog-vs-hotjar">Hotjar</a>) is suitable for handling PHI.</p><p>If you need session replay or product analytics with HIPAA compliance, you&#x27;ll need to look at alternatives like PostHog, Mixpanel, or Amplitude.</p></details><details><summary>What are the best HIPAA-compliant analytics tools in 2026?</summary><p>Based on our research, the best HIPAA-compliant analytics tools right now are:</p><ol><li><strong><a href="/platform-packages">PostHog</a></strong> – Best all-in-one platform with a single BAA covering product analytics, session replay, feature flags, experiments, and more</li><li><strong>Mixpanel</strong> – Best for focused product analytics and funnel analysis with BAA support</li><li><strong>Countly</strong> – Best for teams that want to self-host without a BAA</li><li><strong>Freshpaint</strong> – Best for teams that need a PHI-safe layer in front of existing non-compliant tools</li><li><strong>Piwik PRO</strong> – Best for web analytics with both BAA and self-hosting options</li><li><strong>Amplitude</strong> – Best for retention-focused analytics with warehouse-native HIPAA options</li></ol></details><details><summary>How is PostHog different from other HIPAA-compliant analytics tools?</summary><p><strong>PostHog</strong> is the only tool in this list that covers the full product development stack – product analytics, web analytics, session replay, feature flags, A/B testing, surveys, error tracking, LLM analytics, logs, and more – all under a single BAA. All products offer generous free tiers and <a href="/pricing">usage-based billing</a> with no surprise overages.</p><p>That matters for HIPAA compliance because every additional vendor means another BAA to negotiate, another data-sharing agreement to manage, and another potential liability surface.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[8 best open source analytics tools you can self-host]]></title><description><![CDATA[This guide only includes open-source analytics tools that: Have built-in analysis views.  This includes end-to-end analytics, and dashboard tools that…]]></description><link>https://posthog.com/blog/best-open-source-analytics-tools</link><guid isPermaLink="false">e0ef5462-5659-5431-9092-b02b51d73c10</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-company-culture-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<details><summary>What are the criteria for this guide?</summary><p>This guide only includes open-source analytics tools that:</p><ol><li><p><strong>Have built-in analysis views.</strong> This includes end-to-end analytics, and dashboard tools that connect to existing data sources, but not data pipeline platforms.</p></li><li><p><strong>Are actively maintained.</strong> This is subjectively judged based on recently merged pull requests, commits to their repos, and the responsiveness of the maintainer to review requests.</p></li><li><p><strong>Are free to self-host.</strong> Tools that are &quot;open core&quot; but don&#x27;t offer a free, self-hostable deployment option are not included.</p></li></ol></details><details><summary>Who maintains this guide?</summary><p>This guide is maintained by <a href="/">PostHog</a>, an open-source developer platform. You can suggest additions to this guide by opening an issue on our <a href="https://github.com/PostHog/posthog.com">website repo</a>.</p><p>We maintain separate guides on <a href="/blog/best-open-source-feature-flag-tools">open-source feature flag tools</a>,  <a href="/blog/best-open-source-ab-testing-tools">open-source AB testing products</a>, and <a href="/blog/best-open-source-session-replay-tools">open-source session replay tools</a>.</p></details><details><summary>Changelog</summary><ul><li><strong>Mar 14, 2022:</strong> Added Umami; updates to copy and screenshots</li><li><strong>Jun 16, 2022:</strong> Added Fathom Lite, OpenReplay</li><li><strong>Aug 24, 2022:</strong> Removed Fathom Lite, added Apache Superset, Redash</li><li><strong>Sep 13, 2023:</strong> Added Ackee and Open Web Analytics</li><li><strong>Nov 22, 2023:</strong> Added inclusion criteria, removed Ackee</li><li><strong>Feb 26, 2025:</strong> Complete guide overhaul.</li><li><strong>Mar 9, 2026:</strong> Content refresh.</li></ul></details><h2 id="the-best-open-source-analytics-tools">The best open source analytics tools</h2><p>You want visibility into what users are doing – but you also want control over where that data lives. Open source analytics tools give you both: insights without handing your data to a third party.</p><p>This guide covers the best open source analytics tools you can self-host, from full product analytics platforms to lightweight web analytics and BI tools.</p><p><strong>Looking for cloud product analytics tools instead?</strong> See our guide to the <a href="/blog/best-product-analytics-tools-for-startups">best product analytics tools for startups</a>.</p><h3 id="1-posthog">1. PostHog</h3><div><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_1_d06072d8f6.png" alt="posthog screenshot"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_8_bf4453ab9b.png" alt="posthog screenshot"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_2_4aaae9e247.png" alt="posthog screenshot"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_3_d6491f94c2.png" alt="posthog screenshot"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_4_64f789e057.png" alt="posthog screenshot"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_5_ecc0044869.png" alt="posthog screenshot"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_6_867dc8bbc9.png" alt="posthog screenshot"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_7_43bb254514.png" alt="posthog screenshot"/></p></div><h4 id="what-is-posthog">What is PostHog?</h4><ul><li><strong>Created:</strong> 2020</li><li><strong>License:</strong> MIT</li><li><strong>GitHub Stars:</strong> 31.9k</li></ul><p><a href="/">PostHog</a> is an all-in-one platform that combines product analytics with several other developer-focused tools, such as <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, <a href="/surveys">surveys</a>, <a href="/logs">logs</a>, and more.</p><p>Beyond the core <a href="/product-analytics">product analytics features</a>, it also supports creating <a href="/docs/data-warehouse/sql">custom insights using SQL</a>, and offers a <a href="/docs/data-warehouse">built-in data warehouse</a> so you can import data from external sources like Stripe, Hubspot, and Zendesk.</p><h4 id="who-should-use-posthog">Who should use PostHog?</h4><p>Developers and startups who need an in-depth understanding of what users are doing in their app, or want to track the complete journey from their marketing website through to their app. There&#x27;s a <a href="/pricing">generous free tier</a>, which means ~90% of users use PostHog for free.</p><h4 id="pros-and-cons">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Advanced product analytics features</td><td>Self-hosting not recommended above 300k events per month</td></tr><tr><td>Easy-to-use web analytics dashboard</td><td>Steeper learning curve compared to lightweight analytics tools</td></tr><tr><td>Session replay for web and mobile apps</td><td></td></tr><tr><td>Replaces multiple tools</td><td></td></tr><tr><td>Generous free tier on cloud</td><td></td></tr></tbody></table><h4 id="faq">FAQ</h4><details><summary>What tools can PostHog replace?</summary><p>Several. The built-in product analytics is an alternative to tools such as <a href="/blog/best-mixpanel-alternatives">Mixpanel</a>, <a href="/blog/best-amplitude-alternatives">Amplitude</a>, and <a href="/blog/best-heap-alternatives">Heap</a> and it can <a href="/blog/posthog-vs-ga4">replace Google Analytics</a> for website and marketing analytics.</p><p>With heatmaps plus session replay for both web and mobile apps, PostHog can replace the likes of <a href="/blog/best-hotjar-alternatives">Hotjar</a> and <a href="/blog/best-fullstory-alternatives">FullStory</a>. It even includes feature flag and experiment features like those found in <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> or error tracking like <a href="/blog/posthog-vs-sentry">Sentry</a>. </p></details><details><summary>What&#x27;s included in open source?</summary><p><a href="https://github.com/PostHog/posthog">PostHog Open Source</a> is distributed under an MIT license for hobbyists and proof of concepts via a Docker Compose deployment. It includes most features, but is limited to one project per instance and is provided <a href="/docs/self-host/open-source/disclaimer">without guarantee</a>.</p></details><details><summary>What are the hosting requirements?</summary><p>The minimum requirements are a VPS with 4 vCPU, 16GB RAM, and more than 30GB storage. Note that PostHog only recommends the <a href="/docs/self-host">self-hosted release</a> for deployments up to ~300k events per month. Above this, it recommends switching to PostHog Cloud due to the complexity of scaling to higher event volumes.</p></details><details><summary>Is there a hosted option?</summary><p>Yes. PostHog offers a managed cloud option with a <a href="/pricing">generous free tier</a> of 1 million events, 5,000 recordings, and 1 million flag API requests every month, and the option of US or EU-based hosting.</p></details><br/><h3 id="2-matomo">2. Matomo</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/matomo-screenshot.png" alt="Matomo - open source analytics tools"/></p><h4 id="what-is-matomo">What is Matomo?</h4><ul><li><strong>Created:</strong> 2007</li><li><strong>License:</strong> AGPLv3</li><li><strong>GitHub Stars:</strong> 21.3k</li></ul><p><a href="/blog/posthog-vs-matomo">Matomo</a> is an open-source platform for website analytics. The user experience is closely modeled on the previous version of Google Analytics, known as Universal Analytics, which many people prefer to Google&#x27;s current offering.</p><p>It looks little dated compared to some tools in this list, but it&#x27;s a mature and reliable platform used by many large government and non-profit organizations.</p><h4 id="who-should-use-matomo">Who should use Matomo?</h4><p>Companies that want comprehensive website and marketing analytics without the privacy implications of using Google Analytics.</p><h4 id="pros-and-cons-1">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Easy GDPR compliance</td><td>Features like session replay and heatmaps not included in open-source release</td></tr><tr><td>Google Analytics data import</td><td>Session-based analytics less appropriate for app analytics</td></tr><tr><td>Easy installation for Wordpress and popular CMS</td><td>Dated user interface</td></tr><tr><td>Used by many large orgs (United Nations &amp; EU)</td><td>More complex to self-host than lightweight analytics tools</td></tr><tr><td>Strong web and marketing analytics features</td><td></td></tr><tr><td>Built-in tag manager</td><td></td></tr></tbody></table><h4 id="faq-1">FAQ</h4><details><summary>What tools can Matomo replace?</summary><p>It&#x27;s mainly pitched as an <a href="/blog/ga4-alternatives">alternative to Google Analytics 4</a>, especially for those looking for ironclad <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR compliance</a>. Matomo even offers a data import tool for Google Analytics, so you can bring your data with you.</p></details><details><summary>What&#x27;s included in open source?</summary><p>Matomo on-premise includes all the core website analytics features, such as user and event tracking, e-commerce tracking, customizable dashboards, user segmentation, scheduled email reports, and alerts. Features like A/B testing and session replay are available as paid add-ons only.</p></details><details><summary>What are the hosting requirements?</summary><p>The minimum requirements for 100,000 pageviews per month are: one server 2 CPU, 2 GB RAM, 50GB SSD disk. <a href="https://matomo.org/faq/on-premise/matomo-requirements/">Matomo recommends</a> separate app and database servers for anything over 1 million page views per month.</p></details><details><summary>Is there a hosted option?</summary><p>Yes. Matomo&#x27;s cloud offering includes all features and charges by &quot;hits per month&quot;. The hosted version unlocks some features, like A/B testing and heatmaps, that are paid add-ons for the on-premise release.</p></details><br/><h3 id="3-metabase">3. Metabase</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/metabase-screenshot.png" alt="Metabase"/></p><h4 id="what-is-metabase">What is Metabase?</h4><ul><li><strong>Created:</strong> 2015</li><li><strong>GitHub Stars:</strong> 46.3k</li><li><strong>License:</strong> AGPLv3</li></ul><p><a href="https://github.com/metabase/metabase">Metabase</a> is one of the most popular <a href="/blog/best-open-source-business-intelligence-tools">open-source BI tools</a>. Metabase&#x27;s visual query builder enables you to create shareable dashboards in just a few minutes with a drag-and-drop interface, and there&#x27;s a native SQL editor for advanced users.</p><p>Metabase is a great tool for business and revenue reporting. It requires more technical knowledge than either PostHog or Matomo, but it&#x27;s powerful in the right hands.</p><h4 id="who-should-use-metabase">Who should use Metabase?</h4><p>Companies that want to analyze product and company data that&#x27;s already stored in data warehouses and have a reasonable degree of internal knowledge of SQL.</p><h4 id="pros-and-cons-2">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Connects to all popular closed and open-source databases</td><td>Requires separate event collection and storage setup</td></tr><tr><td>Visual query builder for building simple queries</td><td>Less accessible for non-technical users</td></tr><tr><td>Full SQL editor for advanced users and queries</td><td>Lacks features beyond BI</td></tr><tr><td>Join and query data from multiple sources</td><td></td></tr><tr><td>Light hosting requirements</td><td></td></tr></tbody></table><h4 id="faq-2">FAQ</h4><details><summary>What tools can Metabase replace?</summary><p>Metabase is a direct alternative to business intelligence tools like Google&#x27;s Looker / Looker Studio, Tableau, and Microsoft&#x27;s Power BI. There are official connectors for all the most popular databases (Redshift, BigQuery, Snowflake, etc), and community and partner-managed connectors for the likes of ClickHouse and DuckDB.</p></details><details><summary>What&#x27;s included in open source?</summary><p>The open-source version includes the same core query and visualization features as paid versions, but without advanced permission and security features tailored to large companies.</p></details><details><summary>What are the hosting requirements?</summary><p><a href="https://www.metabase.com/learn/metabase-basics/administration/administration-and-operation/metabase-in-production#:~:text=Metabase%20needs%20at%20least%201,and%201%20GB%20of%20RAM.">Metabase recommends</a> two servers: one for the application and one for the database. It needs at least 1 core and 1GB of RAM with additional resources required depending on the number of concurrent users.</p></details><details><summary> Is there a hosted option?</summary><p>Yes. The Starter plan includes cloud deployment for $85 per month for five users, with each additional user adding $5 per month.</p></details><br/><h3 id="4-plausible-analytics">4. Plausible Analytics</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/plausible-screenshot.png" alt="Plausible Analytics - open source analytics tools"/></p><h4 id="what-is-plausible">What is Plausible?</h4><ul><li><strong>Created:</strong> 2019</li><li><strong>License:</strong> AGPLv3</li><li><strong>GitHub Stars:</strong> 24.3k</li></ul><p><a href="/blog/posthog-vs-plausible">Plausible Analytics</a> is a lightweight web analytics tool focused on providing <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR-compliant website analytics</a> that doesn&#x27;t infringe on user privacy. This means Plausible doesn&#x27;t rely on cookies and is compliant with regulations like GDPR out of the box. </p><p>It&#x27;s very fast and easy to use, though this comes at the expense of features. It&#x27;s ideal for anyone who just wants simple web analytics features, like tracking top pages and referrers, but it&#x27;s less useful for app analytics and understanding user behavior.</p><h4 id="who-should-use-plausible">Who should use Plausible?</h4><p>Anyone who wants easy-to-use website analytics that doesn&#x27;t want to use Google Analytics, have cookie banners, or collect any private data.</p><h4 id="pros-and-cons-3">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Fast and easy to use</td><td>Limited analytics features</td></tr><tr><td>Minimal impact on website performance</td><td>Open-source release only updated twice a year</td></tr><tr><td>Cookieless GDPR-compliance</td><td>No free tier on hosted version</td></tr><tr><td>Google Analytics import available</td><td></td></tr><tr><td>Will scale to large traffic requirements</td><td></td></tr></tbody></table><details><summary>What tools can Plausible replace?</summary><p>It&#x27;s a popular alternative to Google Analytics for people who want something fast and easy to use. Unlike Google Analytics, Plausible&#x27;s lightweight tracking script has minimal impact on website performance. </p></details><details><summary>What&#x27;s included in open source?</summary><p>The <a href="https://plausible.io/self-hosted-web-analytics">community edition</a> offers the same features as paid versions, including tracking all common website metrics, goal and conversion tracking, basic funnels, and reports in Slack or via email. The only limitation is that it&#x27;s only updated twice a year, whereas the cloud version gets continuous updates.</p></details><details><summary>What are the hosting requirements?</summary><p>Plausible recommends at least 2GB of RAM, and it requires a CPU that supports SSE 4.2 or NEON instruction set or higher.</p></details><details><summary> Is there a hosted option?</summary><p>Yes. There&#x27;s no free tier, but it&#x27;s cheap even at high volumes. Pricing starts at €9 per month for 10,000 monthly page views.</p></details><br/><h3 id="5-openpanel">5. OpenPanel</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Screenshot_2025_02_18_at_13_03_49_c99b9639c2.png" alt="OpenPanel"/></p><h4 id="what-is-openpanel">What is OpenPanel?</h4><ul><li><strong>Created:</strong> 2024</li><li><strong>GitHub Stars:</strong> 5.4k</li><li><strong>License:</strong> AGPLv3</li></ul><p><strong>OpenPanel</strong> is inspired by Mixpanel and Plausible. It aims to offer some tools common of a product analytics tools, but with the speed, simplicity, and privacy-friendly features Plausible brings to web analytics.</p><p>This means that, unlike Plausible, you can build custom dashboards, as well as build insights that track retention within your app. OpenPanel also creates profiles for individual users that show how often they use your app, events they trigger, and most visited pages.</p><h4 id="who-should-use-openpanel">Who should use OpenPanel?</h4><p>Developers who want basic product and website analytics for their project, but don&#x27;t want to the more in-depth analysis of a tool like PostHog.</p><h4 id="pros-and-cons-4">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Fast and easy to use</td><td>Young project and small community</td></tr><tr><td>More analysis options than Plausible</td><td>Only supports basic product analytics features</td></tr><tr><td>No cookies required</td><td></td></tr><tr><td>Basic funnel and retention analysis</td><td></td></tr><tr><td>Cheaper than typical product analytics tools</td><td></td></tr></tbody></table><h4 id="faq-3">FAQ</h4><details><summary>What tools can OpenPanel replace?</summary><p>OpenPanel could replace Mixpanel, Amplitude, and Google Analytics. It isn&#x27;t as advanced as any of these tools, but it covers most of the essential features they offer. Unlike PostHog, OpenPanel is focused solely on product analytics, so doesn&#x27;t include things like session replay or A/B testing features.</p></details><details><summary>What&#x27;s included in open source?</summary><p>The open-source version is available with no limitations. Features include custom dashboards and charts (line, bar, area, map, pie, funnels, histograms, and retention), user profiles, a realtime analytics view, and tracking scripts for most popular frameworks, including Next.js, React, and React Native.</p></details><details><summary>What are the hosting requirements?</summary><p>OpenPanel doesn&#x27;t provide minimum requirements, but recommends hosting using Hetzner, and notes it&#x27;ll work on any server where you have pre-installed Docker, Docker Compose, Node and pnpm.</p></details><details><summary> Is there a hosted option?</summary><p>Yes. There is no free tier, but 100k events a month cost just $20, and 1 million events are $90 per month.</p></details><br/><h3 id="6-umami">6. Umami</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/umami_1_eb1b7297da.png" alt="umami analytics"/></p><h4 id="what-is-umami">What is Umami?</h4><ul><li><strong>Founded:</strong> 2020</li><li><strong>License:</strong> MIT</li><li><strong>GitHub Stars:</strong> 35.6k</li></ul><p><strong>Umami</strong> is another popular privacy-first website analytics tool. Like Plausible, it tracks basic website analytics, doesn&#x27;t collect any personal information, and is extremely fast. Similar to OpenPanel, it&#x27;s added some product analytics features, such as user journeys, retention, and funnels, though it only supports very basic analysis.</p><h4 id="who-should-use-umami">Who should use Umami?</h4><p>Similar to Plausible, Umami is ideal for anyone who wants easy-to-use website analytics that respects privacy. The two products are very similar, so which you choose will depend on personal preferences.</p><h4 id="pros-and-cons-5">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Easy to use and clean UI</td><td>Less polished than Plausible</td></tr><tr><td>Supports basic event tracking</td><td>Postgres database less scalable than Plausible&#x27;s ClickHouse backed event database</td></tr><tr><td>No cookies required</td><td></td></tr><tr><td>Minimal impact on website performance</td><td></td></tr><tr><td>Easy to self host</td><td></td></tr></tbody></table><h4 id="faq-4">FAQ</h4><details><summary>What tools can Umami replace?</summary><p>Google Analytics mainly, but also any other tool focused mainly on website analytics, including closed-source alternatives like Fathom.</p></details><details><summary>What&#x27;s included in open source?</summary><p>There&#x27;s no difference between the open source and paid products. Umami tracks all common website metrics, supports custom events, and offers basic funnel, user path, and retention analysis as well.</p></details><details><summary>What are the hosting requirements?</summary><p>Umami requires a server with Node.js version 18.18 or newer and an SQL database – MySQL (minimum v8.0) and PostgreSQL (minimum v12.14) are supported.</p></details><details><summary> Is there a hosted option?</summary><p>Yes and, unlike Plausible, there&#x27;s a free tier. You can track up to 100k events per month on Umami Cloud for free. The Pro tier starts at just $20 per month for 1 million events per month.</p></details><br/><h3 id="7-apache-superset">7. Apache Superset</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/superset_1_3c65062156.png" alt="superset - open source analytics tools"/></p><h4 id="what-is-apache-superset">What is Apache Superset?</h4><ul><li><strong>Created:</strong> 2016</li><li><strong>License:</strong> Apache-2.0</li><li><strong>GitHub Stars:</strong> 70.8k</li></ul><p><strong>Superset</strong> is the another of the big open-source business intelligence tools alongside Metabase and Redash. It&#x27;s also considered the most complex and least accessible for non-technical users, though its range of visualizations and charting options is unmatched. Superset is ideal for enterprises with experienced in-house data teams, or anyone with lots of SQL experience.</p><h4 id="who-should-use-apache-superset">Who should use Apache Superset?</h4><p>Companies that want to do advanced analysis and have the internal resources and knowledge to use Superset to its full potential. Superset is better-suited to companies with dedicated data science people, whereas Metabase is more accessible to non-technical users.</p><h4 id="pros-and-cons-6">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Huge range of visualization features</td><td>Not suitable for non-technical users</td></tr><tr><td>Highly customizable</td><td>Relatively complex to host</td></tr><tr><td>Very scalable for large orgs</td><td></td></tr><tr><td>Large community</td><td></td></tr></tbody></table><h4 id="faq-5">FAQ</h4><details><summary>What tools can Superset replace?</summary><p>Looker, Tableau and Power BI.</p></details><details><summary>What&#x27;s included in open source?</summary><p>There&#x27;s no paid version, so all features are included in the open source release, which includes 40+ pre-installed visualizations and vast options for data scientists to customize them to their needs.</p></details><details><summary>What are the hosting requirements?</summary><p>While there is a Docker Compose deployment, it&#x27;s not recommended for production use cases, which require deploying Superset on Kubernetes. <a href="https://superset.apache.org/docs/faq/">Superset&#x27;s FAQ</a> indicates 8GB RAM and 2vCPUs is &quot;adequate to run a moderately-sized instance&quot;.</p></details><details><summary> Is there a hosted option?</summary><p>Not directly, though third-parties offer managed instances.</p></details><br/><h3 id="8-openreplay">8. OpenReplay</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/openreplay.png" alt="openreplay - open source analytics tools"/></p><h4 id="what-is-openreplay">What is OpenReplay?</h4><ul><li><strong>Created:</strong> 2021</li><li><strong>License:</strong> AGPLv3</li><li><strong>GitHub Stars:</strong> 11.8k</li></ul><p><strong>OpenReplay</strong> is a session replay suite built for developers to find and eliminate problems. </p><p>In addition to session replay, it also includes some product analytics features, such as conversion funnels, user paths, heatmaps, trends, and custom dashboards. These features aren&#x27;t as developed as dedicated analytics tools like Mixpanel or PostHog, but they&#x27;re a useful augment to the core replay features.</p><h4 id="who-should-use-openreplay">Who should use OpenReplay?</h4><p>Companies that want an <a href="/blog/best-logrocket-alternatives">alternative to LogRocket</a> that they can self-host.</p><h4 id="pros-and-cons-7">Pros and cons</h4><table><thead><tr><th><strong>Pros</strong></th><th><strong>Cons</strong></th></tr></thead><tbody><tr><td>Comprehensive session replay features</td><td>Analytics features are secondary to session replay</td></tr><tr><td>Useful for discovering issues in your app</td><td>Data export limited to Enterprise plans</td></tr><tr><td>Built-in performance monitoring</td><td></td></tr><tr><td>Supports both web and mobile app tracking</td><td></td></tr></tbody></table><h4 id="faq-6">FAQ</h4><details><summary>What tools can OpenReplay replace?</summary><p>OpenReplay is an alternative to LogRocket and other similar dev-focused session replay tools, like PostHog. It can also replace the likes of Hotjar, and includes a co-browsing feature that&#x27;s similar to Hotjar&#x27;s.</p></details><details><summary>What&#x27;s included in open source?</summary><p>The free community edition includes all OpenReplay&#x27;s core features for session replay, app monitoring, and analytics with no limits on users or projects. Paying customers gain a handful of advanced features, such as support for data export, extra security features, and dedicated support.</p></details><details><summary>What are the hosting requirements?</summary><p>OpenReplay <a href="https://docs.openreplay.com/en/deployment/">typically recommends</a> a minimum of 2 vCPUs, 8 GB of RAM, 50 GB of storage, though this varies depending on the hosting provider.</p></details><details><summary> Is there a hosted option?</summary><p>Yes. There&#x27;s a free tier that&#x27;s limited to 1,000 session per month, or you can pay-as-you-go for $5.95 per 1,000 sessions each month.</p></details><h2 id="which-open-source-analytics-tool-should-you-choose">Which open source analytics tool should you choose?</h2><ul><li>Want an all-in-one platform that covers product analytics, session replay, feature flags, and more? <strong><a href="/">PostHog</a></strong></li><li>Need a privacy-first Google Analytics replacement with GDPR compliance built in? <strong>Matomo</strong></li><li>Want to query and visualize data that&#x27;s already in your warehouse? <strong>Metabase</strong></li><li>Just need fast, lightweight web analytics without cookies or tracking? <strong>Plausible</strong></li><li>Want basic product analytics with user profiles and retention, without the complexity of PostHog? <strong>OpenPanel</strong></li><li>Prefer a clean, simple web analytics tool similar to Plausible? <strong>Umami</strong></li><li>Need advanced visualizations and have an experienced data team to run it? <strong>Apache Superset</strong></li><li>Looking for a self-hostable session replay tool to replace LogRocket? <strong>OpenReplay</strong></li></ul><h2 id="frequently-asked-questions">Frequently Asked Questions</h2><details><summary>What are the best open source analytics tools in 2026?</summary><p>Based on our research, the best open source analytics tools you can self-host right now are:</p><ol><li><strong><a href="/">PostHog</a></strong> – Best all-in-one platform with product analytics, web analytics, session replay, feature flags, and more</li><li><strong>Matomo</strong> – Best open source alternative to Google Analytics for website and marketing analytics</li><li><strong>Metabase</strong> – Best open source BI tool for teams with data already in a warehouse</li><li><strong>Plausible</strong> – Best lightweight, privacy-first web analytics tool</li><li><strong>OpenPanel</strong> – Best simple product analytics for developers who want more than Plausible</li><li><strong>Umami</strong> – Best privacy-first web analytics alternative to Plausible</li><li><strong>Apache Superset</strong> – Best for advanced data teams who need complex visualizations</li><li><strong>OpenReplay</strong> – Best open source session replay tool for developers</li></ol></details><details><summary>What&#x27;s the difference between open source and cloud analytics tools?</summary><p><strong>Open source analytics tools</strong> let you self-host on your own infrastructure, giving you full control over where your data lives. This is useful for GDPR compliance, data sovereignty, or cost management at scale.</p><p><strong>Cloud analytics tools</strong> are managed by the vendor – easier to set up and maintain, but your data lives on their servers. Most tools in this list also offer a cloud-hosted option if you&#x27;d rather not manage infrastructure yourself.</p><p>For cloud product analytics tools, see our guide to the <a href="/blog/best-product-analytics-tools-for-startups">best product analytics tools for startups</a>.</p></details><details><summary>Should I self-host PostHog?</summary><p>You can, but for most teams PostHog Cloud is the better choice – even if open source and data control are important to you.</p><p>Here&#x27;s why:</p><ul><li><strong>Automatic updates:</strong> PostHog Cloud gets continuous updates and new features as soon as they ship. When self-hosting, you&#x27;ll need to manage these updates yourself or you&#x27;ll always be running slightly behind.</li><li><strong>Generous free tier:</strong> PostHog Cloud includes 1 million events, 5,000 session recordings, 1 million feature flag requests every month, and a lot more at no cost. <strong>Around 90% of PostHog users pay nothing</strong>. It&#x27;s hard to beat free with zero infrastructure overhead.</li><li><strong>Scaling complexity:</strong> PostHog only recommends self-hosting for deployments up to ~300k events per month. Beyond that, managing the infrastructure yourself becomes a real engineering burden.</li><li><strong>Easy to get started:</strong> You can be up and running in minutes with no servers to provision. The <a href="/wizard">PostHog setup wizard</a> detects your framework, installs the right SDK, and configures everything automatically – no manual setup required.</li></ul><p><div></div></p><p>The main reason to self-host is strict data residency requirements that can&#x27;t be met by PostHog&#x27;s EU Cloud option. If that&#x27;s your situation, the open source release is a solid starting point. For everyone else, cloud is the faster, easier, and usually cheaper path.</p></details><details><summary>Which open source analytics tools are best for GDPR compliance?</summary><p><strong>Plausible</strong> and <strong>Umami</strong> are cookieless by default and collect no personal data, making them the simplest path to GDPR compliance. <strong>Matomo</strong> is widely used by government and enterprise organizations specifically for its GDPR compliance features, including data anonymization and consent management. <strong>PostHog</strong> offers cookieless tracking and EU Cloud hosting if you want a managed option with EU data residency.</p><p>For a deeper breakdown, see our guide to the <a href="/blog/best-gdpr-compliant-analytics-tools">best GDPR-compliant analytics tools</a>.</p></details><details><summary>Can I use PostHog for free?</summary><p>Yes. PostHog offers both a self-hostable open source release (MIT license) and a cloud-hosted free tier. The cloud free tier includes 1 million events, 5,000 session recordings, and 1 million feature flag requests every month. Around 90% of PostHog users pay nothing. </p><p>See <a href="/pricing">PostHog&#x27;s pricing page</a> for full details.</p></details><details><summary>What is the best open source alternative to Google Analytics?</summary><p><strong>Matomo</strong> is the most direct open source alternative to Google Analytics – it even supports importing your existing GA data. <strong>Plausible</strong> and <strong>Umami</strong> are better options if you want something simpler and privacy-first. For deeper product analytics beyond website traffic, <strong>PostHog</strong> is the strongest option.</p></details><details><summary>How is PostHog different from other open source analytics tools?</summary><p>PostHog is more than an analytics tool. It combines everything developers need to build and improve their product in one platform:</p><ul><li><strong>All-in-one toolkit:</strong> <a href="/product-analytics">Product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, and <a href="/llm-analytics">LLM analytics</a></li><li><strong>Open source:</strong> MIT-licensed and <a href="https://github.com/PostHog/posthog">actively maintained</a> with 31k+ GitHub stars</li><li><strong>Generous free tier:</strong> 1M events, 5K recordings, and 1M flag requests per month at no cost</li><li><strong>Developer-first:</strong> Transparent APIs, <a href="/docs/product-analytics/sql">SQL access</a>, and a <a href="/roadmap">public roadmap</a></li></ul></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best product analytics tools for startups, compared]]></title><description><![CDATA[A tale as old as time: a founding team ships their MVP, installs  Google Analytics , watches pageview numbers go up, and feels good about themselves…]]></description><link>https://posthog.com/blog/best-product-analytics-tools-for-startups</link><guid isPermaLink="false">317cb0e8-8a36-53c2-93ec-ff50e15853c5</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>A tale as old as time: a founding team ships their MVP, installs <a href="/blog/posthog-vs-ga4">Google Analytics</a>, watches pageview numbers go up, and feels good about themselves. </p><p>Three months later they realize they have no idea why users churn, what <a href="/newsletter/wtf-is-activation">&quot;activated&quot;</a> means, or which features actually matter, so they start duct-taping together a bunch of different tools to try to figure it out.</p><p>If you&#x27;re early stage, that&#x27;s months of valuable context you just missed by not setting yourself up with the right solution from the start – context that could&#x27;ve gotten you to <a href="/founders/product-market-fit-game">product market fit</a> faster. </p><p>Don&#x27;t make the same mistake. This guide compares the best product analytics tools for startups, taking into consideration what actually matters at each stage of growth. </p><p>Before getting started, let&#x27;s brush up on the basics:</p><details><summary>What is product analytics (and how is it different from Google Analytics)?</summary><p><strong>Product analytics</strong> is <a href="/docs/product-analytics/capture-events">event-based tracking</a> that measures how users interact with your product, not just whether they visit your website. Every button click, feature used, form submitted, and page navigated becomes a data point you can query, filter, and act on.</p><p>Google Analytics tells you &quot;10,000 people visited your site this week, 40% bounced, average session was 3 minutes.&quot; Useful for marketing, less useful for product decisions.</p><p><a href="/docs/product-analytics">Product analytics</a> tells you &quot;User 4521 signed up Tuesday, completed onboarding in 3 minutes, used the core feature twice, then never came back.&quot;</p><p><strong>What to look in product analytics tools at as a startup:</strong></p><ol><li><strong><a href="/docs/product-analytics/funnels">Funnels</a></strong> – where do users drop off between signup and activation?</li><li><strong><a href="/docs/product-analytics/retention">Retention cohorts</a></strong> – of users who signed, how many came back?</li><li><strong><a href="/docs/data/cohorts">Segmentation</a></strong> – do users coming from X behave differently than those from Y?</li><li><strong><a href="/tutorials/feature-retention">Feature adoption</a></strong> – you shipped a new feature. Is anyone using it? Are those users retaining better?</li></ol><p>For a deeper dive, check out our <a href="/product-engineers/aarrr-pirate-funnel">AARRR pirate metrics framework</a> guide. </p><p>Building a mobile app? See our comparison of the <a href="/blog/best-mobile-app-analytics-tools">best mobile app analytics tools</a>. If open source matters to you, we&#x27;ve also rounded up the <a href="/blog/best-open-source-analytics-tools">best open source analytics tools</a>.</p></details><details><summary>What is product-market fit (PMF)?</summary><p>Product-market fit means <a href="/founders/making-something-people-want">you&#x27;ve built something people actually want</a> – and keep coming back to. It&#x27;s the point where retention curves flatten instead of declining to zero, users start recommending your product without being asked, and <a href="/founders/first-1000-users">growth feels like it&#x27;s pulling you forward</a> rather than being pushed.</p><p>The problem is that PMF isn&#x27;t binary – it&#x27;s a spectrum. Most startups think they have it before they actually do. </p><p>For a deeper framework on how to think about this, read our founder&#x27;s take on <a href="/founders/product-market-fit-game">the product-market fit game</a> – it breaks PMF into five levels you need to clear, from finding a real problem to onboarding your first reference customers. </p><p>We also have a full guide on <a href="/founders/measure-product-market-fit">how to measure product-market fit</a> using a combination of surveys, retention data, and word-of-mouth signals.</p></details><details><summary>What to measure when you&#x27;re pre-PMF</summary><p><strong>Your situation:</strong> You have an MVP with a few hundred users. You don&#x27;t know if they&#x27;re getting value. Retention is a mystery. The product might look completely different in six weeks.</p><p><strong>The metrics that matter</strong>: focus on <a href="/founders/early-stage-analytics">building a key metrics dashboard</a> and finding your <a href="/product-engineers/activation-metrics">activation metrics</a>, aka the actions correlated with long-term retention. <em>Correlated</em> is key – you&#x27;re not guessing, you&#x27;re testing which actions predict whether someone comes back.</p><p>You should also be looking at <a href="/blog/how-to-find-and-fix-app-onboarding-drop-off">onboarding completion rate</a> (funnel from signup → first meaningful action).</p><p><strong>Pair your analytics tool with:</strong></p><ul><li><a href="/session-replay">Session replay</a> – numbers say 40% drop off at step 3, but replay will show you they couldn&#x27;t find the &quot;Next&quot; button.</li><li><a href="/surveys">Surveys</a> – run a <a href="/templates">PMF survey</a> (&quot;How disappointed would you be if you could no longer use this product?&quot;). Add exit intent and onboarding feedback surveys.</li><li><a href="/docs/data/cohorts">Cohort</a> comparisons by acquisition source.</li></ul><p>Not sure which tools to use? </p><p>We&#x27;ve compared the best <a href="/blog/best-session-replay-tools">session replay tools</a>, <a href="/blog/best-open-source-session-replay-tools">best open source session replay tools</a>, and <a href="/blog/best-inapp-survey-tools">best in-app survey tools</a> for developers and startups.</p></details><details><summary>What to measure when you&#x27;re post-PMF</summary><p><strong>Your situation:</strong> Users are returning. Revenue is growing. You have a small team. The question shifts from &quot;does this work?&quot; to &quot;how do we grow efficiently?&quot;</p><p><strong>The metrics that matter:</strong></p><ul><li><strong>Cohort retention curves</strong> – <a href="/docs/product-analytics/retention">retention</a> by signup week. Is the curve flattening (good) or declining to zero (<a href="/newsletter/validating-product-ideas">you don&#x27;t actually have PMF</a>)?</li><li><strong>Engagement depth</strong> – DAU/MAU ratio, session frequency, feature breadth per user</li><li><strong>Feature adoption</strong> – what % of activated users tried the new feature? Use <a href="/docs/product-analytics/lifecycle">lifecycle analysis</a> to see if they retain better</li><li><strong>Conversion to paid</strong> – <a href="/docs/product-analytics/funnels">funnel</a> from trial → paid → retained subscription</li></ul><p><strong>Pair your analytics tool with:</strong></p><ul><li><a href="/feature-flags">Feature flags</a> – gradual rollouts (1% → 10% → 100%), kill switches, targeting for beta access</li><li><a href="/experiments">A/B testing</a> – test onboarding flows, pricing pages, feature gates against retention or conversion goals. </li><li><a href="/error-tracking">Error tracking</a> – correlate bugs with churn (&quot;Users who hit the checkout error in v2.3.1 churned at 3x the normal rate&quot;).</li><li><a href="/llm-analytics">LLM analytics</a> – if you&#x27;re shipping AI features, track cost, latency, and output quality per model</li></ul><p>Not sure which tools to use? </p><p>We&#x27;ve compared the best <a href="/blog/best-open-source-feature-flag-tools">feature flag tools</a>, <a href="/blog/best-open-source-ab-testing-tools">open source A/B testing tools</a>, <a href="/blog/best-error-tracking-tools">error tracking tools</a>, and <a href="/blog/best-open-source-llm-observability-tools">open source LLM observability tools</a> for developers and startups.</p></details><details><summary>What to measure as a scale-up</summary><p><strong>Your situation:</strong> You have a larger organization, perhaps including a data team. Reliability matters as much as growth. Enterprise customers ask about SLAs and data residency.</p><p><strong>The metrics that matter:</strong></p><ul><li><strong>Reliability</strong> – crash-free sessions, error rates, p95/p99 latency</li><li><strong>Data quality</strong> – event schema compliance, missing properties, taxonomy consistency</li><li><strong>Cost-to-serve</strong> – COGS per user, analytics costs as a line item</li><li><strong>Net revenue retention</strong> – expansion vs churn at the account level using <a href="/docs/product-analytics/group-analytics">group analytics</a></li></ul><p><strong>Pair your analytics tool with:</strong></p><ul><li><strong><a href="/data-stack">Data warehouse</a></strong> – create a single source of truth and query data from across product analytics, sales, finances, ops, and more. </li><li><strong><a href="/docs/product-analytics/group-analytics">Group analytics</a></strong> – track funnels, retention, and feature adoption at the account level, not just individual users</li><li><strong><a href="/logs">Logs</a></strong> – debug issues across your backend alongside user behavior and error data</li><li><strong><a href="/docs/product-analytics/sql">SQL access</a></strong> – write custom queries when the UI doesn&#x27;t cover your edge case, build views for your data team</li></ul></details><details><summary>What if I don&#x27;t have a data team?</summary><p>You don&#x27;t need one to get started. A lot of product analytics tools are designed so a single engineer or technical founder can set up tracking, build funnels, and run experiments without dedicated data infrastructure.</p><p>Most modern analytics platforms also feature AI-powered tools that let anyone on the team ask questions in plain language instead of writing queries from scratch. </p><p>For example, <a href="/ai">PostHog AI</a> can generate SQL queries, build funnels and retention charts, create insights and dashboards, summarize session replays, draft surveys, and help debug why a metric looks off – all from a natural language prompt. It won&#x27;t replace a data team at scale, but it means you&#x27;re not blocked while you&#x27;re still small.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_19_T15_45_12_897_Z_8938ad9b77.png" alt="PostHog AI"/></p></details><p>Now that you have a rough idea of what to measure, here&#x27;s what to measure it with:</p><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-pendo-alternatives/posthog.png" alt="PostHog"/></p><h3 id="what-is-posthog-and-why-should-startups-consider-it">What is PostHog and why should startups consider it?</h3><p><a href="/">PostHog</a> is an all-in-one developer platform that bundles <a href="/product-analytics">product analytics</a> with <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/logs">logs</a>, <a href="/llm-analytics">LLM observability</a>, <a href="/workflows">workflows</a>, and more. It&#x27;s open source at its core, with cloud hosting in both the US <a href="/blog/posthog-cloud-eu">and EU</a>. </p><p>PostHog ships fast, so the platform keeps getting better; check the <a href="/changelog">changelog</a> to see what&#x27;s new.</p><p>Every product has its own generous free tier, so you pay nothing until you have real traction. Over 90% of companies on PostHog pay $0! If you&#x27;re an early-stage startup (less than 2 years old, under $5M raised), you may also qualify for the <a href="/startups">PostHog for Startups program</a> – $50,000 in credits for a year, plus partner benefits and merch.</p><p><a href="/docs/billing/estimating-usage-costs">Billing limits</a> per product mean no surprise bills, and you don&#x27;t need a credit card to get started. Features that other tools gate normally behind enterprise pricing, like <a href="/docs/advanced/proxy">reverse proxy</a>, can be accessed in the free tier.</p><h3 id="key-features">Key features</h3><ul><li><a href="/ai">AI-powered analytics</a> with natural language queries, SQL generation, session replay summaries, and an <a href="/docs/model-context-protocol">MCP server</a> for AI workflows</li><li><a href="/docs/product-analytics/funnels">Funnels</a>, <a href="/docs/product-analytics/retention">retention</a>, <a href="/docs/product-analytics/paths">paths</a>, <a href="/docs/data/cohorts">cohorts</a>, <a href="/docs/product-analytics/lifecycle">lifecycle analysis</a> – all included in free tier</li><li><a href="/session-replay">Session replay</a> with console logs, network requests, and performance data</li><li><a href="/experiments">Experimentation</a> with statistical significance built on <a href="/feature-flags">feature flags</a></li><li><a href="/surveys">Surveys</a> with PMF templates, NPS, and targeting by user behavior</li><li><a href="/error-tracking">Error tracking</a> with stack traces alongside user behavior context</li><li><a href="/docs/llm-analytics">LLM analytics</a> to monitor and optimize AI features</li><li><a href="/docs/data-warehouse">Data warehouse</a> and <a href="/docs/cdp">CDP</a> for cross-product queries, external source connections, and syncing data between tools</li></ul><h3 id="getting-started">Getting started</h3><p>There is no need to jump on a &quot;quick sales call&quot; or to request a demo (unless you want to <a href="/talk-to-a-human">talk to a human</a>), PostHog is fully self-serve. </p><p>Create a free account at <a href="/">posthog.com</a>, pick US or EU hosting, and you&#x27;re in. No credit card needed.</p><p>Getting started takes minutes; <a href="/docs/getting-started/start-here">our docs</a> walk you through instrumentation step by step, or you can just paste a snippet in your <code>&lt;head&gt;</code> tag and <a href="/docs/product-analytics/autocapture">autocapture</a> starts collecting data immediately. </p><p>Want to skip the manual setup entirely? You can try out the <a href="/docs/ai-engineering/ai-wizard">PostHog wizard</a>, which detects your framework, installs <a href="/docs/libraries">the right SDK</a>, and configures everything for you.</p><p><div></div></p><h3 id="pricing">Pricing</h3><table><thead><tr><th>Product</th><th>Free tier (monthly)</th><th>After free tier</th></tr></thead><tbody><tr><td><strong>Product analytics + web analytics</strong></td><td><strong>1M events</strong></td><td><strong>$0.00005/event</strong></td></tr><tr><td>Session replay</td><td>5K recordings</td><td>~$0.005/recording</td></tr><tr><td>Feature flags + experiments</td><td>1M requests</td><td>$0.0001/request</td></tr><tr><td>Surveys</td><td>1,500 responses</td><td>$0.10/response</td></tr><tr><td>Error tracking</td><td>100K exceptions</td><td>$0.00037/exception</td></tr><tr><td>Data warehouse</td><td>1M synced rows</td><td>$0.000015/row</td></tr><tr><td>LLM analytics</td><td>100K events</td><td>$0.00006/event</td></tr><tr><td>Logs</td><td>50GB ingested</td><td>$0.25/GB</td></tr><tr><td>Workflows</td><td>10K messages/channel</td><td>$0.003000/email</td></tr><tr><td>PostHog AI</td><td>2,000 credits</td><td>$0.01/credit</td></tr></tbody></table><p>Every product is billed independently – you only pay for what you use beyond the free tier, and there are bulk discounts for higher usage. No per-seat fees, you get unlimited team members on every plan. </p><p>Use the <a href="/pricing">pricing calculator</a> to estimate costs based on your actual volume.</p><details><summary>PostHog is for you if... </summary><ul><li>You just launched your MVP and wants to get analytics up and running quickly</li><li>You&#x27;re a technical founder or product engineer who&#x27;d rather install one tool than manage five</li><li>You want <a href="/ai">AI-powered analytics</a> with natural language queries, and an <a href="/docs/model-context-protocol">MCP server</a> to integrate your analytics data into your AI workflows</li><li>You need EU hosting for privacy and compliance</li><li>You want to <a href="/wizard">hit the ground running</a>, start free, and only start paying when you have momentum</li></ul></details><details><summary>PostHog is not for you if... </summary><ul><li>Your team is entirely non-technical – PMs who need point-and-click everything may find the learning curve steep</li><li>You <em>only</em> need in-app guides and onboarding flows (<a href="/docs/product-tours/start-here">Product Tours</a> are still in alpha)</li><li>You want a warehouse-native analytics tool that sits on top of your existing BigQuery, Snowflake, or Databricks setup – PostHog has its own <a href="/docs/data-warehouse">data warehouse</a> and can sync data in and out, but it&#x27;s not designed to be a query layer for an external warehouse you already own</li><li>You want a <a href="/blog/best-mobile-app-analytics-tools">dedicated mobile analytics platform</a> – PostHog has mobile SDKs and <a href="/docs/session-replay">mobile replay</a>, but you might be bettter served by a tool with deeper mobile-specific features</li></ul></details><h2 id="2-mixpanel">2. Mixpanel</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_19_T20_41_30_936_Z_ec4ca1641e.png" alt="Mixpanel"/></p><h3 id="what-is-mixpanel-and-why-should-startups-consider-it">What is Mixpanel and why should startups consider it?</h3><p><a href="/blog/posthog-vs-mixpanel">Mixpanel</a> is a product analytics platform focused on funnels, retention, and cohort analysis – with session replay, feature flags, and A/B testing now built in. If analytics depth is your primary requirement, Mixpanel&#x27;s query interface is fast and polished. The Spark AI builder helps non-technical team members explore data without learning the event model.</p><p><a href="/blog/best-mixpanel-alternatives">Mixpanel&#x27;s</a> experiments and feature flags launched in late 2025, so the platform is moving toward a more integrated workflow – though it still doesn&#x27;t cover surveys or error tracking. Session replay is also relatively new, so it&#x27;s less mature than dedicated replay tools.</p><p>The startup program is the headline for eligible teams: companies under 5 years old with ≤$8M raised get the first year free – up to 1B events, 500K replays, and advanced features. </p><h3 id="key-features-1">Key features</h3><ul><li>Spark AI query builder for non-technical users</li><li>Heatmaps and session replay with automatic capture of rage clicks and dead clicks</li><li>Feature flags with cohort targeting, percentage rollouts, and sticky variants (enterprise add-on)</li><li>A/B testing with primary, secondary, and guardrail metrics (enterprise add-on)</li><li>Metric Trees for mapping how experiments ladder up to business goals (enterprise add-on)</li><li>Warehouse connectors for Snowflake, BigQuery, Databricks, Redshift</li></ul><h3 id="getting-started-1">Getting started</h3><p>Self-serve signup – no credit card required. Paste a JavaScript snippet before your closing <code>&lt;/head&gt;</code> tag, or install an SDK. You can also connect an existing data source via Segment, RudderStack, or warehouse connectors.</p><p>Autocapture is available for web. For mobile and server-side, you&#x27;ll need to instrument events manually.</p><p>The startup program requires an application – eligibility is verified, and data must be flowing within 90 days of acceptance or you lose access.</p><h3 id="pricing-1">Pricing</h3><table><thead><tr><th>Plan</th><th>Price</th><th>Includes</th></tr></thead><tbody><tr><td>Free</td><td>$0 forever</td><td>1M events/mo, 10K replays, 5 saved reports</td></tr><tr><td>Startup</td><td>Free first year</td><td>Up to 1B annual events, 500K replays (if eligible)</td></tr><tr><td>Growth</td><td>From $0</td><td>$0.28/1K events after 1M free</td></tr><tr><td>Enterprise</td><td>Contact sales</td><td>Unlimited events, governance</td></tr></tbody></table><p>The free plan covers core analytics but excludes several features startups often need as they grow: behavioral cohorts, custom properties, formulas, and saved metrics are limited. </p><p>Account-level analytics, experiment reporting, and feature flags are paid add-ons. Monitoring is capped at 5 alerts per project, and there&#x27;s no anomaly detection, root cause analysis, or Metric Trees. </p><p>If <a href="/founders/early-stage-analytics">you&#x27;re pre-PMF and just need funnels and retention</a>, the free tier works. Once you&#x27;re running experiments or tracking B2B accounts, you&#x27;ll hit the upgrade wall quickly.</p><details><summary>Mixpanel is for you if...</summary><ul><li>You want strong standalone funnel and cohort analysis</li><li>You qualify for the startup program and want a free first year</li><li>You have a data warehouse and want strong warehouse connectors</li><li>Your team includes non-technical PMs who need a polished, visual query builder</li></ul></details><details><summary>Mixpanel is not for you if...</summary><ul><li>You need surveys, error tracking, or LLM observability in the same platform – Mixpanel doesn&#x27;t offer any of these</li><li>You want mature, battle-tested replay and experimentation – Mixpanel&#x27;s are newer additions (late 2025)</li><li>You rely heavily on autocapture – Mixpanel added web autocapture recently, but it&#x27;s less mature than PostHog&#x27;s or Heap&#x27;s, and mobile still requires manual instrumentation</li></ul></details><p><div to="https://posthog.com/blog/posthog-vs-mixpanel">Compare PostHog and Mixpanel</div></p><h2 id="3-amplitude">3. Amplitude</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_19_T21_08_58_174_Z_4826c5eac4.png" alt="Amplitude"/></p><h3 id="what-is-amplitude-and-why-should-startups-consider-it">What is Amplitude and why should startups consider it?</h3><p><a href="/blog/posthog-vs-amplitude">Amplitude</a> is a retention-focused analytics platform known for the deepest cohort math in the category – N-day, unbounded, and bracket retention with cohort comparison overlays. If understanding <em>why</em> users come back (or don&#x27;t) is your primary workflow, Amplitude&#x27;s retention tooling is best-in-class.</p><p>The platform has expanded well beyond analytics. It now includes session replay, feature flags, A/B testing (Amplitude Experiment), and Guides &amp; Surveys. A Unified Browser SDK lets you initialize analytics, replay, experiments, and guides in a single call.</p><p><a href="/blog/best-amplitude-alternatives">Amplitude</a> uses a monthly tracked user (MTU) billing model. One user who triggers 500 events costs the same as one who triggers 5 – attractive for products with high per-user engagement. However, anonymous users count as MTUs until merged, which can inflate costs for products with lots of anonymous traffic.</p><h3 id="key-features-2">Key features</h3><ul><li>Cohort comparison overlays for segment-by-segment retention visualization</li><li>Feature flags with percentage rollouts – unlimited on all plans including free</li><li>Guides &amp; Surveys for in-app tooltips, banners, checklists, and NPS with annoyance monitoring to throttle pop-ups</li><li>Ask Amplitude AI for natural language data exploration</li><li>Ampli CLI for type-safe, code-generated tracking based on your tracking plan</li><li>Warehouse connectors for Snowflake, BigQuery, Redshift, and real-time streaming via Kinesis and Pub/Sub</li></ul><h3 id="getting-started-2">Getting started</h3><p>Self-serve signup for the Starter (free) and Plus plans. Install an SDK or use the Unified Browser SDK to initialize analytics, replay, experiments, and guides in one call. You can also paste a <code>&lt;script&gt;</code> snippet in your <code>&lt;head&gt;</code> tag for a no-build setup.</p><p>For data already in a warehouse, connect Snowflake, BigQuery, or Redshift directly.</p><h3 id="pricing-2">Pricing</h3><table><thead><tr><th>Plan</th><th>Price</th><th>Includes</th></tr></thead><tbody><tr><td>Starter</td><td>Free</td><td>50K MTUs, 10M events, unlimited flags, session replay, AI chat</td></tr><tr><td>Plus</td><td>From $49/mo (annual)</td><td>300K MTUs or 25M events, behavioral cohorts, saved charts, web experiments</td></tr><tr><td>Growth</td><td>Contact sales</td><td>Custom MTUs, causal insights, predictive audiences, feature experimentation</td></tr><tr><td>Enterprise</td><td>Contact sales</td><td>Cross-product analytics, multi-armed bandits, warehouse-native, EU residency</td></tr></tbody></table><p>Guides &amp; Surveys, extra session replay volume, and additional automated syncs are available as add-ons on Plus plans.</p><details><summary>Amplitude is for you if...</summary><ul><li>Retention curves and cohort comparisons are your primary analytical workflow</li><li>Your product has high per-user engagement (MTU billing rewards lots of events per user)</li><li>You want experiment exposure events excluded from your analytics bill</li><li>You need governance and taxonomy tools as your data team grows</li></ul></details><details><summary>Amplitude is not for you if...</summary><ul><li>Your product has lots of anonymous traffic – anonymous users count as distinct MTUs until merged, inflating costs</li><li>You want simple, transparent pricing – Growth/Enterprise require sales conversations</li><li>You need error tracking or logs – Amplitude doesn&#x27;t offer either</li><li>You&#x27;re pre-PMF and just need basic funnels and retention – the depth of tooling can be more than you need right now</li></ul></details><p><div to="https://posthog.com/blog/posthog-vs-amplitude">Compare PostHog and Amplitude</div></p><h2 id="4-heap">4. Heap</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-pendo-alternatives/heap.png" alt="Heap"/></p><h3 id="what-is-heap-and-why-should-startups-consider-it">What is Heap and why should startups consider it?</h3><p><a href="/blog/posthog-vs-heap">Heap</a> is an analytics platform that records every user interaction automatically, then lets you define events retroactively using a visual point-and-click editor in a Chrome extension. </p><p>Famous for their autocapture capabilities, Heap is particularly appealing for non-technical founders and early-stage teams who don&#x27;t want to commit to a tracking plan before they understand what matters. The free plan includes 10K sessions/mo, 6 months of data history, and SSO.</p><p>Worth noting: Heap was acquired by <a href="/blog/best-contentsquare-alternatives">Contentsquare</a>, and the tools are merging into one platform. For feature flags, surveys, and error tracking, you&#x27;ll need separate tools.</p><h3 id="key-features-3">Key features</h3><ul><li>Autocapture records every interaction – retroactive queries for events you define later</li><li>Visual labeling: point-and-click event definition in a Chrome extension, no code needed</li><li>Account &gt; user &gt; session &gt; event hierarchy for B2B products</li><li>Effort analysis to identify high-friction workflows</li></ul><h3 id="getting-started-3">Getting started</h3><p>Paste the Heap snippet on your site and autocapture starts recording every interaction immediately.</p><p>Use the Chrome extension for visual labeling to define named events on top of the autocaptured data – point and click on any UI element to create a named event retroactively. For mobile, install the iOS or Android SDK, though autocapture is web-only and mobile requires manual event instrumentation.</p><p>If you already have data flowing through Segment or a warehouse, Heap supports those as import sources too.</p><h3 id="pricing-3">Pricing</h3><table><thead><tr><th>Plan</th><th>Price</th><th>Includes</th></tr></thead><tbody><tr><td>Free</td><td>$0</td><td>10K sessions/mo, core charts, 6 month data retention</td></tr><tr><td>Growth</td><td>Install snippet for estimate</td><td>Session-based pricing</td></tr><tr><td>Pro/Enterprise</td><td>Contact sales</td><td>Advanced features, longer retention</td></tr></tbody></table><details><summary>Heap is for you if...</summary><ul><li>You don&#x27;t yet know what to track and want to avoid premature tracking plan decisions</li><li>You want to define events by clicking on UI elements – no code needed</li><li>You&#x27;re a non-technical founder who wants retroactive analysis without engineering help</li><li>You want to start collecting data immediately and figure out what matters later</li></ul></details><details><summary>Heap is not for you if...</summary><ul><li>You need clean, well-governed data from day one – autocapture creates noise without governance</li><li>You&#x27;re building a cross-platform product (web + mobile) – session definitions differ between platforms</li><li>You want upfront pricing – Growth/Pro requires installing the snippet for an estimate</li><li>You want long data retention on the free plan – you&#x27;re capped at 6 months of history, which isn&#x27;t enough to measure annual retention or seasonal patterns</li><li>You need SQL access or API depth for custom analysis – Heap is more visual and less technical than PostHog, Mixpanel, or Amplitude</li></ul></details><p><div to="https://posthog.com/blog/posthog-vs-heap">Compare PostHog and Heap</div></p><h2 id="5-fullstory">5. Fullstory</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-logrocket-alternatives/fullstory.png" alt="FullStory"/></p><h3 id="what-is-fullstory-and-why-should-startups-consider-it">What is Fullstory and why should startups consider it?</h3><p><a href="/blog/posthog-vs-fullstory">Fullstory</a> is a session replay-first platform with product analytics layered on top. It flips the typical analytics workflow: instead of starting with dashboards and drilling into data, you start with session replays and layer quantitative analytics on top.</p><p>The &quot;tagless&quot; autocapture engine records user interactions without manual instrumentation, and AI-generated session summaries cut review time (you can read a summary instead of watching a 15-minute session). </p><p>The trade-off is depth: Fullstory&#x27;s funnels and retention are <a href="/blog/best-fullstory-alternatives">lighter than its competitors</a>, and all pricing tiers require contacting sales. Mobile analytics is a separate paid add-on. For feature flags, surveys, and error tracking, you&#x27;ll need separate vendors.</p><h3 id="key-features-4">Key features</h3><ul><li>Click-from-metric-to-replay workflow across product analytics and session replay</li><li>AI session summaries to surface key moments and reduce replay review time</li><li>&quot;Tagless&quot; autocapture for interaction recording without manual instrumentation</li><li>Configurable privacy controls: capture what you need, mask what you don&#x27;t</li><li>Frustration signals: rage clicks, dead clicks, error clicks surfaced automatically</li></ul><h3 id="getting-started-4">Getting started</h3><p>Contact sales for all tiers. No public self-serve signup for full functionality.</p><h3 id="pricing-4">Pricing</h3><p>All tiers (Business, Advanced, Enterprise) require contacting sales. Mobile analytics is a separate add-on. No public pricing available.</p><details><summary>Fullstory is for you if...</summary><ul><li>Your primary workflow is &quot;watch what users do, then quantify it&quot;</li><li>You need a tight replay-to-analytics loop</li><li>You care about frustration detection (rage clicks, dead clicks) as a primary signal</li></ul></details><details><summary>Fullstory is not for you if...</summary><ul><li>You need deep quantitative analytics as your primary tool </li><li>You want transparent, self-serve pricing – all tiers require contacting sales</li><li>You&#x27;re building mobile-first – mobile analytics is a paid add-on, not included</li><li>You want AI features beyond session summaries – Fullstory&#x27;s AI is focused on replay summarization, not query generation, survey drafting, or broader analytics assistance</li><li>You&#x27;re a startup that needs to know costs upfront before committing</li><li>You need feature flags, A/B testing, surveys, or error tracking – Fullstory doesn&#x27;t offer any of these, so you&#x27;re adding more vendors on top</li></ul></details><p><div to="https://posthog.com/blog/posthog-vs-fullstory">Compare PostHog and Fullstory</div></p><h2 id="6-pendo">6. Pendo</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-Fullstory-alternatives/pendo.png" alt="Pendo"/></p><h3 id="what-is-pendo-and-why-should-startups-consider-it">What is Pendo and why should startups consider it?</h3><p><a href="/blog/posthog-vs-pendo">Pendo</a> pairs product analytics with in-app guides, tooltips, walkthroughs, and NPS surveys. Its strength is the insight-to-action loop: see that 60% of users never discover your highest-retention feature, then build an in-app guide pointing them to it.</p><p>The free plan includes 500 MAUs with retroactive analytics, in-app guides, NPS, and roadmap tools. If your primary need is onboarding users <em>and</em> measuring their behavior in the same tool, Pendo&#x27;s integration between analytics and guides is solid. </p><p>The trade-off: Pendo excludes anonymous users from retention analysis entirely, so if you have a large unidentified user base you&#x27;ll get an incomplete picture. For session replay, feature flags, and error tracking, you&#x27;ll need separate vendors.</p><h3 id="key-features-5">Key features</h3><ul><li>Free plan: 500 MAUs with analytics, in-app guides, NPS, and roadmaps</li><li>Funnels and paths for drop-off and next-action analysis</li><li>In-app guide builder for tooltips, walkthroughs, and feature announcements – no code needed</li><li>MAU-based pricing – predictable if your user count is stable</li><li>Roadmap and feedback tools for product planning</li></ul><h3 id="getting-started-5">Getting started</h3><p>Free plan available (500 MAUs). Self-serve for the free tier. Paid plans require contacting sales for MAU-based pricing.</p><h3 id="pricing-5">Pricing</h3><table><thead><tr><th>Plan</th><th>Price</th><th>Includes</th></tr></thead><tbody><tr><td>Free</td><td>$0</td><td>500 MAUs, analytics + guides + NPS</td></tr><tr><td>Growth</td><td>Contact sales</td><td>MAU-based pricing, more guides</td></tr><tr><td>Enterprise</td><td>Contact sales</td><td>Governance, SSO, advanced analytics</td></tr></tbody></table><details><summary>Pendo is for you if...</summary><ul><li>You want to identify where users struggle <em>and</em> deploy an in-app fix from the same tool</li><li>You&#x27;re a PM who wants to build onboarding flows and feature announcements without engineering help</li><li>Your user base is small and identified (the free plan is capped at 500 MAUs)</li><li>You want analytics and in-app messaging in one platform without custom integrations</li></ul></details><details><summary>Pendo is not for you if...</summary><ul><li>You have lots of anonymous or unidentified users – retention analysis excludes them entirely</li><li>You want SQL access or deep API integrations – Pendo is less technical than PostHog or Mixpanel</li><li>You only need analytics, not in-app guides – you&#x27;re paying for capability you won&#x27;t use</li><li>You need session replay, feature flags, or error tracking – Pendo doesn&#x27;t include any of these</li></ul></details><p><div to="https://posthog.com/blog/posthog-vs-pendo">Compare PostHog and Pendo</div></p><h2 id="which-product-analytics-tool-should-you-choose-for-your-startup">Which product analytics tool should you choose for your startup?</h2><h3 id="step-1-know-your-stage">Step 1: Know your stage</h3><p><strong>Pre-PMF:</strong> Speed over depth. Get data flowing in an afternoon and focus on three questions: are users signing up, are they reaching core value, are they coming back? <a href="/newsletter/validating-product-ideas">See if your product has legs</a>.</p><p><strong>Post-PMF:</strong> You&#x27;ve <a href="/newsletter/what-weve-learned-about-product-market-fit">validated the product</a>. Now you need to understand why it works and how to grow efficiently. The tool you chose at the MVP stage either scales with you or becomes technical debt.</p><p><strong>Scale-up:</strong> Reliability, data quality, and cost control matter as much as insights. You need warehouse integrations, group analytics for B2B accounts, and compliance features like EU residency and SSO.</p><h3 id="step-2-decide-what-you-need-in-one-platform-vs-separate-tools">Step 2: Decide what you need in one platform vs. separate tools</h3><p>The bundled approach means less setup, shared context across products, and one bill. </p><p>The unbundled approach gives you flexibility to swap individual tools, but every additional vendor means another data model, another integration, and another place where user context gets lost.</p><h3 id="step-3-match-the-pricing-model-to-your-product">Step 3: Match the pricing model to your product</h3><p>The wrong pricing model can cost you significantly more depending on your product&#x27;s usage pattern.</p><ul><li><strong>Event-based:</strong> You pay per <strong>action tracked</strong>. Best for products with moderate events per user. Watch out for high-frequency events that inflate volume.</li><li><strong>MTU-based:</strong> You pay per <strong>unique user</strong>. Best for high-engagement products where each user triggers hundreds of events. Watch out for anonymous traffic – unidentified visitors count as separate MTUs until merged.</li><li><strong>Session-based:</strong> You pay per <strong>session</strong>. Best for products with short, focused sessions. Watch out for products where users return multiple times per day.</li><li><strong>MAU-based:</strong> You pay per <strong>monthly active user</strong>. Most predictable if your user count is stable. Watch out for rapid growth – costs scale linearly with users regardless of data volume.</li></ul><h3 id="step-4-check-whats-actually-free">Step 4: Check what&#x27;s actually free</h3><p>&quot;Free tier&quot; means very different things across tools.</p><p>Some tools give you the full product at low volume. Others gate core features behind paid plans and call the rest &quot;free.&quot; Before committing, check: how many events/sessions/users are included? Which features are restricted? Do you need a credit card? How long is data retained?</p><table><thead><tr><th>Tool</th><th>Free tier</th><th>Pricing model</th><th>Self-serve?</th><th>Best for</th><th>You&#x27;ll also need...</th></tr></thead><tbody><tr><td><strong>PostHog</strong></td><td>1M events/mo</td><td>Events (per product)</td><td>Yes</td><td>All-in-one platform</td><td>Nothing – it&#x27;s bundled</td></tr><tr><td><strong>Mixpanel</strong></td><td>1M events/mo</td><td>Events</td><td>Yes</td><td>Pure funnel/cohort analysis</td><td>Replay, flags, surveys, errors</td></tr><tr><td><strong>Amplitude</strong></td><td>10K MTUs</td><td>MTUs</td><td>Partial</td><td>Retention depth</td><td>Replay, flags, surveys, errors</td></tr><tr><td><strong>Heap</strong></td><td>10K sessions/mo</td><td>Sessions</td><td>Yes</td><td>Retroactive autocapture</td><td>Flags, surveys, errors</td></tr><tr><td><strong>Fullstory</strong></td><td>10K sessions/mo</td><td>Contact sales</td><td>No</td><td>Replay-first analysis</td><td>Flags, surveys, errors</td></tr><tr><td><strong>Pendo</strong></td><td>500 MAUs</td><td>MAUs</td><td>Free tier</td><td>Analytics + in-app guides</td><td>Replay, flags, errors</td></tr></tbody></table><h3 id="recommendations-by-team-type">Recommendations by team type</h3><p><strong>For pre-PMF startups and solo founders</strong></p><ul><li><strong>PostHog</strong> if you want analytics, replay, surveys, flags, and more in one quick install with a generous free tier</li><li><strong>Mixpanel</strong> if you qualify for the startup program and want a free first year with up to 1B events</li><li><strong>Heap</strong> if you don&#x27;t know what to track yet and want retroactive analysis without a tracking plan</li></ul><p><strong>For post-PMF and scaling teams</strong></p><ul><li><strong>PostHog</strong> if you want connected workflows – funnel drop-off → replay → experiment → deploy – without switching tools</li><li><strong>Amplitude</strong> if retention math and cohort comparisons are your primary analytical workflow</li><li><strong>Mixpanel</strong> if your team includes non-technical PMs who need a polished, visual query builder</li></ul><p><strong>For engineering-heavy teams</strong></p><ul><li><strong>PostHog</strong> if you want SQL access, an <a href="/docs/model-context-protocol">MCP server</a>, open source, and everything in one data model</li><li><strong>Amplitude</strong> if you need type-safe tracking (Ampli CLI) and governance tooling as your data team grows</li><li><strong>Mixpanel</strong> if you have a data warehouse and want strong warehouse connectors with experiments built in</li></ul><p><strong>For product managers and less technical teams</strong></p><ul><li><strong>Pendo</strong> if you need analytics and in-app guides in one tool without engineering help</li><li><strong>Amplitude</strong> if you want Guides &amp; Surveys alongside deep analytics and AI-powered exploration</li><li><strong>Fullstory</strong> if your primary workflow is watching sessions and quantifying what you see</li></ul><p><strong>For teams building AI-powered products</strong></p><ul><li><strong>PostHog</strong> if you want <a href="/llm-analytics">LLM observability</a> (cost, latency, token usage, output quality) alongside product analytics, replay, and experiments in one platform</li><li><strong>Amplitude</strong> if you&#x27;re already using Amplitude for analytics and want to layer experiments on top of AI features</li><li><strong>Mixpanel</strong> if you need to track AI feature adoption and conversion funnels but handle observability separately with a dedicated tool</li></ul><p><div></div></p><h2 id="faqs">FAQs</h2><details><summary>How do I track analytics for my MVP with PostHog?</summary><p>Start minimal. Install PostHog&#x27;s <a href="/docs/product-analytics/autocapture">autocapture</a> snippet (or run our <a href="/wizard">AI setup wizard</a>). You&#x27;ll start collecting data right away.</p><p>Define <a href="/newsletter/wtf-is-activation">your activation hypothesis</a>, build one funnel, watch 5-10 <a href="/session-replay">session replays</a> a week. You need to answer three questions: are users signing up, are they reaching core value, are they coming back? The rest can wait.</p><p><div></div></p></details><details><summary>What is a tracking plan and when do I need one?</summary><p>A tracking plan is a document that defines every event you track, its properties, and its naming conventions. You don&#x27;t need one on day one – <a href="/docs/product-analytics/autocapture">autocapture</a> gets you started immediately. But once you have multiple people instrumenting events or your product has grown beyond a few core flows, a tracking plan prevents duplicate events, inconsistent naming, and data you can&#x27;t trust.</p></details><details><summary>How do I choose the right analytics tool for my startup?</summary><p>Match tool to stage: <a href="/product-engineers/activation-metrics">activation metrics</a> pre-PMF, retention cohorts post-PMF. </p><p>Compare pricing models against your product&#x27;s usage pattern: events (PostHog, Mixpanel), MTUs (Amplitude), MAUs (Pendo). </p><p>Check whether you need adjacent tools (replay, flags, experiments, surveys, error tracking...) in the same platform or are fine managing separate vendors. </p><p>And check mobile SDK support if building native apps.</p></details><details><summary>Can I use product analytics for my mobile app?</summary><p>Yes. <strong>PostHog</strong> has SDKs for iOS, Android, React Native, and Flutter. <strong>Mixpanel</strong> and <strong>Amplitude</strong> also have broad mobile support. Heap is primarily web. Fullstory&#x27;s mobile is a paid add-on. </p><p>Mobile apps generate more events per session than web, so factor that into cost estimates on event-based pricing. </p><p>See our comparison of the <a href="/blog/best-mobile-app-analytics-tools">best mobile app analytics tools</a>.</p></details><details><summary>What is event-based analytics?</summary><p>Instead of tracking pageviews, <a href="/docs/data/events">event-based analytics</a> records specific user actions – button clicks, feature usage, form submissions, purchases, API calls – as discrete data points with properties attached. </p><p>This lets you build funnels across any sequence of actions, segment users by behavior, and answer questions like &quot;what did users who retained do differently in their first session?&quot; </p></details><details><summary>What&#x27;s the difference between autocapture and manual event tracking?</summary><p><a href="/docs/product-analytics/autocapture">Autocapture</a> automatically records every user interaction (clicks, page views, form submissions) without you writing code for each one. You get data immediately but may need to filter noise. </p><p><strong>Manual tracking</strong> requires you to define and instrument each event explicitly – more setup time, but cleaner data from day one.</p><p>PostHog, Amplitude, and Heap support autocapture. Mixpanel added web autocapture recently.</p></details><details><summary>Should I switch from Google Analytics to product analytics?</summary><p>You probably don&#x27;t need to switch – you need to add. </p><p><a href="/blog/ga4-alternatives">GA4</a> is fine for marketing attribution and traffic analysis. Product analytics covers everything after signup: funnel drop-off, retention cohorts, feature adoption, behavioral segmentation. Most teams keep <a href="/blog/best-web-analytics-tools">a web analytics tool</a> for marketing and add a product analytics tool for in-product behavior. </p><p>Read our <a href="/blog/posthog-vs-ga4">GA4 comparison</a> for a deeper breakdown.</p></details><details><summary>How does product analytics relate to business intelligence?</summary><p><strong>Product analytics</strong> = user-level event streams for real-time product decisions. <strong>BI</strong> = aggregated reporting for finance and ops. </p><p>Post-PMF startups export product events to a <a href="/docs/data-warehouse">data warehouse</a> (Snowflake, BigQuery) for unified reporting that combines product behavior with revenue data. Product analytics feeds the warehouse; <a href="/blog/best-open-source-business-intelligence-tools">BI tools</a> visualize the combined data.</p></details><details><summary>Can I use multiple analytics tools at the same time?</summary><p>Yes, and many teams do. </p><p>The risk is data fragmentation: if your funnel data is in one tool and your retention data is in another, you lose the ability to connect them. </p><p>Tools like <strong>PostHog</strong> that bundle analytics, replay, and experiments in one data model avoid this problem. If you do use multiple tools, you can route data through a single source (like Segment or a warehouse) to keep things consistent.</p></details><details><summary>What is cohort analysis and why does it matter?</summary><p>A <a href="/docs/data/cohorts">cohort</a> is a group of users who share a characteristic – usually signup date. </p><p>Cohort analysis compares how different groups behave over time: did users who signed up in January retain better than those who signed up in March? This tells you whether your product is actually getting better, not just growing. </p><p>It&#x27;s an important analysis for understanding product-market fit.</p></details><details><summary>How do product analytics tools handle user privacy and GDPR?</summary><p>Most tools offer EU hosting, data residency options, and consent management. </p><p><strong>PostHog</strong> offers both US and EU cloud hosting; <strong>Amplitude</strong> has EU data residency on enterprise plans; <strong>Mixpanel</strong> provides EU data residency and supports data deletion requests. If GDPR compliance is critical, check whether the tool processes data in the EU, supports consent-based tracking, and offers data deletion APIs.</p><p>Read our guide on the <a href="/blog/best-gdpr-compliant-analytics-tools">best GDPR compliant analytics tools</a> for more details.</p></details><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs FullStory]]></title><description><![CDATA[PostHog and  FullStory  are both popular tools for understanding user behavior, but how are they different? Here's the short answer. PostHog  is an…]]></description><link>https://posthog.com/blog/posthog-vs-fullstory</link><guid isPermaLink="false">688b115c-99a4-59fa-986f-e612be5dd526</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-fullstory/posthog-vs-fullstory.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog and <a href="/blog/best-fullstory-alternatives">FullStory</a> are both popular tools for understanding user behavior, but how are they different? Here&#x27;s the short answer.</p><ul><li><p><strong>PostHog</strong> is an all-in-one [developer platform] (/products) built to help engineers build successful products. It offers a wide range of features to help teams build better products, including <a href="/product-analytics">analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/error-tracking">error tracking</a>, <a href="/experiments">experiments</a>, and more.</p></li><li><p><strong>FullStory</strong> is a behavioral data and analytics platform focused on session replay, product analytics, and frustration signal detection. It has expanded in recent years with StoryAI (AI-powered insights), Guides and Surveys, and Anywhere (data warehouse sync and real-time activation).</p></li></ul><p>In this comparison, we&#x27;ll explore, compare and contrast PostHog and FullStory in detail, so you can decide which tool is right for you. We&#x27;ll look at areas such as...</p><ul><li><a href="#core-feature-comparison">Core features and product focus</a></li><li><a href="#product-analytics">Product analytics</a>, <a href="#session-replays">Session replay</a>, and <a href="#heatmaps-clickmaps-and-scrollmaps">Heatmapping</a> features</li><li><a href="#apps-integrations-and-plugins">Integrations with other software</a></li><li><a href="#event-tracking">Event tracking and data management</a></li><li><a href="#security-and-compliance">Privacy, security, and compliance</a></li><li><a href="#frequently-asked-questions">Pricing and frequently asked questions</a></li></ul><h2 id="how-is-posthog-different">How is PostHog different?</h2><h3 id="1-posthog-is-an-all-in-one-developer-platform">1. PostHog is an all-in-one developer platform</h3><p>FullStory has expanded beyond session replay into analytics, AI insights, and in-app messaging, but it still doesn&#x27;t include feature flags, A/B testing, or error tracking.</p><p>In contrast, PostHog is a comprehensive, all-in-one platform that has robust <a href="/docs/product-analytics">analytics</a>, <a href="/docs/feature-flags">feature flagging</a>, <a href="/docs/experiments">A/B testing</a>, <a href="/docs/session-replay">session recording</a>, <a href="/docs/error-tracking">error tracking</a>, <a href="/workflows">workflows</a> and more. </p><p>It easily replaces an entire stack of traditional tools, such as <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a>, <a href="/blog/posthog-vs-amplitude">Amplitude</a>, and <a href="/blog/best-fullstory-alternatives">FullStory</a>.</p><h3 id="2-posthog-is-for-engineers-technical-users-builders">2. PostHog is for engineers, technical users, <em>builders</em></h3><p>PostHog is designed from the ground up to meet the needs of developers, and product-focused engineers. Session replay includes advanced tools for debugging errors and performance issues, while feature flags make it easy to test, and roll out, new features at scale. You get <a href="/docs/product-analytics/sql">SQL access</a>, a fully documented <a href="/docs/api">API</a>, and <a href="/docs/libraries">SDKs</a> for every major platform.</p><h3 id="3-transparent-pricing-generous-free-tiers">3. Transparent pricing, generous free tiers</h3><p>Our <a href="/pricing">pricing</a> is 100% transparent. There are no hidden fees or surprise overages – what you see is exactly what you&#x27;ll pay.</p><p>We also default to charging as little as possible while still making a sensible margin, and every product comes with a generous free tier. In fact, more than 90% of companies use PostHog for free!</p><blockquote><p>In 2024, we <a href="/blog/session-replay-pricing">cut prices for session replay</a> and <a href="/blog/analytics-pricing">analytics events</a>. In 2025, we&#x27;ve <a href="/blog/data-pipeline-pricing">cut prices for data pipelines</a> and surveys. If we can cut pass a saving onto our customers, we always will.</p></blockquote><p><div></div></p><h2 id="core-features">Core features</h2><p>This comparison will compare all available features, regardless of pricing tier. Visit the pricing section <a href="#frequently-asked-questions">in the FAQ</a> for more information on pricing.</p><p><div competitors="posthog,fullstory"></div></p><ul><li><p><strong>Product analytics:</strong> Both FullStory and PostHog offer product analytics, but <em>what</em> they offer is drastically different. We explore this comparison in greater detail below.</p></li><li><p><strong>Data warehouse:</strong> PostHog includes a built-in <a href="/data-warehouse">data warehouse</a> for importing and querying external data. FullStory offers Anywhere: Warehouse for exporting behavioral data to BigQuery, Snowflake, Redshift, and Databricks, and Anywhere: Activation for real-time behavioral triggers – but these are paid add-ons.</p></li></ul><blockquote><p><strong>Further reading:</strong> <a href="/blog/posthog-alternatives">How FullStory compares to other PostHog alternatives</a></p></blockquote><h3 id="product-analytics">Product Analytics</h3><p>FullStory is aimed at UX designers, general product managers, and customer success teams, while PostHog is suited to product engineers, front-end developers and more technical users. As a result, PostHog offers a wider range of analytics tools, including <a href="/docs/sql">its own SQL dialect for detailed analysis</a>.</p><p><div competitors="posthog,fullstory"></div></p><p>Product analytics in PostHog is closely integrated with other tools, such as <a href="/docs/feature-flags">feature flags</a> and <a href="/docs/session-replay">session replays</a>.</p><p>This means you can use a Trends insight to examine the performance of a particular metric, click on a point in the graph to see users who contributed to it, and then jump directly to their session replay to see what they did.</p><p>You can also do this in reverse by filtering for session replays where particular events occur, and creating dynamic playlists. We cover these session replay features in greater depth below.</p><p>FullStory&#x27;s StoryAI (powered by Google Gemini) can summarize sessions, answer natural language questions, and proactively surface friction points – but it&#x27;s a premium add-on and doesn&#x27;t connect to experiments or feature flags since FullStory lacks those features.</p><blockquote><p><strong>PostHog ships weirdly fast.</strong> We never stop shipping. Visit <a href="/changelog">the weekly changelog</a> to keep up to date, or take a look at what we’re planning in <a href="/roadmap">our public roadmap</a>!</p></blockquote><h3 id="session-replay">Session replay</h3><p>FullStory is well-known for session replay, while PostHog is an all-in-one platform. The gap between them on replay has narrowed significantly, with PostHog offering developer-focused debugging tools that FullStory doesn&#x27;t.</p><p>PostHog&#x27;s <a href="/docs/session-replay">session replay</a> includes console logs, network request monitoring, a DOM explorer, performance metrics, and <a href="/docs/posthog-ai/session-summaries">AI-powered session summaries</a> – making it more powerful for debugging. Data retention <a href="/docs/session-replay/recording-retention">varies depending on the plan you choose</a>.</p><p>FullStory&#x27;s strength is its frustration signal detection (rage clicks, dead clicks, error clicks) and StoryAI-powered session summaries. It offers a 30,000 sessions per month free tier with 12 month retention, but limited features.</p><p><div competitors="posthog,fullstory"></div></p><h3 id="heatmaps-clickmaps-and-scrollmaps">Heatmaps, clickmaps and scrollmaps</h3><p>Different types of heatmaps enable you to see where users are focusing their attention – or even precisely where they are looking on a page.</p><p><div competitors="posthog,fullstory"></div></p><h3 id="integrations-and-data-pipelines">Integrations and data pipelines</h3><p>PostHog includes a built-in <a href="/cdp">CDP</a> with sources, transformations, and destinations, as well as a <a href="/data-stack">built-in data warehouse</a>. FullStory offers Anywhere: Warehouse (hourly data sync to BigQuery, Snowflake, Redshift, S3, GCS, Azure Blob, and Databricks) and Anywhere: Activation (real-time behavioral triggers) – both are paid add-ons.</p><p>Below are some of the most popular integrations for FullStory and PostHog:</p><p><div competitors="posthog,fullstory"></div></p><h2 id="event-tracking">Event tracking</h2><p>Both PostHog and FullStory support a broad range of tracking options, manual event instrumentation, and autocapture.</p><p><div competitors="posthog,fullstory"></div></p><blockquote><h3 id="should-you-autocapture-events">Should you autocapture events?</h3><p>Autocapture is much faster to set up than manual instrumentation, but some argue that it creates too much noise to be useful. We disagree, and it&#x27;s why PostHog gives you your first million events for free, every month – so you can capture events without worrying about event limits. <a href="/blog/is-autocapture-still-bad">It&#x27;s something we feel strongly about</a>.</p></blockquote><h2 id="security-and-compliance">Security and compliance</h2><p><div competitors="posthog,fullstory"></div></p><h2 id="when-to-choose-posthog-vs-fullstory">When to choose PostHog vs FullStory</h2><ul><li>Want to understand user behavior, debug issues, run experiments, and ship features – all without switching tools? Go with <strong>PostHog</strong>.</li><li>Need session replay with frustration detection, AI-powered behavioral insights, and in-app guides for non-technical teams? <strong>FullStory</strong> is built for that.</li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><p><strong>For engineering-led product teams</strong></p><ul><li><strong>PostHog</strong> – SQL access, <a href="/docs/model-context-protocol">MCP server</a> for AI coding tools, <a href="/docs/libraries">SDKs</a> for every major platform, error tracking, LLM analytics, and tight integration between analytics, feature flags, and experiments. Built by engineers, for engineers.</li></ul><p><strong>For UX and customer success teams</strong></p><ul><li><strong>FullStory</strong> – Frustration signal detection, StoryAI-powered session summaries, and in-app Guides and Surveys make it accessible to non-technical teams who want to diagnose user problems and improve digital experiences.</li></ul><p><strong>For growth and experimentation teams</strong></p><ul><li><strong>PostHog</strong> – Run A/B tests, roll out features incrementally with feature flags, and measure impact on conversion and retention – all in one workflow. FullStory doesn&#x27;t offer feature flags or experiments.</li></ul><p><strong>For teams building AI products</strong></p><ul><li><strong>PostHog</strong> – Native <a href="/llm-analytics">LLM analytics</a> for tracking model performance, token costs, and user interactions. FullStory&#x27;s StoryAI helps analyze behavioral data but doesn&#x27;t offer AI observability tools.</li></ul><p><strong>For ecommerce and retail teams</strong></p><ul><li><strong>FullStory</strong> – Frustration signals, conversion funnel analysis, and the recently launched Guides and Surveys are well-suited to optimizing ecommerce experiences. FullStory&#x27;s mobile app add-on supports native app analytics.</li></ul><p><strong>For privacy-conscious and regulated organizations</strong></p><ul><li>Both are SOC 2 certified, GDPR-ready, and HIPAA-ready. <strong>PostHog</strong> adds open source code, cookieless tracking, EU hosting, and a built-in data warehouse for full data ownership. FullStory is also ISO 27001 and ISO 42001 certified.</li></ul><p><strong>For early-stage startups</strong></p><ul><li><strong>PostHog</strong> – One platform that scales from first users to product-market fit without swapping tools. The <a href="/pricing">generous free tier</a> includes 1 million events, 5,000 replays, and 1 million feature flag requests per month. <a href="/startups">Startups can also qualify for $50k in free credits</a>.</li></ul><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>How much do PostHog and FullStory cost?</summary><p><strong>PostHog</strong> uses transparent, usage-based <a href="/pricing">pricing</a>. It&#x27;s free to get started – no credit card required. Every month you get 1 million events, 5,000 web session replays, 2,500 mobile session replays, and 1 million feature flag requests for free. After that, you pay only for what you use, and pricing gets cheaper at scale. You can set billing limits per product to avoid surprises.</p><p><strong>FullStory</strong> offers a free plan (FullstoryFree) with 30,000 sessions/month and 12-month retention, but it excludes dashboards, mobile apps, StoryAI, and configurable form privacy. Paid plans (Business, Advanced, Enterprise) require contacting sales – pricing isn&#x27;t publicly available. </p></details><details><summary>Do PostHog and FullStory offer free trials?</summary><p>It doesn&#x27;t cost anything to <a href="/wizard">get started with PostHog</a>, and every month you get your first million events <em>and</em> first 5,000 sessions for free. You can set billing limits to stay within the free allowance forever.</p><p>FullStory offers a 14-day free trial of its Business plan (limited to 5,000 sessions), after which you can convert to the free FullstoryFree plan or contact sales for a paid plan.</p></details><details><summary>Does FullStory have feature flags or A/B testing?</summary><p>No. FullStory doesn&#x27;t offer native feature flags, A/B testing, or experimentation. You&#x27;d need a separate tool like <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a>, <a href="/blog/best-optimizely-alternatives">Optimizely</a>, or PostHog. PostHog includes both <a href="/feature-flags">feature flags</a> and <a href="/experiments">A/B testing</a> natively, tightly integrated with analytics and session replay.</p></details><details><summary>Does FullStory have error tracking?</summary><p>No. FullStory doesn&#x27;t offer error tracking or crash monitoring. PostHog includes native <a href="/error-tracking">error tracking</a> that connects exceptions and stack traces directly to session replays, user behavior, and feature flag changes.</p></details><details><summary>Does FullStory have surveys?</summary><p>Yes. FullStory launched <strong>Guides and Surveys</strong> in February 2026, adding in-app tours, smart tips, checklists, banners, and surveys targeted by user behavior. PostHog also includes <a href="/surveys">surveys</a> with NPS, CSAT, CES, and custom question types, with targeting based on person properties, URLs, feature flags, or events.</p></details><details><summary>What is StoryAI?</summary><p><strong>StoryAI</strong> is FullStory&#x27;s suite of AI-powered features, powered by Google Gemini. It includes session summaries, natural language queries (Ask StoryAI), proactive opportunity detection, and AI-suggested elements. Session summaries are included on Advanced and Enterprise plans; Opportunities and Ask StoryAI require StoryAI Premium.</p><p>PostHog also offers AI features including <a href="/docs/posthog-ai/session-summaries">session replay summaries</a>, an <a href="/docs/model-context-protocol">MCP server</a> for AI coding tools like Cursor and Claude Code, and <a href="/ai">PostHog AI</a> for generating insights and querying your data in natural language.</p></details><details><summary>Does session replay capture personal information?</summary><p>Both PostHog and FullStory offer privacy masking to automatically remove text field input from session replays, as well as more advanced controls to further protect user privacy. PostHog also supports cookieless tracking and is open source, so you can audit exactly what data is collected.</p></details><details><summary>Which has better session replay?</summary><p>Both are strong but serve different needs. <strong>PostHog&#x27;s</strong> replay includes console logs, network monitoring, a DOM explorer, and performance metrics – ideal for debugging. <strong>FullStory&#x27;s</strong> replay excels at frustration signal detection (rage clicks, dead clicks) and AI-powered session summaries via StoryAI. FullStory&#x27;s free tier offers more sessions (30,000/month vs 5,000/month), but PostHog&#x27;s replay is more developer-focused.</p></details><details><summary>Can I migrate from FullStory to PostHog?</summary><p>Yes – though there are some caveats. You can export historical event data from FullStory and import it into PostHog using the <a href="/docs/migrate">historical migrations guide</a>. Session replay recordings can&#x27;t be migrated since they&#x27;re stored in FullStory&#x27;s proprietary format. The simplest approach is to install PostHog&#x27;s snippet alongside FullStory, run both in parallel, and transition fully once you&#x27;re confident in the setup. </p></details><details><summary>Does PostHog offer EU hosting?</summary><p>Yes. PostHog offers EU-hosted cloud with data stored exclusively in the EU. PostHog is SOC 2 certified, GDPR-ready, and HIPAA-ready.</p></details><details><summary>How long does it take to deploy PostHog?</summary><p>Minutes. Use the <a href="/wizard">setup wizard</a> to connect your app – one terminal command and our AI wizard handles framework detection, SDK config, and more. Autocapture starts collecting events immediately. Enable session replays, feature flags, and other features from your project settings.</p></details><details><summary>What are the alternatives to PostHog and FullStory?</summary><p>Other popular tools include <a href="/blog/posthog-vs-hotjar">Hotjar</a>, <a href="/blog/posthog-vs-logrocket">LogRocket</a>, <a href="/blog/posthog-vs-heap">Heap</a>, <a href="/blog/posthog-vs-amplitude">Amplitude</a>, and <a href="/blog/posthog-vs-mixpanel">Mixpanel</a>. For a full breakdown, see our guide to the <a href="/blog/best-fullstory-alternatives">best FullStory alternatives</a> and the <a href="/blog/best-session-replay-tools">best session replay tools for developers</a>.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best in-app survey tools for product teams, compared]]></title><description><![CDATA[Most in-app survey tools look roughly the same on paper: a basic NPS widget here, a few question types there, some targeting options. But when you…]]></description><link>https://posthog.com/blog/best-inapp-survey-tools</link><guid isPermaLink="false">c0b4cdef-8488-523d-8d69-88994006016d</guid><dc:creator><![CDATA[Jina Yoon]]></dc:creator><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/v1720536764/posthog.com/contents/surveys-hog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Most in-app survey tools look roughly the same on paper: a basic NPS widget here, a few question types there, some targeting options.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/same_survey_tools_d4bf9dad02.png" alt="They&#x27;re the same picture meme"/></p><p>But when you need to get into the nitty gritty like triggering a survey after a user kicks off a certain event, or connecting their response to the <a href="/blog/best-session-replay-tools">session replay</a> so you can investigate <em>why</em> someone gave you a 3 out of 10... That&#x27;s when different tools start to diverge real fast.</p><p>In this guide, we&#x27;ll compare the best in-app survey tools for product teams including what each one does well, where they fall short, and how to pick the right fit.</p><h2 id="what-features-do-you-need-in-your-in-app-survey-tool">What features do you need in your in-app survey tool?</h2><p>A good in-app survey tool lets you ask the right users the right questions at the right moment, without making them leave your product.</p><p>Most solid tools include:</p><ul><li>Survey widgets that embed directly in your web or mobile app</li><li>Pre-built templates for NPS, CSAT, and <a href="/newsletter/what-weve-learned-about-product-market-fit">PMF surveys</a></li><li>Basic targeting by page URL or user property</li><li>Response dashboards with simple reporting</li></ul><p>Teams who want more precise feedback will go further with:</p><ul><li><strong>Event-triggered surveys</strong> so you ask right after a meaningful user action, not just on page load</li><li><strong>Mobile app support</strong> with native iOS and Android SDKs</li><li><strong>Multi-step branching logic</strong> to show different questions based on previous answers</li><li><strong>AI-powered analysis</strong> to surface themes across hundreds of open-text responses without manual tagging</li><li><strong>Integration with session replay and analytics</strong> so you can connect what users say with what they actually did</li></ul><p>Here&#x27;s a quick overview how the most popular tools in the market compare:</p><p><div competitors="posthog,hotjar,sprig,survicate,pendo,survey_monkey"></div></p><h2 id="whats-the-best-in-app-survey-tool-for-product-teams">What&#x27;s the best in-app survey tool for product teams?</h2><h3 id="1-posthog">1. PostHog</h3><br/><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1/posthog.com/src/images/products/screenshot-surveys" alt="PostHog surveys"/></p><p>PostHog (that&#x27;s us, hi 👋) is an all-in-one developer platform that includes <a href="/surveys">surveys</a> alongside <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, and much, much more.</p><p>This means you can do more than just collect feedback. When a user submits an NPS response, you can <a href="/docs/session-replay">pull up their session replay</a> to see exactly what experience preceded it, join the response to their event history, or use a feature flag to <a href="/docs/experiments/creating-an-experiment">target them with a follow-up experiment</a>. Everything lives in one place, and all the products are designed to work well together.</p><p><a href="/docs/surveys">Surveys</a> in PostHog support web and mobile apps, can be triggered by events or feature flags, and include <a href="/templates">templates for NPS, PMF, CSAT, and more</a>. This lets teams get very granular with when and how to send surveys to users, and do complex analysis with other product tools.</p><p>PostHog is also investing heavily in <a href="/ai">AI features</a>. Built-in AI summaries and the ability to get deeper survey analysis in the PostHog AI chat interface are both currently in Beta.</p><p>The free tier includes 1,500 responses per month with no credit card required.</p><p><strong>Strengths:</strong></p><ul><li>Surveys part of a unified suite, linked to session replay, analytics, feature flags, and more</li><li>Highly customizable event-triggered and feature flag-targeted surveys</li><li>Web and mobile support (iOS, Android, React Native, Flutter)</li><li>AI analysis: summarize responses and dig deeper via chat (in Beta)</li><li>1,500 free responses/month with usage-based pricing</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">PostHog is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Product and engineering teams who want to connect survey feedback directly to technical details related to user behavior, analytics, and experimentation without adding another tool to their stack.</p></div></div><hr/><h3 id="2-hotjar">2. Hotjar</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/Results_3b8597f809.png" alt="Hotjar surveys"/></p><p><a href="/blog/posthog-vs-hotjar">Hotjar</a> (now part of Contentsquare) is one of the most widely deployed tools for understanding user behavior on websites. Its surveys sit inside a broader toolkit that includes heatmaps, session recordings, and user interviews, making it easy to triangulate between what users say and what they do.</p><p>Surveys in Hotjar support NPS, CSAT, and open-ended questions, and can be triggered by exit intent, scroll depth, or specific events. AI-powered sentiment analysis is available on paid plans. You can also recruit and schedule <a href="/newsletter/talk-to-users">user interviews</a> directly through Hotjar Engage.</p><p>See our <a href="/blog/posthog-vs-hotjar">PostHog vs Hotjar</a> comparison for a deeper breakdown.</p><p><strong>Strengths:</strong></p><ul><li>Simple setup and intuitive interface</li><li>Surveys paired with heatmaps and session replay</li><li>Exit-intent and event-triggered surveys</li><li>AI-powered sentiment analysis on responses</li><li>Built-in user interview scheduling</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Hotjar is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Product, UX, and marketing teams focused who want qualitative feedback paired with visual behavior insights.</p></div></div><hr/><h3 id="3-sprig">3. Sprig</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/sprig_41751b0501.svg" alt="Sprig surveys"/></p><p>Sprig is a purpose-built user research platform that links in-product surveys and session replays together into what it calls &quot;studies.&quot; The core idea is that you should see not just what users said, but what they were doing when they said it.</p><p>In Sprig, you trigger a study in response to a user action, users answer your survey, and the session recording captures the context. AI then analyzes responses across participants to surface common themes automatically so you don&#x27;t have to manually tag hundreds of open-text answers.</p><p>Sprig supports web and most mobile platforms (iOS, Android, but not Flutter). Their free tier plan is limited to 25 survey responses per month, and pricing is usage-based without public information on rates.</p><p><strong>Strengths:</strong></p><ul><li>Surveys and session replays linked in a single workflow</li><li>AI analysis that surfaces themes across responses automatically</li><li>Web and mobile support (iOS, Android – no Flutter)</li><li>Designed for <a href="/newsletter/how-to-uncover-your-users-real-problems">continuous product discovery</a></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Sprig is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>UX researchers and product teams running continuous discovery who need survey responses and session context side-by-side, with AI to handle analysis at scale.</p></div></div><hr/><h3 id="4-survicate">4. Survicate</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/survicate_4f0135ee19.webp" alt="Survicate surveys"/></p><p>Survicate is a dedicated customer feedback platform built for multi-channel survey distribution. It specializes in reaching users everywhere: inside your web app, inside mobile apps via native SDKs, in email, and via shareable links. See our <a href="/blog/best-survicate-alternatives">best Survicate alternatives</a> if you&#x27;re already evaluating other options.</p><p>The survey builder supports 13+ question types with branching logic and no code required. An AI-powered Insights Hub groups open-text responses by topic and sentiment, cutting down on manual analysis. Native integrations with HubSpot, Intercom, Salesforce, Zapier, and Slack make it easy to push responses into existing workflows.</p><p>The free tier allows 25 responses per month, with paid plans starting at $56/month (billed annually).</p><p><strong>Strengths:</strong></p><ul><li>Multi-channel surveys (web, mobile, email, shareable links)</li><li>Native iOS and Android SDKs</li><li>30+ integrations including HubSpot, Intercom, and Salesforce</li><li>AI-powered Insights Hub for grouping open-text responses</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Survicate is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Customer success and product teams who need to collect feedback across multiple channels and route responses directly into their CRM or support tools.</p></div></div><hr/><h3 id="5-pendo">5. Pendo</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/pendo_8ebcb39c28.webp" alt="Pendo surveys"/></p><p><a href="/blog/posthog-vs-pendo">Pendo</a> is a product experience platform that combines in-app surveys with analytics, session replay, in-app guides, and product roadmaps. It&#x27;s primarily aimed at product managers and customer success teams at mid-to-large companies.</p><p>Surveys in <a href="/blog/best-pendo-alternatives">Pendo</a> are targeted by user segment or behavior, support web and mobile, and connect to its broader analytics model. The free plan includes Pendo-branded NPS surveys for up to 500 monthly active users, but full survey functionality requires a paid plan.</p><p>Pendo&#x27;s pricing is very opaque and quite hefty, which puts it out of reach for most smaller teams and startups. See our <a href="/blog/posthog-vs-pendo">PostHog vs Pendo</a> comparison for more detail.</p><p><strong>Strengths:</strong></p><ul><li>Surveys bundled with in-app guides, analytics, and session replay</li><li>Web and mobile support</li><li>Powerful user segmentation for survey targeting</li><li>Deep integrations with Salesforce, HubSpot, and data warehouses</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Pendo is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Mid-to-large product teams that need surveys as part of a broader adoption and analytics platform, and have the budget for an enterprise tool.</p></div></div><hr/><h3 id="6-surveymonkey">6. SurveyMonkey</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/surveymonkey_fea64837f1.png" alt="SurveyMonkey surveys"/></p><p>SurveyMonkey is one of the world&#x27;s most popular survey platforms. It covers a wide range of survey types – NPS, CSAT, market research, employee feedback – and supports deployment via web embed, mobile SDK, email, and shareable links.</p><p>It&#x27;s the most feature-rich pure survey tool on this list. You get 15+ question types, advanced branching logic, quota controls, and optional access to a respondent panel if you need external data. Reporting and benchmarking features are strong, especially for market research use cases.</p><p>The trade-off is depth of product integration. SurveyMonkey doesn&#x27;t connect to session replay or analytics, so linking feedback to user behavior requires manual data exports and joins.</p><p><strong>Strengths:</strong></p><ul><li>Comprehensive survey builder with 15+ question types</li><li>Multi-channel distribution (web, mobile, email, links)</li><li>Optional respondent panel for external market research</li><li>Strong reporting and industry benchmarking</li><li>100+ integrations</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">SurveyMonkey is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Teams that need a standalone, full-featured survey platform, especially for market research use cases that require external respondent panels.</p></div></div><hr/><h2 id="which-in-app-survey-tool-should-you-choose">Which in-app survey tool should you choose?</h2><ul><li>Want surveys integrated with other analytics tools that are easy to trigger from custom events? <strong><a href="/surveys">PostHog</a></strong></li><li>Need surveys alongside heatmaps and session replay with AI summaries? <strong>Hotjar</strong></li><li>Want in-depth research with AI, surveys, and session replays linked together? <strong>Sprig</strong></li><li>Need multi-channel surveys with direct CRM integrations? <strong>Survicate</strong></li><li>Want surveys bundled with in-app guides and product analytics? <strong>Pendo</strong></li><li>Need a standalone platform with advanced question logic or respondent panels? <strong>SurveyMonkey</strong></li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><h4 id="for-high-growth-startups">For high-growth startups</h4><ul><li><strong>PostHog</strong> for a generous free tier, transparent <a href="/pricing">pricing</a>, and an all-in-one platform that <a href="/products">replaces multiple tools</a></li><li><strong>Survicate</strong> if you specifically need multi-channel feedback distribution early on</li></ul><h4 id="for-enterprise-and-large-product-teams">For enterprise and large product teams</h4><ul><li><strong>Pendo</strong> for surveys bundled with in-app guides, analytics, and roadmap tools</li><li><strong>SurveyMonkey</strong> for complex research use cases with external panels and advanced reporting</li></ul><h4 id="for-product-and-engineering-teams">For product and engineering teams</h4><ul><li><strong>PostHog</strong> to connect survey responses to session replays, feature flags, and analytics in one workflow</li><li><strong>Sprig</strong> if continuous product discovery with AI analysis is the primary use case</li></ul><h4 id="for-ux-and-customer-success-teams">For UX and customer success teams</h4><ul><li><strong>Hotjar</strong> for quick qualitative feedback alongside heatmaps and session recordings on web</li><li><strong>Survicate</strong> for multi-channel feedback with tight CRM integrations</li></ul><h2 id="faq">FAQ</h2><details><summary>What&#x27;s the difference between in-app surveys and standalone survey tools?</summary><p>In-app surveys are embedded in your product and triggered by user behavior – you catch users in the moment, which leads to higher response rates and more relevant feedback. Standalone tools like SurveyMonkey are primarily distributed via shared links or email, which adds friction and loses the in-product context.</p></details><details><summary>How do I trigger surveys at the right time?</summary><p>The best time to trigger a survey is right after a meaningful user action – <a href="/blog/how-to-find-and-fix-app-onboarding-drop-off">completing onboarding</a>, using a key feature, hitting an error, or reaching a milestone. Tools like <strong>PostHog</strong>, <strong>Sprig</strong>, and <strong>Hotjar</strong> all support event-triggered surveys so you can configure this without hardcoding survey logic into your app.</p></details><details><summary>Which in-app survey tools support mobile apps?</summary><p><strong>PostHog</strong>, <strong>Survicate</strong>, <strong>Pendo</strong>, <strong>Hotjar</strong>, and <strong>SurveyMonkey</strong> all offer native mobile SDKs. <strong>Sprig</strong> supports iOS and Android but not Flutter.</p></details><details><summary>Can I link survey responses to user behavior and analytics?</summary><p>Yes, if you use the right tool. <strong>PostHog</strong> links every survey response to the user&#x27;s event history, session replay, and feature flag state automatically. <strong>Sprig</strong> ties surveys directly to session recordings. <strong>Pendo</strong> connects survey data to its broader analytics model. Standalone tools like <strong>Survicate</strong> and <strong>SurveyMonkey</strong> don&#x27;t have built-in analytics, so you&#x27;d need to export and join data yourself.</p></details><details><summary>Which in-app survey tools have a free plan?</summary><ul><li><strong>PostHog</strong>: 1,500 responses/month free</li><li><strong>Hotjar</strong>: 20 responses/month free (Ask Basic plan)</li><li><strong>Sprig</strong>: 25 responses/month free</li><li><strong>Survicate</strong>: 25 responses/month free</li><li><strong>Pendo</strong>: NPS surveys only, up to 500 MAU</li></ul><p><strong>SurveyMonkey</strong> doesn&#x27;t offer a meaningful free tier for in-app survey use.</p></details><details><summary>What question types do in-app survey tools support?</summary><p>Most tools support NPS, CSAT, multiple choice, and open text. More capable tools also include rating scales, emoji reactions, multi-select, and interview scheduling. <strong>PostHog</strong> and <strong>Survicate</strong> both support a broad range of question types with branching logic and no code required.</p></details><details><summary>How is PostHog different from dedicated survey tools?</summary><p><strong>PostHog</strong> is more than a survey tool. It combines surveys with the full context needed to understand and act on feedback:</p><ul><li><strong>All-in-one toolkit:</strong> <a href="/product-analytics">Product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, and <a href="/error-tracking">error tracking</a></li><li><strong>Developer-first:</strong> Transparent APIs, <a href="/docs/product-analytics/sql">SQL query builder</a>, open source, and a <a href="/roadmap">public roadmap</a></li><li><strong>Transparent pricing:</strong> Generous free tiers and <a href="/pricing">usage-based billing</a></li><li><strong>Trusted by teams:</strong> Used by <a href="/customers">Supabase, Lovable, ElevenLabs, ResearchGate</a>, and more</li></ul></details><br/><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The 7 best mobile app analytics tools]]></title><description><![CDATA[Mobile app analytics tools help you understand how users interact with your app, but the right tool depends on what you're trying to do. Debugging…]]></description><link>https://posthog.com/blog/best-mobile-app-analytics-tools</link><guid isPermaLink="false">52fc988d-ab1c-54e5-a2e3-dcb33b6f6866</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/open-source-testing-tools/testinghog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Mobile app analytics tools help you understand how users interact with your app, but the right tool depends on what you&#x27;re trying to do. Debugging user issues? You&#x27;ll want session replays. Optimizing conversion funnels? You need retention charts and path analysis. Measuring ad spend? Attribution and ROI tracking are essential.</p><p>Some tools try to do it all. Others specialize. Choosing the wrong one means either paying for features you don&#x27;t need, or stitching together integrations that create a messy workflow.</p><p>In this guide, we compare the 7 best mobile app analytics tools – from all-in-one platforms to specialized solutions – so you can find the right fit for your team.</p><h2 id="what-features-do-you-need-in-a-mobile-app-analytics-tool">What features do you need in a mobile app analytics tool?</h2><p>A good mobile app analytics tool gives you visibility into how users actually experience your app – what they tap, where they drop off, and what keeps them coming back.</p><p>Most solid tools include:</p><ul><li>Event tracking for key user actions (sign-ups, purchases, feature usage)</li><li>Funnels and conversion analysis to identify drop-off points</li><li>Retention charts to measure how well you keep users over time</li><li>User segmentation and cohorts for targeted analysis</li><li>Mobile SDKs for iOS, Android, React Native, and Flutter</li></ul><p>More advanced tools go further with:</p><ul><li><strong>Session replay</strong> so you can watch exactly how users navigate your app and where they get stuck</li><li><strong>Heatmaps and touch tracking</strong> to see which UI elements get the most attention</li><li><strong>A/B testing and feature flags</strong> to experiment safely and roll out changes incrementally</li><li><strong>Crash and error monitoring</strong> to connect technical issues to user impact</li><li><strong>Marketing attribution</strong> to measure which campaigns and channels drive installs and revenue</li></ul><p>Here&#x27;s how some of the most popular mobile app analytics tools compare:</p><h2 id="1-posthog">1. PostHog</h2><p><strong>Best for:</strong> Engineering and product teams</p><div class="mb-4 border border-primary rounded bg-accent max-w-fit leading-[0] p-4"><span><span data-rmiz-wrap="visible"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/docs/product-analytics/funnel-light.png" alt="Funnels insight" class="dark:hidden rounded"/><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/docs/product-analytics/funnel-dark.png" alt="Funnels insight" class="hidden dark:block rounded"/><button aria-label="Zoom image" data-rmiz-btn-open="true"></button></span></span></div><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="/">PostHog</a> (that&#x27;s us 👋) is an all-in-one platform built to help engineers create better products. It includes product analytics and a whole bunch more, such as <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/surveys">surveys</a>, and <a href="/session-replay">session replays</a>.</p><p>It&#x27;s designed for product-minded engineers, growth teams, and product managers who need to move fast and iterate based on reliable, actionable insights.</p><h4 id="key-features">Key features</h4><ul><li><p><strong>Product analytics:</strong> Custom trends, funnels, user paths, retention analysis, and segment user cohorts. Also, direct <a href="/docs/product-analytics/sql">SQL querying</a> for power users.</p></li><li><p><strong>Session replays:</strong> View exactly how users are using your app. Includes event timelines, console logs, network activity, and 90-day data retention.</p></li><li><p><strong>A/B tests:</strong> Experiment in your app with up to nine test variations and track impact on primary and secondary metrics. Auto-calculate test duration, sample size, and statistical significance.</p></li><li><p><strong>Feature flags:</strong> Rollout features safely with <a href="/docs/feature-flags/local-evaluation">local evaluation</a> (for faster performance), JSON payloads, and instant rollbacks.</p></li><li><p><strong>Data warehouse:</strong> Combine data from all your different sources for easy analysis and comprehensive insights.</p></li></ul><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog has <a href="/pricing">transparent pricing</a> based on usage. It&#x27;s free to get started and completely free for the first 1 million analytics events. After this free monthly allowance, pricing starts at $0.00005/event (or $5 for 100k events), and events cost progressively less the more you use. You can also set billing limits to ensure you don&#x27;t get surprise bills.</p><p>Startups less than 2 years old and with under $5 million in funding can apply for <a href="/startups">PostHog for Startups</a>, which includes $50,000 in additional free credits.</p><h3 id="why-do-companies-use-posthog">Why do companies use PostHog?</h3><p>According to <a href="https://www.g2.com/products/posthog/reviews">G2 reviews</a>, companies use PostHog because:</p><ol><li><p><strong>It&#x27;s many tools in one:</strong> PostHog can replace tools like <a href="/blog/posthog-vs-mixpanel">Mixpanel</a> (analytics), <a href="/blog/best-uxcam-alternatives">UXCam</a> (session replay), and <a href="/blog/posthog-vs-statsig">Statsig</a> (A/B testing and feature flags). This simplifies workflows and ensures all product data is in one place.</p></li><li><p><strong>They need a complete picture of users:</strong> PostHog includes every tool necessary to understand users and build better products. This means creating funnels to track conversion, watching replays to see where users get stuck, and testing solutions with A/B tests.</p></li><li><p><strong>Pricing is transparent and scalable:</strong> Reviewers appreciate how PostHog&#x27;s pricing scales as they grow. There&#x27;s a <a href="/pricing">generous free tier</a>. Companies eligible for <a href="/startups">PostHog for Startups</a> also get $50k in additional free credits.</p></li></ol><blockquote><h4 id="bottom-line">Bottom line</h4><p>For teams looking for all the tools they need to improve their products, PostHog makes for a great choice. This is especially true for startups and scaleups thanks to it having a generous free tier.</p></blockquote><p><div></div></p><h2 id="2-mixpanel">2. Mixpanel</h2><p><strong>Best for:</strong> Product managers, desginers and marketing teams</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/heap-alternatives/mixpanel.png" alt="mixpanel"/></p><h3 id="what-is-mixpanel">What is Mixpanel?</h3><p><a href="/blog/posthog-vs-mixpanel">Mixpanel</a> is one of the most popular product analytics tools on the market. Founded in 2009, it&#x27;s expanded beyond pure analytics to include session replay (web and mobile) and warehouse connectors.</p><h4 id="key-features-1">Key features</h4><ul><li><p><strong>Product analytics:</strong> Track user behavior, KPIs, and core metrics with trends, retention, and flows.</p></li><li><p><strong>Collaborative boards:</strong> Build analysis in collaborative boards that can include reports, text, videos, and GIFs. Embed these boards in other tools.</p></li><li><p><strong>Alerts:</strong> Get automated notifications when there are anomalies in metrics or if they fall outside a positive or negative range.</p></li><li><p><strong>Filtered data views:</strong> Hide and filter data on a per-team basis to reduce noise and separate data for privacy reasons.</p></li><li><p><strong>Session replay:</strong> Watch real user sessions on web, iOS, and Android. Includes server-side stitching to view replays for backend and warehouse events.</p></li></ul><h3 id="how-much-does-mixpanel-cost">How much does Mixpanel cost?</h3><p>Pricing starts at $28/month for up to 10k events and scales with events. 2 million events cost $258/month.</p><h3 id="why-do-companies-use-mixpanel">Why do companies use Mixpanel?</h3><p>Looking at <a href="https://www.g2.com/products/mixpanel/reviews">G2 reviews</a>, companies choose Mixpanel to:</p><ol><li><p><strong>Eliminate the need for data analysts:</strong> Mixpanel helps reviewers structure large volumes of data, and make data-driven decisions, reducing their reliance on dedicated data analysts to produce insights.</p></li><li><p><strong>Track and target campaigns:</strong> Marketers appreciate the ability to create user segments and target specific users, enabling more personalized campaigns and improved user engagement.</p></li><li><p><strong>Understand user behavior:</strong> In common with most analytics tools, Mixpanel&#x27;s users mostly want to understand user behavior, identify bottlenecks, and monitor core metrics like conversion rates, activation, and retention.</p></li></ol><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>Mixpanel is great for teams who want powerful yet easy to use analytics and don&#x27;t need any of the extra features that other alternatives on this list provide such as feature flags or A/B testing.</p></blockquote><h2 id="3-uxcam">3. UXCam</h2><p><strong>Best for:</strong> Product managers in enterprise companies</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1720771924/posthog.com/contents/Funnel_analytics.png" alt="UXCam"/></p><h3 id="what-is-uxcam">What is UXCam?</h3><p><a href="/blog/best-uxcam-alternatives">UXCam</a> is a platform built solely for mobile apps. It includes a full-suite of analytics features as well as session replays and heatmaps.</p><p>It&#x27;s designed to provide deep insights into user behavior, helping product managers understand how users interact with their apps.</p><h4 id="key-features-2">Key features</h4><ul><li><p><strong>Product analytics:</strong> Custom trends, funnels, user paths, retention analysis, and segment user cohorts.</p></li><li><p><strong>Session replays:</strong> View exactly how users are using your app. Includes event timelines, console logs, network activity, and 90-day data retention.</p></li><li><p><strong>Heatmaps:</strong> See where users tap, where they scroll to, and the areas that get the most attention.</p></li></ul><h3 id="how-much-does-uxcam-cost">How much does UXCam cost?</h3><p>UXCam has a free plan with 3,000 monthly sessions and 30-day replay retention. Paid plans (Starter, Growth, Enterprise) are session-based with custom pricing – the company&#x27;s sales team will give you a quote after you&#x27;ve spoken to them. They also offer a 14-day free trial with access to all Growth features, 100,000 sessions, and 1 million custom events.</p><h3 id="why-do-companies-use-uxcam">Why do companies use UXCam?</h3><p>Looking at <a href="https://www.g2.com/products/uxcam/reviews">G2 reviews</a>, companies choose UXCam because:</p><ol><li><p><strong>They need insights on user behavior:</strong> Insights show what users are doing, where their attention is going, and how they are spending their time. Users love the realizations they get with UXCam&#x27;s tools.</p></li><li><p><strong>It&#x27;s easy to use:</strong> Reviewers note how easy UXCam is to set up and use. This means they can go from idea to actionable learnings quickly.</p></li><li><p><strong>Heatmaps and scrollmaps:</strong> Seeing clicks and scroll depth works well and creates actionable insights for design and product teams. Helps improve UX and page designs.</p></li></ol><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>UXCam is ideal for product managers who need in-depth insights into user behavior. Despite opaque pricing, its ease of use and actionable insights make it a valuable tool.</p></blockquote><h2 id="4-amplitude">4. Amplitude</h2><p><strong>Best for:</strong> Product managers, data analysts, marketing teams</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-fullstory-alternatives/amplitude.png" alt="Amplitude"/></p><h3 id="what-is-amplitude">What is Amplitude?</h3><p><a href="/blog/posthog-vs-amplitude">Amplitude</a> was one of the original product analytics tools. Many large enterprise customers, like Ford, NBCUniversal, and Walmart rely on it. In recent years, it’s also added A/B testing and feature flags.</p><h4 id="key-features-3">Key features</h4><ul><li><p><strong>Product analytics:</strong> Funnel and retention analysis, user paths, behavioral cohorts, custom dashboards, and more.</p></li><li><p><strong>A/B testing:</strong> Test new features on specific targets and analyze with primary, secondary, and counter metrics.</p></li><li><p><strong>Customer data platform:</strong> Combine analytics data with third-party tools for data governance, identity resolution, and data federation.</p></li><li><p><strong>AI insight builder:</strong> Generate insights based on natural language requests, like &quot;What is my purchase conversion rate?&quot;</p></li></ul><h3 id="how-much-does-amplitude-cost">How much does Amplitude cost?</h3><p>Amplitude has a free Starter plan with 10,000 monthly tracked users (MTUs), 1,000 session replays, and core analytics features. The Plus plan starts at $49/month on an annual plan. Growth and Enterprise plans have custom pricing based on MTUs and event volume.</p><h3 id="why-do-companies-use-amplitude">Why do companies use Amplitude?</h3><p>According to <a href="https://www.g2.com/products/amplitude-analytics/reviews">G2 reviews</a>, people like Amplitude because:</p><ol><li><p><strong>It&#x27;s simple to use:</strong> Amplitude makes it easy for non-technical users to get insights about their product and make improvements. Amplitude is built for users like product managers and marketers, making it a popular choice for them.</p></li><li><p><strong>It offers built-in A/B testing:</strong> Amplitude offers integrated experimentation features. This enables companies to run experiments on existing cohorts, and then analyze the data in a single place.</p></li><li><p><strong>It helps them become data-driven:</strong> Amplitude users appreciate it helps them become data-driven. It becomes easy to add data, visualize it, and make decisions, and they can use it as a source of truth thanks to its built-in customer data platform.</p></li></ol><blockquote><h4 id="bottom-line-3">Bottom line</h4><p>Amplitude is a good choice for product and marketing teams who want powerful analytics with session replay and experimentation. Note that heatmaps are web-only and require a Growth or Enterprise plan.</p></blockquote><h2 id="5-firebase-google-analytics">5. Firebase (Google Analytics)</h2><p><strong>Best for:</strong> Apps already using Firebase&#x27;s other features</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/firebase.png" alt="Firebase"/></p><h3 id="what-is-firebase">What is Firebase?</h3><p>Firebase is Google&#x27;s mobile app development platform. It includes analytics, realtime databases, push notifications, in-app messaging, and more. Its analytics feature is powered by <a href="/blog/posthog-vs-ga4">Google Analytics</a>.</p><h4 id="key-features-4">Key features</h4><ul><li><p><strong>Comprehensive analytics:</strong> Gain in-depth insights into user behavior and app performance.</p></li><li><p><strong>Real-time data:</strong> Access real-time data on user interactions, app crashes, and performance metrics.</p></li><li><p><strong>Push notifications:</strong> Engage users with targeted push notifications based on their behavior and preferences.</p></li><li><p><strong>In-app messaging:</strong> Send personalized messages to users within your app to guide them through key actions.</p></li></ul><h3 id="how-much-does-firebase-cost">How much does Firebase cost?</h3><p>Firebase follows a two-tier model: the Spark plan (free) includes generous quotas for most services, while the Blaze plan (pay-as-you-go) charges only for usage beyond free limits. Crashlytics, Remote Config, A/B Testing, and Cloud Messaging are all free with unlimited usage.</p><h3 id="why-do-companies-choose-firebase">Why do companies choose Firebase</h3><p>According to <a href="https://www.g2.com/products/firebase/reviews">G2 reviews</a>, companies choose Firebase because:</p><ol><li><p><strong>It&#x27;s a comprehensive toolkit:</strong> Firebase offers a broad range of tools beyond analytics, such as push notifications, in-app messaging, and Crashlytics, making it an all-in-one tool for app development and management.</p></li><li><p><strong>It&#x27;s easy to use:</strong> Reviewers appreciate how easy Firebase is to use, making app management simple.</p></li><li><p><strong>It integrates with other Google services:</strong> Firebase integrates smoothly with other Google services, providing a powerful development and analytics ecosystem.</p></li></ol><blockquote><h4 id="bottom-line-4">Bottom line</h4><p>Firebase analytics is a great choice for companies already leveraging it&#x27;s other features or any of Google&#x27;s other products.</p></blockquote><h2 id="6-appsflyer">6. Appsflyer</h2><p><strong>Best for:</strong> Marketing teams</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1720788891/posthog.com/contents/apps-flyer.png" alt="Appsflyer"/></p><h3 id="what-is-appsflyer">What is Appsflyer?</h3><p>Appsflyer is a platform that focuses on marketing attribution rather than product analytics. It helps marketing teams understand which campaigns, channels, and ad creatives drive app installs and conversions, with built-in support for iOS privacy frameworks.</p><h4 id="key-features-5">Key features</h4><ul><li><p><strong>Attribution:</strong> Appsflyer provides detailed attribution data, allowing marketers to see which campaigns, channels, and touchpoints are driving installs and conversions.</p></li><li><p><strong>Marketing analytics:</strong> Turn insights on campaign performance into actionable strategies to improve your marketing.</p></li><li><p><strong>ROI measurement:</strong> Understand your true mobile marketing ROI, enabling you to optimize your spend effectively.</p></li><li><p><strong>Fraud protection:</strong> Advanced mobile app fraud detection and prevention tools help protect your ad spend.</p></li></ul><h3 id="how-much-does-appsflyer-cost">How much does Appsflyer cost?</h3><p>AppsFlyer has three pricing tiers based on attributed conversions (non-organic installs and re-engagements):</p><ul><li><strong>Zero plan:</strong> Free forever with 12,000 lifetime conversions. Includes basic attribution, core analytics, and SKAdNetwork support.</li><li><strong>Growth plan:</strong> $0.07 per conversion after the first 12,000 free conversions in year one. Includes attribution for all major ad networks.</li><li><strong>Enterprise plan:</strong> Custom pricing. Includes premium features like Protect360, raw data access, and dedicated support.</li></ul><h3 id="why-do-companies-use-appsflyer">Why do companies use Appsflyer?</h3><p>According to <a href="https://www.g2.com/products/appsflyer/reviews">G2 reviews</a>, companies use Appsflyer because:</p><ol><li><p><strong>They need comprehensive attribution insights:</strong> Appsflyer enables marketers to understand which campaigns and channels are driving the best results.</p></li><li><p><strong>It&#x27;s easy to use:</strong> Reviewers note how easy Appsflyer is to use. This means they can go from idea to actionable learnings quickly.</p></li><li><p><strong>It has a wide range of integrations</strong>: Appsflyer can connect to many different marketing tools, making it easier to manage and analyze data from multiple sources.</p></li></ol><blockquote><h4 id="bottom-line-5">Bottom line</h4><p>Appsflyer is the top choice for marketing teams looking to optimize their ad spend and gain deep insights into their campaigns.</p></blockquote><h2 id="7-countly">7. Countly</h2><p><strong>Best for:</strong> Teams in strict regulatory environments</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1720790258/posthog.com/contents/Countly-31.png" alt="Countly"/></p><h3 id="what-is-countly">What is Countly?</h3><p>Countly is privacy-focused product analytics platform. It emphasizes 100% data ownership and privacy compliance, supporting regulations like GDPR, HIPAA, and CCPA. Users have full control over their data, which can be self-hosted or managed in a private cloud.</p><h4 id="key-features-6">Key features</h4><ul><li><p><strong>Product analytics:</strong> Track user behavior, application performance, and key metrics with customizable dashboards.</p></li><li><p><strong>Privacy compliance:</strong> Ensure compliance with GDPR, HIPAA, CCPA, and other privacy regulations.</p></li><li><p><strong>Push notifications:</strong> Engage users with personalized push notifications based on their behavior and preferences.</p></li><li><p><strong>Crash analytics:</strong> Monitor and resolve app crashes with detailed reports and real-time alerts.</p></li></ul><h3 id="how-much-does-countly-cost">How much does Countly cost?</h3><p>Countly offers three deployment options:</p><ul><li><strong>Lite (self-hosted):</strong> Free forever, open-source. Includes core analytics but limited features (no funnels, retention, cohorts, or heatmaps).</li><li><strong>Flex (private cloud):</strong> Free for up to 500 MAU. Paid tiers start at $40/month for 1,000 MAU; features like retention, funnels, and A/B testing are add-ons.</li><li><strong>Enterprise:</strong> Custom pricing based on data points. Includes all features, SSO, white-labeling, SLA support, and professional services.</li></ul><h3 id="why-do-companies-use-countly">Why do companies use Countly?</h3><p>Based on <a href="https://www.g2.com/products/countly/reviews">G2 reviews</a>, companies choose Countly because:</p><ol><li><p><strong>It&#x27;s focused on privacy and compliance:</strong> Countly ensures that companies can adhere to strict regulatory requirements.</p></li><li><p><strong>It&#x27;s many tools in one:</strong> From push notifications to A/B testing to crash analytics, Countly provides many features for building great apps.</p></li><li><p><strong>You have full data ownership:</strong> With options for self-hosting and private cloud, Countly enables companies to manage their data securely.</p></li></ol><blockquote><p>Countly is a great choice if you&#x27;re building a strict regulatory environment. Many users complain about its bad user interface though.</p></blockquote><h2 id="which-mobile-app-analytics-tool-should-you-choose">Which mobile app analytics tool should you choose?</h2><ul><li>Want an all-in-one platform that integrates mobile analytics with session replays, feature flags, A/B tests, and error tracking – without stitching together multiple tools? Go with <strong>PostHog</strong>.</li><li>Already using Firebase for backend services and need free, unlimited analytics? Stick with <strong>Firebase</strong>.</li><li>Product or growth team that wants powerful analytics without needing a data team to set it up? Choose <strong>Mixpanel</strong>.</li><li>Mobile-first team that needs gesture tracking, crash context, and rage tap detection? <strong>UXCam</strong> is built for you.</li><li>Enterprise team that needs polished dashboards, CDP capabilities, and Google/ad network integrations? Consider <strong>Amplitude</strong>.</li><li>Marketing team focused on attribution, ad spend optimization, and campaign ROI? <strong>AppsFlyer</strong> is the industry standard.</li><li>Require self-hosting, private cloud, or strict regulatory compliance (HIPAA, GDPR)? <strong>Countly</strong> gives you full data ownership.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think you&#x27;ll love PostHog if:</p><ul><li>You value transparency (we&#x27;re open source and open core)</li><li>You want tools to ship, track, and analyze new features – like A/B testing, feature flags, and session replays</li><li>You want try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>)</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="faq">FAQ</h2><details><summary>What is mobile app analytics?</summary><p><strong>Mobile app analytics</strong> is the process of collecting, measuring, and analyzing user behavior data from iOS and Android applications. It helps product teams understand how users interact with their app — from which features get the most engagement to where users drop off in key flows. </p><p>Most mobile analytics platforms track events (like button taps, screen views, and purchases), user properties (like device type, OS version, and location), and session data (like session length and frequency). Advanced platforms also include <a href="/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, and crash analytics to give teams a complete picture of the mobile experience.</p></details><details><summary>What&#x27;s the difference between mobile analytics and web analytics?</summary><p>While both track user behavior, <strong>mobile analytics</strong> deals with unique challenges that web analytics doesn&#x27;t face. Mobile apps run on diverse devices with different screen sizes, OS versions, and hardware capabilities. They also work offline, have app store distribution, and use different tracking mechanisms (SDKs vs. JavaScript snippets).</p><p>Mobile analytics platforms typically track app-specific metrics like crash-free sessions, app installs, push notification engagement, and gesture interactions (swipes, pinches, rage taps) that don&#x27;t exist on the web. Some platforms like <strong>PostHog</strong> and <strong>Mixpanel</strong> support both web and mobile, while others like <strong>UXCam</strong> focus exclusively on mobile.</p></details><details><summary>What&#x27;s the difference between product analytics and marketing analytics for mobile apps?</summary><p>Product analytics focuses on what users do <em>inside</em> your app — which features they use, where they get stuck, how often they return, and what drives retention. Tools like <strong>PostHog</strong>, <strong>Mixpanel</strong>, and <strong>Amplitude</strong> excel here. </p><p>Marketing analytics (also called attribution or mobile measurement) focuses on how users <em>found</em> your app — which ad campaigns drove installs, what the cost per acquisition was, and which channels have the best ROI. <strong>AppsFlyer</strong> is the leading tool for this. </p><p>Most teams need both: marketing analytics to optimize acquisition spend, and product analytics to understand and improve the in-app experience.</p></details><details><summary>Do I need a mobile measurement partner (MMP) like AppsFlyer?</summary><p>You need an MMP if you&#x27;re running paid user acquisition campaigns and want to know which ads, networks, and creatives are driving installs and conversions. MMPs like <strong>AppsFlyer</strong> handle the complex work of attributing installs to specific campaigns across dozens of ad networks (Meta, Google, TikTok, etc.) while navigating iOS privacy restrictions like SKAdNetwork. </p><p>If you&#x27;re not running paid campaigns or are relying primarily on organic growth, you can skip the MMP and focus on product analytics instead. Many teams use both — an MMP for acquisition data and a product analytics tool like <strong>PostHog</strong> for in-app behavior.</p></details><details><summary>How do I choose between self-hosted and cloud-hosted analytics?</summary><p>Cloud-hosted analytics (like <strong>Mixpanel</strong>, <strong>Amplitude</strong>, or <strong>PostHog</strong> Cloud) is easier to set up and maintain — you just integrate the SDK and start tracking. Self-hosted analytics gives you complete control over your data, which matters for companies in regulated industries (healthcare, finance, government) or those with strict data residency requirements. </p><p><strong>Countly</strong> specializes in self-hosted deployments. The trade-off is that self-hosting requires infrastructure management and ongoing maintenance. For more options, see our guide to the <a href="/blog/best-gdpr-compliant-analytics-tools">best GDPR-compliant analytics tools</a>.</p></details><details><summary>What mobile analytics features should I prioritize?</summary><p>It depends on your team&#x27;s biggest questions:</p><ul><li><strong>Understanding user flows and drop-offs:</strong> Prioritize <a href="/docs/product-analytics/funnels">funnels</a>, <a href="/docs/product-analytics/retention">retention analysis</a>, and user paths</li><li><strong>Debugging UX issues:</strong> Look for <a href="/blog/best-mobile-app-session-replay-tools">session replay for mobile apps</a> with gesture tracking</li><li><strong>Optimizing features:</strong> Look for <a href="/blog/best-mobile-app-ab-testing-tools">A/B testing</a> capabilities</li><li><strong>App stability concerns:</strong> Crash analytics with stack traces is essential</li></ul><p>For most teams, starting with core product analytics (events, funnels, retention) and adding session replay provides the best foundation before expanding to more advanced features.</p></details><details><summary>How do iOS privacy changes (ATT, SKAdNetwork) affect mobile analytics?</summary><p>Apple&#x27;s App Tracking Transparency (ATT) framework requires apps to ask permission before tracking users across other apps and websites. Most users opt out, which significantly impacts marketing attribution — you can no longer reliably track which ad drove an install for users who decline. </p><p>SKAdNetwork is Apple&#x27;s privacy-preserving alternative that provides aggregate attribution data with limited granularity and delayed reporting. Product analytics (tracking behavior within your own app) is less affected since it relies on first-party data. However, cross-app user identification and some cohort analysis capabilities are limited. Tools like <strong>AppsFlyer</strong> and <strong>Mixpanel</strong> have built SKAdNetwork support to help marketers adapt to these restrictions.</p></details><details><summary>Can I use multiple analytics tools together?</summary><p>Yes, and many teams do. A common setup is using an MMP like <strong>AppsFlyer</strong> for attribution alongside a product analytics tool like <strong>PostHog</strong> or <strong>Mixpanel</strong> for in-app behavior. Some teams add a dedicated crash reporting tool like <strong>Firebase Crashlytics</strong> or <a href="/blog/posthog-vs-sentry">Sentry</a> on top of their analytics stack. </p><p>The main considerations are SDK bloat (each SDK adds to your app size and can impact performance), data consistency (making sure user IDs match across tools), and cost (paying for multiple platforms). All-in-one platforms like <strong>PostHog</strong> reduce this complexity by combining <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/ab-testing">A/B testing</a>, and <a href="/error-tracking">error tracking</a> in a single SDK.</p></details><details><summary>What&#x27;s the best free mobile analytics tool?</summary><p><strong>Firebase</strong> offers the most generous free tier — its analytics is completely free with no event limits. <strong>PostHog</strong>&#x27;s free tier includes 1 million events and 2,500 mobile session recordings per month. <strong>Mixpanel</strong> offers 1 million events per month free, including 10,000 session replays. <strong>Countly</strong> Lite is free and open-source if you self-host, though it lacks advanced features like funnels and retention. For pure marketing attribution, <strong>AppsFlyer</strong>&#x27;s Zero plan includes 12,000 lifetime conversions free.</p><p>The best choice depends on which features matter most to your team.</p></details><details><summary>Which mobile app analytics tool has the best session replay?</summary><p><strong>PostHog</strong> and <strong>UXCam</strong> both offer strong mobile session replay. <strong>UXCam</strong> is purpose-built for mobile and captures gestures like swipes, pinches, and rage taps with dedicated heatmaps. <strong>PostHog</strong> offers session replay as part of a broader platform that includes analytics, feature flags, and A/B testing — so you can jump from a funnel drop-off directly into the replays that show why users are leaving.</p><p><strong>Mixpanel</strong> added session replay in 2024 with a server-side stitching feature that lets you view replays for backend events. <strong>Amplitude</strong> also added replay but it&#x27;s limited to Growth and Enterprise plans.</p><p>For a detailed comparison, see our guide to the <a href="/blog/best-mobile-app-session-replay-tools">best mobile app session replay tools</a>.</p></details><details><summary>How is PostHog different from other mobile analytics tools?</summary><p><strong>PostHog</strong> is more than a mobile analytics tool. It gives developers full context by combining all the tools needed to build a successful product in one platform — with a single SDK for mobile.</p><ul><li><strong>All-in-one toolkit:</strong> <a href="/product-analytics">Product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/logs">logs</a>, <a href="/workflows">workflows</a>, and more.</li><li><strong>Built for mobile:</strong> Native iOS and Android SDKs with offline event queuing, gesture tracking, and mobile session replay</li><li><strong>Developer-first:</strong> Transparent APIs, <a href="/docs/product-analytics/sql">SQL query builder</a>, open source, and a <a href="/roadmap">public roadmap</a></li><li><strong>Transparent pricing:</strong> Generous free tiers and <a href="/pricing">usage-based billing</a></li><li><strong>Trusted by teams:</strong> Used by <a href="/customers">20,000+ companies</a> including Y Combinator startups, scale-ups, and enterprises</li></ul></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Hotjar]]></title><description><![CDATA[PostHog  and  Hotjar  both help you understand how users interact with your product through session replay, heatmaps, and user surveys. They're…]]></description><link>https://posthog.com/blog/posthog-vs-hotjar</link><guid isPermaLink="false">59de2854-fafe-584d-9797-2f4428d09a6c</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-hotjar/posthog-vs-hotjar.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="/">PostHog</a> and <a href="/blog/best-hotjar-alternatives">Hotjar</a> both help you understand how users interact with your product through session replay, heatmaps, and user surveys. They&#x27;re popular choices for teams that want to go beyond pageview analytics and see what users actually do.</p><p>Hotjar is now part of <a href="/blog/best-contentsquare-alternatives">Contentsquare</a> (which also acquired <a href="/blog/posthog-vs-heap">Heap</a>). It&#x27;s still available as a focused user research tool built for UX teams, but pricing and plans now live under the Contentsquare umbrella. </p><p>PostHog combines <a href="/session-replay">replays</a> and <a href="/surveys">surveys</a> with a <a href="/products">full suite of developer tools</a> designed to measure impact from one integrated platform.</p><p>In this comparison, we break down how PostHog and Hotjar stack up so you can decide which one is the right fit.</p><h2 id="how-is-posthog-different">How is PostHog different?</h2><h3 id="1-were-an-all-in-one-platform">1. We&#x27;re an all-in-one platform</h3><p>PostHog goes beyond <a href="/session-replay">replays</a> and <a href="/surveys">user surveys</a> by integrating them with <a href="/product-analytics">product</a> and <a href="/web-analytics">web analytics</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/workflows">workflows</a>, a <a href="/data-warehouse">data warehouse</a>, <a href="/cdp">data pipelines</a>, and more. It&#x27;s everything you need from a single app with a single contract. A <em>genuine</em> single source of truth for your product and customer data.</p><h3 id="2-its-a-platform-built-for-developers">2. It&#x27;s a platform built for developers</h3><p>This means you get support from the engineers who <em>actually build the product</em>, <a href="/docs/api">extensively documented APIs</a>, and a <a href="/docs/product-analytics/sql">SQL query builder</a>, so you can analyze data how you want. Our code, culture, and strategy are public <a href="https://github.com/PostHog/posthog">on GitHub</a> and in our <a href="/handbook">public handbook</a>.</p><p>And as your needs grow, PostHog grows with you – advanced capabilities such as <a href="/cdp">a CDP</a> or <a href="/data-warehouse">data warehouse</a> are ready to switch on whenever you need them.</p><blockquote><p>Development teams at <a href="/customers/supabase">Supabase</a>, <a href="/customers/lovable">Lovable</a>, and <a href="/customers/elevenlabs">ElevenLabs</a>, and many more trust PostHog as they scale.</p></blockquote><h3 id="3-were-cheaper-and-have-a-generous-free-tier">3. We&#x27;re cheaper and have a generous free tier</h3><p>Every customer gets 5,000 web recordings, 1,500 survey responses, and 1 million events for free each month, no matter what plan they&#x27;re on. Our <a href="/pricing">generous free tier</a> means more than 90% of companies use PostHog for free, and you&#x27;ll pay less when you do use up your free credits. You also get 2,500 free recordings on mobile apps.</p><p><div></div></p><h2 id="product-comparison">Product comparison</h2><p>The best way to imagine PostHog is as an <a href="/blog/best-hotjar-alternatives">alternative to Hotjar</a>, <a href="/blog/best-heap-alternatives">Heap</a>, and <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> rolled into one.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize where users scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/data-stack"><strong>Data Stack</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Import, query, model &amp; visualize product and third party data together</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Interview scheduling</strong><div class="text-sm text-secondary mt-1">In-app widget for requesting customer interviews</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Interview transcriptions</strong><div class="text-sm text-secondary mt-1">Record and transcribe user interviews</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h3 id="analytics">Analytics</h3><p>Since Hotjar is now part of Contentsquare, the analytics picture has changed. </p><p>Hotjar already offered funnels, but since the merge, broader product analytics features – like retention, user paths, and custom dashboards – are now available through Contentsquare&#x27;s plans.</p><p>Contentsquare splits analytics across two products: Experience Analytics (funnels, heatmaps, dashboards – 200k free monthly sessions) and Product Analytics (trends, retention, journey analysis – 10k free monthly sessions). A significant number of features like user ID and custom variable filters, session summaries, and their AI assistant are all on their paid Growth tier or higher.</p><p>PostHog includes all of this and more in a single product, with 1 million free events every month.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Custom events</strong><div class="text-sm text-secondary mt-1">Manually capture custom events and properties wherever they happen</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/trends"><strong>Graphs &amp; trends</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Build custom insights and visualizations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/dashboards"><strong>Dashboards</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Combine insights into shareable dashboards</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Correlation analysis</strong><div class="text-sm text-secondary mt-1">Automatically identify significant factors that impact conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI analysis</strong><div class="text-sm text-secondary mt-1">Surface user pain points using AI</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/lifecycle"><strong>Lifecycle</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user lifecycle to understand how users interact with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/stickiness"><strong>Stickiness</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user stickiness over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/user-paths"><strong>User paths</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Understand how users navigate through your product and where they get stuck</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h3 id="session-replay">Session replay</h3><p>Session replays are an essential tool for understanding how people use your product, especially for <a href="/blog/early-stage-analytics">early-stage companies</a> searching for product-market fit.</p><p>Since joining Contentsquare, Hotjar&#x27;s session replay capabilities have expanded – recordings now include AI-powered summaries, error detection, and frustration signals. Mobile app session replay is also available through Contentsquare&#x27;s Enterprise plan. </p><p>PostHog supports <a href="/docs/session-replay/mobile">mobile session replay</a> with 2,500 recordings free every month, including <a href="/docs/session-replay/installation/android">Android</a>, <a href="/docs/session-replay/installation/ios">iOS</a>, <a href="/docs/session-replay/installation/react-native">React Native</a>, and <a href="/docs/session-replay/installation/flutter">Flutter</a>.</p><p>Both PostHog and Hotjar are good options if you&#x27;re looking for a <a href="/blog/best-fullstory-alternatives">FullStory</a>, <a href="/blog/best-logrocket-alternatives">LogRocket</a>, or <a href="/blog/best-microsoft-clarity-alternatives">Microsoft Clarity alternative</a>.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web app recordings</strong><div class="text-sm text-secondary mt-1">Capture recordings from single-page apps and websites</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Android recordings</strong><div class="text-sm text-secondary mt-1">Record sessions from Android mobile apps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>iOS recordings</strong><div class="text-sm text-secondary mt-1">Record sessions from iOS mobile apps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>React Native recordings</strong><div class="text-sm text-secondary mt-1">Record sessions from React Native apps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Flutter recordings</strong><div class="text-sm text-secondary mt-1">Record sessions from Flutter apps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Playlists</strong><div class="text-sm text-secondary mt-1">Sort recordings into static and dynamic playlists</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Highlights</strong><div class="text-sm text-secondary mt-1">Create short clips from recordings</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Beta</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Frustration and engagement scores</strong><div class="text-sm text-secondary mt-1">Filter recordings by sentiment analysis</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Target recordings by URL</strong><div class="text-sm text-secondary mt-1">Start or filter recordings based on specific URLs or URL patterns</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Record via feature flag</strong><div class="text-sm text-secondary mt-1">Only record sessions for users that have the flag enabled</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Export recordings to JSON</strong><div class="text-sm text-secondary mt-1">Export important recording data for offline storage</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Export recordings to video</strong><div class="text-sm text-secondary mt-1">Export session recordings as video files</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Beta</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h3 id="heatmaps">Heatmaps</h3><p>Heatmaps visualize where people click and navigate to on your app or website and, when combined with session replay, give a clearer overview of how users behave.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Heatmaps</strong><div class="text-sm text-secondary mt-1">See clicks and mouse movement on your site</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Clickmaps</strong><div class="text-sm text-secondary mt-1">See what elements people click on in pages</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Scrollmaps</strong><div class="text-sm text-secondary mt-1">Visualize how far users scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Rage clicks</strong><div class="text-sm text-secondary mt-1">Track repeated clicks in the same place</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Save heatmaps</strong><div class="text-sm text-secondary mt-1">Save historic heatmaps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">View heatmaps overlaid directly on a webpage</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h3 id="surveys">Surveys</h3><p>Hotjar&#x27;s surveys are now part of Contentsquare&#x27;s Voice of Customer product. They&#x27;ve added AI-generated surveys, AI summary reports with sentiment analysis, and increased free response limits. </p><p>Hotjar still supports more survey types than PostHog, including unmoderated user tests and interview scheduling, but PostHog offers more precise targeting options.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-start col-span-full border-b-2 border-primary bg-accent pb-2"><div><div class="font-semibold text-base">Platforms</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web surveys</strong><div class="text-sm text-secondary mt-1">Show surveys on websites and web apps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Mobile surveys</strong><div class="text-sm text-secondary mt-1">Show surveys in mobile apps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-start col-span-full border-b-2 border-primary bg-accent pb-2"><div><div class="font-semibold text-base">Question types</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Multiple choice</strong><div class="text-sm text-secondary mt-1">Single-select questions with predefined answer options</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Multi-select</strong><div class="text-sm text-secondary mt-1">Allow users to select multiple answers from a list</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Numerical rating</strong><div class="text-sm text-secondary mt-1">Collect ratings on a numerical scale</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Emoji reaction</strong><div class="text-sm text-secondary mt-1">Quick feedback collection using emoji reactions</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Embedded links</strong><div class="text-sm text-secondary mt-1">Include clickable links within survey questions</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Freeform text</strong><div class="text-sm text-secondary mt-1">Open-ended text responses for detailed feedback</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Interview scheduling</strong><div class="text-sm text-secondary mt-1">Send users a link to schedule a feedback meeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-start col-span-full border-b-2 border-primary bg-accent pb-2"><div><div class="font-semibold text-base">Presentation</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Popover surveys</strong><div class="text-sm text-secondary mt-1">Display surveys as popovers in the bottom corner of the screen</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Feedback button</strong><div class="text-sm text-secondary mt-1">Show a feedback button that opens surveys on click</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Hosted surveys</strong><div class="text-sm text-secondary mt-1">Get a shareable URL to a survey that you can send directly to users or embed</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Beta</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Custom colors &amp; positioning</strong><div class="text-sm text-secondary mt-1">Customize the colors of your surveys to match your brand</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Custom HTML</strong><div class="text-sm text-secondary mt-1">Add HTML to your survey text</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Iframe embedding</strong><div class="text-sm text-secondary mt-1">Embed surveys in your website using an iframe</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-start col-span-full border-b-2 border-primary bg-accent pb-2"><div><div class="font-semibold text-base">Features</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Sentiment analysis</strong><div class="text-sm text-secondary mt-1">Analyze survey results using AI to discover trends</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Survey templates</strong><div class="text-sm text-secondary mt-1">Choose from a library of pre-built templates (CSAT, NPS, etc) or start from scratch</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User interview requests</strong><div class="text-sm text-secondary mt-1">Templates for organizing and scheduling user interviews</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>API access</strong><div class="text-sm text-secondary mt-1">Full API access for creating custom survey experiences</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Webhooks</strong><div class="text-sm text-secondary mt-1">Send survey responses to places like Slack or Teams</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-start col-span-full border-b-2 border-primary bg-accent pb-2"><div><div class="font-semibold text-base">Targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Display conditions</strong><div class="text-sm text-secondary mt-1">Display surveys based on URL or person property</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Event-triggered surveys</strong><div class="text-sm text-secondary mt-1">Trigger a survey to open when an event occurs, either every time or just once</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Feature flag targeting</strong><div class="text-sm text-secondary mt-1">Target surveys to specific users based on feature flags</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Custom targeting</strong><div class="text-sm text-secondary mt-1">Target surveys to specific users, cohorts, or behavioral segments</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><h2 id="price-comparison">Price comparison</h2><p>Hotjar&#x27;s old pricing tiers (Business and Scale) no longer exist. Since the Contentsquare merger, Hotjar&#x27;s tools are now sold under Contentsquare&#x27;s pricing structure, which is split across three separate products – Experience Analytics (replays, heatmaps), Voice of Customer (surveys, interviews), and Product Analytics (powered by Heap). Each product has its own plan: Free, Growth, Pro, or Enterprise.</p><p>PostHog, by contrast, has fully transparent, usage-based pricing for every product on a single bill.</p><h3 id="free-tier-comparison">Free tier comparison</h3><table><thead><tr><th></th><th>Contentsquare</th><th>PostHog</th></tr></thead><tbody><tr><td><strong>Session replays</strong></td><td>10,000/mo</td><td>5,000/mo</td></tr><tr><td><strong>Heatmaps</strong></td><td>200,000/m (with sessions)</td><td>Included with replays</td></tr><tr><td><strong>Analytics events</strong></td><td>10,000 sessions (Product Analytics)</td><td>1,000,000 events</td></tr><tr><td><strong>Survey responses</strong></td><td>100/mo</td><td>1,500/mo</td></tr><tr><td><strong>Data retention</strong></td><td>1 month (Experience Analytics)</td><td>7 years</td></tr><tr><td><strong>Feature flags</strong></td><td>❌</td><td>1,000,000 requests</td></tr><tr><td><strong>A/B tests</strong></td><td>❌</td><td>1,000,000 requests</td></tr><tr><td><strong>Error tracking</strong></td><td>❌</td><td>100,000 requests</td></tr></tbody></table><p>Contentsquare does offer 200,000 monthly sessions for its Experience Analytics free plan, which is generous for heatmaps and basic session data. But its Product Analytics free tier is limited to just 10,000 sessions with limited history, and surveys cap at 100 responses per month.</p><p>PostHog gives you 1 million analytics events, 5,000 web replays, 2,500 mobile replays, 1,500 survey responses, and 1 million feature flag requests – all on the same platform.</p><h3 id="paid-pricing">Paid pricing</h3><p>PostHog uses usage-based pricing across all products. You only pay for what you use, and prices decrease at higher volumes. Here&#x27;s what typical usage costs with PostHog:</p><table><thead><tr><th>Monthly usage</th><th>PostHog cost</th></tr></thead><tbody><tr><td><strong>5,000 replays</strong></td><td>$0 (free tier)</td></tr><tr><td><strong>15,000 replays</strong></td><td>$50</td></tr><tr><td><strong>50,000 replays</strong></td><td>$157.5</td></tr><tr><td><strong>100,000 replays</strong></td><td>$161.5</td></tr><tr><td><strong>1,500 survey responses</strong></td><td>$0 (free tier)</td></tr><tr><td><strong>2,500 survey responses</strong></td><td>$50</td></tr><tr><td><strong>5,000 survey responses</strong></td><td>$122.50</td></tr><tr><td><strong>1M analytics events</strong></td><td>$0 (free tier)</td></tr><tr><td><strong>5M analytics events</strong></td><td>$137.2</td></tr></tbody></table><p>Contentsquare&#x27;s Growth plan starts at $40/month for Experience Analytics, $79/month for Voice of Customer (which includes surveys), and it&#x27;s not disclosed for Product Analytics. Because replays, surveys, and analytics are billed as separate products, costs add up quickly once you need more than one tool. Pro and Enterprise pricing is custom and require a conversation with the sales team.</p><p>With PostHog, everything is on one bill with one pricing calculator. You can see exactly how much you&#x27;ll pay using the calculator on our <a href="/pricing">pricing page</a>.</p><h2 id="platform-and-integrations">Platform and integrations</h2><h3 id="data-sources">Data sources</h3><p>PostHog has a <a href="/data-stack">built-in data warehouse</a>, so you can import, combine, and analyze data from multiple sources, and combine it with analytics events. This means you can <a href="/tutorials/hubspot-reports">monitor deal counts</a> using data from Hubspot, <a href="/tutorials/stripe-reports">analyze gross revenue</a> using Stripe data, and <a href="/tutorials/zendesk-reports">track support ticket SLAs</a> using Zendesk data, all from within PostHog.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Segment</strong><div class="text-sm text-secondary mt-1">Send events via Segment</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Sentry</strong><div class="text-sm text-secondary mt-1">Send and receive data from Sentry</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Stripe</strong><div class="text-sm text-secondary mt-1">Stripe customer data connector</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Hubspot</strong><div class="text-sm text-secondary mt-1">Send and receive data from Hubspot</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Zendesk</strong><div class="text-sm text-secondary mt-1">Send and receive data from Zendesk</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Amazon S3</strong><div class="text-sm text-secondary mt-1">Export data to a S3 bucket</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Postgres</strong><div class="text-sm text-secondary mt-1">Import and export data to a Postgres database</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Snowflake</strong><div class="text-sm text-secondary mt-1">Export data to Snowflake database</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Google Cloud Storage</strong><div class="text-sm text-secondary mt-1">Import/export data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h3 id="data-destinations">Data destinations</h3><p>Contentsquare has improved its data export capabilities since the Hotjar days – its Data Connect feature now exports behavioral data to Snowflake, BigQuery, Redshift, S3, and Databricks. However, PostHog can still send richer data because it collects more actionable data via product analytics, feature flags, and experiments.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Hubspot</strong><div class="text-sm text-secondary mt-1">Send and receive data from Hubspot</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Zapier</strong><div class="text-sm text-secondary mt-1">Trigger Zapier automations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Slack</strong><div class="text-sm text-secondary mt-1">Alerts and notifications for Slack</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Microsoft Teams</strong><div class="text-sm text-secondary mt-1">Alerts and notifications for Microsoft Teams</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Discord</strong><div class="text-sm text-secondary mt-1">Send survey responses and data to Discord</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Intercom</strong><div class="text-sm text-secondary mt-1">Messaging and marketing automation</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Salesforce</strong><div class="text-sm text-secondary mt-1">Sync event and person data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Customer.io</strong><div class="text-sm text-secondary mt-1">Messaging and marketing automation</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>CSV exports</strong><div class="text-sm text-secondary mt-1">Export your data as a CSV</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Amazon S3</strong><div class="text-sm text-secondary mt-1">Export data to a S3 bucket</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>BigQuery</strong><div class="text-sm text-secondary mt-1">Export data to Google BigQuery for analysis</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h3 id="privacy-compliance-and-security">Privacy, compliance, and security</h3><p>Regulatory compliance can be a critical need for many teams, especially if they operate in financial or healthcare industries. Regulations such as HIPAA and GDPR can require teams to store data in certain locations or protect it in certain ways.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Hotjar<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-hotjar">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>SOC 2 Type II</strong><div class="text-sm text-secondary mt-1">SOC 2 security certification</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>GDPR-ready</strong><div class="text-sm text-secondary mt-1">Can be compliant with GDPR</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>CCPA-ready</strong><div class="text-sm text-secondary mt-1">Compliant with California Consumer Privacy Act</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>HIPAA-ready</strong><div class="text-sm text-secondary mt-1">Can be compliant with HIPAA</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Data anonymization</strong><div class="text-sm text-secondary mt-1">Anonymize user data for privacy</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cookieless tracking option</strong><div class="text-sm text-secondary mt-1">Track users without cookies</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><h2 id="when-to-choose-posthog-vs-hotjar">When to choose PostHog vs Hotjar</h2><p>Choosing between PostHog and Hotjar (now Contentsquare) depends on what you need beyond session replay and heatmaps. Here&#x27;s a quick guide:</p><ul><li><p>Want an all-in-one developer platform that goes beyond user research with <a href="/product-analytics">product analytics</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/error-tracking">error tracking</a>, and transparent pricing? Go with <strong>PostHog</strong>.</p></li><li><p>Need a focused UX research tool with session replays, AI-powered surveys, user interviews, and unmoderated user testing? <strong>Hotjar/Contentsquare</strong> is a solid choice.</p></li></ul><h2 id="recommendations-by-team-type">Recommendations by team type</h2><p><strong>For engineering-led product teams</strong></p><ul><li><strong>PostHog</strong> – SQL access, open-source codebase, and SDKs for every major framework. Tightly integrated feature flags, experiments, error tracking, and LLM analytics mean fewer tools to manage.</li></ul><p><strong>For UX research and design teams</strong></p><ul><li><strong>Hotjar / Contentsquare</strong> – Built for qualitative user research with AI-generated surveys, user interviews, unmoderated user tests, and feedback widgets. The Sense AI assistant surfaces insights from survey responses and session replays automatically.</li></ul><p><strong>For product managers who also run experiments</strong></p><ul><li><strong>PostHog</strong> – Run A/B tests, roll out features with flags, and measure impact on funnels and retention – all in one platform. Contentsquare doesn&#x27;t include native feature flags or experimentation.</li></ul><p><strong>For e-commerce and CRO teams</strong></p><ul><li><strong>Hotjar / Contentsquare</strong> – Zone-based heatmaps, journey analysis, and impact quantification help identify and prioritize conversion improvements. Its enterprise tier adds mobile app replay and revenue attribution.</li></ul><p><strong>For teams building AI products</strong></p><ul><li><strong>PostHog</strong> – Native <a href="/llm-analytics">LLM analytics</a> for tracking model performance, token costs, and debugging AI interactions. Contentsquare doesn&#x27;t offer AI observability.</li></ul><p><strong>For privacy-conscious and regulated organizations</strong></p><ul><li>Both are SOC 2 certified, GDPR-ready, and CCPA-ready. <strong>PostHog</strong> is HIPAA-ready and offers EU hosting with raw data access via its <a href="/data-stack">data warehouse</a>. Contentsquare/Hotjar is not HIPAA-compliant, but they do offer EU hosting.</li></ul><p><strong>For early-stage startups</strong></p><ul><li><strong>PostHog</strong> – A single platform that scales from MVP to growth stage. The generous free tier includes 1 million analytics events, 5,000 replays, and 250 survey responses per month. <a href="/startups">Startups can also qualify for $50k in free credits</a>.</li></ul><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What&#x27;s the difference between PostHog and Hotjar?</summary><p><strong>Hotjar</strong> (now part of Contentsquare) is a UX research tool built for understanding user behavior through session replay, heatmaps, and surveys. <strong>PostHog</strong> is a broader all-in-one platform that combines those capabilities with product analytics, feature flags, A/B testing, error tracking, LLM analytics, and more – built for engineering-led teams who want everything in one place.</p></details><details><summary>Is Hotjar still available or is it just Contentsquare now?</summary><p>As of July 2025, Hotjar formally merged into the Contentsquare Group. The Hotjar brand still exists, but all products – session replay, heatmaps, surveys – are now part of the Contentsquare platform under new pricing tiers (Free, Growth, Pro, Enterprise). Existing Hotjar users were migrated to Contentsquare accounts.</p></details><details><summary>Does PostHog replace Hotjar?</summary><p><strong>Yes, for most teams.</strong> PostHog offers session replay, heatmaps, and surveys – the core Hotjar features – plus product analytics, feature flags, A/B testing, error tracking, and more. If you&#x27;re an engineering or product team that wants to go beyond user research, PostHog replaces Hotjar and several other tools in one platform.</p><p><strong>Consider keeping Contentsquare if</strong> your team relies heavily on user interviews, unmoderated user tests, or the Sense AI assistant for UX research.</p></details><details><summary>Which has better session replay – PostHog or Contentsquare?</summary><p><strong>PostHog</strong> includes more developer-focused features like console logs, network request monitoring, a DOM explorer, and performance metrics. It also supports mobile replay on all plans (Android, iOS, React Native, Flutter). <strong>Contentsquare</strong> added AI-powered replay summaries and frustration signals, but mobile replay is limited to Enterprise plans or Pro add-ons.</p></details><details><summary>Does Contentsquare have error tracking?</summary><p>Contentsquare has basic error detection through its Experience Monitoring product, which surfaces JavaScript errors and performance issues. However, this is more focused on frontend monitoring than full error tracking. <strong>PostHog</strong> includes native <a href="/error-tracking">error tracking</a> that connects exceptions and stack traces directly to session replays, user behavior, and feature flag changes.</p></details><details><summary>Does Contentsquare have product analytics?</summary><p>Yes, but it&#x27;s complicated. Contentsquare&#x27;s Product Analytics is powered by <a href="/blog/posthog-vs-heap">Heap</a>, which it acquired in 2023. It&#x27;s offered as a separate product with its own pricing (free tier: 10k sessions). Contentsquare&#x27;s Experience Analytics also includes basic funnels, dashboards, and journey analysis. </p><p>PostHog&#x27;s product analytics is fully integrated with all other tools on the same platform and same data.</p></details><details><summary>Can I use PostHog and Contentsquare together?</summary><p>Yes, though most teams find it redundant for replays and heatmaps. You can use <strong>Contentsquare</strong> for UX research (interviews, user tests) alongside <strong>PostHog</strong> for product analytics, feature flags, and experiments. PostHog can receive data from or send data to other tools via its <a href="/docs/cdp">CDP</a>.</p></details><details><summary>Does Contentsquare support mobile apps?</summary><p>Partially. Contentsquare&#x27;s mobile session replay and experience monitoring are limited to Enterprise plans (or Pro add-ons). PostHog supports mobile session replay on all plans with native SDKs for Android, iOS, React Native, and Flutter.</p></details><details><summary>What are the best Hotjar alternatives in 2026?</summary><p>The top Hotjar alternatives in 2026 include:</p><ul><li><strong><a href="/session-replay">PostHog</a></strong> – Best all-in-one platform for teams wanting replay, heatmaps, analytics, feature flags, and experiments together</li><li><strong><a href="/blog/posthog-vs-fullstory">FullStory</a></strong> – Best for enterprise teams wanting AI-powered session insights with strong mobile support</li><li><strong><a href="/blog/best-microsoft-clarity-alternatives">Microsoft Clarity</a></strong> – Best free option for basic heatmaps and session replay</li><li><strong><a href="/blog/posthog-vs-logrocket">LogRocket</a></strong> – Best for frontend teams wanting replay with error tracking and performance monitoring</li><li><strong><a href="/blog/posthog-vs-mixpanel">Mixpanel</a></strong> – Best for product teams wanting analytics-first with replay capabilities</li></ul></details><details><summary>Which is better for B2B SaaS – PostHog or Contentsquare?</summary><p><strong>PostHog</strong> is generally better for B2B SaaS teams. It includes <a href="/docs/product-analytics/group-analytics">group analytics</a> for account-level analysis, feature flags for enterprise rollouts, and a built-in <a href="/data-stack">data warehouse</a> for connecting CRM data from Stripe, HubSpot, and Zendesk. Contentsquare is more oriented toward B2C e-commerce and high-traffic consumer websites.</p></details><details><summary>Can I migrate from Hotjar to PostHog?</summary><p>There&#x27;s no direct data migration from Hotjar/Contentsquare to PostHog since session replay data isn&#x27;t portable between platforms. However, you can set up PostHog alongside Contentsquare and run them in parallel during a transition period. PostHog starts collecting data immediately via <a href="/docs/product-analytics/autocapture">autocapture</a>, so there&#x27;s no gap in coverage. See our <a href="/docs/getting-started/install">getting started guide</a> for setup instructions.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The 8 best free and open-source feature flag services]]></title><description><![CDATA[The  benefits of feature flags  are numerous. They help you mitigate risk,  test changes in production , manage access, and most important of all…]]></description><link>https://posthog.com/blog/best-open-source-feature-flag-tools</link><guid isPermaLink="false">16d9d499-5979-53c4-a4ba-25a6d7bd6521</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-company-culture-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>The <a href="/product-engineers/feature-flag-benefits-use-cases">benefits of feature flags</a> are numerous. They help you mitigate risk, <a href="/product-engineers/testing-in-production">test changes in production</a>, manage access, and most important of all, ship faster.</p><p>While it&#x27;s tempting to <a href="/blog/feature-flags-as-a-service">build your own tools</a>, there&#x27;s no shortage to feature flag services with decent free tiers, or open-source feature flag tools you can self-host. These are the best and most popular right now.</p><h2 id="what-features-do-you-need-in-an-open-source-feature-flag-tool">What features do you need in an open-source feature flag tool?</h2><p>A good open-source feature flag tool gives you control over how and when users see new features without locking you into a proprietary platform. Most solid tools include:</p><ul><li>Boolean and multivariate flags for toggling features on/off or serving multiple variations</li><li>User targeting and segmentation to roll out features to specific groups</li><li>Percentage rollouts for gradually releasing features to a growing share of users</li><li>SDKs for your stack (JavaScript, Python, React, Go, mobile, etc.)</li><li>Self-hosting options so you keep full control of your data</li></ul><p>More advanced tools go further with:</p><ul><li><strong>A/B testing and experimentation</strong> built on top of feature flags with statistical analysis</li><li><strong>Product analytics integration</strong> so you can measure the impact of flag changes on user behavior</li><li><strong>Remote configuration</strong> to change app settings without deploying new code</li><li><strong>Scheduled flag changes</strong> for time-based releases</li><li><strong>Audit logs and permissions</strong> for team-level control over who can change flags</li><li><strong>Local evaluation</strong> to check flags without network requests for faster performance</li></ul><p>Here&#x27;s how the most popular open-source feature flag tools compare:</p><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2026_02_11_at_09_54_29_2x_96f74a428a.png" alt="PostHog"/></p><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="/">PostHog</a> is an all-in-one platform, which means it offers <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, <a href="/surveys">user surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, and a lot more in addition to feature flags.</p><p>It&#x27;s a <a href="/blog/best-launchdarkly-alternatives">popular alternative to LaunchDarkly</a> and analytics tools like <a href="/blog/best-amplitude-alternatives">Amplitude</a>.</p><p>PostHog&#x27;s <a href="/docs/feature-flags">feature flags</a> enable conditional rollouts, multivariate flags, JSON payloads, automated usage reports, local evaluation, and more. They power its <a href="/docs/experiments">A/B testing features</a>, so you can test product changes for their impact on key metrics. </p><p>PostHog also offers an <a href="/docs/feature-flags/early-access-feature-management">early access feature management</a> feature, which enables users to self-onboard to beta features behind feature flags. </p><h3 id="supported-libraries">Supported libraries</h3><ul><li><p><strong>Client-side:</strong> JavaScript, React Native, React, Android, iOS, Flutter, Remix, Angular, Next.js, Svelte, Capacitor, Unity</p></li><li><p><strong>Server-side:</strong> Node.js, Python, PHP, Ruby, Go, Java, .NET, Elixir, Rust</p></li></ul><p>You can also evaluate feature flags using PostHog&#x27;s API from any language that can make HTTP requests.</p><h3 id="how-much-does-it-cost">How much does it cost?</h3><p>PostHog&#x27;s free tier includes 1 million feature flag requests per month. After that, you pay $0.0001 per request, with costs decreasing the more you use. You can set billing limits to avoid surprise bills – see the <a href="/pricing">pricing page</a> for more info.</p><blockquote><h3 id="bottom-line">Bottom line</h3><p>PostHog is the best choice if you want feature flags alongside <a href="/docs/product-analytics">product analytics</a>, <a href="/docs/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, and more in a single platform. Its <a href="/pricing">generous free tier</a> makes it especially appealing for <a href="/startups">startups and scaleups</a>.</p></blockquote><p><div></div></p><h2 id="2-growthbook">2. GrowthBook</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-feature-flags/growthbook.png" alt="GrowthBook"/></p><h3 id="what-is-growthbook">What is GrowthBook?</h3><p><a href="/blog/posthog-vs-growthbook">GrowthBook</a> is a warehouse-native, open-source feature flagging and experimentation platform built to help companies make better data-driven decisions. Its flag tool features advanced targeting, gradual rollouts, and experiments. </p><p>It&#x27;s warehouse native with support for most major SQL data sources, and there&#x27;s a code-free visual experiment editor that can used be less technical end users.</p><h3 id="supported-sdks">Supported SDKs</h3><ul><li><p><strong>Client-side:</strong> JavaScript, React, Android (Kotlin), iOS (Swift), Flutter, Vue</p></li><li><p><strong>Server-side:</strong> PHP, Ruby, Python, Go, Java, C#.</p></li></ul><h3 id="how-much-does-it-cost-1">How much does it cost?</h3><p><a href="/blog/best-growthbook-alternatives">GrowthBook&#x27;s</a> open-source self-hosted plan is free with unlimited users, flags, and experiments. The cloud-hosted Starter plan is free for up to 3 users. If you need advanced features like CUPED variance reduction, a visual editor, or multi-arm bandits, you&#x27;ll need the Pro plan at $40/user/month.</p><h2 id="3-flagsmith">3. Flagsmith</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-feature-flags/flagsmith.png" alt="Flagsmith"/></p><h3 id="what-is-flagsmith">What is Flagsmith?</h3><p><a href="/blog/best-flagsmith-alternatives">Flagsmith</a> is a feature flag tool that makes it easy to test and deploy new functional and visual changes to users without pushing updates to code. </p><p>All flags in Flagsmith are capable of being configured for cross-platform remote configuration, so you can alter an app in real-time without having to wait for app store approval.</p><p>It supports local evaluation, scheduling, and paid plans offer an Edge API that automatically routes requests to the closest data center to the user.</p><h3 id="supported-sdks-1">Supported SDKs</h3><ul><li><p><strong>Client-side:</strong> JavaScript, React Native, React, Android, iOS, Next.js.</p></li><li><p><strong>Server-side:</strong> Node.js, Python, PHP, Ruby, Go, .NET, Ruby, Rust, Elixir.</p></li></ul><h3 id="how-much-does-it-cost-2">How much does it cost?</h3><p>Flagsmith&#x27;s cloud free plan includes 50,000 requests per month for 1 user and 1 project. The Start-Up plan is $45/month for up to 1 million requests and 3 users. Enterprise and on-premises pricing is available for larger teams. The open-source self-hosted version is free with no usage limits.</p><blockquote><h3 id="bottom-line-1">Bottom line</h3><p>Flagsmith is a solid open-source option for teams that need feature flags with remote configuration and flexible deployment options, including on-premises hosting. Its free cloud tier is limited to a single user, but the self-hosted version has no restrictions.</p></blockquote><h2 id="4-unleash">4. Unleash</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-feature-flags/unleash.png" alt="unleash"/></p><h3 id="what-is-unleash">What is Unleash?</h3><p><strong>Unleash</strong> is a flag service with a public roadmap and a strong community. Official SDK support is comprehensive and there&#x27;s a large selection of community maintained SDKs for less popular frameworks, too.</p><p>Unleash is particularly popular with privacy-conscious organizations since user data never leaves your infrastructure. You can use it to define targeting rules, gradual rollouts, and custom activation strategies, and it integrates with tools like Jira, <a href="/blog/best-datadog-alternatives">Datadog</a>, Microsoft Teams, and Slack.</p><h3 id="supported-sdks-2">Supported SDKs</h3><ul><li><p><strong>Client-side:</strong> JavaScript, Android, Flutter, iOS, React, Svelte, Vue.</p></li><li><p><strong>Server-side:</strong> Go, Java, Node.js, PHP, Python, Ruby, Rust, .NET.</p></li><li><p><strong>Community maintained:</strong> Angular, Clojure, C++, ColdBox, Dart, Elixir, Haskell, Laravel, NestJS, React Native, Solid.</p></li></ul><h3 id="how-much-does-it-cost-3">How much does it cost?</h3><p>Unleash&#x27;s open-source self-hosted version is free with unlimited feature flags. A self-service Enterprise plan starts at $75 per seat per month with a 5-seat minimum, available as cloud-hosted or self-hosted. Custom Enterprise pricing is available for annual contracts and dedicated support. </p><blockquote><h3 id="bottom-line-2">Bottom line</h3><p>Unleash has the largest community and most extensive SDK support of any open-source feature flag tool. Its privacy-first architecture makes it a strong choice for organizations with strict data requirements.</p></blockquote><h2 id="5-flipt">5. Flipt</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-feature-flags/flipt.png" alt="flipt"/></p><h3 id="what-is-flipt">What is Flipt?</h3><p><strong>Flipt</strong> is a popular open-source option for feature flagging. It&#x27;s 100% open source with no paid editions. It supports all basic <a href="/blog/feature-flag-benefits-use-cases">feature flag use cases</a>, such as rolling out features based on segments (e.g. new users, email, country etc.), multiple variations, and percentage thresholds for rollouts. It also supports storing your flags in Git, so it can be used without a database.</p><h3 id="supported-sdks-3">Supported SDKs</h3><ul><li><p><strong>Client-side:</strong> JavaScript/TypeScript, React, Android (Kotlin).</p></li><li><p><strong>Server-side:</strong> C#, .NET, C++, Dart, Go, Java, Node, PHP, Python, Ruby.</p></li></ul><h3 id="how-much-does-it-cost-4">How much does it cost?</h3><p>Nothing. There is no paid version of Flipt. It&#x27;s distributed under a GPL-3.0 license.</p><h2 id="6-flipper">6. Flipper</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-feature-flags/flipper.png" alt="flipper"/></p><p>Flipper is a rebuilt version of the <a href="/blog/github-gitlab-feature-flags">feature flag platform used by GitHub</a>, maintained by a small team of ex-GitHub engineers. It supports all the common use cases for feature flags, such as boolean flags, group targeted flags, and targeting by actors or a percentage of actors. It currently only supports Ruby applications, though support for other languages is planned.</p><h3 id="supported-sdks-4">Supported SDKs</h3><p>Ruby only</p><h3 id="how-much-does-it-cost-5">How much does it cost?</h3><p>The open-source gem is free with unlimited flags. Flipper Cloud offers a free plan (2 seats, 5 flags) and fixed-price paid tiers: Bronze at $49/month (up to 10 seats), Silver at $149/month (up to 25 seats), and Gold at $299/month (up to 50 seats). Custom plans are available for larger teams needing higher seat limits, extended retention, or custom terms.</p><blockquote><h3 id="bottom-line-3">Bottom line</h3><p>Flipper is the best feature flag tool for Ruby on Rails teams. Its developer experience is exceptional, and its fixed-price Cloud plans are straightforward. However, it&#x27;s Ruby-only, which limits its audience.</p></blockquote><h2 id="7-featbit">7. FeatBit</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-feature-flags/featbit.png" alt="featbit"/></p><h3 id="what-is-featbit">What is FeatBit?</h3><p>FeatBit is an open-source feature flag and A/B testing tool that&#x27;s available in Standard (for small businesses) and Professional (for enterprises) flavors – the Standard edition is easier deploy due to fewer dependencies. It supports custom user segments, rolling out by percentages, and feature flag scheduling. A/B testing data can also be exported to tools like <a href="/blog/best-datadog-alternatives">Datadog</a>, Grafana, and Amplitude.</p><p>FeatBit is designed for self-hosting, with support for Helm Charts, Terraform, and OpenTelemetry for observability. It&#x27;s capable of supporting over 1 million simultaneous online users.</p><h3 id="supported-sdks-5">Supported SDKs</h3><ul><li><p><strong>Client-side:</strong> JavaScript, React, Vue.</p></li><li><p><strong>Server-side:</strong> Python, PHP, Ruby, Go, .NET, Java.</p></li></ul><h2 id="how-much-does-it-cost-6">How much does it cost?</h2><p>All features are completely free. FeatBit monetizes its platform by offering premium support packages, which start at $399 per month for dedicated support with a 2-hour reply SLA during business hours. Enterprise and cloud options are also available.</p><blockquote><h3 id="bottom-line-4">Bottom line</h3><p>FeatBit is a strong choice for teams that want a feature-rich, self-hosted feature flag tool with no artificial feature gates. Its .NET foundation and enterprise-grade scalability make it appealing for larger organizations, though its community is smaller than the other tools on this list.</p></blockquote><h2 id="8-featurehub">8. FeatureHub</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-feature-flags/feature-hub.png" alt="featurehub"/></p><h3 id="what-is-featurehub">What is FeatureHub?</h3><p><strong>FeatureHub</strong> is an open-source feature flag tool that offers all the basics you need, including multivariate flags, client and server-side evaluation, and percentage rollouts.</p><p>The open-source version has no usage limits – it even supports SAML and social sign-in via Microsoft, Google and GitHub. There&#x27;s also a Google Analytics integration, though this is the only analytics integration it offers at present.   </p><h3 id="supported-sdks-6">Supported SDKs</h3><ul><li><p><strong>Client-side:</strong> JavaScript, React, Flutter, iOS (Swift), Android, Angular.</p></li><li><p><strong>Server-side:</strong> Node, C#, Dart, Go, Python, Ruby, Java.</p></li></ul><h3 id="how-much-does-it-cost-7">How much does it cost?</h3><p>FeatureHub offers a hosted option in addition to its open-source edition, and both versions offer the same features. The hosted version is $4.99 per user per month, plus API request charges: $0.38 per 10,000 streaming requests, $0.35 per 10,000 REST requests, and $0.33 per 10,000 test requests. A 30-day free trial with 10,000 API requests is included.</p><blockquote><h3 id="bottom-line-5">Bottom line</h3><p>FeatureHub is a solid, no-frills open-source feature flag tool with a straightforward pricing model. Its smaller community and more limited integrations mean it&#x27;s best suited for teams that value simplicity and just need the basics done well.</p></blockquote><h2 id="which-open-source-feature-flag-tool-should-you-choose">Which open-source feature flag tool should you choose?</h2><ul><li>Want an all-in-one platform that integrates feature flags with product analytics, session replay, A/B testing, error tracking, logs, and more? Go with <strong>PostHog</strong>.</li><li>Already have a data warehouse and want feature flags combined with powerful experimentation? Choose <strong>GrowthBook</strong>.</li><li>Need the most extensive SDK support and largest open-source community? <strong>Unleash</strong> is the most established.</li><li>Need open-source feature flags with remote configuration and on-premises hosting? Try <strong>Flagsmith</strong>.</li><li>Want a 100% open-source tool with zero paid tiers and Git-native flag management? <strong>Flipt</strong> is for you.</li><li>Building with Ruby on Rails and want the best developer experience? <strong>Flipper</strong> is purpose-built for your stack.</li><li>Need a self-hosted, enterprise-grade tool with no artificial feature gates? <strong>FeatBit</strong> offers the most features for free.</li><li>Want a simple, no-frills open-source tool with cloud-native architecture? <strong>FeatureHub</strong> covers the basics well.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think you&#x27;ll love PostHog if:</p><ul><li>You value transparency (we&#x27;re open source and open core)</li><li>You want tools to ship, track, and analyze new features – like feature flags, A/B testing, analytics, and session replays</li><li>You want try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>)</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is the best free feature flag tool?</summary><ul><li><strong>PostHog</strong> is the best option for product teams that want feature flags alongside <a href="/products">a full suite of developer tools</a> in one platform — its free tier includes 1 million feature flag requests per month. </li><li><strong>GrowthBook</strong> is the best choice for teams with a data warehouse – it&#x27;s completely free to self-host with no limits. </li><li><strong>Flipt</strong> is the best choice if you want a tool that is 100% open source with no paid tiers at all. </li></ul><p>For more options beyond open source, check out our guide to the <a href="/blog/best-feature-flag-software-for-developers">best feature flag tools for developers</a>.</p></details><details><summary>What&#x27;s the difference between feature flags and A/B testing?</summary><p><a href="/docs/feature-flags">Feature flags</a> let you toggle features on or off for specific users without deploying new code. <a href="/docs/experiments">A/B testing</a> uses feature flags to randomly split users into groups (variants) and then measures which variant performs better against a goal metric. </p><p>In practice, most A/B testing tools — including <strong>PostHog</strong>, <strong>GrowthBook</strong>, and <strong>FeatBit</strong> – are built on top of a feature flagging engine. The distinction matters because tools like Unleash, Flagsmith, and Flipt are primarily feature flag tools that can be <em>used</em> for basic split testing, while PostHog and GrowthBook provide end-to-end experimentation with built-in statistical analysis.</p><p>To learn more, read our guide on <a href="/blog/what-is-a-feature-flag">what is a feature flag (and how it compares to remote config and A/B testing)</a>.</p></details><details><summary>Should I build my own feature flags or use a service?</summary><p>For simple boolean flags, building your own is tempting and straightforward. But feature flag tools quickly become complex once you need targeting rules, percentage rollouts, audit logs, multi-environment support, and experimentation. Most teams are better off using an existing tool – especially since open-source options are free to self-host. For a deeper dive, read our guide on <a href="/blog/feature-flags-as-a-service">feature flags as a service</a>.</p></details><details><summary>Can I self-host a feature flag tool?</summary><p>Yes – that&#x27;s one of the main advantages of open-source feature flag tools. All eight tools on this list can be self-hosted. <strong>PostHog</strong>, <strong>GrowthBook</strong>, <strong>Unleash</strong>, <strong>Flagsmith</strong>, <strong>FeatBit</strong>, and <strong>FeatureHub</strong> offer both cloud and self-hosted options. <strong>Flipt</strong> and <strong>Flipper</strong> are self-hosted first (though Flipper also offers a cloud service). Self-hosting gives you complete control over your data, which is particularly important for teams with strict privacy requirements or regulatory compliance needs.</p></details><details><summary>What is local evaluation and why does it matter?</summary><p>Local evaluation means feature flags are checked locally within your application rather than making a network request to a remote server for every check. This reduces latency and means your feature flags keep working even if the flag service goes down. <strong>PostHog</strong>, <strong>Flagsmith</strong>, <strong>Flipper</strong>, and <strong>Flipt</strong> all support local evaluation. It&#x27;s especially important for performance-sensitive applications and high-traffic services.</p></details><h2 id="further-reading">Further reading</h2><ul><li><a href="/blog/what-is-a-feature-flag">What is a feature flag (and how it compares to remote config and A/B testing)</a></li><li><a href="/docs/feature-flags/best-practices">Feature flag best practices and tips (with examples)</a></li><li><a href="/blog/feature-flags-as-a-service">Should you build or buy? Feature flags as a service, explained</a></li><li><a href="/product-engineers/feature-flags-vs-configuration">Feature flags vs configuration: Which should you choose?</a></li><li><a href="/product-engineers/feature-flag-benefits-use-cases">The benefits of feature flags and how to use them</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The 5 best free and open-source A/B testing tools]]></title><description><![CDATA[Also known as split testing or  multivariate testing , A/B testing is the practice of splitting your audience to test variations of a product design…]]></description><link>https://posthog.com/blog/best-open-source-ab-testing-tools</link><guid isPermaLink="false">83848045-23e2-52d9-beab-52a3c5e03822</guid><dc:creator><![CDATA[Hanna Crombie]]></dc:creator><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/open-source-testing-tools/testinghog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Also known as split testing or <a href="/product-engineers/what-is-multivariate-testing-examples">multivariate testing</a>, A/B testing is the practice of splitting your audience to test variations of a product design, new feature, call to action, landing page – anything you can imagine, really.</p><p>There are dozens of A/B testing tools available, but what they offer varies widely. Many lean toward marketing use cases (i.e. testing website landing pages) and aren&#x27;t useful for product feature testing, or only support specific platforms like Shopify or WordPress.</p><p>In this guide, we&#x27;re looking at the best free and open-source A/B testing tools. Open-source tools are mainly built for developers, so we recommend marketers read our guide to the best <a href="/blog/best-vwo-alternatives">alternatives to VWO</a>.</p><h2 id="what-features-do-you-need-in-an-open-source-ab-testing-tool">What features do you need in an open-source A/B testing tool?</h2><p>A good open-source A/B testing tool lets you experiment with changes to your product and measure their impact on real users without locking you into a proprietary platform. Most solid tools include:</p><ul><li>A/B and multivariate testing for comparing different variations</li><li>Statistical analysis to determine when results are significant</li><li>Feature flags for safely rolling out changes to specific user segments</li><li>SDKs for your stack (JavaScript, Python, React, mobile, etc.)</li><li>Self-hosting options so you keep full control of your data</li></ul><p>More advanced tools go further with:</p><ul><li><strong>Bayesian and Frequentist statistics</strong> so you can choose the approach that fits your team&#x27;s workflow</li><li><strong>Multi-armed bandit experiments</strong> that automatically allocate traffic to the winning variation</li><li><strong>Holdout groups</strong> to measure the long-term cumulative impact of your experiments</li><li><strong>Visual editors</strong> for creating variations without code changes</li><li><strong>Warehouse-native architecture</strong> that connects directly to your existing data infrastructure</li><li><strong>Product analytics integration</strong> so you can analyze experiment results alongside broader user behavior</li></ul><p>Here&#x27;s how the most popular open-source A/B testing tools compare:</p><h2 id="1-posthog">1. PostHog</h2><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2026_02_17_at_08_43_32_2x_aa22220b10.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2026_02_17_at_08_43_06_2x_49e3ebc85d.png" classes="rounded" alt="PostHog Experiments"></div><p><a href="/">PostHog</a> is an all-in-one developer platform that integrates a <a href="/experiments">comprehensive A/B testing suite</a> with <a href="/products">many other tools</a>, such as <a href="/product-analytics">Product Analytics</a>, <a href="/feature-flags">Feature Flags</a>, <a href="/session-replay">Session Replay</a>, <a href="/error-tracking">Error Tracking</a>, and more. It&#x27;s designed for product-minded engineers, growth teams, and product managers who need to move fast and iterate based on reliable, actionable insights.</p><p><a href="/docs/experiments">PostHog’s experimentation suite</a> supports multivariate experiments, and targeting by geography, user cohorts, and person properties – all of which is built atop PostHog&#x27;s multivariate <a href="/docs/feature-flags">feature flags</a>. PostHog supports both Bayesian and Frequentist statistical approaches, so you can choose the method that fits your team&#x27;s workflow.</p><h3 id="who-is-posthog-for">Who is PostHog for?</h3><p>PostHog is ideal for product teams and engineers, particularly those who don&#x27;t want to assemble a complicated stack of analytics tools. As an all-in-one platform, PostHog includes everything a team needs to measure user behavior, test new features, and roll them out. It&#x27;s also one of the <a href="/blog/best-open-source-session-replay-tools">best open-source session replay tools</a> available.</p><h3 id="features-and-benefits">Features and benefits</h3><ul><li>A/B and multivariate testing</li><li>Unlimited experiments</li><li>Multivariate feature flags</li><li>Bayesian and Frequentist statistics engines</li><li>Full product analytics suite</li><li>Ability to select segments for experiments</li><li>Event pipelines for integration with data warehouses</li><li>Traffic visualization with user path analysis</li></ul><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>Experiments are billed under feature flag requests, which are <a href="/pricing">free up to 1 million requests</a> per month alongside 1 million analytics events and 5,000 session recordings. After the free monthly allowance, you&#x27;ll pay $0.0001/request, and requests cost progressively less the more you use. You can set billing limits to ensure you don&#x27;t get surprise bills. </p><p>While PostHog is open source, its A/B testing features aren&#x27;t included in the open source release – you&#x27;ll need the free cloud tier to access them.</p><blockquote><h4 id="bottom-line">Bottom line</h4><p>For teams looking for all the tools they need to experiment and improve their products, PostHog is a great choice. This is especially true for startups and scaleups thanks to its generous free tier.</p></blockquote><p><strong>Further reading:</strong> New to A/B testing? Read <a href="/blog/ab-testing-guide-for-engineers">a software engineer&#x27;s guide to A/B testing</a> and our guide to <a href="/blog/ab-testing-mistakes">common A/B testing mistakes</a>. Looking for mobile testing tools? See our guide to the <a href="/blog/best-mobile-app-ab-testing-tools">best mobile app A/B testing tools</a>.</p><p><div></div></p><h2 id="2-growthbook">2. GrowthBook</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-testing-tools/growthbook.png" alt="GrowthBook - best open source ab testing tools"/></p><p><a href="/blog/posthog-vs-growthbook">GrowthBook</a> is an <a href="/blog/best-open-source-feature-flag-tools">open-source platform for feature flags</a> and A/B tests that helps teams to deploy code efficiently and analyze experiments. Built by engineers who wanted better insights on new releases, it is a modular solution that promotes feature flagging as an essential step in the development process. This means it can be used as a full-stack platform, a plugin feature flagging tool, or an analysis engine.</p><h3 id="who-is-growthbook-for">Who is GrowthBook for?</h3><p><a href="/blog/best-growthbook-alternatives">GrowthBook</a> is built for data, engineering, and product teams who need the power of a customizable platform without having to build it in house.</p><h3 id="features-and-benefits-1">Features and benefits</h3><ul><li>Warehouse-native architecture – connects directly to BigQuery, Redshift, Snowplow, and more</li><li>Both Bayesian and Frequentist statistics engines with CUPED variance reduction</li><li>Visual A/B test editor for no-code experiments (Pro plan)</li><li>Multi-arm bandits and safe rollouts (Pro plan)</li><li>Lightweight SDKs for speed</li><li>Easy to implement – no need for data or engineering resources</li><li>Self-hosted and managed options available</li></ul><h3 id="how-much-does-growthbook-cost">How much does GrowthBook cost?</h3><p>GrowthBook open source (MIT license) is free and includes unlimited experiments. Their cloud Starter plan is free for up to 3 users with unlimited experiments. The Pro cloud plan costs $40 per user per month and adds advanced statistics (CUPED, sequential testing), a visual A/B test editor, and multi-arm bandits.</p><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>GrowthBook is the best choice for data and engineering teams that already have a data warehouse and want to run experiments on top of their existing infrastructure. Its warehouse-native approach means you never have to send raw user data to a third party.</p></blockquote><h2 id="3-unleash">3. Unleash</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-testing-tools/img2_Unleash.png" alt="Unleash - best open source ab testing tools"/></p><p><strong>Unleash</strong> is a feature management platform that provides an overview of all features across your applications and services. The platform empowers engineering teams to implement A/B tests via feature toggles and offers accurate user targeting. It&#x27;s particularly popular with privacy-conscious organizations since it doesn&#x27;t require you to share user data with third parties.</p><p>You can use Unleash to define the rules of your experiments, but the platform doesn’t provide all the tools you need to manage A/B tests end-to-end. Instead, you&#x27;ll need to connect your experiment with an analytics platform like PostHog, <a href="/blog/posthog-vs-ga4">Google Analytics</a> or <a href="/blog/posthog-vs-mixpanel">Mixpanel</a> in order to visualize results.</p><h3 id="who-is-unleash-for">Who is Unleash for?</h3><p>Unleash is for autonomous development teams who want a lightweight way to test, validate, and rollout new features safely.</p><h3 id="features-and-benefits-2">Features and benefits</h3><ul><li>Accurate user targeting</li><li>Fast toggle evaluation, so performance issues are spotted fast</li><li>Extensive APIs</li><li>25+ official SDKs covering all major languages and frameworks</li><li>Privacy-first architecture (no user PII leaves your infrastructure)</li><li>Integrations with Jira, <a href="/blog/best-datadog-alternatives">Datadog</a>, Microsoft Teams, and Slack</li><li>Self-hosted and managed service available</li></ul><h3 id="how-much-does-unleash-cost">How much does Unleash cost?</h3><p>Unleash&#x27;s open source self-hosted plan is free with unlimited feature flags and experiments. A self-service Enterprise plan starts at $75 per seat per month with a 5-seat minimum, available as cloud-hosted or self-hosted. Custom Enterprise pricing is available for teams that want annual contracts and dedicated support.</p><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>Unleash is the best open-source option for teams that primarily need feature flag management and want to add basic A/B testing on top.</p></blockquote><h2 id="4-mojito">4. Mojito</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/mojito_6bd820c223.webp" alt="Mojito - best open source ab testing tools"/></p><p><strong>Mojito</strong> is an open source split testing stack that lets you build, launch, and analyze experiments via Git/CI. The stripped-down tool consists of three modular components – a front-end library for bucketing users and tracking them, data models and events for fast reporting, and reporting templates and functions, so you can build your own visualizations for experiment analysis.</p><p>It&#x27;s worth noting that Mojito is maintained by a small consultancy and has a slower development cadence than the other tools on this list. That said, its simplicity is part of the appeal – it&#x27;s a lightweight, dependency-free option for teams that want full source control over their testing stack.</p><h3 id="who-is-mojito-for">Who is Mojito for?</h3><p>Mojito is a fully source-controlled stack for developers and technical product teams who want a simple solution with unlimited customization.</p><h3 id="strengths">Strengths</h3><ul><li>Simple APIs and unlimited customization</li><li>No need for 3rd party analytics</li><li>~5kb front-end library for minimal page load impact</li><li>Error tracking and handling</li><li>No account required – deploy from your own infrastructure</li><li>Lightweight solution for optimized page load speed</li></ul><h3 id="how-much-does-mojito-cost">How much does Mojito cost?</h3><p>Mojito is completely free and open source, and you don’t need an account to get started. It&#x27;s distributed under a BSD 3-clause license.</p><h2 id="5-flagsmith">5. Flagsmith</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-testing-tools/img4_Flagsmith.png" alt="Flagsmith - best open source ab testing tools"/></p><p><a href="/blog/best-flagsmith-alternatives">Flagsmith</a> is an open-source feature flag and remote configuration service that lets you manage features across mobile, web and server-side applications. You can use Flagsmith’s multivariate flags as a bucketing engine to place users into testing buckets and control the specific user experience that is being tested. Flagsmith doesn’t provide analytics for multivariate tests, however, so you’ll need to use a third-party provider to receive the stream of event data derived from the behavior of the user.</p><h3 id="who-is-flagsmith-for">Who is Flagsmith for?</h3><p>Flagsmith is targeted at data-driven front end and user experience teams who want to increase efficiency in their feature development.</p><h3 id="features-and-benefits-3">Features and benefits</h3><ul><li>Manage flags across multiple platforms</li><li>Powerful segmenting rules</li><li>Integrations with a number of popular analytics platforms</li><li>Remote configuration allows you to toggle features without changing code</li><li>On-premises hosting for maximum infrastructure control</li><li>Integrations with Amplitude, Heap, Mixpanel, and more for analytics</li></ul><h3 id="how-much-does-flagsmith-cost">How much does Flagsmith cost?</h3><p>Flagsmith is open source and available on a BSD 3-clause license.  It can be hosted entirely on-premises with pricing available on request. Their cloud free plan includes up to 50,000 requests per month for 1 team member with unlimited flags, environments, and segments. The Start-Up cloud plan is $45 per month for up to 1 million requests.</p><h2 id="which-open-source-ab-testing-tool-should-you-choose">Which open-source A/B testing tool should you choose?</h2><ul><li>Want an all-in-one platform that integrates A/B testing with product analytics, session replays, feature flags, and more? Go with <strong>PostHog</strong>.</li><li>Already have a data warehouse and want to run experiments on top of your existing data? Choose <strong>GrowthBook</strong>.</li><li>Primarily need feature flag management with basic A/B testing and a privacy-first architecture? <strong>Unleash</strong> is your best bet.</li><li>Need open-source feature flags with remote configuration and on-premises hosting? Try <strong>Flagsmith</strong>.</li><li>Want a minimalist, fully source-controlled split testing stack with zero vendor dependencies? <strong>Mojito</strong> is for you.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think you&#x27;ll love PostHog if:</p><ul><li>You value transparency (we&#x27;re open source and open core)</li><li>You want tools to ship, track, and analyze new features – like A/B testing, feature flags, and session replays</li><li>You want try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>)</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is the best free A/B testing tool?</summary><p>It depends on what you need. </p><p><strong>PostHog</strong> is the best option for product teams that want experimentation alongside product analytics, session replay, and feature flags in one platform – its free tier includes 1 million feature flag requests per month. </p><p><strong>GrowthBook</strong> is the best choice for teams that already have a data warehouse and want a dedicated, warehouse-native experimentation tool – it&#x27;s completely free to self-host with no limits. If you&#x27;re looking for more options beyond open source, check out our guide to the <a href="/blog/best-mobile-app-ab-testing-tools">best mobile app A/B testing tools</a>.</p></details><details><summary>What&#x27;s the difference between feature flags and A/B testing?</summary><p><a href="/docs/feature-flags">Feature flags</a> let you toggle features on or off for specific users without deploying new code. <a href="/docs/experiments">A/B testing</a> uses feature flags to randomly split users into groups (variants) and then measures which variant performs better against a goal metric. </p><p>In practice, most A/B testing tools on this list – <strong>PostHog</strong>, <strong>GrowthBook</strong>, <strong>Unleash</strong>, <strong>Flagsmith</strong> – are built on top of a feature flagging engine. The distinction matters because tools like <strong>Unleash</strong> and <strong>Flagsmith</strong> are primarily feature flag tools that can be <em>used</em> for A/B testing, while <strong>PostHog</strong> and <strong>GrowthBook</strong> provide end-to-end experimentation with built-in statistical analysis.</p></details><details><summary>Is GrowthBook really free?</summary><p>Yes, with caveats. GrowthBook&#x27;s self-hosted open-source version (MIT license) is genuinely free with unlimited users, experiments, and feature flags. The cloud-hosted Starter plan is free for up to 3 users. If you need advanced features like CUPED variance reduction, a visual editor, or multi-arm bandits, you&#x27;ll need the Pro plan at $40/user/month.</p></details><details><summary>Can you do A/B testing without code?</summary><p>Some tools on this list offer visual editors that let you set up web experiments without writing code. <strong>GrowthBook</strong> includes a visual A/B test editor on its Pro plan. For fully no-code A/B testing, you&#x27;ll likely want a marketing-focused tool like <a href="/blog/best-vwo-alternatives">VWO</a> or <a href="/blog/best-optimizely-alternatives">Optimizely</a> instead, though these are neither free nor open source.</p><p>You can also use a <a href="/blog/ai-is-killing-no-code-experiments">combination of an AI agent and MCP to help you do this</a>.</p></details><details><summary>Do I need a separate analytics tool with open-source A/B testing?</summary><p>It depends on the tool. <strong>PostHog</strong> includes full product analytics alongside experimentation, so you don&#x27;t need anything else. <strong>GrowthBook</strong> is warehouse-native and pulls experiment results from your existing data warehouse, so you&#x27;ll need an analytics pipeline already in place. <strong>Unleash</strong> and <strong>Flagsmith</strong> are primarily feature flag tools – you&#x27;ll need a separate analytics platform (like PostHog, Google Analytics, or Mixpanel) to analyze your experiment results. <strong>Mojito</strong> includes its own reporting templates but requires you to set up a data storage layer.</p></details><details><summary>What&#x27;s the difference between Bayesian and Frequentist A/B testing?</summary><p>These are two statistical approaches for analyzing experiment results. </p><ul><li><p><strong>Frequentist</strong> testing uses p-values and confidence intervals – you define a sample size upfront, run the test, and check if results are statistically significant at the end. </p></li><li><p><strong>Bayesian</strong> testing calculates the probability that one variant is better than another and updates continuously as data comes in, making it easier to interpret mid-experiment.</p></li></ul><p><strong>PostHog</strong> and <strong>GrowthBook</strong> support both approaches. Most other open-source tools on this list don&#x27;t include built-in statistical analysis at all – you&#x27;ll need to calculate significance yourself or use a separate tool.</p></details><details><summary>Can I self-host an A/B testing tool?</summary><p>Yes – that&#x27;s one of the main advantages of open-source A/B testing tools. <strong>GrowthBook</strong> offer both cloud and self-hosted options with full experimentation features. <strong>Unleash</strong> and <strong>Flagsmith</strong> can be self-hosted for free with their open-source editions. <strong>Mojito</strong> is self-hosted only. Self-hosting gives you complete control over your data, which is particularly important for teams with strict privacy requirements or regulatory compliance needs.</p></details><h2 id="further-reading">Further reading</h2><ul><li><a href="/blog/best-mobile-app-ab-testing-tools">The best mobile app A/B testing tools</a></li><li><a href="/blog/ab-testing-guide-for-engineers">A software engineer&#x27;s guide to A/B testing</a></li><li><a href="/blog/ab-testing-mistakes">Common A/B testing mistakes</a></li><li><a href="/blog/best-open-source-feature-flag-tools">The best open-source feature flag tools</a></li><li><a href="/blog/posthog-vs-growthbook">PostHog vs. GrowthBook</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The 9 best mobile app A/B testing tools]]></title><description><![CDATA[A/B tests are a great way to confirm that your product changes have the intended effects. When it comes to mobile apps, there are many different A/B…]]></description><link>https://posthog.com/blog/best-mobile-app-ab-testing-tools</link><guid isPermaLink="false">9fbaf5ad-943f-53f6-a9c4-4d45657139fe</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/open-source-testing-tools/testinghog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>A/B tests are a great way to confirm that your product changes have the intended effects. When it comes to mobile apps, there are many different A/B testing tools to choose from, but each one is built with a specific target audience in mind.</p><p>In this guide, we compare the 9 best mobile app A/B testing tools – from all-in-one platforms to specialized solutions – so you can find the right fit for your team.</p><h2 id="what-features-do-you-need-in-a-mobile-app-ab-testing-tool">What features do you need in a mobile app A/B testing tool?</h2><p>A good mobile A/B testing tool lets you experiment with changes to your app and measure their impact on real users. Most solid tools include:</p><ul><li>A/B and multivariate testing for comparing different variations</li><li>Statistical analysis to determine when results are significant</li><li>Mobile SDKs for iOS, Android, React Native, and Flutter</li><li>Integration with analytics to measure experiment impact on key metrics</li><li>Feature flags for safely rolling out changes to specific user segments</li></ul><p>More advanced tools go further with:</p><ul><li><strong>Multi-armed bandit experiments</strong> that automatically allocate traffic to the winning variation</li><li><strong>Holdout testing</strong> to measure the long-term cumulative impact of your experiments</li><li><strong>Visual editors</strong> for creating variations without code changes</li><li><strong>Server-side testing</strong> for experiments that need to run on your backend</li><li><strong>Bayesian vs. Frequentist statistical approaches</strong> for analyzing experiment results</li><li><strong>Namespacing</strong> for organizing experiments and avoiding conflicts</li><li><strong>Product analytics integration</strong> so you can analyze experiment results alongside broader user behavior</li></ul><p>Here&#x27;s how the most popular mobile app A/B testing tools compare:</p><h2 id="1-posthog">1. PostHog</h2><ul><li><strong>Best for:</strong> Engineering and product teams</li></ul><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2026_02_17_at_08_43_32_2x_aa22220b10.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/w_1600,c_limit,q_auto,f_auto/Clean_Shot_2026_02_17_at_08_43_06_2x_49e3ebc85d.png" classes="rounded" alt="PostHog ab testing"></div><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="/">PostHog</a> (that&#x27;s us!) is an all-in-one developer platform built to help engineers create better products. It includes <a href="/experiments">experimentation</a> and a whole bunch more, such as <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replays</a>, <a href="/feature-flags">feature flags</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, and an <a href="/ai">AI assistant</a>.</p><p>Because everything lives in a single platform, you can launch an experiment, deploy it behind a feature flag, see how it impacts funnels or retention, and watch session replays of how users in each variant actually behave – without stitching together separate tools or juggling data exports.</p><p>It&#x27;s designed for product-minded engineers, growth teams, and product managers who need to move fast and iterate based on reliable, actionable insights.</p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Open source:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Transparent pricing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Includes product analytics:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="which-platforms-does-posthog-support">Which platforms does PostHog support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔</td></tr><tr><td>Server</td><td>✔</td></tr></tbody></table><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog has <a href="/pricing">transparent pricing</a> based on the usage. It&#x27;s free to get started and completely free for the first 1 million A/B testing requests. After this free monthly allowance, you&#x27;ll pay $0.0001/request, and requests cost progressively less the more you use. You can also set billing limits to ensure you don&#x27;t get surprise bills. </p><p><strong>Further reading:</strong> New to A/B testing? Read <a href="/blog/ab-testing-guide-for-engineers">a software engineer&#x27;s guide to A/B testing</a> and our guide to <a href="/blog/ab-testing-mistakes">common A/B testing mistakes</a>.</p><blockquote><h4 id="bottom-line">Bottom line</h4><p>For teams looking for all the tools they need to experiment and improve their products, PostHog makes for a great choice. This is especially true for startups and scaleups thanks to its generous free tier.</p></blockquote><p><div></div></p><h2 id="2-vwo">2. VWO</h2><ul><li><strong>Best for:</strong> Non-technical teams</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/vwo-testing.png" alt="VWO mobile app A/B tests"/></p><h3 id="what-is-vwo">What is VWO?</h3><p><a href="/blog/best-vwo-alternatives">VWO</a> is a testing platform that primarily targets large enterprises. Its experimentation platform includes support for A/B and multivariate tests and a visual editor. It&#x27;s useful for non-technical users who need an easy-to-use interface to test in-app messaging and UI copy.</p><p>It also offers surveys and behavioral insights (heatmaps, session recordings), plus limited product analytics like funnels. However, its analytics capabilities are basic compared to dedicated tools – most teams will still want a separate product analytics platform for deeper analysis.</p><ul><li><strong>Free tier:</strong> <span class="text-red text-lg">✖</span> Free trial only</li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Includes product analytics:</strong> Limited</li><li><strong>Get started without talking to sales:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="which-platforms-does-vwo-support">Which platforms does VWO support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔</td></tr><tr><td>Server</td><td>✔</td></tr></tbody></table><h3 id="how-much-does-vwo-cost">How much does VWO cost?</h3><p>VWO uses custom, usage-based pricing based on Monthly Tracked Users (MTUs). Web testing, mobile app testing, server-side testing (feature experimentation), behavior analytics, and personalization are all separate products with their own pricing. VWO offers a 30-day free trial but no permanent free tier. You&#x27;ll need to contact their sales team for a quote.</p><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>VWO is great for marketing and product teams who want an easy-to-use visual editor for running experiments without coding. However, its pricing is opaque, and its analytics features are limited compared to <a href="/blog/best-product-analytics-tools-for-startups">dedicated product analytics tools</a>.</p></blockquote><h2 id="3-optimizely">3. Optimizely</h2><ul><li><strong>Best for:</strong> Marketing teams</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/optimizely-testing.png" alt="Optimizely mobile app A/B tests"/></p><h3 id="what-is-optimizely">What is Optimizely?</h3><p><a href="/blog/posthog-vs-optimizely">Optimizely</a> is an all-in-one system for marketing that includes A/B testing <strong>and</strong> more – like content management, campaign planning, asset management, and checkout customizations. </p><p>It&#x27;s built for marketers in large enterprises looking to optimize their content, apps, and e-commerce experiences.</p><ul><li><strong>Free tier:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Includes product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-red text-lg">✖</span></li></ul><h3 id="which-platforms-does-optimizely-support">Which platforms does Optimizely support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔</td></tr><tr><td>Server</td><td>✔</td></tr></tbody></table><h3 id="how-much-does-optimizely-cost">How much does Optimizely cost?</h3><p>Optimizely&#x27;s pricing is sales-driven and not publicly listed. According to <a href="https://splitbase.com/blog/optimizely-pricing">Splitbase</a>, plans start at a minimum of $36,000 per year, with enterprise plans potentially exceeding $200,000+ depending on traffic and features. Only annual contracts are available.</p><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>Optimizely is a powerful enterprise experimentation platform, but it comes with enterprise pricing to match. It&#x27;s best suited for large marketing teams with big budgets who need content management alongside A/B testing. If you&#x27;re primarily looking for mobile app experimentation, there are more affordable and focused options on this list.</p></blockquote><h2 id="4-firebase">4. Firebase</h2><ul><li><strong>Best for:</strong> Apps already using Firebase&#x27;s other features</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/firebase.png" alt="Firebase mobile app A/B tests"/></p><h3 id="what-is-firebase-ab-testing">What is Firebase A/B testing?</h3><p>Firebase A/B testing is built specifically for mobile apps and is completely free. It includes an easy to use interface for running experiments on Firebase&#x27;s other app features, such as cloud messaging and in-app messaging. </p><p>It&#x27;s important to note that using A/B testing on Firebase requires installing <a href="/blog/posthog-vs-ga4">Google Analytics</a> in your app. It&#x27;s also not possible to run A/B tests on your web app or server.</p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span> </li><li><strong>Transparent pricing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Includes product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="which-platforms-does-firebase-support">Which platforms does Firebase support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✖ (not officially supported; community libraries exist)</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✖</td></tr><tr><td>Server</td><td>✖</td></tr></tbody></table><h3 id="how-much-does-firebase-ab-testing-cost">How much does Firebase A/B testing cost?</h3><p>A/B testing with Firebase is completely free. </p><blockquote><h4 id="bottom-line-3">Bottom line</h4><p>Firebase A/B testing is the best free option if you&#x27;re already in the Firebase ecosystem. It&#x27;s limited to mobile and tightly coupled to Firebase&#x27;s other services, so it&#x27;s not ideal if you need cross-platform experimentation.</p></blockquote><h2 id="5-kameleoon">5. Kameleoon</h2><ul><li><strong>Best for:</strong> E-commerce and healthcare companies</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/kameleoon.png" alt="Kameleoon mobile app A/B tests"/></p><h3 id="what-is-kameleoon">What is Kameleoon?</h3><p>Kameleoon is an experimentation and personalization platform with support for both web and mobile apps. It includes an easy to use interface for running experiments on push notifications and in-app messaging. </p><p>In addition to testing, it offers a real-time personalization engine that&#x27;s particularly useful for e-commerce apps. It&#x27;s also <a href="/blog/best-hipaa-compliant-ab-testing-tools">HIPAA-compliant</a>, which makes Kameleoon a viable option for healthcare apps.</p><ul><li><strong>Free tier:</strong> <span class="text-red text-lg">✖</span> Free trial only</li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> Partial</li><li><strong>Includes product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-red text-lg">✖</span></li></ul><h3 id="which-platforms-does-kameleoon-support">Which platforms does Kameleoon support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔</td></tr><tr><td>Server</td><td>✔</td></tr></tbody></table><h3 id="how-much-does-kameleoon-cost">How much does Kameleoon cost?</h3><p>Kameleoon&#x27;s Starter plan begins at $495 per month, which includes web experimentation features. Enterprise plans with mobile app testing, feature management, and advanced capabilities like SSO and CUPED are custom-priced. Kameleoon offers a free trial.</p><blockquote><h4 id="bottom-line-4">Bottom line</h4><p>Kameleoon is a solid pick for e-commerce and healthcare teams that need HIPAA compliance and real-time personalization alongside experimentation. However, mobile app testing is locked behind custom enterprise pricing, so it&#x27;s not the most accessible option for smaller teams.</p></blockquote><h2 id="6-statsig">6. Statsig</h2><ul><li><strong>Best for:</strong> Product teams in high-growth startups</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/statsig.png" alt="Statsig mobile app A/B tests"/></p><h3 id="what-is-statsig">What is Statsig?</h3><p><a href="/blog/best-statsig-alternatives">Statsig</a> is a platform built for feature management and experimentation. It offers feature flags, A/B testing, and product analytics.</p><p>It offers advanced experimentation techniques, such as multi-armed bandit experiments and <a href="/tutorials/holdout-testing">holdout testing</a>, making it well suited for growth teams in startups.</p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong>  <span class="text-green text-lg">✔</span></li><li><strong>Includes product analytics:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="which-platforms-does-statsig-support">Which platforms does Statsig support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔</td></tr><tr><td>Server</td><td>✔</td></tr></tbody></table><h3 id="how-much-does-statsig-cost">How much does Statsig cost?</h3><p>Statsig&#x27;s Developer tier is free with 2 million events per month. The Pro tier costs $150 per month with 5 million events included, and additional events cost $0.05 per 1,000. Enterprise plans offer volume discounts and custom pricing.</p><blockquote><h4 id="bottom-line-5">Bottom line</h4><p>Statsig is a great choice for growth-focused engineering teams who want advanced experimentation with transparent, usage-based pricing. Its unlimited free feature flags are a standout.</p></blockquote><h2 id="7-launchdarkly">7. LaunchDarkly</h2><ul><li><strong>Best for:</strong> Engineering and product teams</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/launch-darkly.png" alt="LaunchDarkly mobile app A/B tests"/></p><h3 id="what-is-launchdarkly">What is LaunchDarkly?</h3><p><a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a> is built for enterprises wanting to follow software development best practices. This means A/B testing changes, managing features, de-risking releases, and coordinating deploys.</p><p>The people who find LaunchDarkly most useful are engineering managers, site reliability engineers, and product managers. </p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Includes product analytics:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="which-platforms-does-launchdarkly-support">Which platforms does LaunchDarkly support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔</td></tr><tr><td>Server</td><td>✔</td></tr></tbody></table><h3 id="how-much-does-launchdarkly-cost">How much does LaunchDarkly cost?</h3><p>LaunchDarkly offers a free Developer tier for small projects, which includes A/B tests and experiments. The Foundation plan starts at $12 per service connection and $10 per 1k client-side MAU per month, which includes feature flags, experimentation, and limited client-side MAU. Enterprise and Guardian plans have custom pricing.</p><blockquote><h4 id="bottom-line-6">Bottom line</h4><p>LaunchDarkly is the go-to for engineering teams who need enterprise-grade feature flag management and want to add experimentation on top. It&#x27;s feature-flag-first, not experiment-first.</p></blockquote><h2 id="8-ab-tasty">8. AB Tasty</h2><ul><li><strong>Best for:</strong> Marketing and product teams who want experimentation with built-in personalization</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_16_T21_00_27_581_Z_41eb4ccf00.png" alt="AB Tasty"/></p><h3 id="what-is-ab-tasty">What is AB Tasty?</h3><p>AB Tasty is a digital experience optimization platform used by thousands of brands. It combines A/B testing, multivariate testing, feature flagging, and personalization into a single platform. Its server-side experimentation product (Flagship) supports mobile app testing through dedicated SDKs, while its client-side tools cover web experimentation with a visual, no-code editor.</p><ul><li><strong>Free tier:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Includes product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-red text-lg">✖</span></li></ul><h3 id="which-platforms-does-ab-tasty-support">Which platforms does AB Tasty support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔</td></tr><tr><td>Server</td><td>✔</td></tr></tbody></table><h3 id="how-much-does-ab-tasty-cost">How much does AB Tasty cost?</h3><p>AB Tasty uses custom pricing, you&#x27;ll need to contact their sales team for a quote. There&#x27;s no free tier, but a free trial is available.</p><blockquote><h4 id="bottom-line-7">Bottom line</h4><p>AB Tasty is a strong choice for teams that want experimentation and personalization in one platform, especially if you have marketers who need to run web experiments independently. Mobile app testing is handled through their Flagship SDKs, which support all major platforms.</p></blockquote><h2 id="9-apptimize">9. Apptimize</h2><ul><li><strong>Best for:</strong> Product teams in large enterprises</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/apptimize.png" alt="Apptimize mobile app A/B tests"/></p><h3 id="what-is-apptimize">What is Apptimize?</h3><p>Apptimize focuses on A/B testing for mobile apps and is now part of Airship&#x27;s customer experience platform. It supports cross-platform testing and feature management with SDKs for all major mobile platforms, plus server-side support.</p><ul><li><strong>Free tier:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Includes product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Get started without talking to sales:</strong> <span class="text-red text-lg">✖</span></li></ul><h3 id="which-platforms-does-apptimize-support">Which platforms does Apptimize support?</h3><table><thead><tr><th>Platform</th><th>Supported</th></tr></thead><tbody><tr><td>iOS</td><td>✔</td></tr><tr><td>Android</td><td>✔</td></tr><tr><td>React Native</td><td>✔</td></tr><tr><td>Flutter</td><td>✔</td></tr><tr><td>Web</td><td>✔ (JavaScript)</td></tr><tr><td>Server</td><td>✔ (Java, Node.js, Python)</td></tr></tbody></table><h3 id="how-much-does-apptimize-cost">How much does Apptimize cost?</h3><p>Apptimize don&#x27;t share their pricing publicly. You need to ask sales for a custom quote.</p><blockquote><h4 id="bottom-line-8">Bottom line</h4><p>Apptimize is an option for enterprise teams already using Airship for customer engagement. For most teams, other tools on this list offer more value and transparency.</p></blockquote><h2 id="which-mobile-app-ab-testing-tool-should-you-choose">Which mobile app A/B testing tool should you choose?</h2><ul><li>Want an all-in-one platform that integrates A/B testing with product analytics, session replays, feature flags, error tracking and more, without stitching together multiple tools? Go with <strong>PostHog</strong>.</li><li>Non-technical team that needs an easy-to-use interface for running mobile experiments without heavy developer involvement? Choose <strong>VWO</strong>.</li><li>Enterprise marketing team with a large budget that needs content management alongside experimentation? Consider <strong>Optimizely</strong>.</li><li>Already using Firebase for backend services and want free, mobile-only A/B testing? Stick with <strong>Firebase</strong>.</li><li>E-commerce or healthcare company that needs HIPAA compliance and AI-powered personalization? <strong>Kameleoon</strong> is built for you.</li><li>High-growth engineering team that wants advanced experimentation with multi-armed bandits and holdout testing? Choose <strong>Statsig</strong>.</li><li>Engineering team that needs enterprise-grade feature flag management with experiments on top? <strong>LaunchDarkly</strong> is the standard.</li><li>Marketing and product team that wants experimentation with built-in personalization? Try <strong>AB Tasty</strong>.</li><li>Enterprise team already using Airship for customer engagement? <strong>Apptimize</strong> integrates with your stack.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think you&#x27;ll love PostHog if:</p><ul><li>You value transparency (we&#x27;re open source and open core)</li><li>You want tools to ship, track, and analyze new features – like A/B testing, feature flags, and session replays</li><li>You want try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>)</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="faq">FAQ</h2><details><summary>What is mobile app A/B testing?</summary><p><strong>Mobile app A/B testing</strong> is the process of comparing two or more variations of an app experience or feature to determine which one performs better against a defined goal. You split your users into groups, show each group a different variation, and measure which one drives better (statistically significant) results – like more signups, higher retention, or increased revenue.</p><p>Unlike web A/B testing where you can deploy changes instantly, mobile experiments often need to work with app store release cycles. Tools like <strong>PostHog</strong> and <strong>Statsig</strong> handle this through feature flags, which let you change what users see without shipping a new app version.</p></details><details><summary>What&#x27;s the difference between client-side and server-side A/B testing?</summary><p>Both approaches make requests to a server to determine which variation a user sees — the difference is where that request happens.</p><p><strong>Client-side testing</strong> makes the request from the app or browser. It&#x27;s easier to set up, but can cause &quot;flicker&quot; as the UI updates after the response comes back. Tools like <strong>VWO</strong> offer visual editors for this approach on web.</p><p><strong>Server-side testing</strong> makes the request from your backend (e.g. a Django or Node service) before sending anything to the client, which eliminates flicker. It&#x27;s better for testing algorithms, pricing logic, API responses, and anything involving backend changes. Tools like <strong>PostHog</strong>, <strong>Statsig</strong>, and <strong>LaunchDarkly</strong> support this approach.</p><p>Most mobile teams need server-side testing because mobile apps can&#x27;t be updated instantly like websites — you need <a href="/docs/feature-flags">feature flags</a> to control which variation users see without waiting for an app store review. You can also use techniques like <a href="/docs/feature-flags/bootstrapping">bootstrapping</a> and <a href="/docs/feature-flags/local-evaluation">local evaluation</a> to reduce latency and avoid flicker on the client side.</p></details><details><summary>How do feature flags relate to A/B testing?</summary><p><a href="/docs/feature-flags">Feature flags</a> and <a href="/docs/experiments">A/B tests</a> are closely related. A feature flag controls whether a user sees a specific feature or variation. An A/B test uses feature flags to randomly assign users to different groups and then measures which group performs better.</p><p>In practice, most modern A/B testing tools (like <strong>PostHog</strong>, <strong>Statsig</strong>, and <strong>LaunchDarkly</strong>) build their experimentation features on top of feature flags. This means you can start with a simple feature flag rollout and then upgrade it to a full experiment when you want to measure impact.</p></details><details><summary>How long should I run a mobile A/B test?</summary><p>Long enough to reach statistical significance – typically 1-4 weeks depending on your traffic volume and the size of the effect you&#x27;re trying to detect. Running a test too short risks false positives (seeing a difference that doesn&#x27;t exist). Running it too long wastes time and delays shipping improvements.</p><p>Most A/B testing tools (including <strong>PostHog</strong> and <strong>Statsig</strong>) can calculate the recommended sample size and duration before you start your experiment. </p></details><details><summary>What are multi-armed bandit experiments?</summary><p>A <strong>multi-armed bandit</strong> is an experiment that automatically shifts traffic toward the winning variation as results come in, rather than splitting traffic equally for the full duration. This means you lose less revenue or engagement to the underperforming variation while still measuring statistical significance.</p><p><strong>Statsig</strong> and <strong>Kameleoon</strong> offer multi-armed bandit experiments. They&#x27;re particularly useful for time-sensitive tests (like promotional campaigns) where you don&#x27;t want to wait weeks for results before acting.</p></details><details><summary>Can I A/B test push notifications?</summary><p>Yes. <strong>Firebase</strong> has built-in support for testing push notification content, timing, and targeting through Cloud Messaging experiments.</p><p>For more custom approaches, you can use a general-purpose A/B testing tool like <strong>PostHog</strong> or <strong>Statsig</strong> to control which notification variant a user receives through feature flags, then measure the downstream impact on engagement and retention.</p></details><details><summary>How do iOS privacy restrictions affect mobile A/B testing?</summary><p>Apple&#x27;s App Tracking Transparency (ATT) framework primarily impacts marketing attribution – tracking which ad drove an install. A/B testing within your own app is largely unaffected because it uses first-party data (you&#x27;re testing variations within your own app, not tracking users across other apps).</p><p>However, if your A/B test relies on identifying users across devices or linking to external data, ATT restrictions may apply. Stick to first-party identifiers (like your own user IDs) and you&#x27;ll be fine for in-app experiments.</p></details><details><summary>What&#x27;s the best free mobile A/B testing tool?</summary><p><strong>Statsig</strong> offers 2 million free events per month and free feature flags. <strong>Firebase A/B testing</strong> is completely free with no usage limits, but it&#x27;s limited to mobile (iOS, Android, Flutter) and requires Google Analytics. <strong>PostHog</strong> offers 1 million A/B testing requests free per month with full cross-platform support. <strong>LaunchDarkly</strong> has a free Developer tier for small projects.</p><p>The best choice depends on your needs: <strong>Firebase</strong> for free and simple, <strong>PostHog</strong> or <strong>Statsig</strong> for free with more advanced features and broader platform support.</p><p>You can also check out our roundup of the <a href="/blog/best-open-source-ab-testing-tools">best free and open-source A/B testing tools</a>.</p></details><details><summary>What are the best AB Tasty alternatives for experimentation?</summary><p>If you&#x27;re evaluating AB Tasty alternatives, the best option depends on what your team needs. </p><ul><li><strong>PostHog</strong> is a strong alternative if you want experimentation, <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replays</a>, and <a href="/feature-flags">feature flags</a> in a single platform with transparent pricing and a generous free tier. </li><li><strong>Optimizely</strong> is a good fit for enterprises that need advanced personalization and full-stack testing. </li><li><strong>VWO</strong> is another option for teams focused on web and mobile experimentation with behavior analytics. </li><li><strong>Statsig</strong> is worth considering if statistical rigor and warehouse-native architecture are priorities. For simpler mobile-only needs.</li><li><strong>Firebase A/B Testing</strong> is free and integrates with the Google ecosystem.</li></ul></details><details><summary>How is PostHog different from other mobile A/B testing tools?</summary><p><strong>PostHog</strong> is more than a mobile A/B testing tool. It gives developers full context by combining all the tools needed to build a successful product in one platform – with a single SDK for mobile.</p><ul><li><strong>All-in-one toolkit:</strong> <a href="/product-analytics">Product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/logs">logs</a>, <a href="/workflows">workflows</a>, and more.</li><li><strong>Built for mobile:</strong> Native iOS and Android SDKs with offline event queuing, gesture tracking, and <a href="/blog/best-mobile-app-session-replay-tools">mobile session replay</a></li><li><strong>Developer-first:</strong> Transparent APIs, <a href="/docs/product-analytics/sql">SQL query builder</a>, open source, and a <a href="/roadmap">public roadmap</a></li><li><strong>Transparent pricing:</strong> Generous free tiers and <a href="/pricing">usage-based billing</a></li><li><strong>Trusted by teams:</strong> Used by <a href="/customers">20,000+ companies</a> including Y Combinator startups, scale-ups, and enterprises</li></ul><p>Also check out our guide to the <a href="/blog/best-mobile-app-analytics-tools">best mobile app analytics tools</a> if you&#x27;re evaluating your full analytics stack.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What is a feature flag (and how it compares to remote config and A/B testing)]]></title><description><![CDATA[Feature flags, remote config, and A/B testing all exist because deploying changes to everyone is, more often than not, a terrible idea. Thoughts and…]]></description><link>https://posthog.com/blog/what-is-a-feature-flag</link><guid isPermaLink="false">c8fea496-a775-597c-a414-812911e9caab</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/experiment-hog.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_16_T23_17_31_744_Z_c463b5b6de.png" alt="Feature Flags vs Remote Config vs A/B Testing"/></p><p>Feature flags, remote config, and A/B testing all exist because deploying changes to everyone is, more often than not, a terrible idea.</p><p>Thoughts and prayers will only get you so far. Sometimes you need a kill switch, sometimes you need to tweak a value without redeploying, and sometimes you need actual data to settle the argument. Sometimes you need all three.</p><p>The tricky part is knowing which tool to reach for, because they sound similar, they overlap in places, and can be built on top of each other.</p><p>This guide breaks down what feature flags, remote configs, and A/B tests actually do, when to use them, and how they work together in PostHog – where all three are built on the same infrastructure, share the same data, and ship under one SDK.</p><h2 id="what-is-a-feature-flag">What is a feature flag?</h2><p>A <a href="/docs/feature-flags">feature flag</a> (also called a feature toggle) is a conditional switch in your code that controls whether a user sees a specific feature. At its simplest, it&#x27;s an <code>if</code> statement that checks a remote value instead of a hardcoded boolean – letting you turn features on or off without deploying new code.</p><pre><code class="language-js">if (posthog.isFeatureEnabled(&#x27;flag-key&#x27;) ) {
  // Do something differently for this user
}
</code></pre><p>Feature flags can be simple booleans (on/off) or multivariate (returning one of several variants). They&#x27;re the foundation for controlled rollouts, kill switches, and internal testing – and in PostHog, they&#x27;re also the infrastructure that powers <a href="/docs/feature-flags/remote-config">remote config</a> and <a href="/experiments">A/B testing</a>.</p><p>The core job of a feature flag is to <strong><a href="/product-engineers/decouple-deployment-from-release">separate deployment from release</a></strong>. You merge code to production whenever it&#x27;s ready, and control who sees it – and when – through the flag.</p><p>In PostHog, feature flags support percentage-based rollouts (ship to 5% of users, then 25%, then everyone), targeting based on <a href="/docs/product-analytics/person-properties">person</a>or <a href="/docs/product-analytics/group-analytics">group</a> properties as well as <a href="/docs/data/cohorts">cohorts</a>. You can also have a flag return a payload with data in any valid JSON type.</p><p><strong>When to use feature flags:</strong></p><ul><li><strong>Progressive rollouts</strong> – Ship to a small group, monitor for issues, then expand. This is the classic <a href="/tutorials/canary-release">canary release</a> pattern.</li><li><strong>Kill switches</strong> – Instantly disable a broken feature without rolling back a deployment. No hotfix, no deploy, no waiting.</li><li><strong>Internal testing</strong> – Release to your team first (set email contains <code>@yourcompany.com</code>), then to beta users, then to everyone.</li><li><strong>Operational toggles</strong> – Maintenance mode, circuit breakers, or infrastructure controls that stay permanent.</li></ul><p><a href="/product-engineers/feature-flag-benefits-use-cases">Feature flags have a lot of uses</a>, but measuring impact isn&#x27;t one of them. They let you turn something on and off, but, on their own they won&#x27;t tell you whether &quot;on&quot; is actually good. That&#x27;s when you pair them with <a href="/docs/product-analytics">analytics</a> and <a href="/docs/experiments">experiments</a>.</p><blockquote><p><strong>Good to know:</strong> PostHog <a href="/docs/feature-flags">feature flags</a> support web, mobile, and server-side SDKs. Flag evaluations tie directly into <a href="/product-analytics">product analytics</a>, so you can filter any insight, funnel, or <a href="/docs/session-replay">session replay</a> by flag value without extra setup. You can also deploy <a href="/docs/surveys">surveys</a> targeting a specific feature flag to collect qualitative feedback alongside your rollout.</p></blockquote><h2 id="what-is-remote-config">What is remote config?</h2><p><a href="/docs/feature-flags/remote-config">Remote config</a> lets you change configuration values in your app without deploying new code. In PostHog, it works by attaching a payload to a feature flag – a small JSON value that your app reads at runtime.</p><p>Think of it as a key-value store that lives outside your codebase. Instead of hardcoding a timeout value, API endpoint, or button label, you pull it from the flag payload and update it from the PostHog dashboard whenever you want.</p><p>This is especially valuable for <strong>mobile apps</strong>, where changes otherwise require an app store review that can take 24-48 hours. Remote config lets you adjust behavior immediately.</p><p><strong>When to use remote config:</strong></p><ul><li><strong>Mobile app configuration</strong> – Change themes, copy, or layouts without waiting for App Store or Play Store approval. We have tutorials for <a href="/tutorials/ios-remote-config">iOS</a>, <a href="/tutorials/android-remote-config">Android</a>, <a href="/tutorials/react-native-remote-config">React Native</a>, and <a href="/tutorials/flutter-remote-config">Flutter</a>.</li><li><strong>Parameter tuning</strong> – Adjust timeouts, rate limits, retry counts, or thresholds without a deploy.</li><li><strong>API endpoint switching</strong> – Point your app at a different backend for testing or failover.</li><li><strong>Environment-specific values</strong> – Different settings for development, staging, and production.</li><li><strong>Copy and UI changes</strong> – Update marketing messages, onboarding text, or button labels on the fly.</li></ul><p>PostHog supports both encrypted and unencrypted payloads. Encrypted payloads are useful when you don&#x27;t want users inspecting config values in network requests.</p><p>One important caveat: remote config in PostHog isn&#x27;t real-time. Changes take effect when the app refreshes or when the SDK re-fetches flags. And you should keep payloads small and intentional – the more config values you externalize, the harder your system becomes to reason about.</p><blockquote><p><strong>A word of caution:</strong> Remote config is powerful, but it can easily become a second settings system nobody fully understands. Keep payloads small and intentional – if a value hasn&#x27;t changed in six months, it probably belongs in your codebase.</p></blockquote><h2 id="what-is-ab-testing">What is A/B testing?</h2><p><a href="/experiments">A/B testing</a> (or experimentation) is about answering a specific question: does variant A perform better than variant B?</p><p>In PostHog, experiments are built on top of feature flags. You create a flag with variants, add experiment tracking on top, and PostHog handles random assignment, event tracking, and statistical significance calculation automatically.</p><p>The key difference from a regular feature flag is that experiments add <strong>measurement</strong>. You define a goal metric (conversion rate, revenue, engagement), PostHog splits users randomly between variants, and you get a statistically rigorous answer about which version wins.</p><p><strong>When to use A/B testing:</strong></p><ul><li><strong>Conversion optimization</strong> – Does the new checkout flow actually convert better, or does it just look nicer?</li><li><strong>Feature validation</strong> – Before investing in a full rollout, test whether the feature moves the metrics you care about.</li><li><strong>UI/UX testing</strong> – Compare different layouts, copy, or design patterns against real engagement data.</li><li><strong>Pricing experiments</strong> – Test different price points with statistical confidence before committing.</li><li><strong>Growth experiments</strong> – Acquisition, activation, or <a href="/docs/product-analytics/retention">retention</a> campaigns where you need evidence, not opinions.</li></ul><p>A/B testing requires sufficient traffic to reach statistical significance. If you&#x27;re only getting a handful of conversions per week, you&#x27;ll be waiting a long time for results. PostHog&#x27;s experiment dashboard shows estimated sample sizes and will tell you when results are significant.</p><blockquote><p><strong>How it works in PostHog:</strong> When you create an <a href="/docs/experiments">experiment</a>, PostHog creates a feature flag underneath with the variants you define. Experiment evaluations are billed under your <a href="/pricing">feature flag</a> quota – there&#x27;s no separate experimentation meter. You get a dedicated experiment dashboard with automatic significance calculations and the ability to drill into <a href="/session-replay">session replays</a> for each variant.</p></blockquote><h2 id="how-they-compare">How they compare</h2><p>Here&#x27;s a quick reference for when you&#x27;re deciding which tool to reach for:</p><table><thead><tr><th></th><th>Feature flags</th><th>Remote config</th><th>A/B testing</th></tr></thead><tbody><tr><td><strong>Core job</strong></td><td>Control who sees what</td><td>Change values without deploying</td><td>Measure which variant wins</td></tr><tr><td><strong>Best for</strong></td><td>Rollouts, kill switches, canary releases</td><td>Mobile config, parameter tuning, copy changes</td><td>Conversion optimization, feature validation</td></tr><tr><td><strong>Analytics needed?</strong></td><td>Optional (but helpful)</td><td>Not required</td><td>Essential – the whole point</td></tr><tr><td><strong>Statistical rigor</strong></td><td>None</td><td>None</td><td>Built-in significance testing</td></tr><tr><td><strong>PostHog implementation</strong></td><td>Boolean/multivariate flags with targeting</td><td>Payloads attached to flags</td><td>Flags + experiment analytics</td></tr><tr><td><strong>Billing</strong></td><td>Per flag request (1M free/month)</td><td>Counted in flag quota</td><td>Counted in flag quota</td></tr></tbody></table><p><div to="https://posthog.com/docs">Learn more about using PostHog</div></p><h2 id="the-overlap-and-where-teams-go-wrong">The overlap (and where teams go wrong)</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/pasted_image_2026_02_16_T23_09_35_518_Z_3f7dc759d5.png" alt="Feature Flags vs Remote Config vs A/B Testing"/></p><p>These three tools share infrastructure, which is part of why they&#x27;re confusing. In PostHog, remote config is literally a payload on a flag, and an A/B test is literally a flag with experiment tracking bolted on. But using one where you need another creates real problems.</p><p><strong>Using feature flags when you need an experiment.</strong> You roll out a new checkout flow to 50% of users with a flag and eyeball the conversion rates in <a href="/product-analytics">product analytics</a>. The numbers look better, so you ship it to everyone. But you didn&#x27;t control for statistical significance, and the difference was actually random noise. An experiment would have told you that.</p><p><strong>Using remote config as a feature flag system.</strong> You start storing more and more behavior in config payloads – not just colors and copy, but entire feature toggles and business logic. Now you have a distributed settings system that&#x27;s harder to debug than the code it replaced. Feature flags with proper targeting rules would have been cleaner.</p><p><strong>Using A/B tests for simple rollouts.</strong> You want to release a bug fix to a subset of users. You don&#x27;t need to measure anything – you just want to control who gets it. Setting up a full experiment with goal metrics and statistical tracking is overkill. A feature flag does the job.</p><h2 id="posthogs-unified-approach">PostHog&#x27;s unified approach</h2><p>The reason PostHog bundles all three capabilities is that they&#x27;re most useful when they share data. Feature flags tied to <a href="/product-analytics">product analytics</a> tell you what happened after a rollout. Experiments connected to <a href="/session-replay">session replay</a> show you <em>why</em> one variant outperformed another. Remote config tracked in the same event stream lets you correlate config changes with metric shifts.</p><p>Here&#x27;s what that looks like in practice:</p><p><strong>Single SDK, single data pipeline.</strong> You install one SDK and get flags, config, and experiments. Every flag evaluation, config fetch, and experiment assignment flows into the same <a href="/data-stack">data warehouse</a> alongside your analytics events, session recordings, and <a href="/error-tracking">error tracking</a> data.</p><p><strong>Experiments inherit flag targeting.</strong> Because PostHog experiments are built on feature flags, you get all the same targeting capabilities: person and group properties, cohorts, percentage rollouts. And you can go from &quot;rolling out a feature&quot; to &quot;running an experiment on that feature&quot; by adding experiment tracking to an existing flag.</p><p><strong>One bill.</strong> Feature flag requests, remote config fetches, and experiment evaluations all count toward the same quota. You get <a href="/pricing">1M flag requests free per month</a>, and everything after that is $0.0001 per request. No separate experiment pricing, no surprise bills from a tool you forgot about.</p><p><strong>Shared analytics context.</strong> Filter any <a href="/docs/product-analytics/funnels">funnel</a>, <a href="/docs/product-analytics/trends">trend</a>, or <a href="/docs/product-analytics/paths">path analysis</a> by feature flag value. Watch session replays filtered by experiment variant. Create <a href="/docs/data/cohorts">cohorts</a> based on flag exposure and track their behavior over time.</p><p>This matters because the alternative – stitching together a feature flag service, an experimentation platform, and an analytics tool – creates data integration work that never ends. </p><p>You&#x27;re constantly mapping user IDs across systems, reconciling event timestamps, and building pipelines to answer questions that should be simple. Not fun (and a waste of time, if you ask me).</p><h2 id="practical-decision-framework">Practical decision framework</h2><p>When you&#x27;re staring at a product change and wondering which tool to use, run through this:</p><p><strong>&quot;I need to control who sees this change.&quot;</strong> → <a href="/feature-flags">Feature flag</a>. Progressive rollout, kill switch, internal testing, beta access – all flags.</p><p><strong>&quot;I need to change a value without deploying.&quot;</strong> → <a href="/docs/feature-flags/remote-config">Remote config</a>. Especially for mobile apps, operational parameters, or environment-specific settings.</p><p><strong>&quot;I need to know if this change actually improves something.&quot;</strong> → <a href="/experiments">A/B test</a>. Set up an experiment with a clear goal metric and let the data tell you.</p><p><strong>&quot;I need to roll out a change AND measure its impact.&quot;</strong> → Use both. Feature flag for the rollout, experiment for the measurement.In PostHog, experiments are built on feature flags – so you get rollout control and measurement in one. Adjust the rollout the same way you would any flag.</p><p><strong>&quot;I need to adjust a value AND measure which value works best.&quot;</strong> → Remote config for the mechanism, A/B test for the measurement. Test different timeout values, price points, or copy variations.</p><h2 id="limitations-to-know-about">Limitations to know about</h2><p>PostHog is transparent about where its feature management capabilities have gaps, and it&#x27;s worth knowing before you commit:</p><ul><li><strong>Not real-time.</strong> Flag changes and config updates require a page or app refresh to take effect. PostHog SDKs <a href="/docs/feature-flags/local-evaluation">handle polling automatically</a>, but changes won&#x27;t be instant.</li><li><strong>No CUPED or mutex groups.</strong> If you&#x27;re running sophisticated experiments at scale – variance reduction techniques, overlapping experiment isolation – PostHog doesn&#x27;t support these yet.</li><li><strong>Dynamic cohort targeting limitations.</strong> You can&#x27;t target flags to cohorts with dynamic attributes (like &quot;users who did X in the last 7 days&quot;), only static, which can be limiting for behavioral targeting use cases.</li></ul><p>For many teams – especially engineering-led startups and growth-stage companies – these trade-offs are fine. You get flags, experiments, config, <a href="/product-analytics">analytics</a>, <a href="/session-replay">session replay</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/logs">logs</a>, <a href="/llm-analytics">LLM observability</a>, and a lot more in one platform with a generous free tier. If you need enterprise governance or advanced experimentation features, tools like <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a> or <a href="/blog/posthog-vs-statsig">Statsig</a> <a href="/blog/best-feature-flag-software-for-developers">may be better fits for those specific needs</a>.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>Can I use feature flags and experiments at the same time?</summary><p>Yes – this is actually the recommended workflow. Use a feature flag for the controlled rollout, then add experiment tracking to measure impact. In <strong>PostHog</strong>, experiments are built on feature flags, so it&#x27;s the same flag with analytics layered on top. All usage counts under a single flag request quota.</p></details><details><summary>How quickly can I set up all three?</summary><p>Feature flags and remote config both take minutes – install the <a href="/docs/libraries">PostHog SDK</a>, create a flag, and you&#x27;re live. Remote config just adds a payload to the flag. Experiments take a little longer because you need a goal metric defined, but you can use <a href="/docs/product-analytics/autocapture">autocaptured events</a> right away – one of the perks of having analytics and experimentation in the same platform. No separate integration setup.</p></details><details><summary>How does PostHog handle statistical significance?</summary><p>PostHog tracks exposures for each variant, calculates goal metrics across experiment groups, and uses either <a href="/docs/experiments/statistics-bayesian">Bayesian</a> or frequentist statistics to determine whether the differences are statistically significant. The experiment dashboard shows results in real time and estimates how long an experiment needs to run based on your traffic. PostHog doesn&#x27;t currently support advanced techniques like CUPED for variance reduction, but covers the fundamentals well for most teams.</p></details><details><summary>Is remote config the same as feature flags?</summary><p>Not exactly. In <strong>PostHog</strong>, remote config is a payload attached to a feature flag – so it uses the same infrastructure. But the intent is different. A feature flag controls <em>whether</em> something is on or off. Remote config controls <em>what value</em> something has. A flag might say &quot;show the new pricing page.&quot; Remote config on that flag might say &quot;set the price to $29/month.&quot; </p><p>See our <a href="/product-engineers/feature-flags-vs-configuration">guide on feature flags vs configuration</a> for a deeper dive.</p></details><details><summary>What if I don&#x27;t have enough traffic for A/B testing?</summary><p>Statistical significance requires a minimum sample size, and low-traffic products may wait weeks or months for results. If you&#x27;re in this situation, consider testing higher-impact changes (which need smaller sample sizes to detect), running tests on higher-traffic pages, or using qualitative methods like <a href="/session-replay">session replays</a> and <a href="/surveys">surveys</a> alongside your experiments.</p></details><details><summary>Can I migrate from LaunchDarkly or another feature flag tool?</summary><p>Yes. <strong>PostHog</strong>&#x27;s feature flag SDK is straightforward to adopt incrementally – you can start by creating new flags in PostHog while keeping existing ones in your current tool, then migrate over time. The <a href="/docs/feature-flags">feature flags documentation</a> covers setup for every major platform.</p><p>We also have a dedicated <a href="/docs/migrate/launchdarkly">LaunchDarkly migration guide</a> if you want to move everything at once. </p></details><details><summary>What are the best A/B testing tools in 2026?</summary><p>The top A/B testing tools in 2026 include:</p><ul><li><strong><a href="/experiments">PostHog</a></strong> – Best for engineering-led teams that want experimentation, feature flags, analytics, session replay and more in one platform</li><li><strong>GrowthBook</strong> – Best open-source option for teams that want warehouse-native experimentation with advanced statistical methods</li><li><strong>Statsig</strong> – Best for teams running high-volume experiments that need CUPED variance reduction and sequential testing</li><li><strong>Optimizely</strong> – Best for enterprise teams needing advanced personalization alongside experimentation</li><li><strong>VWO</strong> – Best for CRO and marketing teams wanting a visual editor with solid statistical rigor</li><li><strong>LaunchDarkly</strong> – Best for teams that prioritize feature flag management and want experimentation as an add-on</li></ul><p>For more alternatives, see our guide to the <a href="/blog/best-open-source-ab-testing-tools">best open-source A/B testing tools</a>.</p></details><details><summary>What are the best feature flag tools in 2026?</summary><p>The top feature flag tools in 2026 include:</p><ul><li><strong><a href="/feature-flags">PostHog</a></strong> – Best for teams that want feature flags integrated with product analytics, experiments, session replay, and more in one platform</li><li><strong>LaunchDarkly</strong> – Best for enterprise teams needing advanced governance, approval workflows, and broad SDK support</li><li><strong>Flagsmith</strong> – Best open-source feature flag tool for teams that need self-hosting with remote config</li><li><strong>GrowthBook</strong> – Best for data teams that want feature flags tightly coupled with warehouse-native experimentation</li><li><strong>Statsig</strong> – Best for teams that want free unlimited feature flags alongside advanced experimentation</li><li><strong>DevCycle</strong> – Best for teams wanting low-latency edge-based flag evaluation</li></ul><p>For a deeper comparison, see our guide to the <a href="/blog/best-feature-flag-software-for-developers">best feature flag software for developers</a>.</p></details><h2 id="further-reading">Further reading</h2><ul><li><a href="/docs/feature-flags/canary-release">How to do a canary release with feature flags</a></li><li><a href="/product-engineers/ab-testing-examples">A/B testing examples from real companies</a></li><li><a href="/product-engineers/ab-testing-guide-for-engineers">A software engineer&#x27;s guide to A/B testing</a></li><li><a href="/blog/how-we-improved-feature-flags-resiliency">How we improved feature flag resiliency</a></li><li><a href="/tutorials/flags-adblock-prevention">How to prevent feature flags from being blocked</a></li></ul><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog is now available in Vercel’s v0]]></title><description><![CDATA[We've released a  brand new PostHog × Vercel integration . That integration made the setup intentionally boring. Flags and experiments are defined in…]]></description><link>https://posthog.com/blog/posthog-v0-integration</link><guid isPermaLink="false">f074d706-53d1-5ec5-afaa-49e63a37c63c</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/v0_cover_62a4b51598.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We&#x27;ve released a <a href="/blog/vercel-integration">brand new PostHog × Vercel integration</a>. That integration made the setup intentionally boring. Flags and experiments are defined in PostHog, synced into Vercel’s native Flags system, credentials are handled automatically, and your app simply consumes them via the Flags SDK.</p><p>That integration focuses on how flags and experiments run in production. Now, we’re extending the same product context into <a href="https://v0.app/">Vercel&#x27;s v0 via MCP</a>, so it’s available while you’re building.</p><p><div mediaId="13hp4af5cc"></div></p><h2 id="what-you-can-do-with-posthog-in-v0">What you can do with PostHog in v0</h2><p>v0 can build directly on real codebases, enabling teams to ship production-ready apps and <a href="/newsletter/building-ai-agents">agents</a> rather than prototypes or toy projects.</p><p>With PostHog as a partner, v0 doesn’t just generate code against your repository – it can do so with an understanding of how your product actually behaves in production. It has access to experiment results, user behavior patterns, feature flag state, and error impact, which means the software you generate reflects real product data rather than assumptions about how the product should work.</p><p>There&#x27;s so much you can do with PostHog in v0 that we asked our Growth team what types of prompts they&#x27;d start with.</p><h3 id="act-based-on-experiment-results">Act based on experiment results</h3><p>When iterating on onboarding or activation flows, existing experiments often already contain the answer to “which direction should we take.” With PostHog connected, v0 can reference experiment data and use it as context when generating UI, so new designs reflect what has already been tested in production.</p><p><strong>Suggested prompt:</strong></p><blockquote><p>Based on the onboarding experiment testing long vs short signup, show me the metrics and then generate a signup flow aligned with the winning variant.</p></blockquote><p><strong>Insights from our Growth team:</strong> You can use this when redesigning signup or pricing pages. For example, if a shorter signup form improved completion rate but reduced activation, that tells you friction wasn’t the only issue. You might keep the shorter form but strengthen the first-run experience, add clearer value framing, or tailor the flow by acquisition channel instead of treating all users the same.</p><h3 id="turn-ideas-into-multivariate-flags">Turn ideas into multivariate flags</h3><p>Product changes are rarely binary. v0 can help turn a concrete idea into a properly structured multivariate feature flag that matches PostHog’s experiment model, making it ready to roll out and measure without additional setup.</p><p><strong>Suggested prompt:</strong></p><blockquote><p>Create a multivariate feature flag in PostHog for our new ‘Quick Actions’ button. Variant A is yellow, variant B is green.</p></blockquote><p><strong>Insights from our Growth team:</strong> Use this for things like CTA color, button placement, or dashboard layout variations. Instead of debating whether a brighter button “feels more clickable,” you can ship both versions behind a multivariate flag and measure downstream impact. Not just clicks, but whether users actually complete the next meaningful action.</p><h3 id="ask-product-questions-and-act-on-the-answers">Ask product questions and act on the answers</h3><p>Understanding what users do often comes down to a few focused questions. v0 can run trends, funnels, and HogQL queries in PostHog and surface the results directly, so decisions about flows or copy are informed by actual usage rather than assumptions.</p><p><strong>Suggested prompt:</strong> </p><blockquote><p>Show me a funnel from page view to signup, broken down by referral source.</p></blockquote><p><strong>Insights from our Growth team:</strong> You can use this when evaluating campaign traffic. If paid users convert differently from organic users, you could generate different landing page variants tailored to intent. It’s also helpful before rewriting homepage copy – if most drop-offs happen before pricing is even viewed, the issue likely isn’t the pricing table.</p><h3 id="find-drop-offs-and-close-the-loop">Find drop-offs and close the loop</h3><p>Identifying where users drop off is only useful if it leads to follow-up. With PostHog in v0, you can move directly from analysis to targeted feedback, without stitching together multiple tools.</p><p><strong>Suggested prompt:</strong> </p><blockquote><p>Find my worst-performing funnel, then create a survey targeting users who dropped off asking what went wrong.</p></blockquote><p><strong>Insights from our Growth team:</strong> You can use this for onboarding steps with unexplained friction. If users consistently abandon at, for example, “Connect your first integration,” you can automatically trigger a short survey for that segment and ask whether it’s confusion, missing documentation, or lack of perceived value. That feedback can immediately shape the next iteration.</p><h3 id="create-and-summarize-surveys">Create and summarize surveys</h3><p>Qualitative feedback is most useful when patterns are clear. v0 can help create surveys and then group responses by theme once data starts coming in, making it easier to move from raw feedback to concrete next steps.</p><p><strong>Suggested prompt:</strong> </p><blockquote><p>Create an open-text survey asking users: &#x27;What&#x27;s the one thing you&#x27;d change about our product?&#x27; and target it to users who&#x27;ve been active for at least 30 days.</p></blockquote><p><strong>Insights from our Growth team:</strong> Try to use this after launches or major UI changes. Instead of manually reading hundreds of open-text responses, look for recurring themes like “navigation confusion” or “missing export options.” That will make it easier to prioritize fixes based on frequency and impact rather than on the loudest individual comment. Once survey responses come in, use a follow-up prompt to pull survey stats and identify the most common themes.</p><h3 id="debug-anticipating-user-impact">Debug anticipating user impact</h3><p>Errors are easier to prioritize when they’re tied to user impact. v0 can query error data from PostHog so investigation starts with which issues affect the most users, not just which ones appeared most recently.</p><p><strong>Suggested prompt:</strong></p><blockquote><p>Show me the top errors affecting the most users this week, and any new errors that appeared after yesterday’s deploy.</p></blockquote><p><strong>Insights from our Growth team:</strong> This should be useful after releases. If a new deploy introduced an error affecting, let&#x27;s say, 15% of active users in a critical flow, that takes priority over a rare edge-case bug. It will also help you connect technical issues to real user journeys – for example, whether the error blocks upgrade, onboarding, or core usage.</p><h3 id="keep-llm-costs-visible">Keep LLM costs visible</h3><p>When building AI features, cost trends matter as much as functionality. v0 can surface model-level spend from PostHog so usage decisions are based on actual data rather than surprises at the end of the month.</p><p><strong>Suggested prompt:</strong> </p><blockquote><p>Which LLM model is costing me the most this week, and how is the spend trending?</p></blockquote><p><strong>Insights from our Growth team:</strong> This comes handy when testing different models for AI-powered features. If GPT-4-level performance doesn’t meaningfully improve user outcomes compared to a cheaper model, that’s an immediate optimization opportunity. </p><hr/><p>Product data is most useful when it shows up at the moment decisions are made. With PostHog available in v0, you can build agents, features, and experiments with real context in mind instead of assumptions. Check it out: <a href="https://v0.app/">v0.app</a></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best Heap alternatives & competitors, compared]]></title><description><![CDATA[Heap  made its name with autocapture – install a snippet, start collecting everything, define events later. It's a powerful approach, especially for…]]></description><link>https://posthog.com/blog/best-heap-alternatives</link><guid isPermaLink="false">60b8acca-a3ca-53f1-8781-b7e6248efac9</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-alternatives/posthog-alternatives.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="/blog/posthog-vs-heap">Heap</a> made its name with autocapture – install a snippet, start collecting everything, define events later. It&#x27;s a powerful approach, especially for teams without dedicated data engineering resources.</p><p>But autocapture alone doesn&#x27;t help you ship better products. Heap doesn&#x27;t include feature flags, A/B testing, or error tracking, for example; its session replay lacks developer debugging tools, and key features like group analytics require a sales conversation.</p><p>If you&#x27;ve outgrown Heap or need more from your analytics stack, this guide compares the best alternatives – whether you want a similar tool or a full platform for building better products.</p><h2 id="1-posthog">1. PostHog</h2><ul><li><strong>Founded:</strong> 2020</li><li><strong>Similar to:</strong> Heap, Amplitude</li><li><strong>Typical users:</strong> Engineers and product teams</li><li><strong>Typical customers:</strong> Mid-size B2Bs and startups</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/hogflix-dashboard.png" alt="posthog"/></p><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="/">PostHog</a> (that&#x27;s us 👋) is an all-in-one platform combining <a href="/product-analytics">product analytics</a>, <a href="/error-tracking">error tracking</a>, <a href="/session-replay">session replays</a>, <a href="/web-analytics">web analytics</a>, <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</a>, <a href="/surveys">user surveys</a>, <a href="/llm-analytics">LLM observability</a>,<a href="/logs">logs</a>, and more into one product. This means it&#x27;s not just an alternative to Heap, but also tools like <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a> and <a href="/blog/posthog-vs-logrocket">LogRocket</a>.</p><p>Typical PostHog users are engineers and product managers at startups and mid-size companies, particularly B2B companies. Customers include <a href="/customers/supabase">Supabase</a>, <a href="/customers/lovable">Lovable</a>, <a href="/customers/elevenlabs">ElevenLabs</a>, and <a href="/customers">see all customers</a>.</p><h3 id="key-features">Key features</h3><ul><li><p><strong>Product analytics:</strong> <a href="/docs/product-analytics/funnels">Funnels</a>, <a href="/docs/product-analytics/paths">user paths</a>, <a href="/docs/product-analytics/retention">retention analysis</a>, custom trends, and dynamic user cohorts. Also supports SQL insights for power users.</p></li><li><p><strong>Session replays:</strong> Including event timelines, console logs, and network activity, and 90-day data retention.</p></li><li><p><strong>Feature flags:</strong> Release features to specific users safely with <a href="/docs/feature-flags/local-evaluation">local evaluation</a> (for faster performance) and JSON payloads.</p></li><li><p><strong>A/B tests:</strong> Up to 9 test variations, primary and secondary metrics. Automatically calculate <a href="/docs/experiments/testing-and-launching">test duration, sample size,</a> and <a href="/docs/experiments/analyzing-results">statistical significance</a>.</p></li><li><p><strong>Surveys:</strong> Target surveys by event or person properties. <a href="/templates">Templates</a> for Net Promoter Score (NPS), product-market fit (PMF) surveys, and more.</p></li><li><p><strong>Error tracking:</strong> <a href="/docs/error-tracking/issues-and-exceptions">Monitor exceptions</a>, <a href="/docs/error-tracking/stack-traces">stack traces</a>, and crashes – connected directly to session replays, user behavior, and feature flag changes.</p></li><li><p><strong>Data warehouse</strong> to import and query data from external sources like <a href="/docs/cdp/sources/stripe">Stripe</a>, <a href="/docs/cdp/sources/zendesk">Zendesk</a>, <a href="/docs/cdp/sources/hubspot">Hubspot</a>, or your existing warehouse – analyze business and product data together.</p></li></ul><h3 id="how-does-posthog-compare-to-heap">How does PostHog compare to Heap?</h3><p>PostHog is the most direct like-for-like alternative to Heap.</p><p>Unlike Mixpanel and Amplitude, PostHog supports event autocapture, which means it starts capturing data from the moment you deploy PostHog&#x27;s code.</p><p>You can also <a href="/tutorials/how-to-capture-events-the-easy-way">create and label events using the PostHog toolbar</a>. This is similar to Heap&#x27;s visual labeling feature, though it&#x27;s only supported on web apps.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Self-serve</strong><div class="text-sm text-secondary mt-1">No need to talk to sales</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">Tag events or view insights on your live website or app with an overlay</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between PostHog and Heap</summary><ul><li>PostHog includes <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, and <a href="/llm-analytics">LLM analytics</a>; Heap doesn&#x27;t offer any of these natively.</li><li>PostHog&#x27;s session replay includes console logs, network monitoring, DOM explorer, and performance metrics; Heap&#x27;s replay is simpler and lacks developer debugging tools.</li><li>PostHog includes a built-in <a href="/data-warehouse">data warehouse</a> for importing and querying external data from <a href="/docs/cdp/sources/stripe">Stripe</a>, <a href="/docs/cdp/sources/hubspot">Hubspot</a>, <a href="/docs/cdp/sources/zendesk">Zendesk</a>, and more; Heap imports user context via &quot;Sources&quot; (Salesforce, Marketo, Segment, etc.) but queries happen within Heap&#x27;s UI rather than via SQL.</li><li>PostHog offers <a href="/docs/product-analytics/sql">SQL access</a> for custom queries; Heap doesn&#x27;t support direct SQL querying.</li><li>PostHog is open-source; Heap is closed-source and cloud-only.</li></ul></details><details><summary>Main similarities between PostHog and Heap</summary><ul><li>Both support event autocapture that starts collecting data immediately after installation.</li><li>Both include product analytics with funnels, retention charts, user paths, and cohorts.</li><li>Both support heatmaps for understanding where users click and scroll.</li><li>Both support group analytics for account-level analysis in B2B products.</li><li>Both offer data warehouse exports — Heap Connect syncs to Snowflake, BigQuery, Redshift, and S3; PostHog exports to S3, BigQuery, Snowflake, and Redshift via batch exports.</li></ul></details><h3 id="why-do-companies-use-posthog">Why do companies use PostHog?</h3><p>According to <a href="https://www.g2.com/products/posthog/reviews">reviews on G2</a>, companies use PostHog because:</p><ol><li><p><strong>It replaces multiple tools:</strong> PostHog can replace Heap (product analytics), LaunchDarkly (feature flags and A/B testing), and Hotjar (session replay and surveys). This simplifies workflows and ensures all their data is in one place.</p></li><li><p><strong>Pricing is transparent and scalable:</strong> Reviewers appreciate how PostHog&#x27;s pricing scales as they grow. There&#x27;s a <a href="/pricing">generous free tier</a>. Companies eligible for <a href="/startups">PostHog for Startups</a> also get $50k in additional free credits.</p></li><li><p><strong>They need a complete picture of users:</strong> PostHog includes every tool necessary to understand users and improve products. This means creating funnels to track conversion, watching replays to see where users get stuck, testing solutions with A/B tests, and gathering feedback with user surveys.</p></li></ol><blockquote><h4 id="bottom-line">Bottom line</h4><p>PostHog offers product analytics with autocapture, session replay, and a visual labeling tool for creating events. This, combined with additional features like feature flags, A/B testing, and surveys, makes it an excellent like-for-like replacement for Heap.</p></blockquote><p><div></div></p><h2 id="2-fullstory">2. FullStory</h2><ul><li><strong>Founded:</strong> 2012</li><li><strong>Most similar to:</strong> PostHog, Glassbox</li><li><strong>Typical users:</strong> Product managers, customer success, and support</li><li><strong>Typical customers:</strong> Online retailers and SaaS companies</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/heap-alternatives/fullstory.png" alt="fullstory"/></p><h3 id="what-is-fullstory">What is FullStory?</h3><p><a href="/blog/best-fullstory-alternatives">FullStory</a> describes itself as Digital Experience Intelligence, which is code for session replay and <a href="/blog/best-mobile-app-analytics-tools">mobile app analytics</a>, with a side of product analytics. Like Heap and PostHog, it supports event autocapture, so you don&#x27;t have to manually code every event you want to capture.</p><h3 id="key-features-1">Key features</h3><ul><li><p><strong>Session replay:</strong> Watch and analyze real user sessions on web and mobile apps.</p></li><li><p><strong>Product analytics:</strong> Understand user paths and struggle points.</p></li><li><p><strong>Event autocapture:</strong> Tagless event capture that ensures all events are tracked.</p></li><li><p><strong>Heatmaps:</strong> Find out where users click and frustration points.</p></li><li><p><strong>Mobile app analytics:</strong> Crash analytics and users path analysis.</p></li></ul><h3 id="how-does-fullstory-compare-to-heap">How does FullStory compare to Heap?</h3><p>FullStory and Heap share a similar feature set – autocapture, product analytics, session replay, and heatmaps – but FullStory leans more toward session replay and user experience debugging, while Heap is stronger on the analytics side with its visual event editor and retroactive event definition.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">FullStory<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-fullstory">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Self-serve</strong><div class="text-sm text-secondary mt-1">No need to talk to sales</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">Tag events or view insights on your live website or app with an overlay</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between FullStory and Heap</summary><ul><li>FullStory&#x27;s core strength is session replay with frustration signals (rage clicks, dead clicks, error clicks); Heap leads with product analytics and retroactive event definition.</li><li>Heap has a visual event editor for non-technical users to tag and define events without code; FullStory doesn&#x27;t offer an equivalent labeling tool.</li><li>Heap offers managed ETL for exporting data to warehouses; FullStory&#x27;s data export options are more limited.</li><li>FullStory is more commonly used by customer success and support teams; Heap is primarily used by product managers.</li><li>Heap&#x27;s free tier is limited to 10,000 sessions/month; FullStory&#x27;s free plan (FullstoryFree) includes 30,000 sessions with 12 months of data retention.</li></ul></details><details><summary>Main similarities between FullStory and Heap</summary><ul><li>Both offer session replay and heatmaps for understanding user behavior.</li><li>Both include product analytics with funnels, user paths, and conversion tracking.</li><li>Both are designed to be accessible to non-technical teams.</li><li>Neither offers feature flags, A/B testing, or surveys natively.</li><li>Both integrate with third-party tools like Segment, Salesforce, and Slack.</li><li>Both are closed-source, cloud-only platforms.</li></ul></details><h3 id="why-do-companies-use-fullstory">Why do companies use FullStory?</h3><p>According to reviews on G2, companies use FullStory for:</p><ol><li><p><strong>Easier collaboration:</strong> As an accessible tool for non-technical users, FullStory facilitates collaboration between product, UX, and engineering teams by allowing all teams to access useful, reliable data.</p></li><li><p><strong>Viewing user issues:</strong> Support teams use FullStory to replay sessions to understand user hard to replicate problems, and identify bugs that need fixing.</p></li><li><p><strong>Improving conversion:</strong> FullStory users like to combine funnel insights with replays of user sessions to understand pain points and improve conversion.</p></li></ol><blockquote><h3 id="bottom-line-1">Bottom line</h3><p>FullStory is a good Heap alternative for non-technical teams, particularly customer success and support teams who need to diagnose user problems. It has superior session replay features, though arguably is less focused on analytics use cases than Heap or PostHog.</p></blockquote><h2 id="3-glassbox">3. Glassbox</h2><ul><li><strong>Founded:</strong> 2010</li><li><strong>Most similar to:</strong> FullStory</li><li><strong>Typical users:</strong> Business analysts, product support</li><li><strong>Typical customers:</strong> Retail and financial services</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/heap-alternatives/glassbox.png" alt="glassbox"/></p><h3 id="what-is-glassbox">What is Glassbox?</h3><p>Glassbox is a session replay and analytics platform with a particular focus on mobile apps and e-commerce use cases. Customers include UK retailer Sainsbury&#x27;s, Marriott, and Experian.</p><p>Unlike Heap, which is mainly used by product managers, G2 suggests Glassbox is predominantly used by business analysts and support teams.</p><h3 id="key-features-2">Key features</h3><ul><li><p><strong>Session replay:</strong> Watch and analyze real user sessions on web and mobile apps.</p></li><li><p><strong>Product analytics:</strong> Understand user paths and struggle points.</p></li><li><p><strong>Performance analytics:</strong> Track app performance and their impact on conversion rates.</p></li><li><p><strong>Click, scroll and heatmaps:</strong> Understand where users interact with your app.</p></li><li><p><strong>User feedback:</strong> Gather satisfaction and user feedback on app experience.</p></li></ul><h3 id="how-does-glassbox-compare-to-heap">How does Glassbox compare to Heap?</h3><p>Glassbox offers similar core features to Heap, including product analytics with autocapture – Glassbox calls it tagless tracking. It doesn&#x27;t offer visual labeling tool, however.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Glassbox</div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Self-serve</strong><div class="text-sm text-secondary mt-1">No need to talk to sales</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">Tag events or view insights on your live website or app with an overlay</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Glassbox and Heap</summary><ul><li>Glassbox includes performance analytics that track app speed and its impact on conversion; Heap doesn&#x27;t offer native performance monitoring.</li><li>Glassbox offers built-in user feedback collection; Heap doesn&#x27;t have native survey or feedback tools.</li><li>Heap has a visual event editor for non-technical users to tag and define events retroactively; Glassbox supports autocapture (tagless tracking) but has no equivalent labeling tool.</li><li>Heap offers managed ETL for exporting data to warehouses like Snowflake and BigQuery; Glassbox&#x27;s data export options are more limited.</li><li>Heap is self-serve with a free tier; Glassbox is sales-driven with no public pricing or free plan.</li><li>Glassbox has a stronger focus on mobile app analytics with native mobile session replay; Heap&#x27;s mobile replay requires its Contentsquare integration.</li></ul></details><details><summary>Main similarities between Glassbox and Heap</summary><ul><li>Both support event autocapture (Glassbox calls it &quot;tagless tracking&quot;) that collects data without manual instrumentation.</li><li>Both offer session replay and heatmaps for understanding user behavior.</li><li>Both include product analytics with funnels, user paths, and conversion tracking.</li><li>Neither offers feature flags, A/B testing, or experiments natively.</li><li>Both are closed-source, cloud-only platforms.</li><li>Both are used to diagnose conversion drop-offs and improve user experience.</li></ul></details><h3 id="why-do-companies-use-glassbox">Why do companies use Glassbox?</h3><p>According to G2 reviews, customers use Glassbox for:</p><ol><li><p><strong>Session replay and error analysis:</strong> Glassbox is best-known for its session replay features, so this is the most popular use case. Customers use Glassbox to analyze user journeys and identify app-breaking bugs.</p></li><li><p><strong>Heatmap and funnel analysis:</strong> Users like the heatmaps feature, which enables them to see user preferences on key pages and use this to visualize user funnels.</p></li><li><p><strong>Fixing low conversion and abandonment:</strong> Glassbox is popular among online retailers, who use it to solve issues around conversion and basket abandonment.</p></li></ol><blockquote><h3 id="bottom-line-2">Bottom line</h3><p>Glassbox is a good Heap alternative for online retailers mostly interested in mobile app analytics and session replay, but SaaS companies should look elsewhere.</p></blockquote><h2 id="4-pendo">4. Pendo</h2><ul><li><strong>Founded:</strong> 2013</li><li><strong>Most similar to:</strong> PostHog, Heap</li><li><strong>Typical users:</strong> Product managers and customer success teams</li><li><strong>Typical customers:</strong> Small and mid-market B2C companies</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/heap-alternatives/pendo.png" alt="pendo"/></p><h3 id="what-is-pendo">What is Pendo?</h3><p><a href="/blog/best-pendo-alternatives">Pendo</a> describes itself as a product experience platform. In addition to product analytics, it offers session replay, in-app guides, user feedback, and product validation tools.</p><h3 id="key-features-3">Key features</h3><ul><li><p><strong>Product analytics:</strong> Funnels, trends, and retention analysis with event autocapture.</p></li><li><p><strong>In-app guides:</strong> Deliver personalized guidance to customers, directly inside your app.</p></li><li><p><strong>User feedback:</strong> Capture and analyze customer feedback at scale.</p></li><li><p><strong>Product validation and roadmaps:</strong> Plan your product improvements and roadmap using data from Pendo.</p></li></ul><h3 id="how-does-pendo-compare-to-heap">How does Pendo compare to Heap?</h3><p>Pendo offers similar features to Heap, including event autocapture and session replay. It lacks a visual labeling tool for events, however.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Pendo<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-pendo">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Self-serve</strong><div class="text-sm text-secondary mt-1">Free to try, no mandatory sales calls</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Starter plans only</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Limited</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">Tag events or view insights on your live website or app with an overlay</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Pendo and Heap</summary><ul><li>Pendo includes in-app guides for user onboarding, tooltips, and feature announcements; Heap doesn&#x27;t offer any in-app messaging.</li><li>Pendo has built-in product validation and roadmap tools for aligning teams on priorities; Heap focuses purely on analytics and replay.</li><li>Pendo includes native user feedback collection and NPS surveys; Heap doesn&#x27;t offer feedback or survey tools.</li><li>Heap captures every user interaction (clicks, scrolls, form inputs, rage clicks) and lets you define events retroactively; Pendo&#x27;s autocapture is limited to page loads and feature clicks, and requires tagging before data appears in reports.</li><li>Heap&#x27;s session replay and analytics features are more mature; Pendo&#x27;s analytics are functional but secondary to its product experience tools.</li></ul></details><details><summary>Main similarities between Pendo and Heap</summary><ul><li>Both support event autocapture that starts collecting data without manual instrumentation.</li><li>Both offer session replay for watching real user sessions.</li><li>Both include product analytics with funnels, trends, retention analysis, and user paths.</li><li>Both support group analytics for account-level analysis in B2B products.</li><li>Both are primarily designed for non-technical product managers.</li><li>Neither offers feature flags, A/B testing, or experiments natively.</li></ul></details><h3 id="why-do-companies-use-pendo">Why do companies use Pendo?</h3><p>According to G2 reviews, customers use Pendo for:</p><ol><li><p><strong>Customer support and feedback:</strong> Users value Pendo as a useful tool for customer support and feedback collection. They use Pendo&#x27;s feedback features to gather qualitative data, and feed that into Pendo&#x27;s validation and roadmap features.</p></li><li><p><strong>Improving onboarding:</strong> Combining Pendo&#x27;s in-app guides and analytics features makes it easy for non-technical users to experiment with new onboarding flows, improving user adoption.</p></li><li><p><strong>Product planning:</strong> Customers to use Pendo&#x27;s data tools, product validation, and roadmap features to align internal teams and stakeholders on product development.</p></li></ol><blockquote><h3 id="bottom-line-3">Bottom line</h3><p>Pendo is similar to Heap in many ways. It&#x27;s primarily designed for non-technical users, and supports event autocapture, making it viable alternative for product teams.</p></blockquote><h2 id="5-mixpanel">5. Mixpanel</h2><ul><li><strong>Founded:</strong> 2009</li><li><strong>Most similar to:</strong> PostHog, Heap, and Amplitude</li><li><strong>Typical users:</strong> Product managers, desginers and marketing teams</li><li><strong>Typical customers:</strong> Mid-size B2C and B2B companies</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/heap-alternatives/mixpanel.png" alt="mixpanel"/></p><h3 id="what-is-mixpanel">What is Mixpanel?</h3><p><a href="/blog/posthog-vs-mixpanel">Mixpanel</a> is one of the <a href="/blog/best-product-analytics-tools-for-startups">most popular product analytics tools</a> on the market. Founded in 2009, it previously narrowed its focus to analytics alone, but has since expanded again – adding session replay, heatmaps, A/B testing (Enterprise), and feature flags in recent years.</p><h3 id="key-features-4">Key features</h3><ul><li><p><strong>Product analytics:</strong> Track user behavior, trends, and retention</p></li><li><p><strong>Collaborative notebooks:</strong> Create analysis in notebooks and collaborate with colleagues</p></li><li><p><strong>Anomaly detection:</strong> Get automated alerts when metrics fall outside a positive or negative range</p></li><li><p><strong>Filtered data views:</strong> Hide and filter data on a per-team basis to reduce noise</p></li></ul><h3 id="how-does-mixpanel-compare-to-heap">How does Mixpanel compare to Heap?</h3><p>Mixpanel and Heap are similar in many ways. They&#x27;re both used mainly by product managers and offer product analytics.  Mixpanel has closed the gap in recent years by adding session replay, heatmaps, A/B testing, and feature flags. </p><p>The key remaining difference is autocapture: Heap records everything from day one and lets you define events retroactively, while Mixpanel supports autocapture but relies more on manual event instrumentation for deeper tracking.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Mixpanel<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-mixpanel">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Self-serve</strong><div class="text-sm text-secondary mt-1">No need to talk to sales</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">Tag events or view insights on your live website or app with an overlay</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Mixpanel and Heap</summary><ul><li>Heap&#x27;s autocapture is more comprehensive – it records everything by default and lets you define events retroactively with a visual editor. Mixpanel supports autocapture but relies more on manual instrumentation for deeper tracking.</li><li>Mixpanel now offers A/B testing and feature flags (relaunched in late 2025); Heap doesn&#x27;t offer either natively.</li><li>Mixpanel includes collaborative notebooks for sharing analysis with teammates; Heap doesn&#x27;t have an equivalent.</li><li>Mixpanel offers anomaly detection with automated alerts; Heap relies on its analysis suggestions to surface insights.</li><li>Heap includes managed ETL for exporting data to warehouses; Mixpanel offers bidirectional warehouse sync and warehouse-native analytics that can query your warehouse directly.</li><li>Mixpanel&#x27;s free tier includes 1 million events/month; Heap&#x27;s free tier is limited to 10,000 sessions.</li></ul></details><details><summary>Main similarities between Mixpanel and Heap</summary><ul><li>Both are popular product analytics platforms designed primarily for product managers.</li><li>Both offer funnels, retention charts, user paths, cohorts, and custom dashboards.</li><li>Both now offer session replay and heatmaps.</li><li>Both support group analytics for account-level B2B analysis.</li><li>Both integrate with CDPs like Segment and Rudderstack, and data warehouses like Snowflake and BigQuery.</li><li>Both are self-serve with free tiers and transparent pricing.</li></ul></details><h3 id="why-do-companies-use-mixpanel">Why do companies use Mixpanel?</h3><ol><li><p><strong>Eliminate need for data analysts:</strong> Reviewers on G2 note Mixpanel helps them structure large volumes of data, and make data-driven decisions, reducing their reliance on dedicated data analysts to produce insights.</p></li><li><p><strong>Campaign targeting and tracking:</strong> Marketing users appreciate the ability to create user segments and target specific users, enabling more personalized campaigns and improved user engagement.</p></li><li><p><strong>Understanding user behavior:</strong> In common with most analytics tools, Mixpanel&#x27;s users mostly want to understand user behavior, identify bottlenecks, and monitor core metrics like conversion rates, activation, and retention.</p></li></ol><blockquote><h4 id="bottom-line-4">Bottom line</h4><p>Mixpanel is a strong Heap alternative with a mature analytics feature set and recent additions like session replay, heatmaps, and A/B testing. The main trade-off is autocapture depth – if your team relies on retroactive event definition without engineering support, Heap still has the edge.</p></blockquote><h2 id="6-amplitude">6. Amplitude</h2><ul><li><strong>Founded:</strong> 2012</li><li><strong>Most similar to:</strong> Mixpanel</li><li><strong>Typical users:</strong> Product managers, data analysts, marketing teams</li><li><strong>Typical customers:</strong> Mid-size and large enterprises</li></ul><h3 id="what-is-amplitude">What is Amplitude?</h3><p><a href="/blog/best-amplitude-alternatives">Amplitude</a> is an analytics and testing tool with a particular focus on large enterprise customers, like Ford, NBCUniversal, and Walmart.</p><h3 id="key-features-5">Key features</h3><ul><li><p><strong>Product analytics:</strong> Funnel and retention analysis, user paths, behavioral cohorts, custom dashboards, and more.</p></li><li><p><strong>A/B testing:</strong> Support for JSON payloads, primary, secondary, and counter metrics.</p></li><li><p><strong>Customer data platform:</strong> Combine analytics data with third-party tools for data governance, identity resolution, and data federation.</p></li><li><p><strong>AI insight builder:</strong> Generate insights based on natural language requests, like &quot;What is my purchase conversion rate?&quot;.</p></li></ul><h3 id="how-does-amplitude-compare-to-heap">How does Amplitude compare to Heap?</h3><p>Amplitude and Heap are both mature product analytics platforms, but they&#x27;ve evolved in different directions. </p><p>While they overlap on core analytics, session replay, and heatmaps, Amplitude skews enterprise with warehouse-native analytics, built-in experimentation, and a CDP. Heap&#x27;s edge is autocapture depth: it records everything from day one and lets you define events retroactively without code. Amplitude is better for large teams with data engineers; Heap is more accessible to self-serve product managers.</p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Amplitude<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-amplitude">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Self-serve</strong><div class="text-sm text-secondary mt-1">Free to try, no mandatory sales calls</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Starter, Plus plans only</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">Tag events or view insights on your live website or app with an overlay</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Paid add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Amplitude and Heap</summary><ul><li>Heap&#x27;s autocapture is more comprehensive. Amplitude supports basic autocapture but relies more on manual instrumentation.</li><li>Amplitude offers warehouse-native analytics that can sit on top of Snowflake, BigQuery, or Databricks and query your data directly; Heap offers managed ETL exports but no native warehouse querying.</li><li>Amplitude includes a built-in customer data platform (CDP) for identity resolution, data governance, and audience syndication; Heap doesn&#x27;t offer a native CDP.</li><li>Amplitude offers mature A/B testing and feature flags with holdout testing and a Bayesian statistics engine; Heap doesn&#x27;t offer either natively.</li><li>Amplitude targets large enterprises with dedicated data and product teams; Heap is more focused on self-serve product managers at mid-market companies.</li></ul></details><details><summary>Main similarities between Amplitude and Heap</summary><ul><li>Both are mature product analytics platforms with 10+ years in market.</li><li>Both offer funnels, retention charts, user paths, cohorts, and custom dashboards.</li><li>Both now offer session replay and heatmaps.</li><li>Both support group analytics for account-level B2B analysis.</li><li>Both offer an AI-powered natural language insight builder.</li><li>Both integrate with CDPs like Segment and Rudderstack, and data warehouses like Snowflake and BigQuery.</li><li>Both are SOC 2 certified and GDPR-ready.</li></ul></details><h3 id="why-do-companies-use-amplitude">Why do companies use Amplitude?</h3><ol><li><p><strong>Reducing load on data teams:</strong> Amplitude is designed to enable non-technical users to self-serve analytics. Amplitude cites NBCUniversal as a company that&#x27;s benefited from its data team spending less time responding to requests for analysis.</p></li><li><p><strong>Large-scale experimentation:</strong> Unlike Mixpanel, Amplitude offers built-in experimentation features. This enables companies to run experiments on users using existing cohorts created in Amplitude.</p></li><li><p><strong>Resolving data quality problems:</strong> Companies that use Amplitude, particularly large ones, often migrate from outdated, self-built, tools that generate poor quality data. Amplitude helps them fix that while making analytics more accessible.</p></li></ol><blockquote><h4 id="bottom-line-5">Bottom line</h4><p>Amplitude is a strong Heap alternative for enterprise teams, especially those wanting warehouse-native analytics, mature experimentation, and a built-in CDP. The main trade-off is autocapture – if your team relies on retroactive event definition without engineering effort, Heap is the better choice.</p></blockquote><h2 id="7-google-analytics-4">7. Google Analytics 4</h2><ul><li><strong>Released:</strong> October 2020</li><li><strong>Most similar to:</strong> Amplitude</li><li><strong>Typical users:</strong> Marketing and content teams</li><li><strong>Typical customers:</strong> Commerce websites and large enterprises</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/mixpanel-alternatives/GA4.png" alt="GA4"/></p><h3 id="what-is-google-analytics-4">What is Google Analytics 4?</h3><p><a href="/blog/posthog-vs-ga4">Google Analytics 4</a> (GA4) is a marketing and product analytics tool that&#x27;s tightly integrated with other Google products, such as Ads, BigQuery, Looker Studio, and Firebase.</p><p>Unlike its predecessor, Universal Analytics (GA3), it&#x27;s event-based. It also introduces new report types, such as conversion funnels and retention tables. This makes it more useful to product teams than before.</p><h3 id="key-features-6">Key features</h3><ul><li><p><strong>Predictive insights</strong> alert you to trends you&#x27;re not aware of, like an increase in traffic to a specific landing page, or an anomalous decline in conversion from one period to another.</p></li><li><p><strong>Integration with Google tools</strong> means it&#x27;s easy to analyze your GA4 data elsewhere, such as Google&#x27;s dashboarding tool, Looker Studio.</p></li><li><p><strong>Natural language search</strong> means you can ask specific questions, like &quot;MoM growth in users on iOS&quot;, rather searching existing reports.</p></li></ul><h3 id="how-does-ga4-compare-to-heap">How does GA4 compare to Heap?</h3><p>GA4 supports event autocapture (calling it &quot;enhanced measurement&quot;), but it&#x27; less comprehensive than Heap&#x27;s – covering scrolls, outbound clicks, and file downloads rather than every interaction. The bigger difference is focus: GA4 is a marketing and web analytics tool built around the Google ecosystem, while Heap is a product analytics tool built for understanding in-product user behavior. </p><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Self-serve</strong><div class="text-sm text-secondary mt-1">No need to talk to sales</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Toolbar</strong><div class="text-sm text-secondary mt-1">Tag events or view insights on your live website or app with an overlay</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between GA4 and Heap</summary><ul><li>GA4 is primarily a marketing and web analytics tool with deep Google Ads, BigQuery, and Looker Studio integration; Heap is built for product analytics with a focus on understanding in-product user behavior.</li><li>Heap&#x27;s autocapture records all interactions and lets you define events retroactively with a visual editor; GA4&#x27;s autocapture (&quot;enhanced measurement&quot;) covers basic interactions like scrolls and outbound clicks but is far less comprehensive.</li><li>GA4 is free for up to 10 million events/month; Heap&#x27;s free tier is limited to 10,000 sessions.</li><li>Heap offers session replay and heatmaps; GA4 doesn&#x27;t offer either.</li><li>GA4 includes predictive insights and audience building for ad targeting; Heap doesn&#x27;t offer advertising or marketing attribution tools.</li><li>Heap supports group analytics for account-level B2B analysis; GA4 doesn&#x27;t have a native equivalent.</li><li>GA4 uses cookies and typically requires consent banners in the EU; Heap also uses cookies but offers more granular privacy controls.</li></ul></details><details><summary>Main similarities between GA4 and Heap</summary><ul><li>Both are event-based analytics platforms with funnels, retention, and conversion tracking.</li><li>Both support a form of event autocapture without manual instrumentation.</li><li>Both offer custom dashboards and reporting.</li><li>Both integrate with data warehouses like BigQuery and Snowflake.</li><li>Both support UTM campaign tracking and traffic source analysis.</li><li>Neither offers feature flags, A/B testing, or surveys natively.</li></ul></details><h3 id="why-do-companies-use-ga4">Why do companies use GA4?</h3><ol><li><p><strong>Because it&#x27;s Google:</strong> It&#x27;s not an original reason, but it holds true. Using Google Analytics makes a lot of sense for teams who rely on other Google platforms, like <a href="/tutorials/google-ads-reports">Google Ads</a> and BigQuery.</p></li><li><p><strong>It&#x27;s powerful and free:</strong> Likewise, Google&#x27;s scale means <a href="/blog/google-analytics-cost">GA4 is completely free</a> to most small and medium-sized businesses. This, combined with strong analytical tools and the large ecosystem of GA experts to call upon, makes it a safe choice.</p></li><li><p><strong>To track marketing ROI:</strong> GA4 is predominantly used by marketing and e-commerce teams to track campaign ROI. It&#x27;s also popular among large content publishers for its scalability.</p></li></ol><blockquote><h4 id="bottom-line-6">Bottom line</h4><p>Until recently, Google Analytics wasn&#x27;t a viable Heap alternative. The launch of GA4 changed this, but switching from Heap to Google only makes sense if you&#x27;re keen to integrate deeper into Google&#x27;s ecosystem of data tools, like BigQuery and Looker Studio.</p></blockquote><h2 id="which-heap-alternative-should-you-choose">Which Heap alternative should you choose?</h2><ul><li>Want analytics integrated with feature flags, experiments, error tracking, session replays, and more? <strong>PostHog</strong> closes the loop in one platform.</li><li>Need session replay with frustration detection for UX and support teams? <strong>FullStory</strong> leads the charge.</li><li>Retail or financial services team focused on mobile app experience? <strong>Glassbox</strong> is built for that.</li><li>Want analytics plus in-app guides, onboarding flows, and product roadmapping? <strong>Pendo</strong> combines them.</li><li>Looking for mature analytics with experimentation and warehouse-native queries? <strong>Amplitude</strong> skews enterprise.</li><li>Want polished, self-serve product analytics with a strong free tier? <strong>Mixpanel</strong> is a solid pick.</li><li>Heavily invested in Google Ads, BigQuery, and the Google ecosystem? <strong>GA4</strong> is hard to beat for marketing attribution.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think PostHog is the perfect Heap replacement if:</p><ul><li>You value transparency (we&#x27;re open source and open core)</li><li>You want to use fewer tools (we can replace way more than just Heap)</li><li>You want try before you buy (we&#x27;re self-serve with a <a href="/pricing">generous free tier</a>)</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is Heap used for?</summary><p><strong>Heap</strong> is a product analytics platform known for comprehensive autocapture. It automatically records clicks, pageviews, form submissions, and other user interactions from the moment you install it, letting you define and analyze events retroactively without engineering support. It also includes session replay and heatmaps, and is now part of <strong>Contentsquare</strong>.</p></details><details><summary>Why look for Heap alternatives?</summary><p>Common reasons include: needing feature flags, A/B testing, or error tracking that Heap doesn&#x27;t offer natively; wanting developer debugging tools like console logs and DOM inspection in session replay; needing transparent, self-serve pricing (Heap&#x27;s higher tiers require sales conversations); wanting EU data residency (Heap doesn&#x27;t currently offer this); or looking for an open-source platform with SQL access.</p></details><details><summary>What&#x27;s the best Heap alternative overall?</summary><p>For most teams, <strong><a href="/blog/posthog-vs-heap">PostHog</a></strong> is the best alternative. It&#x27;s the only tool on this list that matches Heap&#x27;s autocapture while also including <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, and a built-in <a href="/data-warehouse">data warehouse</a> – all with a generous free tier.</p></details><details><summary>Which Heap alternatives support autocapture?</summary><p><strong>PostHog</strong>, <strong>FullStory</strong>, <strong>Glassbox</strong>, <strong>Pendo</strong>, and <strong>GA4</strong> all support some form of autocapture. PostHog and FullStory are the closest to Heap&#x27;s approach – both start recording interactions immediately. GA4&#x27;s &quot;enhanced measurement&quot; is more limited, covering basic interactions like scrolls and outbound clicks. Mixpanel and Amplitude support autocapture but rely more on manual instrumentation for deeper tracking.</p></details><details><summary>Which Heap alternatives are open source?</summary><p><strong>PostHog</strong> is the only open-source Heap alternative on this list; its code is publicly available on <a href="https://github.com/PostHog/posthog">GitHub</a>. All other tools listed – FullStory, Glassbox, Pendo, Mixpanel, Amplitude, and GA4 – are closed-source. See our guide to the <a href="/blog/best-open-source-analytics-tools">best open-source analytics tools</a> for more options.</p></details><details><summary>Which Heap alternative has the best free tier?</summary><p><strong>PostHog</strong> offers the most generous free tier: 1 million events, 5,000 session replays, and 1 million feature flag requests per month – with no credit card required. <strong>GA4</strong> is free for up to 10 million events but has limited product analytics. <strong>FullStory&#x27;s</strong> free plan includes 30,000 sessions with 12 months of retention. <strong>Mixpanel</strong> offers 1 million events free. <strong>Heap&#x27;s</strong> free tier is limited to 10,000 sessions.</p></details><details><summary>Does Heap have feature flags or A/B testing?</summary><p>No. <strong>Heap</strong> doesn&#x27;t offer native feature flags or experimentation. You&#x27;d need a separate tool like <strong>LaunchDarkly</strong>, <strong>Optimizely</strong>, or <strong>PostHog</strong>. PostHog includes both <a href="/feature-flags">feature flags</a> and <a href="/experiments">A/B testing</a> natively, tightly integrated with analytics so you can measure experiment impact on funnels, retention, and revenue.</p></details><details><summary>Does Heap have error tracking?</summary><p>No. <strong>Heap</strong> doesn&#x27;t offer error tracking or crash monitoring. If you need to monitor exceptions alongside your analytics, you&#x27;d need a separate tool like Sentry or Bugsnag. <strong>PostHog</strong> includes native <a href="/error-tracking">error tracking</a> that connects exceptions and stack traces directly to session replays, user behavior, and feature flag changes.</p></details><details><summary>What happened to Heap after the Contentsquare acquisition?</summary><p>Contentsquare <a href="https://contentsquare.com/heap/">completed its acquisition of Heap</a> in December 2023. Heap&#x27;s product analytics features have been integrated into Contentsquare&#x27;s broader experience intelligence platform, alongside <a href="/blog/posthog-vs-hotjar">Hotjar</a>. Heap continues to operate as a product, but its roadmap is now shaped by Contentsquare&#x27;s enterprise and ecommerce focus.</p></details><details><summary>Can I migrate from Heap to PostHog?</summary><p>Yes. See the <a href="/docs/migrate/heap">Heap to PostHog migration guide</a> for step-by-step instructions on exporting your Heap data and importing it into PostHog, including historical events and user properties.</p></details><details><summary>Can PostHog replace Google Analytics?</summary><p>Yes. <strong>PostHog</strong> includes <a href="/web-analytics">web analytics</a> for tracking pageviews, bounce rate, traffic sources, and UTM campaigns. You can integrate it using <a href="/docs/libraries/google-tag-manager">Google Tag Manager</a>. See the <a href="/blog/posthog-vs-ga4">PostHog vs GA4 comparison</a> and <a href="/blog/google-analytics-to-posthog">intro for Google Analytics users</a> for more.</p></details><details><summary>Does PostHog offer EU hosting?</summary><p>Yes. <strong>PostHog</strong> offers EU-hosted cloud with data stored exclusively in the EU. PostHog is also SOC 2 certified, GDPR-ready, and HIPAA-ready.</p></details><details><summary>How does PostHog compare to Amplitude and Mixpanel?</summary><p>Amplitude and Mixpanel offer similar product analytics features to Heap but take different approaches. Amplitude skews enterprise with warehouse-native analytics, a built-in CDP, and mature experimentation. Mixpanel is more self-serve with polished analytics and recent additions like session replay and heatmaps. PostHog goes further with feature flags, error tracking, LLM analytics, and surveys in one platform. Read the <a href="/blog/posthog-vs-mixpanel">PostHog vs Mixpanel</a> and <a href="/blog/posthog-vs-amplitude">PostHog vs Amplitude</a> comparisons for details.</p></details><details><summary>What are the best product analytics tools in 2026?</summary><p>The <a href="/blog/best-product-analytics-tools-for-startups">top product analytics tools in 2026</a> include:</p><ul><li><strong><a href="/product-analytics">PostHog</a></strong> – Best all-in-one platform combining product analytics with <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</a>, and more</li><li><strong><a href="/blog/posthog-vs-mixpanel">Mixpanel</a></strong> – Best for self-serve product teams wanting fast, flexible analytics</li><li><strong><a href="/blog/posthog-vs-amplitude">Amplitude</a></strong> – Best for enterprises wanting warehouse-native analytics and a built-in CDP</li><li><strong><a href="/blog/posthog-vs-heap">Heap</a></strong> – Best for teams wanting comprehensive autocapture with minimal engineering effort</li><li><strong><a href="https://www.pendo.io/">Pendo</a></strong> – Best for product managers who also need in-app guides and user onboarding</li><li><strong><a href="/blog/posthog-vs-ga4">Google Analytics</a></strong> – Best for marketing teams already invested in the Google ecosystem</li></ul><p>For detailed comparisons, see our guides to <a href="/blog/best-mixpanel-alternatives">Mixpanel alternatives</a>, <a href="/blog/best-amplitude-alternatives">Amplitude alternatives</a>, and <a href="/blog/best-plausible-alternatives">Plausible alternatives</a>.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Heap]]></title><description><![CDATA[Heap  is a product analytics platform known for its comprehensive autocapture – it starts collecting clicks, pageviews, and form submissions the…]]></description><link>https://posthog.com/blog/posthog-vs-heap</link><guid isPermaLink="false">56e5682e-e064-5b3b-9b8c-483c1b71000c</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-heap/posthog-vs-heap.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="/blog/best-heap-alternatives">Heap</a> is a product analytics platform known for its comprehensive autocapture – it starts collecting clicks, pageviews, and form submissions the moment you install it, no manual instrumentation required.</p><p>PostHog <a href="/docs/product-analytics/autocapture">also supports autocapture</a>, but goes much further – combining <a href="/product-analytics">product analytics</a> with <a href="/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, and more in one developer platform.</p><p>In this guide, we break down how PostHog and Heap compare across analytics, session replay, experimentation, pricing, and compliance – so you can decide which is the better fit for your team.</p><h2 id="how-is-posthog-different">How is PostHog different?</h2><h3 id="1-were-built-for-engineers">1. We&#x27;re built for engineers</h3><p>What does this mean?</p><ul><li>It means <a href="/changelog">we ship fast</a> and iterate based on user feedback.</li><li>It means engineers do support – all product teams have a <a href="/handbook/engineering/support-hero">weekly support hero</a>.</li><li>It means we have extensive <a href="/docs/api">public and private API endpoints</a>, and a powerful <a href="/docs/product-analytics/sql">SQL query builder</a>.</li><li>It means we built <a href="/docs/libraries">SDKs</a> for all popular (and many unpopular) client-side, backend, and mobile languages and frameworks.</li><li>It means we make it easy to <a href="/product-engineers/testing-in-production">test in production</a>, conduct <a href="/tutorials/phased-rollout">phased rollouts</a>, run <a href="/tutorials/public-beta-program">beta programs</a>, and so much more.</li></ul><h3 id="2-were-an-all-in-one-platform">2. We&#x27;re an all-in-one platform</h3><p>Heap is mainly focused on product analytics. This means you need to adopt additional tools for things like feature management, experiments, and surveys. They&#x27;re all built into PostHog – we even have a <a href="/data-stack">built-in data warehouse</a> that <a href="/tutorials/stripe-reports">integrates with Stripe</a> and <a href="/tutorials/hubspot-reports">Hubspot</a>. You can replace half a dozen tools with PostHog, save money, and get more from your data.</p><h3 id="3-were-totally-transparent">3. We&#x27;re totally transparent</h3><ul><li>How much will PostHog cost? Use our <a href="/pricing">pricing calculator</a>.</li><li>What are we working on? It&#x27;s on our <a href="/roadmap">public roadmap</a>?</li><li>How does sales work? We have a <a href="/sales">whole page on it</a>.</li><li>What do we care about? We explain everything in our <a href="/handbook">public company handbook</a>.</li><li>How do we make money? That&#x27;s <a href="/handbook/how-we-make-money">in the handbook</a>, too.</li></ul><p>Oh, we&#x27;re open source, too. Go take a peak at our code if you like on <a href="https://github.com/PostHog">our GitHub repo</a>.</p><p><div></div></p><h2 id="comparing-posthog-and-heap">Comparing PostHog and Heap</h2><h3 id="platform">Platform</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/cdp"><strong>CDP</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Ingest, transform, and send data between 145+ tools</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/data-stack"><strong>Data Stack</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Import, query, model &amp; visualize product and third party data together</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/error-tracking"><strong>Error tracking</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track and monitor errors and exceptions in your code</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><blockquote><p>💡 <strong>Good to know:</strong> PostHog can replace multiple tools, such as <a href="/blog/posthog-vs-hotjar">Hotjar</a>, <a href="/blog/posthog-vs-ga4">Google Analytics</a>, and <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a>. This makes it a lot easier to extract usable insights, since you don&#x27;t have to constantly switch between tools. Running PostHog on both your product and website makes it easier to understand how marketing activity influences signups and usage, too.</p></blockquote><h3 id="product-analytics">Product analytics</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Monthly free tier</strong></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>1 million events</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>10k monthly sessions</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>SQL query editor</strong><div class="text-sm text-secondary mt-1">Write SQL queries directly against your data without a separate data warehouse</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI insight builder</strong><div class="text-sm text-secondary mt-1">&quot;Talk to your data&quot; using AI</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/dashboards"><strong>Dashboards</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Combine insights into shareable dashboards</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/trends"><strong>Graphs &amp; trends</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Build custom insights and visualizations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/funnels"><strong>Funnels</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track users through a sequence of events to find drop-off and improve conversion</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/retention"><strong>Retention</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user retention over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/user-paths"><strong>User paths</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Understand how users navigate through your product and where they get stuck</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Cohorts</strong><div class="text-sm text-secondary mt-1">Create cohorts of users to analyze and compare</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/lifecycle"><strong>Lifecycle</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user lifecycle to understand how users interact with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/stickiness"><strong>Stickiness</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track user stickiness over time to understand how long users stay with your product</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><blockquote><p>💡 <strong>Good to know:</strong> Every PostHog user gets <a href="/pricing">1 million events for free</a> each month. You can also save money by sending us anonymous events for non-identified users, which are up to 80% cheaper than identified product analytics events. Anonymous events are ideal for tracking behavior on marketing websites, or mobile apps with large consumer audiences. See our docs on <a href="/docs/data/anonymous-vs-identified-events">anonymous vs identified events</a> for more.</p></blockquote><h3 id="session-recordings">Session recordings</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Monthly free tier</strong></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>5,000 web recordings, 2,500 mobile recordings</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Web app recordings</strong><div class="text-sm text-secondary mt-1">Capture recordings from single-page apps and websites</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Mobile app recordings</strong><div class="text-sm text-secondary mt-1">Capture recordings in iOS and Android apps</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Identity detection</strong><div class="text-sm text-secondary mt-1">Identify users in recordings for debugging and support</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Console logs</strong><div class="text-sm text-secondary mt-1">Capture console output from the browser for debugging</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Playlists</strong><div class="text-sm text-secondary mt-1">Sort recordings into static and dynamic playlists</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Performance monitoring</strong><div class="text-sm text-secondary mt-1">Track network events and performance metrics within a session</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Privacy masking for sensitive content</strong><div class="text-sm text-secondary mt-1">Automatic and manual masking of sensitive user data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>conditional_recording</strong></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Network monitoring</strong><div class="text-sm text-secondary mt-1">Monitor network activity during sessions</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>DOM explorer</strong><div class="text-sm text-secondary mt-1">Explore an interactive snapshot of replays</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Export recordings to JSON</strong><div class="text-sm text-secondary mt-1">Export important recording data for offline storage</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Export recordings to video</strong><div class="text-sm text-secondary mt-1">Export session recordings as video files</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Beta</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Minimum duration</strong><div class="text-sm text-secondary mt-1">Only record sessions longer than a specified duration</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Sample recorded sessions</strong><div class="text-sm text-secondary mt-1">Restrict the percentage of sessions that will be recorded</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Record via feature flag</strong><div class="text-sm text-secondary mt-1">Only record sessions for users that have the flag enabled</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><blockquote><p>💡 <strong>Good to know:</strong> Session replays are an essential tool for understanding how people use your product, especially for <a href="/blog/early-stage-analytics">early-stage companies</a> searching for <a href="/founders/product-market-fit-game">product-market fit</a>. Both Heap and PostHog offer session replay, though Heap lacks many developer-facing features like a DOM explorer, performance monitoring, and network events, which are useful for fixing bugs and performance issues.</p></blockquote><h3 id="feature-flags">Feature flags</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Monthly free tier</strong></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>1 million API requests</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>n/a</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Boolean flags</strong><div class="text-sm text-secondary mt-1">Simple on/off flags to enable or disable features</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Multivariate flags</strong><div class="text-sm text-secondary mt-1">Test multiple variants of a feature in a single flag</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Payloads</strong><div class="text-sm text-secondary mt-1">Pass structured data (strings, numbers, or JSON objects) to variants for dynamic configuration without code changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Local evaluation</strong><div class="text-sm text-secondary mt-1">Cache flag values for faster evaluation and reduced API calls</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Percentage-based rollouts</strong><div class="text-sm text-secondary mt-1">Roll out features gradually to a percentage of users</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Custom targeting</strong><div class="text-sm text-secondary mt-1">Target features based on user properties and attributes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Multi-environment support</strong><div class="text-sm text-secondary mt-1">Use the same flag key across PostHog projects for local development or staging</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Partial</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Flag scheduling</strong><div class="text-sm text-secondary mt-1">Schedule flags to turn on or off automatically at specified times</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Bootstrapping</strong><div class="text-sm text-secondary mt-1">Make flags available immediately on page load without waiting for API response</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Early access feature opt-in widget</strong><div class="text-sm text-secondary mt-1">Allow users to opt in or out of specified features with a built-in widget or custom UI</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div></div></div></div></div></div></div></div></p><blockquote><p>💡 <strong>Good to know:</strong> Feature flags make it easy to roll out features to specific users or groups, and <a href="/product-engineers/testing-in-production">safely test in production</a>. Our feature flags are also tightly integrated with other features so you can target session replays, surveys, and more using existing feature flags. See our guide on the <a href="/product-engineers/feature-flag-benefits-use-cases">benefits of feature flags</a> for more.</p></blockquote><h3 id="experiments">Experiments</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Monthly free tier</strong></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>1 million API requests</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>n/a</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Custom goals</strong><div class="text-sm text-secondary mt-1">Define your own goals and metrics to track</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Secondary metrics</strong><div class="text-sm text-secondary mt-1">Monitor impact on unrelated metrics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Split testing</strong><div class="text-sm text-secondary mt-1">Split participants into groups</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Multivariate (A/B/n) testing</strong><div class="text-sm text-secondary mt-1">Test multiple variables simultaneously to find optimal combinations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Statistical significance</strong><div class="text-sm text-secondary mt-1">Automatic calculation of statistical significance with configurable confidence levels</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Recommended run time</strong><div class="text-sm text-secondary mt-1">Automatically calculate the recommended run time and sample size</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Holdout testing</strong><div class="text-sm text-secondary mt-1">Reserve a group of users who do not see any changes, so you can measure long-term impact against a true baseline</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>n/a</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Statistics engine</strong><div class="text-sm text-secondary mt-1">How the results of an experiment are calculated</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Bayesian or Frequentist</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>n/a</span></div></div></div></div></div></div></div></div></p><blockquote><p>💡 <strong>Good to know:</strong> Our <a href="/docs/experiments">experiments</a> integrate seamlessly with our <a href="/docs/feature-flags">feature flag product</a>. This means you can easily deploy the winning variant of an experiment with a single click from the experiment UI.</p></blockquote><h3 id="security-and-compliance">Security and compliance</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>User privacy options</strong><div class="text-sm text-secondary mt-1">Anonymize users, drop personal data</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>History and audit logs</strong><div class="text-sm text-secondary mt-1">Manage and view edits and related users</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Scale</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>GDPR-ready</strong><div class="text-sm text-secondary mt-1">Can be compliant with GDPR</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>HIPAA-ready</strong><div class="text-sm text-secondary mt-1">Can be compliant with HIPAA</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>SOC 2 Type II</strong><div class="text-sm text-secondary mt-1">SOC 2 security certification</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>2FA</strong><div class="text-sm text-secondary mt-1">Enforce login with two-factor authentication</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>SAML/SSO</strong><div class="text-sm text-secondary mt-1">Use SAML or single sign-on authentication</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Scale</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><blockquote><p>💡<strong>Good to know:</strong> Additional compliance features, such as HIPAA Business Associate Agreements, advanced permissions, and audit logs are available on some of our <a href="/platform-packages">platform packages</a>, which also includes white labelling for surveys and shared dashboards.</p></blockquote><h2 id="when-to-choose-posthog-vs-heap">When to choose PostHog vs Heap</h2><p>Choosing the right product analytics tool depends on what your team needs beyond basic analytics. Here&#x27;s a quick guide:</p><ul><li>Want to understand user behavior, debug issues, and ship experiments – all without switching tools? Go with <strong>PostHog</strong>.</li><li>Need comprehensive autocapture with minimal engineering effort and a simple, low-density UI? <strong>Heap</strong> is a solid choice.</li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><p><strong>For engineering-led product teams</strong></p><ul><li><strong>PostHog</strong> – SQL access, public <a href="/docs/api">APIs</a>, <a href="/docs/libraries">SDKs</a> for every major platform, and tight integration between analytics, feature flags, and experiments, error tracking, logs, LLM analytics, and more. Built by engineers, for engineers.</li></ul><p><strong>For non-technical product managers</strong></p><ul><li><strong>Heap</strong> – Autocapture and a visual event editor mean you can define and track events without writing code. The low-density interface is designed for PMs who want insights without complexity.</li></ul><p><strong>For growth and experimentation teams</strong></p><ul><li><strong>PostHog</strong> – Run A/B tests, roll out features incrementally with feature flags, and measure impact on conversion and retention – all in one workflow.</li></ul><p><strong>For marketing and CRO teams</strong></p><ul><li><strong>Heap</strong> – Multi-touch attribution and analysis suggestions help surface friction points and optimize conversion funnels. Its Contentsquare integration adds deeper ecommerce and marketing analytics.</li></ul><p><strong>For teams building AI products</strong></p><ul><li><strong>PostHog</strong> – Native <a href="/llm-analytics">LLM analytics</a> for tracking model performance, token costs, and user interactions. Heap doesn&#x27;t offer AI observability.</li></ul><p><strong>For privacy-conscious and regulated organizations</strong></p><ul><li>Both are SOC 2 certified and GDPR-ready. PostHog is also HIPAA-ready, offers EU hosting, and provides raw data access via its built-in <a href="/data-warehouse">data warehouse</a>. Heap does not currently offer EU data residency.</li></ul><p><strong>For early-stage startups</strong></p><ul><li><strong>PostHog</strong> – One platform that scales from first users to product-market fit without swapping tools as you grow. The <a href="/pricing">generous free tier</a> includes 1 million events, 5,000 replays, and 1 million feature flag requests per month. <a href="/startups">Startups can also qualify for $50k in free credits</a>.</li></ul><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What&#x27;s the main difference between PostHog and Heap?</summary><p><strong>PostHog</strong> is an all-in-one platform that combines <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/surveys">surveys</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, and more in one environment. <strong>Heap</strong> focuses on product analytics and session replay, with autocapture as its core differentiator. If you need more than analytics and replay, PostHog means fewer tools and less context-switching.</p></details><details><summary>Both have autocapture – what&#x27;s the difference?</summary><p>Both <strong>PostHog</strong> and <strong>Heap</strong> automatically capture clicks, pageviews, and form submissions. The key difference is that Heap&#x27;s visual event editor lets non-technical users tag and define events retroactively without code. PostHog&#x27;s autocapture works similarly but is designed more for engineering teams, with tighter integration into feature flags, experiments, and session replays.</p></details><details><summary>Can I migrate from Heap to PostHog?</summary><p>Yes. See the <a href="/docs/migrate/heap">Heap to PostHog migration guide</a> for step-by-step instructions on exporting your Heap data and importing it into PostHog, including historical events and user properties.</p></details><details><summary>How long does it take to deploy PostHog?</summary><p>Minutes. Use the <a href="/wizard">onboarding wizard</a> to connect your app, or just <a href="/docs/getting-started/install">add the tracking snippet</a> directly and autocapture starts collecting events immediately. Enable session replays, feature flags, and other features from your project settings.</p></details><details><summary>Does Heap have feature flags or A/B testing?</summary><p>No. <strong>Heap</strong> doesn&#x27;t offer native feature flags or experimentation. You&#x27;d need a separate tool like LaunchDarkly or Optimizely. PostHog includes both <a href="/feature-flags">feature flags</a> and <a href="/experiments">A/B testing</a> natively, tightly integrated with analytics so you can measure experiment impact on funnels, retention, and revenue.</p></details><details><summary>Does Heap have error tracking?</summary><p>No. <strong>Heap</strong> doesn&#x27;t offer error tracking or crash monitoring. PostHog includes native <a href="/error-tracking">error tracking</a> that connects exceptions and stack traces directly to session replays, user behavior, and feature flag changes.</p></details><details><summary>Which has better session replay?</summary><p>Both offer session replay, but <strong>PostHog</strong>&#x27;s is more developer-focused. It includes console logs, network request monitoring, a DOM explorer, and performance metrics. <strong>Heap</strong>&#x27;s replay is simpler and more suited to PMs who want to watch user sessions without the technical detail.</p></details><details><summary>What are the best product analytics tools in 2026?</summary><p>The top product analytics tools in 2026 include:</p><ul><li><strong><a href="/product-analytics">PostHog</a></strong> – Best all-in-one platform combining product analytics with <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</a>, and more</li><li><strong><a href="/blog/posthog-vs-heap">Heap</a></strong> – Best for teams wanting comprehensive autocapture with minimal engineering effort</li><li><strong><a href="/blog/posthog-vs-amplitude">Amplitude</a></strong> – Best for enterprises wanting warehouse-native analytics and a built-in CDP</li><li><strong><a href="/blog/posthog-vs-mixpanel">Mixpanel</a></strong> – Best for self-serve product teams wanting fast, flexible analytics</li><li><strong><a href="/blog/posthog-vs-pendo">Pendo</a></strong> – Best for product managers who also need in-app guides and user onboarding</li><li><strong><a href="/blog/posthog-vs-ga4">Google Analytics</a></strong> – Best for marketing teams already invested in the Google ecosystem</li></ul></details><details><summary>Can PostHog replace Google Analytics?</summary><p>Yes. PostHog includes <a href="/web-analytics">web analytics</a> for tracking pageviews, bounce rate, traffic sources, and UTM campaigns. You can integrate it using <a href="/docs/libraries/google-tag-manager">Google Tag Manager</a>. See the <a href="/blog/posthog-vs-ga4">PostHog vs GA4 comparison</a> and <a href="/blog/google-analytics-to-posthog">intro for Google Analytics users</a> for more.</p></details><details><summary>How can I estimate my PostHog usage?</summary><p>The easiest way is to <a href="https://us.posthog.com/signup">sign up</a>, integrate the snippet, then check the projection on your billing page after a few days. Alternatively, multiply your monthly active users by 50–100 events per user as a starting point. See <a href="/docs/billing/estimating-usage-costs">Estimating usage &amp; costs</a> for more detail.</p></details><details><summary>What about ad blockers?</summary><p>We recommend deploying a reverse proxy, which sends events to PostHog Cloud using your own domain. This makes them less likely to be intercepted by tracking blockers. We have <a href="/docs/advanced/proxy">setup guides</a> for AWS CloudFront, Cloudflare, Netlify, Vercel, and more. Alternatively, you can use our free <a href="/docs/advanced/proxy/managed-reverse-proxy">managed reverse proxy</a>, </p></details><details><summary>Does PostHog offer EU hosting?</summary><p>Yes. <strong>PostHog</strong> offers EU-hosted cloud with data stored exclusively in the EU. PostHog is also SOC 2 certified, GDPR-ready, and HIPAA-ready.</p></details><details><summary>Can I use PostHog with a CDP like Segment or Rudderstack?</summary><p>Yes. PostHog integrates with both Segment and Rudderstack. See <a href="/docs/advanced/cdp">Using PostHog with a CDP</a> for setup instructions.</p><p>It also includes a <a href="/cdp">built-in CDP</a> that lets you import, transform, and export data without needing a separate tool. See our docs on using <a href="/docs/advanced/cdp">PostHog with a CDP</a> for setup instructions, or browse our comparison of the <a href="/blog/best-customer-data-platforms-for-developers">best customer data platforms for developers</a> if you&#x27;re evaluating options.</p></details><details><summary>Can you use PostHog on e-commerce websites?</summary><p>Absolutely. PostHog is easy to integrate with <a href="/docs/libraries/shopify">Shopify</a> and <a href="/docs/libraries/woocommerce">WooCommerce</a>. You can easily install PostHog on other e-commerce platforms <a href="/docs/integrate">using our Javascript snippet</a> – see our guides to <a href="/tutorials/webflow">setting up Webflow analytics</a> and <a href="/docs/libraries/wordpress">Wordpress</a>.</p></details><details><summary>How does PostHog compare to Amplitude and Mixpanel?</summary><p>Amplitude and Mixpanel offer similar product analytics features to Heap. Read the <a href="/blog/posthog-vs-mixpanel">PostHog vs Mixpanel</a> and <a href="/blog/posthog-vs-amplitude">PostHog vs Amplitude</a> comparisons for details. You can also see the <a href="/blog/best-heap-alternatives">most popular Heap alternatives</a> for a broader view.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Pendo]]></title><description><![CDATA[Want to understand the difference between  Pendo  and PostHog? Here's the short answer: Pendo  is a product experience platform with in-app guides…]]></description><link>https://posthog.com/blog/posthog-vs-pendo</link><guid isPermaLink="false">e7a5d4f4-1317-5e53-bb8a-9d3405e7abbd</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-pendo/posthog-vs-pendo.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Want to understand the difference between <a href="/blog/best-pendo-alternatives">Pendo</a> and PostHog? Here&#x27;s the short answer:</p><ol><li><p><strong>Pendo</strong> is a product experience platform with in-app guides, product analytics, session replay, feedback collection, and roadmap tools.</p></li><li><p><strong>PostHog</strong> is an all-in-one developer platform that includes <a href="/product-analytics">product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/workflows">workflows</a>, <a href="/feature-flags">feature flags</a>, <a href="/session-replay">session replays</a>, <a href="/error-tracking">error tracking</a>, <a href="/logs">logs</a>, a <a href="/data-stack">data warehouse</a>, and more.</p></li></ol><p>Now it&#x27;s time for the long answer...</p><p>In this article we&#x27;ll explore the crucial differences and similarities between Pendo and PostHog. We’ll cover topics such as:</p><ul><li>Pendo and PostHog&#x27;s <a href="#comparing-posthog-and-pendo">core features</a></li><li><a href="#product-analytics">Product analytics</a> and <a href="#in-app-engagement-messaging-and-feedback">messaging &amp; feedback</a> features in detail</li><li><a href="#cdp-and-integrations">Data pipelines</a> and <a href="#popular-integrations">popular integrations</a></li><li><a href="#library-support">Libraries</a>, <a href="#sdks-and-tracking">tracking differences and SDKs</a></li><li><a href="#compliance-and-security">Privacy, security and regulatory compliance</a></li><li>Other <a href="#frequently-asked-questions">frequently asked questions</a></li></ul><h2 id="how-is-posthog-different">How is PostHog different?</h2><h3 id="1-posthog-is-an-all-in-one-platform">1. PostHog is an all-in one platform</h3><p>PostHog brings all the tools engineers need to measure success, run experiments, and more, into one platform. It has robust <a href="/docs/product-analytics">analytics</a>, <a href="/docs/feature-flags">feature flagging</a>, <a href="/docs/experiments">A/B testing</a>, <a href="/docs/session-replay">session recording</a>, <a href="/docs/error-tracking">error tracking</a>, <a href="/workflows">workflows</a> and more. </p><p>Pendo now includes session replay and user engagement on higher tiers, but still requires separate tools for feature flags, A/B testing, error tracking, and more.</p><h3 id="2-posthog-is-built-for-engineers">2. PostHog is built for engineers</h3><p>We built PostHog for product and engineering teams — especially <a href="/product-engineer/what-is-a-product-engineer">engineers with a product focus</a>. As such, PostHog includes many powerful features that aren&#x27;t available in tools like Pendo, which are built for more general audiences. It also means you get support from the engineers who <em>actually build the product</em>, <a href="/docs/api">extensively documented APIs</a>, and a <a href="/docs/product-analytics/sql">SQL query builder</a>, so you can analyze data how you want.</p><h3 id="3-transparent-pricing-generous-free-tiers">3. Transparent pricing, generous free tiers</h3><p>Our <a href="/pricing">pricing</a> is 100% transparent. There are no hidden fees or surprise overages – what you see is exactly what you&#x27;ll pay.</p><p>We also default to charging as little as possible while still making a sensible margin, and every product comes with a generous free tier. In fact, more than 90% of companies use PostHog for free!</p><blockquote><p>In 2024, we <a href="/blog/session-replay-pricing">cut prices for session replay</a> and <a href="/blog/analytics-pricing">analytics events</a>. In 2025, we&#x27;ve <a href="/blog/data-pipeline-pricing">cut prices for data pipelines</a> and surveys. If we can cut pass a saving onto our customers, we always will.</p></blockquote><p><div></div></p><h2 id="comparing-posthog-and-pendo">Comparing PostHog and Pendo</h2><p><strong>Pendo</strong> has four pricing tiers — Free, Base, Core, and Ultimate. Pendo&#x27;s Free plan is limited to 500 monthly active users and doesn&#x27;t include session replays.</p><p><strong>PostHog</strong> uses usage-based pricing with a generous free tier – no credit card required, and unlimited teammates on every plan. Every month, you get 1 million events, 5,000 session replays, 1 million feature flag requests, and more for free. After that, you only pay for what you use, and pricing gets cheaper at scale.</p><p>Adding a credit card unlocks additional features like advanced paths, correlation analysis, lifecycle insights, and dashboard subscriptions. <a href="/startups">Startups can qualify for $50k in free credits</a>, and you can set billing limits per product to avoid surprises. See the <a href="/pricing">pricing page</a> for a full breakdown.</p><ul><li><strong>Product Analytics and Web Analytics</strong>: 1 million events/month</li><li><strong>Session Replay</strong>: 5,000 recordings/month</li><li><strong>Feature Flags</strong>: 1 million requests/month</li><li><strong>Surveys</strong>: 1,500 responses/month</li><li><strong>Data warehouse</strong>: 1 million synced rows/month + free historical syncs for the first 7 days for each new source</li><li><strong>Error tracking</strong>: 100 thousand exceptions/month</li><li><strong>LLM analytics</strong>: 100 thousand events/month</li><li><strong>Logs</strong>: 50GB ingested/month</li><li><strong>Workflows</strong>: 10,000 messages per channel/month</li><li><strong>PostHog AI</strong>: 2,000 credits/month</li></ul><p>When it comes their product platforms, here is how they compare:</p><p><div competitors="posthog,pendo"></div></p><ul><li><p><strong>Session replays:</strong> <a href="/session-replay">Session replays</a> in PostHog recreate exactly what real users see and how they use your product. They also enable you to debug problems using built-in console logs and network performance.</p></li><li><p><strong>Feature flags:</strong> PostHog includes <a href="/feature-flags">multivariate feature flags</a> that support JSON payloads, enabling you to push real-time changes to your product without redeploying. Teams can use feature flags to offer different features or UI choices to users, to trigger in-app messages, and more.</p></li><li><p><strong>A/B testing:</strong> In PostHog, you can use the <a href="/experiments">experimentation suite</a> to create multivariate tests within your product, such as showing some users a different page layout to others. Over time, you can build an understanding of which page performs better, correlate results with other events, and deploy a final version.</p></li></ul><h3 id="product-analytics">Product Analytics</h3><p>PostHog and Pendo are ultimately built for different types of users. While PostHog is designed with engineers and technical users in mind, Pendo is intended more for marketers and UX designers.</p><p>This difference is reflected in all levels of the product, but especially in product analytics, where many advanced features which are lacking in Pendo, are available in PostHog.</p><p><div competitors="posthog,pendo"></div></p><ul><li><p><strong>Correlation analysis:</strong> <a href="/product-analytics">Correlation analysis</a> automatically highlights significant linking properties or events relevant to an insight. For example, you can find if users who complete a funnel are likely to be from a certain location, or have completed another event. In PostHog, correlation analysis is a standard part of analytics.</p></li><li><p><strong>Formulas:</strong> Formulas in PostHog enable you to create custom insights using your data. A simple example of a formula would be an equation to figure out a ratio or percentage (e.g. the percentage of users who completed two different events), though advanced formulas can use more elaborate functions, such as <code>COS</code> and <code>SIN</code>.</p></li><li><p><strong>SQL access:</strong> While both PostHog and Pendo have ready-made insights and visualization types, only PostHog gives you unlimited access to your data by <a href="/docs/sql">writing your own SQL queries</a>. This is ideal for data scientists, product managers, and engineers who want to perform advanced analysis on user data.</p></li></ul><h4 class="mb-4">Discover what&#x27;s possible with <span class="text-blue">product analytics</span></h4><div slugs="/tutorials/churn-rate,/tutorials/event-tracking-guide,/tutorials/api-get-insights-persons,/tutorials/feature-retention,/tutorials/next-steps-after-installing"></div><h3 id="in-app-engagement-messaging-and-feedback">In-app engagement, messaging, and feedback</h3><p>Pendo is built around in-app guides, tooltips, onboarding flows, and collecting user feedback. PostHog covers this ground with two dedicated products: <a href="/surveys">Surveys</a> and <a href="/workflows">Workflows</a>.</p><p><a href="/docs/surveys"><strong>Surveys</strong></a> let you collect qualitative feedback directly inside your product – NPS, CSAT, CES, ratings, multiple choice, open text, and link prompts with custom CTAs. They can be displayed as popovers, feedback buttons, or via the API for fully custom UIs. You can target surveys based on person properties, URLs, feature flags, or specific events. Because surveys are part of PostHog, you can see the profiles of who responded, watch their session replays, and analyze responses alongside your product analytics.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Screenshot_2026_02_10_at_5_05_22_PM_1f60131b32.png" alt="Surveys"/></p><p><a href="/docs/workflows"><strong>Workflows</strong></a> is PostHog&#x27;s no-code automation builder for sending behavior-triggered messages and actions. You can send emails, Slack messages, and SMS (via Twilio), add delays and branching logic, split audiences, and trigger any CDP destination – all based on live product events. Think onboarding drip campaigns, milestone notifications, or Slack alerts when a user hits a key event.</p><p>The biggest difference is that Pendo provides tooltips and product tours, which can be set up using its drag-and-drop editor without engineering support. PostHog doesn&#x27;t offer in-app guides (yet, it&#x27;s currently in alpha) — instead, it covers user engagement through <a href="/surveys">Surveys</a> for targeted feedback and <a href="/workflows">Workflows</a> for behavior-triggered messaging, with deeper integration into your product data.</p><h3 id="cdp-and-integrations">CDP and integrations</h3><p>Pendo integrates with popular tools like Salesforce, Jira, Slack, and Segment, and supports data export via webhooks and APIs. It doesn&#x27;t offer native data pipeline or CDP functionality – you&#x27;d need a separate tool like Segment or RudderStack to route data between platforms.</p><p>PostHog includes a built-in <a href="/cdp">CDP</a> (Customer Data Platform) with three core components: </p><ol><li><strong>Sources</strong> for ingesting data from 20+ managed integrations (Stripe, Hubspot, Salesforce, Snowflake, BigQuery, Google/Meta/LinkedIn Ads, and more</li><li><strong>Transformations</strong> for cleaning and enriching event data in real-time (GeoIP enrichment, PII scrubbing, bot filtering, property standardization)</li><li><strong>Destinations</strong> for sending PostHog data to other tools in real-time or via batch export.</li></ol><p>Because the CDP is built into PostHog, imported data lives alongside your product analytics, session replays, and feature flags – so you can join data with product behavior in a single query without stitching systems together. PostHog also integrates with third-party CDPs like <a href="/docs/libraries/segment">Segment</a> and <a href="/docs/libraries/rudderstack">RudderStack</a> if you already have one set up.</p><p><div competitors="posthog,pendo"></div></p><h3 id="popular-integrations">Popular integrations</h3><p>Below, we&#x27;ve listed a few of the most popular integrations used across PostHog and Pendo.</p><p><div competitors="posthog,pendo"></div></p><blockquote><p><strong>Want more?</strong> For a full list of PostHog’s available integrations, please <a href="/cdp">check the app directory</a>.</p></blockquote><h2 id="compliance-and-security">Compliance and security</h2><p>Regulatory compliance can be a critical need for many teams, especially if they operate in financial or healthcare industries. Regulations such as HIPAA and GDPR can require teams to store data in certain locations, or to protect data in certain ways.</p><p><div competitors="posthog,pendo"></div></p><h2 id="sdks-and-tracking">SDKs and tracking</h2><p>Pendo and PostHog both support a variety of tracking and implementation options to get your data into their platform. Both platforms enable you to create tracked events manually, as well as offering autocapture to help you get started quickly.</p><p>Autocapture is preferred by many users because it&#x27;s faster to set up, but some argue that it creates too much noise or cost to be useful. We disagree, and it&#x27;s why PostHog gives you your first million events for free, every month — so you can capture events without worrying about these issues. <a href="/blog/is-autocapture-still-bad">It&#x27;s something we feel quite strongly about</a>.</p><p><div competitors="posthog,pendo"></div></p><h3 id="library-support">Library support</h3><p>PostHog supports <a href="/docs/libraries">a wide range of client and server libraries</a>, but not all features are equally available across all of them. We recommend using PostHog&#x27;s JavaScript snippet to enjoy all features. See <a href="/docs/integrate?tab=snippet">our client library documentation</a> for more information.</p><p><div competitors="posthog,pendo"></div></p><h2 id="when-to-choose-posthog-vs-pendo">When to choose PostHog vs Pendo</h2><ul><li><p>Want analytics that connect directly to feature flags, experiments, error tracking, and session replays – with transparent pricing and no sales calls? Go with <strong>PostHog</strong>.</p></li><li><p>Need a platform focused on in-app guides, tooltips, onboarding flows, and product validation – with a visual editor built for non-technical PMs? <strong>Pendo</strong> is built for that.</p></li></ul><h2 id="recommendations-by-team-type">Recommendations by team type</h2><p><strong>For engineering-led product teams</strong></p><ul><li><strong>PostHog</strong> – SQL access, feature flags with local evaluation, error tracking, LLM analytics, and extensive APIs make it the natural fit for teams where engineers drive product decisions. Open source with a public roadmap means you can see exactly what&#x27;s coming.</li></ul><p><strong>For non-technical product managers</strong></p><ul><li><strong>Pendo</strong> – Designed for PMs who want to create in-app guides, tooltips, and onboarding flows without writing code. Its visual editor and product validation tools are purpose-built for teams that don&#x27;t have engineering resources for every in-app change.</li></ul><p><strong>For teams building and shipping features frequently</strong></p><ul><li><strong>PostHog</strong> – Feature flags, A/B testing, and error tracking let you roll out safely, measure impact, and catch regressions – all in one platform. Pendo doesn&#x27;t offer feature flags, experiments, or error tracking natively.</li></ul><p><strong>For teams focused on user onboarding and adoption</strong></p><ul><li><strong>Pendo</strong> – In-app guides, tooltips, walkthroughs, resource centers, and NPS surveys are Pendo&#x27;s core strength. PostHog covers <a href="/surveys">surveys</a> and automated messaging via <a href="/workflows">Workflows</a>, but doesn&#x27;t have Pendo&#x27;s visual tooltip builder.</li></ul><p><strong>For teams building AI products</strong></p><ul><li><strong>PostHog</strong> – <a href="/llm-analytics">LLM analytics</a> tracks model performance, token costs, latency, and traces for engineers debugging and optimizing their AI stack. Pendo&#x27;s Agent Analytics measures AI agent adoption and user success, but doesn&#x27;t offer technical LLM observability.</li></ul><p><strong>For privacy-conscious and regulated organizations</strong></p><ul><li>Both are SOC 2 certified, GDPR-ready, and HIPAA-ready, with EU data residency options. <strong>PostHog</strong> adds open source code, cookieless tracking, and a built-in <a href="/docs/data-warehouse">data warehouse</a> for full data ownership. Pendo offers EU hosting (GCP EU multi-region) but doesn&#x27;t offer self-hosting.</li></ul><p><strong>For early-stage startups</strong></p><ul><li><strong>PostHog</strong> – Generous free tiers across every product (1M events, 5k replays, 1M flag requests/mo), transparent pricing you can model in advance, and <a href="/startups">startups can qualify for $50k in free credits</a>. Pendo&#x27;s free tier is limited to 500 MAUs with Pendo branding; paid plans require sales conversations.</li></ul><p><strong>For enterprise product teams</strong></p><ul><li><strong>Both work</strong>, but for different reasons. Pendo excels at in-app engagement, onboarding, and product validation for large PM teams. PostHog excels at analytics depth, experimentation, error tracking, and developer tooling. Choose based on whether your priority is guiding users (Pendo) or understanding and shipping to them (PostHog).</li></ul><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What&#x27;s the difference between PostHog and Pendo?</summary><p><strong>Pendo</strong> is a product experience platform built for product managers. It combines product analytics with in-app guides, tooltips, onboarding flows, NPS surveys, product validation, and roadmap tools. Session replay is available on Core plans and above. </p><p><strong>PostHog</strong> is an all-in-one platform built for engineers, combining product analytics with <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/surveys">surveys</a>, <a href="/workflows">workflows</a>, a built-in <a href="/data-warehouse">data warehouse</a>, and more.</p><p>The key difference is focus: <strong>Pendo</strong> is optimized for non-technical PMs who want to create in-app guides and collect feedback without code. <strong>PostHog</strong> is optimized for engineering-led teams who want to measure, experiment, and ship — all from one platform.</p></details><details><summary>Who is Pendo useful for?</summary><p><strong>Pendo</strong> is designed primarily for product managers and customer success teams. Its core features are the ability to create in-app guides, tooltips, and onboarding flows without engineering support, plus tools for collecting user feedback, NPS surveys, product validation, and roadmap planning. It also includes product analytics (funnels, trends, retention) and session replay on Core plans and above.</p><p>Pendo is a good fit if your team&#x27;s primary goal is driving feature adoption and improving onboarding through in-app messaging, and you don&#x27;t need feature flags, A/B testing, error tracking, or deep developer tooling.</p></details><details><summary>Who is PostHog useful for?</summary><p><strong>PostHog</strong> is built primarily for engineers, technical product managers, and product-focused engineering teams. Beyond product analytics, PostHog includes <a href="/ai">PostHog AI</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/session-replay">session replays</a> with console logs and network monitoring, <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/surveys">surveys</a>, <a href="/logs">logs</a>, <a href="/workflows">workflows</a> for automated messaging, and a built-in <a href="/data-warehouse">data warehouse</a> — all with SQL access and extensive APIs.</p><p>PostHog is a good fit if your team wants a single platform that covers the full build-measure-learn cycle: ship with feature flags, track with analytics, debug with replays and error tracking, iterate with experiments...</p></details><details><summary>How much does Pendo cost?</summary><p>Pendo uses MAU-based (monthly active users) pricing across four tiers — Free, Base, Core, and Ultimate — but doesn&#x27;t publish prices publicly. You need to contact their sales team for a quote.</p><p>The <strong>Free</strong> tier supports up to 500 MAUs with basic analytics, in-app guides, and branded NPS surveys. <strong>Base</strong> adds one integration and expanded analytics. <strong>Core</strong> adds session replay. <strong>Ultimate</strong> adds NPS (unbranded), product discovery, journey orchestration, and data synchronization. Some features like Pendo Listen (feedback) and additional integrations are available as paid add-ons on lower tiers.</p><p>Based on third-party data from Vendr and customer reports, typical Pendo costs range from around $15,000 to $140,000+ per year depending on MAU count, features, and contract terms. Paid plans are annual only — Pendo doesn&#x27;t offer monthly billing.</p></details><details><summary>How much does PostHog cost?</summary><p>PostHog uses transparent, usage-based <a href="/pricing">pricing</a>. It&#x27;s free to get started — no credit card required — and every month you get generous free allowances including 1 million analytics events, 5,000 session replays, and 1 million feature flag requests.</p><p>After the free tier, you pay only for what you use, and pricing gets cheaper at scale. You can set billing limits per product to avoid surprises, and all pricing is public on the <a href="/pricing">pricing page</a>. Volume discounts and <a href="/startups">startup credits of $50k</a> are available. In practice, more than 90% of PostHog users stay on the free tier.</p></details><details><summary>Do Pendo and PostHog offer free trials?</summary><p><strong>Pendo</strong> offers a free tier (Pendo Free) rather than a time-limited trial. It supports up to 500 MAUs with basic analytics, in-app guides, and branded NPS surveys. Once you exceed 500 MAUs, you can no longer create guides or segments, and usage data is sampled. Pendo does not offer free trials of its paid plans — you need to contact sales.</p><p><strong>PostHog</strong> is free to start with no restrictions on features or time. All users get 1 million events, 5,000 session replays, and 1 million feature flag requests free every month. You can set billing limits to keep usage within the free allowance indefinitely, and there&#x27;s no Pendo-style branding on free accounts. Adding a credit card unlocks advanced features like correlation analysis and lifecycle insights while still staying on the free tier.</p></details><details><summary>Does Pendo have feature flags or A/B testing?</summary><p>No. Pendo doesn&#x27;t offer native feature flags, A/B testing, or experimentation. If you need to roll out features gradually, run experiments, or toggle functionality by user segment, you&#x27;d need a separate tool like LaunchDarkly or Optimizely.</p><p><strong>PostHog</strong> includes both <a href="/feature-flags">feature flags</a> and <a href="/experiments">A/B testing</a> natively, tightly integrated with analytics and session replay. You can target flags by user properties, roll out gradually, measure experiment impact on funnels and retention, and debug issues by filtering replays to specific flag variants.</p></details><details><summary>Does Pendo have error tracking?</summary><p>No. Pendo doesn&#x27;t offer error tracking, crash monitoring, or exception handling. You&#x27;d need a separate tool like Sentry or Bugsnag for this.</p><p><strong>PostHog</strong> includes native <a href="/error-tracking">error tracking</a> that connects exceptions and stack traces directly to session replays, user behavior, and feature flag changes — so you can see exactly what a user was doing when an error occurred and whether a specific release caused it.</p></details><details><summary>Does Pendo have LLM analytics?</summary><p>Pendo offers Agent Analytics for tracking AI agent adoption, conversation effectiveness, and user success — but it&#x27;s aimed at product managers measuring business impact, not engineers debugging LLM performance.</p><p><strong>PostHog&#x27;s</strong> <a href="/llm-analytics">LLM analytics</a> is developer-focused, tracking traces, token costs, latency, and model performance across your AI stack.</p></details><details><summary>Which has better session replay — PostHog or Pendo?</summary><p><strong>PostHog</strong> has stronger session replay for developers. Beyond watching user sessions, it includes console logs, network request monitoring, a DOM explorer, and performance metrics — so you can debug issues, not just observe behavior. Replays also link directly to error tracking and feature flag evaluations, so you can see exactly what went wrong and which variant a user was on.</p><p><strong>Pendo</strong> includes session replay on Core plans and above, focused on understanding user journeys alongside in-app guide performance. It doesn&#x27;t include developer debugging tools. Pendo&#x27;s free tier doesn&#x27;t include replay at all; PostHog&#x27;s free tier includes 5,000 replays/month.</p></details><details><summary>Can I migrate from Pendo to PostHog?</summary><p>Yes. See the <a href="/docs/migrate/pendo">Pendo to PostHog migration guide</a> for step-by-step instructions on exporting your Pendo data and importing it into PostHog, including historical events and user properties.</p></details><details><summary>Does PostHog offer EU hosting?</summary><p>Yes. PostHog offers EU-hosted cloud with data stored exclusively in the EU. PostHog is SOC 2 certified, GDPR-ready, and HIPAA-ready, with cookieless tracking options and an open-source codebase you can audit.</p><p>Pendo also offers EU data residency via GCP&#x27;s EU multi-region (including Frankfurt, Warsaw, and other locations). Both platforms support GDPR and HIPAA compliance requirements.</p></details><details><summary>Can PostHog replace Pendo?</summary><p><strong>For analytics, yes.</strong> PostHog offers deeper product analytics than Pendo, including funnels, retention, user paths, cohorts, correlation analysis, formula mode, and SQL access. PostHog also includes session replay, surveys (NPS, CSAT, CES, and custom), and <a href="/workflows">Workflows</a> for automated behavior-triggered messaging.</p><p><strong>For in-app guides, partially.</strong> PostHog&#x27;s <a href="/surveys">Surveys</a> can display targeted popovers and prompts, and <a href="/workflows">Workflows</a> can trigger emails, Slack messages, and SMS based on user behavior. But PostHog doesn&#x27;t have Pendo&#x27;s visual drag-and-drop editor for tooltips, product tours, and walkthroughs. If your team relies heavily on no-code in-app guides, Pendo&#x27;s editor is still a differentiator.</p></details><details><summary>What are the best Pendo alternatives?</summary><p>The best Pendo alternatives depend on what you need most:</p><ul><li><strong><a href="/blog/best-pendo-alternatives">PostHog</a></strong> – Best all-in-one platform for engineering-led teams wanting analytics, feature flags, experiments, error tracking, and more</li><li><strong><a href="/blog/posthog-vs-mixpanel">Mixpanel</a></strong> – Best for self-serve product analytics with a polished UI</li><li><strong><a href="/blog/posthog-vs-amplitude">Amplitude</a></strong> – Best for enterprise teams wanting warehouse-native analytics and mature experimentation</li><li><strong><a href="/blog/posthog-vs-heap">Heap</a></strong> – Best for teams wanting comprehensive autocapture with minimal engineering effort</li><li><strong>Userpilot</strong> – Best for non-technical teams focused primarily on in-app onboarding and adoption</li></ul><p>For a detailed comparison, see our guide to the <a href="/blog/best-pendo-alternatives">best Pendo alternatives</a>.</p></details><details><summary>What are the best product analytics tools in 2026?</summary><p>The top product analytics tools in 2026 include:</p><ul><li><strong><a href="/product-analytics">PostHog</a></strong> – Best all-in-one platform combining product analytics with <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</a>, and more</li><li><strong><a href="/blog/posthog-vs-mixpanel">Mixpanel</a></strong> – Best for self-serve product teams wanting fast, flexible analytics</li><li><strong><a href="/blog/posthog-vs-amplitude">Amplitude</a></strong> – Best for enterprises wanting warehouse-native analytics and a built-in CDP</li><li><strong><a href="/blog/best-pendo-alternatives">Pendo</a></strong> – Best for product managers who also need in-app guides and user onboarding</li><li><strong><a href="/blog/posthog-vs-heap">Heap</a></strong> – Best for teams wanting comprehensive autocapture with minimal instrumentation</li><li><strong><a href="/blog/posthog-vs-ga4">Google Analytics</a></strong> – Best for marketing teams already invested in the Google ecosystem</li></ul><p>For detailed comparisons, see our guides to <a href="/blog/best-mixpanel-alternatives">Mixpanel alternatives</a>, <a href="/blog/best-amplitude-alternatives">Amplitude alternatives</a>, and <a href="/blog/best-heap-alternatives">Heap alternatives</a>.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog × Vercel: feature flags, minus the plumbing]]></title><description><![CDATA[If you’re building on Vercel and using PostHog for  feature flags  and  experiments , you’ve probably had some version of this setup: flags defined in…]]></description><link>https://posthog.com/blog/vercel-integration</link><guid isPermaLink="false">7b657125-7d21-585c-af7e-2be60d136dcb</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/vercel_integration_7b155713cf.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>If you’re building on Vercel and using PostHog for <a href="/feature-flags">feature flags</a> and <a href="/experiments">experiments</a>, you’ve probably had some version of this setup:</p><ul><li>flags defined in one place</li><li>app logic living somewhere else</li><li>a bit of glue code</li><li>a bit of env var juggling</li><li>a bit of “wait, where does this get evaluated again?”</li></ul><p>Today, that gets simpler.</p><h2 id="introducing-the-posthog--vercel-integration">Introducing the PostHog × Vercel integration</h2><p><a href="/docs/integrations/vercel-marketplace">The new PostHog × Vercel integration</a> lets you use PostHog feature flags and experiments directly in Vercel, without custom wiring or creative workarounds.</p><p>Here’s how it works:</p><ol><li>You define feature flags and experiments in PostHog</li><li>They’re synced into Vercel’s native Flags system</li><li>Your Vercel apps consume them using the Vercel Flags SDK</li></ol><p>Alongside flag syncing, the integration also takes care of credentials. Your PostHog Project ID and API key are automatically synced into Vercel environment variables.</p><p>This means no copying values between dashboards and no wondering if prod and staging are using the same project. It’s the boring kind of automation – the best kind. </p><p>In addition, thanks to the Vercel Marketplace, billing and account management are now both managed in a single location.</p><p>The integration also works with <a href="v0.app">v0 – Vercel&#x27;s AI agent</a> that helps users create real code and full-stack apps.</p><h2 id="get-started">Get started</h2><p>Feature flags help teams ship more confidently and experiment more easily. This integration keeps that experience simple – letting PostHog handle flags and experiments, and Vercel focus on running your app, without you having to stitch the two together.</p><p>If you’re already using PostHog and Vercel, you can enable the integration from the Vercel Marketplace and start syncing flags right away.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Your logs' final destination is in GA. You always end up here anyway]]></title><description><![CDATA[Logs  is where debugging actually ends. You might start with an alert, an error, or a user report. You might open a session replay or trace a request…]]></description><link>https://posthog.com/blog/logs-ga</link><guid isPermaLink="false">1a5ba386-e069-54b6-a7ea-2aff18967846</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/logs_ga_cover_84292178a1.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong><a href="https://app.posthog.com/logs">Logs</a></strong> is where debugging actually ends. You might start with an alert, an error, or a user report. You might open a session replay or trace a request across services. But when you need to understand what really happened, what the system did, in what order, and why, you end up going through your logs. </p><p>PostHog is now the final destination for your logs. Logs is generally available, and it lives in the same place as your errors, session replays, and product data. The place where an investigation begins is now also where it ends.</p><h2 id="we-built-it-by-tripping-over-our-own-logs">We built it by tripping over our own logs</h2><p>A lot has changed since <strong><a href="/blog/logs-beta">we released Logs in beta</a></strong>, largely driven by how we use it ourselves.</p><p>In fact, we recently wrote about how PostHog engineers debug PostHog using Logs, including cases where our previous logging setup quietly hid serious problems instead of surfacing them.</p><p>In one example, a platform engineer tracked down repeated out-of-memory crashes that “looked fine” everywhere else. Only after filtering aggressively did something odd remain: huge compressed payloads being logged where they shouldn’t have been. The old internal pipeline tried to process everything, crashed repeatedly, and sometimes took other services with it.</p><p>This internal feedback shaped these improvements: better filtering, clearer visibility, and faster ways to rule out options. If you’re curious, you can <strong><a href="/blog/how-posthog-uses-logs">read the full story of how we use Logs ourselves and what we’ve learned from it</a></strong>.</p><h2 id="when-what-happened-becomes-clear">When “what happened?” becomes clear</h2><p>Logs is designed for the part of debugging where you already know something is wrong and need to understand why. Instead of scrolling through raw text, logs are treated as structured data you can filter and pivot around by:</p><ul><li>Service</li><li>Severity</li><li>IDs</li><li>Users</li><li>Any other attribute</li></ul><p>The view updates as you filter, making it easier to scope an issue first and only read individual log lines once something stands out.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2026_01_21_at_16_53_37_2x_1_84e0ab03b8.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2026_01_21_at_16_53_57_2x_1_1afd0b3948.png" alt="log filters" classes="rounded"></div><p>Frontend and backend logs live together. Browser logs captured via PostHog JS are ingested alongside backend logs and automatically linked to users and sessions, so you can move from a frontend exception to the session replay where it happened and then to the backend logs that explain what the system was doing at that moment.</p><p>Under the hood, Logs is built on standard OpenTelemetry ingestion (OTLP). There are no proprietary SDKs and no new instrumentation model to learn. If you’re already emitting logs via OpenTelemetry, you can send them to PostHog with minimal configuration and keep using the same tooling you already have.</p><p>When investigations get noisy or time is tight, you can also summarize what’s happening and highlight patterns using PostHog AI. It’s not a replacement for reading logs, but it can be a useful way to sanity-check assumptions or get oriented more quickly when there’s a lot going on.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2026_01_21_at_16_03_53_2x_1_b4ae4d71e8.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2026_01_22_at_14_53_40_2x_1_38ac84670a.png" alt="logs AI insights" classes="rounded"></div><h2 id="how-logs-fits-into-posthog">How Logs fits into PostHog</h2><p>All of this works because Logs lives in the same place as <a href="/error-tracking">error tracking</a>, <a href="/session-replay">session replay</a>, and <a href="/product-analytics">product analytics</a>. Debugging shouldn’t be a sequence of separate tools so much as a single flow that moves from signal to explanation. </p><p>Logs is now generally available. All beta users get one month free. The free tier includes 50 GB, then costs $0.25 per GiB ingested (or $0.15 per GiB at 300 GB+), with 7-day retention and no per-seat or query fees.</p><p>If you’re already using PostHog for errors or replays, Logs fits into the workflow you already have, rather than adding a new one. <a href="https://app.posthog.com/logs">Try it out.</a></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Behind the scenes of a PostHog hackathon]]></title><description><![CDATA[As a 100% remote company, our annual company hackathon is one of our most important rituals.   Some of our most important products and features, like…]]></description><link>https://posthog.com/blog/behind-the-scenes-posthog-hackathon</link><guid isPermaLink="false">883b4fd6-d357-5797-a548-4073b1de4c0e</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/ben_dreams_of_hedgehogs_a90e7c58cf.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>As a 100% remote company, our annual company hackathon is one of our most important rituals.  </p><p>Some of our most important products and features, like session replay and our data warehouse, started as hackathon projects.</p><p>We wanted to share this with you, so at our 2025 offsite in Tulum, Mexico we shot this hackathon documentary about one of our... defining features: Hedgehog Mode. </p><p>In <a href="https://www.youtube.com/watch?v=gwUZRA0Y7xI">episode 1 of Ben Dreams of Hedgehogs</a>, Ben White teams up with Lottie Coxon to convince people to realize Ben&#x27;s dream of building a hedgehog-themed videogame.  </p><p>Is this our next multi-million dollar product? No.  </p><p>Was it a lot of fun? Absolutely. </p><p>You can watch the first episode below, or on <a href="https://www.youtube.com/watch?v=gwUZRA0Y7xI">our YouTube channel</a>.</p><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/gwUZRA0Y7xI?si=ZpbEqAJV6dYV1FPE" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerPolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe><p>And if you&#x27;d like to participate in a PostHog hackathon, we&#x27;re <a href="/careers">always hiring</a>.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The most popular Mixpanel alternatives & competitors, compared]]></title><description><![CDATA[Mixpanel  has been a go-to product analytics platform for over a decade, and it's evolved significantly – adding session replay, heatmaps, A/B testing…]]></description><link>https://posthog.com/blog/best-mixpanel-alternatives</link><guid isPermaLink="false">8defd02f-eeed-50ca-a86a-553493fecad6</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-alternatives/posthog-alternatives.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="/blog/posthog-vs-mixpanel">Mixpanel</a> has been a go-to product analytics platform for over a decade, and it&#x27;s evolved significantly – adding session replay, heatmaps, A/B testing, and feature flags in recent years.</p><p>But Mixpanel isn&#x27;t the only option. Whether you&#x27;re looking for an all-in-one platform that includes error tracking and LLM analytics, transparent usage-based pricing, or a tool built specifically for engineering teams, there are alternatives worth considering.</p><p>In this guide, we compare the best Mixpanel alternatives – whether you need a focused analytics tool or an all-in-one platform for building better products.</p><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/hogflix-dashboard.png" alt="posthog"/></p><h3 id="what-is-posthog">What is PostHog?</h3><p>PostHog is an open-source developer platform that combines <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/surveys">user surveys</a>, <a href="/error-tracking">error tracking</a>, and more into one platform. This means it&#x27;s not just an alternative to Mixpanel, but also <a href="/blog/posthog-vs-hotjar">Hotjar</a>, <a href="/blog/posthog-vs-optimizely">Optimizely</a>, and <a href="/blog/best-split-alternatives">Split</a></p><h3 id="key-features">Key features</h3><ul><li><p><strong>Product analytics</strong>, including funnels, user paths, retention analysis, custom trends, and dynamic user cohorts. Power users can create custom insights using SQL.</p></li><li><p><strong>Web analytics</strong> for tracking your marketing website – pageviews, bounce rate, traffic sources, UTM campaigns, and web vitals in a simple dashboard.</p></li><li><p><strong>Session replays</strong> with event timelines, console logs, network activity, DOM explorer, and performance metrics. 90-day retention with the ability to save individual replays offline indefinitely.</p></li><li><p><strong>Heatmaps</strong> showing clicks, scroll depth, and mouse movement overlaid on your actual site – viewable directly via the PostHog toolbar.</p></li><li><p><strong>A/B tests</strong> with up to 10 test variations, primary and secondary metrics. Automatically calculates recommended duration, sample size, and statistical significance.</p></li><li><p><strong>Surveys</strong>, including open text, link with custom CTA, ratings (for <a href="/product-engineers/nps-vs-csat-vs-ces">NPS, CSAT, and CES surveys</a>), single and multiple choice. Target users based on person properties, URL, or using existing feature flags.</p></li><li><p><strong>Error tracking</strong> to monitor exceptions, stack traces, and crashes – connected directly to session replays, user behavior, and feature flag changes.</p></li><li><p><strong>Data warehouse</strong> to import and query data from external sources like Stripe, Zendesk, Hubspot, or your existing warehouse – analyze business and product data together.</p></li></ul><h3 id="who-uses-posthog">Who uses PostHog?</h3><p>Typical PostHog users are:</p><ul><li>Product-minded engineering teams</li><li>Data-savvy product managers</li><li>Startups and mid-size enterprises</li></ul><p>Customers include <a href="/customers/supabase">Supabase</a>, <a href="/customers/lovable">Lovable</a>, <a href="/customers/elevenlabs">ElevenLabs</a>, and <a href="/customers">see all customers</a>.</p><h3 id="how-does-posthog-compare-to-mixpanel">How does PostHog compare to Mixpanel?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center "><svg class="h-5 mx-auto w-auto max-w-full " width="157" height="30" viewBox="0 0 157 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#1D4AFF" d="M0 23.468C0 22.5771 1.07706 22.1309 1.70703 22.7609L6.29004 27.344C6.92 27.974 6.47391 29.051 5.58301 29.051H1C0.447715 29.051 0 28.6033 0 28.051V23.468ZM0 13.4709C4.9194e-05 12.5801 1.07707 12.1339 1.70703 12.7639L9.99707 21.0539V29.051L0.292969 19.3469C0.105529 19.1593 0 18.905 0 18.6399V13.4709ZM0 3.47384C3.86254e-05 2.58298 1.07707 2.13689 1.70703 2.76681L9.99707 11.0568V19.0539L0.292969 9.34982C0.105519 9.1623 0 8.90793 0 8.64278V3.47384Z"></path><path fill="#F9BD2B" d="M26.2852 27.344C26.915 27.974 26.468 29.051 25.5771 29.051H19.9961L19.9932 21.053L26.2852 27.344ZM29.6982 20.761C29.8857 20.9485 29.9912 21.2029 29.9912 21.468V26.637C29.9912 27.5278 28.9142 27.974 28.2842 27.344L19.9941 19.0539V11.0569L29.6982 20.761ZM19.9941 3.47386C19.9942 2.58298 21.0712 2.13688 21.7012 2.76683L29.6982 10.7639C29.8857 10.9514 29.9912 11.2058 29.9912 11.4709V16.6399C29.9912 17.5308 28.9142 17.9769 28.2842 17.3469L20.2871 9.34984C20.0997 9.16232 19.9941 8.90796 19.9941 8.64281V3.47386Z"></path><path fill="#F54E00" d="M16.2871 27.344C16.9171 27.974 16.471 29.051 15.5801 29.051H9.99707V21.0539L16.2871 27.344ZM19.7012 20.761L19.9941 21.0598V29.051L10.29 19.3469C10.1027 19.1593 9.99707 18.905 9.99707 18.6399V11.0569L19.7012 20.761ZM9.99707 3.47385C9.99711 2.58299 11.0742 2.13688 11.7041 2.76682L19.7012 10.7639L19.9941 11.0598V19.0539L10.29 9.34982C10.1026 9.16231 9.99707 8.90794 9.99707 8.64279V3.47385Z"></path><path fill="#000" d="M42.5248 23.5308L33.1121 14.118C32.4821 13.488 31.405 13.9342 31.405 14.8251V27.9915C31.405 28.5438 31.8527 28.9915 32.405 28.9915H46.9856C47.5379 28.9915 47.9856 28.5438 47.9856 27.9915V26.7925C47.9856 26.2402 47.536 25.7992 46.9883 25.7279C45.3076 25.509 43.7355 24.7414 42.5248 23.5308ZM36.2035 25.7925C35.3206 25.7925 34.604 25.0759 34.604 24.193C34.604 23.31 35.3206 22.5934 36.2035 22.5934C37.0865 22.5934 37.8031 23.31 37.8031 24.193C37.8031 25.0759 37.0865 25.7925 36.2035 25.7925Z"></path><path fill="#000" d="M59.6496 25H63.7576V18.188H67.1896C70.9596 18.188 73.3776 15.9521 73.3776 12.494C73.3776 9.03605 70.9596 6.80005 67.1896 6.80005H59.6496V25ZM63.7576 14.678V10.3101H66.7736C68.3336 10.3101 69.2696 11.142 69.2696 12.494C69.2696 13.8461 68.3336 14.678 66.7736 14.678H63.7576Z"></path><path fill="#000" d="M80.8095 25.208C84.8135 25.208 87.7255 22.348 87.7255 18.448C87.7255 14.548 84.8135 11.688 80.8095 11.688C76.7535 11.688 73.8935 14.548 73.8935 18.448C73.8935 22.348 76.7535 25.208 80.8095 25.208ZM77.6895 18.448C77.6895 16.368 78.9375 14.938 80.8095 14.938C82.6555 14.938 83.9035 16.368 83.9035 18.448C83.9035 20.528 82.6555 21.958 80.8095 21.958C78.9375 21.958 77.6895 20.528 77.6895 18.448Z"></path><path fill="#000" d="M94.2995 25.208C97.3675 25.208 99.4475 23.284 99.4475 21.022C99.4475 15.718 92.4015 17.434 92.4015 15.354C92.4015 14.7821 92.9995 14.4181 93.8575 14.4181C94.7415 14.4181 95.8075 14.964 96.1455 16.16L99.2135 14.886C98.6155 12.988 96.4055 11.688 93.7275 11.688C90.8415 11.688 89.0475 13.404 89.0475 15.458C89.0475 20.424 95.9895 19.046 95.9895 21.1C95.9895 21.828 95.3135 22.3221 94.2995 22.3221C92.8435 22.3221 91.8295 21.3081 91.5175 20.0861L88.4495 21.282C89.1255 23.258 91.1015 25.208 94.2995 25.208Z"></path><path fill="#000" d="M109.33 24.8701L109.07 21.5681C108.628 21.8021 108.056 21.88 107.588 21.88C106.652 21.88 106.028 21.2041 106.028 20.034V15.068H109.2V11.896H106.028V8.10005H102.206V11.896H100.126V15.068H102.206V20.528C102.206 23.7001 104.364 25.208 107.198 25.208C107.978 25.208 108.706 25.0781 109.33 24.8701Z"></path><path fill="#000" d="M122.656 6.80005V13.872H115.428V6.80005H111.32V25H115.428V17.382H122.656V25H126.79V6.80005H122.656Z"></path><path fill="#000" d="M135.908 25.208C139.912 25.208 142.824 22.348 142.824 18.448C142.824 14.548 139.912 11.688 135.908 11.688C131.852 11.688 128.992 14.548 128.992 18.448C128.992 22.348 131.852 25.208 135.908 25.208ZM132.788 18.448C132.788 16.368 134.036 14.938 135.908 14.938C137.754 14.938 139.002 16.368 139.002 18.448C139.002 20.528 137.754 21.958 135.908 21.958C134.036 21.958 132.788 20.528 132.788 18.448Z"></path><path fill="#000" d="M150.201 24.584C151.631 24.584 152.905 24.09 153.581 23.232V24.48C153.581 25.936 152.411 26.9501 150.617 26.9501C149.343 26.9501 148.225 26.326 148.043 25.26L144.559 25.806C145.027 28.276 147.549 29.9401 150.617 29.9401C154.647 29.9401 157.325 27.574 157.325 24.064V11.896H153.555V13.014C152.853 12.208 151.657 11.688 150.123 11.688C146.483 11.688 144.195 14.184 144.195 18.136C144.195 22.088 146.483 24.584 150.201 24.584ZM147.913 18.136C147.913 16.186 149.057 14.938 150.825 14.938C152.619 14.938 153.763 16.186 153.763 18.136C153.763 20.086 152.619 21.334 150.825 21.334C149.057 21.334 147.913 20.086 147.913 18.136Z"></path></svg></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Mixpanel<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-mixpanel">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/feature-flags"><strong>Feature Flags</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Control feature access with precision and safely roll out changes</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/surveys"><strong>Surveys</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Collect product feedback with no-code surveys and customizable targeting</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay/heatmaps"><strong>Heatmaps</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Visualize where users click and scroll on your website</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Open source</strong><div class="text-sm text-secondary mt-1">Audit code, contribute to roadmap, and build integrations</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>SQL query editor</strong><div class="text-sm text-secondary mt-1">Write SQL queries directly against your data without a separate data warehouse</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Notebooks</strong><div class="text-sm text-secondary mt-1">Collaborate on analysis in shareable notebooks</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between PostHog and Mixpanel</summary><ul><li>PostHog includes <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, and <a href="/surveys">surveys</a> natively; Mixpanel doesn&#x27;t offer these at all.</li><li>PostHog charges up to 80% less for anonymous events; Mixpanel charges the same, higher rate for all events regardless.</li><li>PostHog has a built-in <a href="/data-stack">data warehouse</a> for importing external data (Stripe, Zendesk, etc.); Mixpanel relies on warehouse connectors and requires you to get data into a third-party warehouse first.</li><li>Mixpanel&#x27;s Experiments report is an Enterprise-only add-on; PostHog includes experiments on all plans with usage-based pricing.</li><li>PostHog offers SQL access for custom queries; Mixpanel doesn&#x27;t have a native SQL editor, requiring you to export your data instead.</li></ul></details><details><summary>Main similarities between PostHog and Mixpanel</summary><ul><li>Both offer core product analytics: funnels, retention, cohorts, user paths, and trends.</li><li>Both include A/B testing, feature flags, and session replay with web and mobile SDK support (iOS, Android, React Native).</li><li>Both have AI-powered insight builders for natural language queries.</li><li>Both are SOC 2 certified and GDPR-ready with EU data residency options.</li><li>Both integrate with CDPs like Segment and Rudderstack, and data warehouses like Snowflake and BigQuery.</li></ul></details><p>PostHog is the best choice if you like the idea of consolidating around one platform. Mixpanel offers third-party integrations for features it doesn&#x27;t have, but this creates a messy workflow for teams.</p><p>PostHog also supports <a href="/docs/product-analytics/autocapture">autocapture</a>. This means you don&#x27;t have to manually instrument events. Instead, PostHog starts collecting data from the moment you implement its tracking snippet.</p><h3 id="why-do-companies-use-posthog">Why do companies use PostHog?</h3><p>According to <a href="https://www.g2.com/products/posthog/reviews">reviews on G2</a>, companies use PostHog because:</p><ol><li><p><strong>It replaces multiple tools:</strong> PostHog can replace Mixpanel (product analytics), LaunchDarkly (feature flags and A/B testing), and Hotjar (session replay and surveys). This simplifies workflows and ensures all their data is in one place.</p></li><li><p><strong>Pricing is transparent and scalable:</strong> Reviewers appreciate how PostHog&#x27;s pricing scales as they grow. There&#x27;s a <a href="/pricing">generous free tier</a>. Companies eligible for <a href="/startups">PostHog for Startups</a> also get $50k in additional free credits.</p></li><li><p><strong>They need a complete picture of users:</strong> PostHog includes every tool necessary to understand users and improve products. This means creating funnels to track conversion, watching replays to see where users get stuck, testing solutions with A/B tests, and gathering feedback with user surveys.</p></li></ol><blockquote><h4 id="bottom-line">Bottom line</h4><p>PostHog is the best Mixpanel alternative for startups and mid-size companies. It replaces Mixpanel and numerous other tools, saving money and time. Power user features, like an SQL insight builder and session replay logs, make it a good choice for engineering-led teams, too.</p></blockquote><p><div></div></p><h2 id="2-google-analytics-4-ga4">2. Google Analytics 4 (GA4)</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/mixpanel-alternatives/GA4.png" alt="GA4"/></p><h3 id="what-is-google-analytics-4">What is Google Analytics 4?</h3><p><a href="/blog/posthog-vs-ga4">Google Analytics 4 (GA4)</a> is a marketing and product analytics tool that&#x27;s tightly integrated with other Google products, such as Ads, BigQuery, Looker Studio, and Firebase.</p><p>Unlike its predecessor, Universal Analytics (GA3), it&#x27;s event-based. It also introduces new report types, such as conversion funnels and retention tables. This makes it more useful to product teams than before.</p><h3 id="key-features-1">Key features</h3><ul><li><p><strong>Web and app analytics</strong> with event-based tracking, conversion funnels, retention tables, and user paths across websites and mobile apps.</p></li><li><p><strong>Advertising analytics</strong> with native Google Ads integration, campaign attribution, and ROI tracking across paid channels.</p></li><li><p><strong>Predictive insights</strong> powered by Google&#x27;s machine learning – alerts you to trends, anomalies, and predicts churn and purchase probability.</p></li><li><p><strong>Google ecosystem integration</strong> with BigQuery for raw data access, Looker Studio for dashboards, Firebase for mobile, and Google Ads for attribution.</p></li><li><p><strong>Natural language search</strong> lets you ask specific questions like &quot;MoM growth in users on iOS&quot; rather than building reports manually.</p></li></ul><h3 id="who-uses-ga4">Who uses GA4?</h3><p>Typical GA4 users are:</p><ul><li>Marketing and content teams</li><li>Large news and content publishers</li><li>Enterprises who also use BigQuery</li></ul><p>Google&#x27;s huge scale means GA4 is used by both the biggest global corporations to SMBs of every kind. It is ubiquitous.</p><h3 id="how-does-ga4-compare-to-mixpanel">How does GA4 compare to Mixpanel?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">GA4<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-ga4">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Mixpanel<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-mixpanel">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Advertising analytics</strong><div class="text-sm text-secondary mt-1">Track ROI on Google Ads and other marketing campaigns</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Notebooks</strong><div class="text-sm text-secondary mt-1">Collaborate on analysis in shareable notebooks</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Google Ads</strong><div class="text-sm text-secondary mt-1">Import ROI data from Google Ads</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Predictive insights</strong><div class="text-sm text-secondary mt-1">AI-powered alerts when metrics change</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI insight builder</strong><div class="text-sm text-secondary mt-1">&quot;Talk to your data&quot; using AI</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/dashboards"><strong>Dashboards</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Combine insights into shareable dashboards</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Role-based access control</strong><div class="text-sm text-secondary mt-1">Control access to features and data based on user roles and permissions</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Transparent pricing</strong><div class="text-sm text-secondary mt-1">Clear, upfront pricing with no hidden fees</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between GA4 and Mixpanel</summary><ul><li>GA4 is optimized for marketing analytics and campaign attribution; Mixpanel is built for product analytics and user behavior.</li><li>GA4 has native Google Ads integration for tracking ad spend and ROI; Mixpanel requires third-party connectors for advertising data.</li><li>Mixpanel supports group analytics for B2B account-level tracking; GA4 doesn&#x27;t have native group analytics.</li><li>GA4 is free for most businesses (up to 10M events/month); Mixpanel&#x27;s free tier is 1M events with paid plans scaling from there.</li><li>Mixpanel now includes session replay, heatmaps, A/B testing, and feature flags; GA4 doesn&#x27;t offer any of these.</li></ul></details><details><summary>Main similarities between GA4 and Mixpanel</summary><ul><li>Both are event-based analytics platforms with funnels, retention, and cohort analysis.</li><li>Both integrate with major data warehouses like BigQuery and Snowflake.</li><li>Both provide custom dashboards and reporting capabilities.</li><li>Both support mobile app analytics via Firebase (GA4) and native SDKs (Mixpanel).</li><li>Both are used by large enterprises with significant compliance and scale requirements.</li></ul></details><p>GA4 and Mixpanel are only superficially similar. They cover the same basics, but GA4 is better-suited to content and marketing teams, while Mixpanel is designed for product teams.</p><p>Note, GA4 doesn&#x27;t support group analytics. This makes it easy to track aggregated usage at an account level, rather than at a user level – useful for tracking behavior in B2B products.</p><h3 id="why-do-companies-use-ga4">Why do companies use GA4?</h3><ol><li><p><strong>Because it&#x27;s Google:</strong> It&#x27;s not an original reason, but it holds true. Using Google Analytics makes a lot of sense for teams who rely on other Google platforms, like Google Ads and BigQuery.</p></li><li><p><strong>It&#x27;s powerful and free:</strong> Likewise, Google&#x27;s scale means <a href="/blog/google-analytics-cost">GA4 is completely free</a> to most small and medium-sized businesses. This, combined with strong analytical tools and the large ecosystem of GA experts to call upon, makes it a safe choice.</p></li><li><p><strong>To track marketing ROI:</strong> GA4 is predominantly used by marketing and e-commerce teams to track campaign ROI. It&#x27;s also popular among large content publishers for its scalability.</p></li></ol><blockquote><h4 id="bottom-line-1">Bottom line</h4><p>GA4 is the best Mixpanel alternative for marketing teams who want to track ROI on campaigns, and a good option for B2C and e-commerce platforms. Product teams, especially those working on B2B products, should look elsewhere.</p></blockquote><h2 id="3-amplitude">3. Amplitude</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/mixpanel-alternatives/ammplitude.png" alt="amplitude"/></p><h3 id="what-is-amplitude">What is Amplitude?</h3><p><a href="/blog/best-amplitude-alternatives">Amplitude</a> is an analytics and testing tool with a particular focus on large enterprise customers, like Zoom, NBCUniversal, and Walmart.</p><h3 id="key-features-2">Key features</h3><ul><li><p><strong>Product analytics</strong> with funnel and retention analysis, user paths, behavioral cohorts, custom dashboards, and SQL access for power users.</p></li><li><p><strong>Session replay</strong> to watch real user sessions and understand behavior qualitatively – includes heatmaps on Growth/Enterprise plans.</p></li><li><p><strong>A/B testing</strong> with support for JSON payloads, primary, secondary, and guardrail metrics. Web Experimentation includes a visual editor.</p></li><li><p><strong>Feature flags</strong> for controlled rollouts and targeting specific user segments based on behavioral cohorts.</p></li><li><p><strong>Warehouse-native analytics</strong> that queries data directly from Snowflake, BigQuery, or Databricks without moving it.</p></li><li><p><strong>AI insight builder</strong> that generates insights based on natural language requests, like &quot;What is my purchase conversion rate?&quot;.</p></li><li><p><strong>Customer data platform</strong> that combines analytics data with third-party tools for data governance, identity resolution, and audience syncing.</p></li></ul><h3 id="who-uses-amplitude">Who uses Amplitude?</h3><p>Typical Amplitude users are:</p><ul><li>Non-technical product managers</li><li>Data teams at large enterprises</li><li>Growth engineering and marketing teams</li><li>Companies with stringent compliance needs</li></ul><p>While it offers a limited free tier for startups, high prices are a barrier. As one reviewer <a href="https://www.g2.com/products/amplitude-analytics/reviews/amplitude-analytics-review-7933567">points out</a>: &quot;The high price tag poses a challenge for small businesses, early-stage, and even medium-sized startups.&quot;</p><h3 id="how-does-amplitude-compare-to-mixpanel">How does Amplitude compare to Mixpanel?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Amplitude<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-amplitude">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Mixpanel<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-mixpanel">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/experiments"><strong>Experiments</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Run statistically rigorous A/B/n tests and validate ideas with confidence</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span>Enterprise add-on</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Notebooks</strong><div class="text-sm text-secondary mt-1">Collaborate on analysis in shareable notebooks</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>AI insight builder</strong><div class="text-sm text-secondary mt-1">&quot;Talk to your data&quot; using AI</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Paid add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Role-based access control</strong><div class="text-sm text-secondary mt-1">Control access to features and data based on user roles and permissions</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Amplitude and Mixpanel</summary><ul><li>Amplitude offers warehouse-native analytics that queries data directly in your warehouse; Mixpanel syncs data bidirectionally but doesn&#x27;t sit on top of your warehouse.</li><li>Amplitude&#x27;s session replay launched earlier with deeper analytics integration; Mixpanel&#x27;s is newer but includes mobile support and AI summaries.</li><li>Amplitude includes Guides &amp; Surveys as a paid add-on; Mixpanel doesn&#x27;t offer native survey functionality.</li><li>Amplitude targets larger enterprises with more complex compliance needs; Mixpanel is more accessible to mid-market companies.</li><li>Mixpanel&#x27;s feature flags and experiments are newer (late 2025); Amplitude has had experimentation longer.</li></ul></details><details><summary>Main similarities between Amplitude and Mixpanel</summary><ul><li>Both are established product analytics platforms with 10+ years in market.</li><li>Both now offer session replay, heatmaps, A/B testing, and feature flags.</li><li>Both provide AI-powered natural language querying for building insights.</li><li>Both support group analytics for B2B account-level tracking.</li><li>Both integrate with CDPs like Segment and data warehouses like Snowflake and BigQuery.</li><li>Both are SOC 2 certified and GDPR-ready with EU data residency options.</li><li>Both serve large enterprise customers with complex data governance requirements.</li></ul></details><p>On paper, Amplitude and Mixpanel are very similar, but they differ in focus and approach. While both products serve large enterprise customers, Amplitude is more focused on these users. </p><h3 id="why-do-companies-use-amplitude">Why do companies use Amplitude?</h3><ol><li><p><strong>Reducing load on data teams:</strong> Amplitude is designed to enable non-technical to self-serve analytics. Amplitude <a href="https://amplitude.com/case-studies/nbc">cites</a> NBCUniversal as a company that&#x27;s benefited from its data team spending less time responding to requests for analysis.</p></li><li><p><strong>Large-scale experimentation:</strong> Unlike Mixpanel, Amplitude offers a built-in experimentation add-on. This enables companies to run experiments on users using existing cohorts created in Amplitude.</p></li><li><p><strong>Resolving data quality problems:</strong> Companies that use Amplitude, particularly large ones, often migrate from outdated, or self-built, tools that generate poor quality data. Amplitude helps them fix that, while also making analytics more accessible.</p></li></ol><blockquote><h4 id="bottom-line-2">Bottom line</h4><p>Amplitude is the best Mixpanel alternative for large enterprise companies who want to reduce the load on expensive, overworked data science teams. Startups and mid-size companies might find there are better-value alternatives</p></blockquote><h2 id="4-heap">4. Heap</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/mixpanel-alternatives/heap.png" alt="heap"/></p><h3 id="what-is-heap">What is Heap?</h3><p>Heap describes itself as a Digital Insights Platform. Unpacking that a bit, it means Heap offers both product analytics and session replay, and supports marketing use cases with multitouch attribution.</p><p>Heap was <a href="https://contentsquare.com/heap/">acquired in September 2023</a> by <a href="/blog/best-contentsquare-alternatives">Contentsquare</a>, a marketing and e-commerce analytics firm, and announced plans to integrate the two products.</p><h3 id="key-features-3">Key features</h3><ul><li><p><strong>Event autocapture</strong> captures clicks, form submissions, and pageviews automatically without manual instrumentation. A visual editor lets teams tag and define events retroactively.</p></li><li><p><strong>Product analytics</strong> with funnels, retention, user paths, and behavioral cohorts for understanding how users move through your product.</p></li><li><p><strong>Session replay</strong> and heatmaps for qualitative insights into user behavior, though it lacks developer-focused debugging tools like console logs and network monitoring.</p></li><li><p><strong>Analysis suggestions</strong> use data science to automatically surface hidden interactions, friction points, and opportunities in user journeys.</p></li><li><p><strong>Multi-touch attribution</strong> for marketing teams to understand which channels and campaigns drive conversions.</p></li><li><p><strong>Managed ETL</strong> to export analytics data to Snowflake, BigQuery, and other warehouses for broader analysis.</p></li></ul><h3 id="who-uses-heap">Who uses Heap?</h3><p>Typical Heap users are:</p><ul><li>Non-technical product managers</li><li>Marketing and design teams</li></ul><p>Heap puts a strong focus on supporting non-technical product managers via autocapture.</p><p>Customers include Amway, Eventbrite, and Nielsen.</p><h3 id="how-does-heap-compare-to-mixpanel">How does Heap compare to Mixpanel?</h3><p><div class="OSTable md:@2xs/not-full-width:mx-0 mb-2 -mx-4 @md/reader-content-container:-mx-6 @lg/reader-content-container:-mx-8"><div dir="ltr" class="relative overflow-hidden h-full flex-1 [&amp;&gt;div&gt;div]:!block max-w-screen " style="position:relative;--radix-scroll-area-corner-width:0px;--radix-scroll-area-corner-height:0px"><style>[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}</style><div data-radix-scroll-area-viewport="" class="size-full  " style="overflow-x:hidden;overflow-y:hidden"><div style="min-width:100%;display:table"><div class=""><div class="md:@2xs/not-full-width:px-0 flex px-4 @md/reader-content-container:px-6 @lg/reader-content-container:px-8"><div class="text-primary inline-grid min-w-[42rem] max-w-full divide-x divide-y divide-border border-b border-primary text-[15px] [&amp;&gt;div]:px-2 w-min [&amp;&gt;div]:py-2 " style="grid-template-columns:auto minmax(120px, 1fr) minmax(120px, 1fr)"><div class="text-sm border-l border-t border-primary bg-input font-bold   "></div><div class="text-sm border-l border-t border-primary bg-input font-bold  text-center ">Heap<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-heap">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="text-sm border-l border-t border-primary bg-input font-bold !border-r text-center ">Mixpanel<br/><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="underline text-[13px] opacity-75 hover:opacity-100 ml-3" href="/blog/posthog-vs-mixpanel">compare<svg class="LemonIcon inline-block size-3" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/product-analytics"><strong>Product Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track usage, retention, and feature adoption with comprehensive analytics</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/web-analytics"><strong>Web Analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Privacy-focused web analytics with real-time data and no sampling</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Autocapture</strong><div class="text-sm text-secondary mt-1">Capture events without manual tracking</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/session-replay"><strong>Session Replay</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Watch real user sessions to understand behavior and fix issues</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span>Pro/Premier Add-on</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Notebooks</strong><div class="text-sm text-secondary mt-1">Collaborate on analysis in shareable notebooks</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-red text-lg font-bold">✗</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><span data-state="closed" class="" style="-webkit-touch-callout:none"><a class="group underline" href="/profiles"><strong>Group analytics</strong><svg class="LemonIcon invisible group-hover:visible inline-block size-4 text-secondary relative -top-px" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M7.995 5.75a.75.75 0 0 1 .75-.75h8.505c.966 0 1.75.784 1.75 1.75v9.496a.75.75 0 0 1-1.5 0V7.56L7.03 18.03a.75.75 0 0 1-1.06-1.061L16.44 6.5H8.744a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg></a></span><div class="text-sm text-secondary mt-1">Track metrics at a company and account level</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-start "><div class="leading-tight min-w-48"><strong>Role-based access control</strong><div class="text-sm text-secondary mt-1">Control access to features and data based on user roles and permissions</div></div></div><div class="
                                relative
               
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div><div class="
                                relative
               !border-r
            flex flex-col 
            justify-center 
            items-center text-center "><span class="text-green text-lg font-bold">✓</span></div></div></div></div></div></div></div></div></p><details><summary>Main differences between Heap and Mixpanel</summary><ul><li>Heap&#x27;s autocapture is more comprehensive and central to its value prop; Mixpanel supports autocapture but emphasizes manual instrumentation.</li><li>Mixpanel now includes A/B testing and feature flags; Heap lacks native experimentation and relies on third-party integrations.</li><li>Mixpanel offers a more generous free tier (1M events) compared to Heap&#x27;s 10,000 monthly sessions.</li><li>Heap includes heatmaps out of the box; Mixpanel&#x27;s heatmaps are tied to session replay.</li><li>Mixpanel offers EU data residency; Heap does not currently offer EU hosting.</li></ul></details><details><summary>Main similarities between Heap and Mixpanel</summary><ul><li>Both offer core product analytics with funnels, retention, cohorts, and user paths.</li><li>Both support integrations with data warehouses like Snowflake and BigQuery.</li><li>Both are self-serve with free tiers available for smaller teams.</li><li>Both are designed primarily for non-technical product managers and growth teams.</li><li>Both integrate with CDPs like Segment and Rudderstack.</li></ul></details><p>Heap has a healthy integration library for A/B testing and marketing automation. For surveys, Heap supports Appcues, Delighted, and Chameleon (microsurveys). Mixpanel also has a large catalog and lists at least eight survey/microsurvey integrations (including Appcues, Survicate, Wootric/InMoment, Hotjar, Sprig, 1Flow, Userflow, and UserGuiding).</p><p>Mixpanel also offers a more generous free tier of up to 1 million events; Heap is limited to 10,000 monthly sessions.</p><h3 id="why-do-companies-use-heap">Why do companies use Heap?</h3><ol><li><p><strong>Conversion rate optimization:</strong> Combining product analytics and session replay makes Heap useful for growth and marketing teams looking to improve conversion.</p></li><li><p><strong>To improve data collection</strong> Companies with limited engineering resources find Heap&#x27;s autocapture ensures important events aren&#x27;t missed.</p></li><li><p><strong>Low information density</strong> Reviewers on G2 appreciate Heap&#x27;s user-friendly interface, which tends toward lower information density than competing tools.</p></li></ol><blockquote><h4 id="bottom-line-3">Bottom line</h4><p>Heap is basically Mixpanel with autocapture. This makes it a decent choice for non-technical product teams, but it&#x27;s not radically different.</p></blockquote><details><summary>Honorable mentions</summary><p>This guide focuses on the most popular Mixpanel alternatives, but these aren&#x27;t the only ones. Here are some other tools worth considering:</p><ul><li><p><strong><a href="/blog/best-pendo-alternatives">Pendo</a></strong> describes itself as a product experience platform. It combines analytics with in-app guides, user feedback widgets, roadmap planning, and product discovery tools. Best for product teams who want onboarding and adoption tools alongside analytics.</p></li><li><p><strong>Kissmetrics</strong> is more focused on marketing and e-commerce use cases than Mixpanel. It&#x27;s worth considering if you want to focus on channel attribution and revenue tracking, but don&#x27;t want to use GA4.</p></li><li><p><strong>Snowplow</strong> is a powerful, open-source behavioral data platform. It can replace tools like Mixpanel, but requires significant data engineering resources to set up and maintain. Best for large enterprises with well-staffed data teams who want full control over their data pipeline.</p></li><li><p><strong>Countly</strong> is an open-source analytics platform with strong mobile app support, push notifications, and crash analytics. It offers both self-hosted and cloud options, making it a good choice for teams who need data sovereignty.</p></li><li><p><strong><a href="/blog/best-plausible-alternatives">Plausible</a></strong> and <strong><a href="/blog/best-fathom-alternatives">Fathom</a></strong> are privacy-first, lightweight analytics tools. They&#x27;re not direct Mixpanel replacements – they focus on simple website metrics rather than product analytics – but they&#x27;re worth considering if GDPR compliance and minimal data collection are priorities.</p></li></ul><p>For more options, see our guide to the <a href="/blog/best-open-source-analytics-tools">best open-source product analytics tools</a> and <a href="/blog/best-product-analytics-tools-for-startups">best product analytics tools for startups</a>.</p></details><h2 id="which-mixpanel-alternative-should-you-choose">Which Mixpanel alternative should you choose?</h2><ul><li>Engineering team wanting to ship faster with analytics, session replay, feature flags, A/B testing, and error tracking in one platform? <strong>PostHog</strong> is built for you.</li><li>Marketing team needing campaign attribution, ad spend tracking, and Google ecosystem integration? <strong>GA4</strong> is the obvious choice.</li><li>Large enterprise wanting warehouse-native analytics and mature experimentation? <strong>Amplitude</strong> is built for scale.</li><li>Non-technical team wanting comprehensive autocapture with minimal engineering effort? <strong>Heap</strong> gets you started fast.</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but we think PostHog is the perfect Mixpanel replacement if:</p><ul><li>You value transparency. We&#x27;re open source and open core.</li><li>You want all the tools to help you build a better product (like error tracking, session replays, feature flags, and A/B testing).</li><li>You&#x27;re an engineering-led team that wants SQL access and direct support from the people who build the product.</li><li>You want to try before you buy. We&#x27;re self-serve with a <a href="/pricing">generous free tier</a>.</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out <a href="/docs">our docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What is Mixpanel used for?</summary><p><strong>Mixpanel</strong> is a product analytics platform used to track user behavior, analyze conversion funnels, measure retention, and run A/B tests. Product, growth, and marketing teams use it to understand how users interact with their products and make data-driven decisions. Mixpanel has expanded significantly in recent years, adding session replay, heatmaps, feature flags, and experimentation.</p></details><details><summary>Why look for Mixpanel alternatives?</summary><p>Common reasons include: needing features Mixpanel doesn&#x27;t offer (like error tracking or LLM analytics), wanting a more generous free tier to get you started, preferring an open-source or self-hostable platform, wanting SQL access for custom queries, or consolidating multiple tools into one platform.</p></details><details><summary>What&#x27;s the best Mixpanel alternative overall?</summary><p>For most teams, <strong>PostHog</strong> is the best alternative. It includes everything Mixpanel offers (<a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</a>) plus <a href="/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/surveys">surveys</a>, and a built-in <a href="/data-warehouse">data warehouse</a> – all with transparent pricing and a generous free tier.</p></details><details><summary>Which Mixpanel alternatives are open source?</summary><p><strong>PostHog</strong> is the only major open-source alternative on this list (it&#x27;s open core under the MIT license). <strong>Snowplow</strong> is also open source but requires significant data engineering resources. See our guide to the <a href="/blog/best-open-source-analytics-tools">best open-source product analytics tools</a> for more options.</p></details><details><summary>Which Mixpanel alternative has the best free tier?</summary><p><strong>PostHog</strong> offers the most generous free tier: 1 million events, 5,000 session replays, 1 million feature flag requests, and 1,500 survey responses per month. <strong><a href="/blog/posthog-vs-ga4">GA4</a></strong> is free for up to 10M events/month but lacks session replay and experimentation. Mixpanel&#x27;s free tier includes 1M events with a credit card on file.</p></details><details><summary>Which alternative is best for marketing teams?</summary><p><strong>GA4</strong> is the best choice for marketing teams. It offers native Google Ads integration, campaign attribution, predictive insights, and is free for most businesses. It&#x27;s tightly integrated with the Google ecosystem (BigQuery, Looker Studio, Firebase), making it ideal for teams already using Google tools.</p></details><details><summary>Which alternative is best for large enterprises?</summary><p><strong>Amplitude</strong> is purpose-built for large enterprises. It offers warehouse-native analytics, mature experimentation, advanced data governance, and is designed to help non-technical teams self-serve analytics without overloading data teams. However, pricing requires contacting sales and can be expensive.</p></details><details><summary>Which alternative requires the least engineering effort?</summary><p><strong>Heap</strong> is designed for teams with limited engineering resources. Its comprehensive autocapture starts collecting clicks, form submissions, and pageviews automatically, and a visual editor lets you define events retroactively without writing code.</p></details><details><summary>Does Mixpanel have error tracking?</summary><p>No. Mixpanel does not offer <a href="/blog/best-error-tracking-tools">error tracking or crash reporting</a>. If you need to monitor exceptions alongside your analytics, consider <strong>PostHog</strong> (which ties <a href="/error-tracking">errors</a> to user sessions and feature flags) or pair Mixpanel with a dedicated tool like <a href="/blog/posthog-vs-sentry">Sentry</a>.</p></details><details><summary>Does Mixpanel have LLM analytics?</summary><p>No. Mixpanel doesn&#x27;t offer LLM observability or AI analytics features. <strong>PostHog</strong> is currently the only analytics platform on this list that includes <a href="/llm-analytics">LLM analytics</a> for tracking AI product usage, monitoring model performance, analyzing token costs, and debugging LLM interactions.</p></details><details><summary>Does Mixpanel have surveys?</summary><p>No. Mixpanel doesn&#x27;t offer native survey functionality. If you need to collect user feedback, NPS scores, or run product-market fit surveys, you&#x27;ll need a separate tool like Sprig or Survicate – or use <strong>PostHog</strong>, which includes <a href="/surveys">surveys</a> with targeting based on user properties, URLs, and feature flags.</p></details><details><summary>Can I use Mixpanel with my data warehouse?</summary><p>Yes. Mixpanel offers warehouse-native analytics that can query data directly from Snowflake, BigQuery, and Databricks. <strong>Statsig</strong> and <strong>Amplitude</strong> also offer strong data warehouse integrations. </p><p><strong>PostHog</strong> offers two approaches to using warehouse data: </p><ol><li><strong>Use PostHog as your integrated warehouse</strong>: Data stays in PostHog and is accessible across many PostHog tools. This eliminates the need to stitch together multiple vendors and maintain multiple complex ETL pipelines.</li><li><strong>Connect external warehouses as sources</strong>: Sync tables and fields from Snowflake/BigQuery/Databricks into PostHog via our CDP. Queries run on PostHog compute, enabling you to use warehouse data across PostHog tools.</li></ol><p><strong>PostHog is better if:</strong></p><ul><li>You want to eliminate tool sprawl (Mixpanel is analytics-focused with warehouse connectivity as an add-on)</li><li>You value having the warehouse and analytics in one platform</li><li>You want features Mixpanel doesn&#x27;t offer, like surveys</li><li>You want transparent, usage-based pricing (1 million synced rows free per month)</li></ul><p>The managed warehouse approach PostHog offers is better if you want a single platform for analyzing data and using other features, such as surveys and feature flags, as you don&#x27;t need to maintain an external warehouse in addition to other tools. </p></details><details><summary>Can I migrate from Mixpanel to PostHog?</summary><p>Yes. <strong>PostHog</strong> has a <a href="/docs/migrate/managed-migrations">managed migration tool</a> for Mixpanel that makes importing your data, historical events, and user properties easy. It also has dedicated <a href="/docs/migrate/mixpanel">Mixpanel to PostHog migration guide</a></p></details><details><summary>What other analytics tools are available?</summary><p>Beyond the tools in this guide, there are many other options worth considering. See our guides to <a href="/blog/best-amplitude-alternatives">Amplitude alternatives</a>, <a href="/blog/best-heap-alternatives">Heap alternatives</a>, <a href="/blog/ga4-alternatives">Google Analytics alternatives</a>, and <a href="/blog/best-open-source-analytics-tools">open-source product analytics tools</a> for broader comparisons.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Mixpanel]]></title><description><![CDATA[PostHog and  Mixpanel  are both product analytics platforms helping teams understand user behavior and build better products. Both expanded beyond…]]></description><link>https://posthog.com/blog/posthog-vs-mixpanel</link><guid isPermaLink="false">098dcd46-0386-53bd-8589-88e1e4e73649</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-vs-mixpanel/posthog-vs-mixpanel.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog and <a href="/blog/best-mixpanel-alternatives">Mixpanel</a> are both product analytics platforms helping teams understand user behavior and build better products. Both expanded beyond core analytics, but their approaches and feature sets differ.</p><ol><li><p><strong>Mixpanel</strong> is a product analytics platform with session replay, heatmaps, A/B testing, and feature flags. It&#x27;s built for product managers and growth teams who want deep behavioral insights.</p></li><li><p><strong>PostHog</strong> is an all-in-one platform for building successful products. On top of <a href="/product-analytics">product analytics</a>, it includes <a href="/error-tracking">error tracking</a>, <a href="/session-replay">session replays</a>, <a href="/experiments">experiments</a>, <a href="/feature-flags">feature flags</a>, <a href="/surveys">surveys</a>, <a href="/llm-analytics">LLM analytics</a>, an <a href="/ai">AI assistant</a>, and more. It&#x27;s built for engineers and product teams who want everything in one place.</p></li></ol><h2 id="how-is-posthog-different">How is PostHog different?</h2><h3 id="1-were-an-all-in-one-platform">1. We&#x27;re an all-in-one platform</h3><p>PostHog puts all your data in one place and combines it with every tool you need to build a successful product. This means:</p><ul><li><strong><a href="/product-analytics">Product analytics</a></strong> for analyzing behavior, funnels, activation, and retention</li><li><strong><a href="/web-analytics">Web analytics</a></strong> for tracking your marketing website and content</li><li><strong><a href="/session-replay">Session replay</a></strong> for observing how people use your product and diagnosing problems</li><li><strong><a href="/feature-flags">Feature flags</a></strong> for testing in production and shipping new features</li><li><strong><a href="/experiments">Experiments</a></strong> for verifying improvements to your product and website</li><li><strong><a href="/error-tracking">Error tracking</a></strong> for monitoring exceptions and problems in your code</li><li><strong><a href="/surveys">Surveys</a></strong> for capturing user feedback, tracking NPS, and booking interviews
<strong><a href="/llm-analytics">LLM Analytics</a></strong> for understanding how users interact with AI features</li><li><strong>A built-in <a href="/data-warehouse">data warehouse</a></strong> for analyzing your business and event data together</li></ul><p>In other words, it&#x27;s <a href="/products">everything you need in one app</a> with a single login and contract. A <em>genuine</em> single source of truth for your product and customer data.</p><h3 id="2-we-build-for-developers">2. We build for developers</h3><p>This means you get support from the engineers who <em>actually build the product</em>, <a href="/docs/api">extensively documented APIs</a>, and a <a href="/docs/product-analytics/sql">SQL query builder</a>, so you can analyze data how you want. We&#x27;re open source, so you can inspect <a href="https://github.com/PostHog">our source code</a> and vote on what we should build via <a href="/roadmap">our public roadmap</a>.</p><h3 id="3-we-promise-transparent-and-cheap-pricing-forever">3. We promise transparent and cheap pricing (forever)</h3><p>We default to charging as little as possible while still making a profit – we also have a generous free tier on all our products. We can do this because we&#x27;re efficient. We don&#x27;t splurge on D-list comedians to host an annual convention you&#x27;ll never attend. Our <a href="/pricing">pricing</a> is also 100% transparent.</p><p><div></div></p><h2 id="comparing-posthog-and-mixpanel">Comparing PostHog and Mixpanel</h2><p>As an all-in-one-platform, PostHog isn&#x27;t just <a href="/blog/best-mixpanel-alternatives">an alternative to Mixpanel</a>, it can also replace tools like <a href="/blog/best-hotjar-alternatives">Hotjar</a> for session replay and surveys, and <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> for experiments and feature flags.</p><h3 id="platform">Platform</h3><p><div competitors="posthog,mixpanel"></div></p><blockquote><p><strong>Good to know:</strong> If we don&#x27;t have something you want now, there&#x27;s a good chance we&#x27;re planning on building it already. Visit <a href="/roadmap">our public roadmap</a> to see what we&#x27;re considering, and vote for features and products you&#x27;re interested in. <a href="/changelog/">We ship fast</a>!</p></blockquote><h3 id="product-analytics">Product analytics</h3><p>PostHog and Mixpanel offer broadly similar product analytics features, including the ability to <a href="/ai">create insights using natural language</a>.</p><p><div competitors="posthog,mixpanel"></div></p><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">Good to know</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Our <a href="/pricing">generous free tier</a> means every PostHog customer gets 1 million analytics events for free every single month. More than 90% of companies use PostHog for free, and our <a href="/startups">startup program</a> comes with $50,000 in credit.</p></div></div><h3 id="website-analytics">Website analytics</h3><p>PostHog is also a powerful <a href="/blog/ga4-alternatives">alternative to Google Analytics</a> that bridges the gap between lightweight tools like <a href="/blog/best-plausible-alternatives">Plausible</a>, and expensive enterprise platforms like <a href="/blog/best-adobe-analytics-alternatives">Adobe Analytics</a>.</p><p><div competitors="posthog,mixpanel"></div></p><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">Good to know</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You can use the <a href="/docs/toolbar">PostHog toolbar</a> to <a href="/docs/toolbar/heatmaps">view clickmaps, heatmaps, and scrollmaps</a> for your website. You can also use the toolbar to turn feature flags on and off, debug events, and create no-code experiments.</p></div></div><h3 id="session-replay">Session replay</h3><p>PostHog <a href="/session-replay">session replay</a> can be used by anyone, but it includes numerous developer-level features that make it useful for engineers, product managers, and support engineers who want to diagnose issues and identify potential improvements. Features include console logs, network request monitoring, a DOM explorer, performance metrics, and the ability to jump directly from errors or funnel drop-offs into relevant replays.</p><p><div competitors="posthog,mixpanel"></div></p><h4 id="library-support-for-replays">Library support for replays</h4><p>Both PostHog and Mixpanel offer broad SDK support for session replay across web and mobile platforms.</p><p><div competitors="posthog,mixpanel"></div></p><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">Good to know</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You can use PostHog AI to chat with your recordings using natural language – e.g. &quot;show me sessions over 5 minutes long&quot; or &quot;show me sessions from users in Belgium&quot;. You can also ask <a href="/ai">PostHog AI</a> to summarize what happened during a session.</p></div></div><h3 id="feature-flags">Feature flags</h3><p>Feature flags make it easy to roll out features to specific users or groups, and <a href="/product-engineers/testing-in-production">safely test in production</a>. You can also use them to <a href="/docs/feature-flags/early-access-feature-management">control access to beta features</a>, and make <a href="/docs/feature-flags/scheduled-flag-changes">scheduled changes to your app</a>.</p><p><div competitors="posthog,mixpanel"></div></p><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">Good to know</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Our feature flags are tightly integrated with other tools, meaning you can target session replays, surveys and other features using existing feature flags. See <a href="/product-engineers/feature-flag-benefits-use-cases">benefits of feature flags</a> for more.</p></div></div><h3 id="experiments">Experiments</h3><p>Both PostHog and Mixpanel now offer native A/B testing and feature flags. PostHog has had experimentation longer and bills experiments together with feature flags. Mixpanel relaunched experimentation in late 2025 after previously deprecating it – their Experiments report is available as an Enterprise add-on.</p><p><div competitors="posthog,mixpanel"></div></p><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">Good to know</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You can evaluate the results of experiments using events tracked using PostHog, or <a href="/docs/experiments/data-warehouse">event tables stored in our data warehouse</a>. This means you can include all kinds of business event data as primary or secondary metrics in your experiments.</p></div></div><h3 id="surveys">Surveys</h3><p>You can&#x27;t build a successful product on data alone. Surveys are useful for <a href="/tutorials/feedback-interviews-site-apps">gathering feedback and booking interviews</a>, notifying users of changes, and keeping track of customer satisfaction metrics.</p><p><div competitors="posthog,mixpanel"></div></p><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">Good to know</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Surveys are great for tracking customer satisfaction scores like Net Promoter Score (NPS), customer satisfaction (CSAT), and customer effort score (CES). We include survey templates for all these and more. Read our <a href="/product-engineers/nps-vs-csat-vs-ces">guide comparing NPS, CSAT, and CES</a> to see which survey type you should use and when.</p></div></div><h3 id="price-comparison">Price comparison</h3><p>PostHog and Mixpanel both charge based on the number of events ingested, however:</p><ul><li><strong>Mixpanel</strong> charges the same for events generated by identified and anonymous users.</li><li><strong>PostHog</strong> charges up to 80% less for events generated by anonymous users.</li></ul><p>Anonymous events are the default event type in PostHog, so you only get charged for identified events when you call <code>identify</code> in your code – see our <a href="/docs/data/anonymous-vs-identified-events">anonymous vs identified events explainer</a> for more on this.</p><p>As the below table shows, however, PostHog is cheaper than Mixpanel even if you&#x27;re only tracking identified users.</p><table><thead><tr><th><strong>Monthly events</strong></th><th><strong>PostHog (100% identified events)</strong></th><th><strong>Mixpanel</strong></th><th></th></tr></thead><tbody><tr><td><strong class="text-15px">0-1 million</strong></td><td>Free</td><td>Free</td><td> </td></tr><tr><td><strong class="text-15px">3 million</strong></td><td><span class="text-[15px] font-semibold">$352</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$378</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">5 million</strong></td><td><span class="text-[15px] font-semibold">$560</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$612</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">10 million</strong></td><td><span class="text-[15px] font-semibold">$1,080</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$1,176</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">15 million</strong></td><td><span class="text-[15px] font-semibold">$1,600</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$1,722</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">20 million</strong></td><td><span class="text-[15px] font-semibold">$1,927</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$2,289</span><span class="text-sm opacity-70">/month</span></td><td></td></tr></tbody></table><p>And it becomes even cheaper if 20% of your events are from anonymous users, which is typical for many of our customers.</p><table><thead><tr><th><strong>Monthly events</strong></th><th><strong>PostHog (20% anonymous events)</strong></th><th><strong>Mixpanel</strong></th><th></th></tr></thead><tbody><tr><td><strong class="text-15px">0-1 million</strong></td><td>Free</td><td>Free</td><td> </td></tr><tr><td><strong class="text-15px">3 million</strong></td><td><span class="text-[15px] font-semibold">$310</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$378</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">5 million</strong></td><td><span class="text-[15px] font-semibold">$490</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$612</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">10 million</strong></td><td><span class="text-[15px] font-semibold">$940</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$1,176</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">15 million</strong></td><td><span class="text-[15px] font-semibold">$1,391</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$1,722</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">20 million</strong></td><td><span class="text-[15px] font-semibold">$1,783</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$2,289</span><span class="text-sm opacity-70">/month</span></td><td></td></tr></tbody></table><p>We recommend tracking your marketing website and product in a single project, and you can track all events on your website anonymously to save money.</p><table><thead><tr><th><strong>Monthly events</strong></th><th><strong>PostHog (100% anonymous events)</strong></th><th><strong>Mixpanel</strong></th><th></th></tr></thead><tbody><tr><td><strong class="text-15px">0-1 million</strong></td><td>Free</td><td>Free</td><td> </td></tr><tr><td><strong class="text-15px">3 million</strong></td><td><span class="text-[15px] font-semibold">$84</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$378</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">5 million</strong></td><td><span class="text-[15px] font-semibold">$153</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$612</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">10 million</strong></td><td><span class="text-[15px] font-semibold">$324</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$1,176</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">15 million</strong></td><td><span class="text-[15px] font-semibold">$496</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$1,722</span><span class="text-sm opacity-70">/month</span></td><td></td></tr><tr><td><strong class="text-15px">20 million</strong></td><td><span class="text-[15px] font-semibold">$643</span><span class="text-sm opacity-70">/month</span></td><td><span class="text-[15px] font-semibold">$2,289</span><span class="text-sm opacity-70">/month</span></td><td></td></tr></tbody></table><blockquote><p><strong>Good to know:</strong> Web analytics makes it easy to track and monitor high-level website metrics, like page views, bounce rate, and the top sources of traffic, but you can still create custom product analytics insights and dashboards using anonymous events. See our <a href="/docs/web-analytics/web-vs-product-analytics">web vs product analytics explainer</a> for more.</p></blockquote><h3 id="data-integrations">Data integrations</h3><p><strong>PostHog</strong> has a built-in data warehouse, so you can import and query data directly from our other sources like Stripe and Zendesk, or from an existing warehouse.</p><p><strong>Mixpanel</strong> relies on data warehouse connectors to combine customer and product data. This means you don&#x27;t import data directly from third-party tools. You need to get them into a third-party warehouse and then import that data into Mixpanel for analysis.</p><p><div competitors="posthog,mixpanel"></div></p><p>See our docs for full lists of <a href="/docs/cdp">destinations</a> and <a href="/docs/cdp/sources">data warehouse sources</a>.</p><h3 id="security-and-compliance">Security and compliance</h3><p><div competitors="posthog,mixpanel"></div></p><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">Good to know</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>A Business Associate Agreement for HIPAA compliance is available for customers with our <a href="/platform-packages">platforms add-ons</a>. The add-on also includes priority support, SSO and 2FA enforcement, numerous collaboration features, and support for multiple environments within projects so you can separate dev and production data, but use the same insights and dashboards across them all.</p></div></div><h2 id="when-to-choose-posthog-vs-mixpanel">When to choose PostHog vs Mixpanel</h2><p>Choosing the right product analytics platform depends on your team&#x27;s needs and technical depth. Here&#x27;s a quick guide:</p><ul><li><p>Want an all-in-one developer platform that goes beyond analytics with <a href="/docs/integrate/error-tracking">error tracking</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/feature-flags">feature flags</a>, and transparent pricing + a generous free tier to get you started? Go with <strong>PostHog</strong>.</p></li><li><p>Prefer a polished UI optimized for product managers and growth teams, with strong warehouse-native analytics? <strong>Mixpanel</strong> is a solid choice.</p></li></ul><h2 id="recommendations-by-team-type">Recommendations by team type</h2><p><strong>For engineering-led product teams</strong></p><ul><li><strong>PostHog</strong> – SQL access, open-source codebase, and direct support from the engineers who build the product. Tightly integrated feature flags, experiments, and error tracking mean fewer tools to manage.</li></ul><p><strong>For product management teams</strong></p><ul><li><strong>Mixpanel</strong> – Purpose-built for non-technical users with a polished interface, metric trees for aligning teams on goals, and strong collaboration features.</li></ul><p><strong>For teams building AI products</strong></p><ul><li><strong>PostHog</strong> – Native <a href="/llm-analytics">LLM analytics</a> for tracking AI usage, model performance, token costs, and debugging LLM interactions. Mixpanel doesn&#x27;t offer AI observability.</li></ul><p><strong>For privacy-conscious and regulated organizations</strong></p><ul><li>Both are SOC 2 certified and GDPR-ready with EU data residency options. <strong>PostHog</strong> is HIPAA-ready and offers raw data access via its <a href="/data-warehouse">data warehouse</a>. Both support SAML SSO on enterprise plans.</li></ul><p><strong>For early-stage startups</strong></p><ul><li><strong>PostHog</strong> – A single platform that scales from MVP to growth stage without rebuilding your stack. The generous free tier means you won&#x27;t outgrow it quickly. <a href="/startups">Startups can also qualify for $50k in free credits</a>.</li></ul><table><thead><tr><th> </th><th><strong>Free usage per month</strong></th></tr></thead><tbody><tr><td><strong>Product analytics</strong></td><td>1 million events</td></tr><tr><td><strong>Session replay</strong></td><td>5,000 recordings</td></tr><tr><td><strong>Feature flags and A/B testing</strong></td><td>1 million API requests</td></tr><tr><td><strong>Surveys</strong></td><td>1,500 responses</td></tr><tr><td><strong>Error tracking</strong></td><td>100k errors</td></tr><tr><td><strong>LLM analytics</strong></td><td>100k events</td></tr><tr><td><strong>Data warehouse</strong></td><td>1 million synced rows</td></tr></tbody></table><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>What&#x27;s the difference between PostHog and Mixpanel?</summary><p><strong>Mixpanel</strong> is a product analytics platform that has expanded to include session replay, heatmaps, A/B testing, and feature flags. It&#x27;s optimized for product managers and growth teams. <strong>PostHog</strong> is a broader all-in-one platform that combines product analytics with error tracking, LLM analytics, surveys, and more – built primarily for engineering-led teams who want everything in one place.</p></details><details><summary>Does PostHog replace Mixpanel?</summary><p><strong>Yes, for most teams.</strong> PostHog offers all of Mixpanel&#x27;s core analytics features (funnels, retention, cohorts, user paths) plus additional tools like error tracking, LLM analytics, and surveys. If you&#x27;re an engineering-led team that values SQL access, open-source code, and transparent pricing, PostHog is a strong replacement.</p><p><strong>Consider keeping Mixpanel if</strong> your team is heavily invested in Mixpanel&#x27;s metric trees for goal alignment, you prefer their polished UI for non-technical users, or you&#x27;re using warehouse-native analytics with Mixpanel sitting directly on your data warehouse.</p></details><details><summary>How much does Mixpanel cost?</summary><p>Mixpanel has three tiers:</p><ol><li><strong>Free:</strong> 1M events/month, core analytics, limited features</li><li><strong>Growth:</strong> Starts ~$28/month per 10k events after, scales with volume</li><li><strong>Enterprise:</strong> Custom pricing, includes experiments, advanced features</li></ol><p>Add-ons like Group Analytics, Data Pipelines, and Experiments are separately priced. Session Replay is included but limited by recording count. For comparison, PostHog&#x27;s <a href="/pricing">pricing</a> is fully transparent with no hidden add-on costs.</p></details><details><summary>Which has better session replay – PostHog or Mixpanel?</summary><p>Both offer solid session replay with web and mobile support. <strong>PostHog</strong> includes more developer-focused features like console logs, network request monitoring, DOM explorer, and performance metrics. <strong>Mixpanel</strong> added AI-powered replay summaries and heatmap comparison mode in late 2025. PostHog&#x27;s free tier includes 5,000 replays/month; Mixpanel&#x27;s replay limits depend on your plan.</p></details><details><summary>Can I use PostHog and Mixpanel together?</summary><p>Yes, though most teams find it redundant. If you&#x27;re migrating gradually, you can run both in parallel. PostHog can also receive data from Mixpanel via our <a href="/docs/migrate/mixpanel">Mixpanel to PostHog migration guide</a>, or you can send PostHog data to Mixpanel using our <a href="/docs/cdp">CDP</a>.</p></details><details><summary>What are the best all-in-one product analytics tools in 2026?</summary><p>The top all-in-one product analytics platforms in 2026 include:</p><ul><li><strong>PostHog</strong> – Best for engineering-led teams wanting analytics, session replay, feature flags, experiments, error tracking, LLM analytics, and surveys in one place</li><li><strong>Mixpanel</strong> – Best for product managers wanting polished analytics with session replay, heatmaps, and A/B testing</li><li><strong>Amplitude</strong> – Best for enterprise teams wanting deep behavioral analytics with warehouse-native queries</li><li><strong>Pendo</strong> – Best for product teams wanting analytics combined with in-app guides, feedback, and roadmap tools</li><li><strong>Heap</strong> – Best for teams wanting comprehensive autocapture with minimal instrumentation</li><li><strong>LogRocket</strong> – Best for frontend teams wanting session replay with error tracking and performance monitoring</li></ul></details><details><summary>Which is better for B2B SaaS – PostHog or Mixpanel?</summary><p>Both support group/account-level analytics for B2B use cases. <strong>Mixpanel</strong> recently added Account Profiles and Activation Metrics specifically for B2B analysis (requires Group Analytics add-on). <strong>PostHog</strong> includes <a href="/docs/product-analytics/group-analytics">group analytics</a> on all plans, plus you can connect it to CRM data via the built-in <a href="/data-stack">data warehouse</a>. PostHog is often preferred by B2B teams that also need feature flags and experiments for enterprise rollouts.</p></details><details><summary>Does Mixpanel have feature flags?</summary><p>Yes, as of late 2025. Mixpanel relaunched feature flags alongside their Experimentation 2.0 release. However, feature flags are newer in Mixpanel compared to PostHog, which has had them longer with more mature functionality like local evaluation, bootstrapping, early access management, and scheduling.</p></details><details><summary>Does Mixpanel have error tracking?</summary><p>No. Mixpanel does not offer error tracking or crash reporting. If you need to monitor exceptions alongside your analytics, you&#x27;d need a separate tool like Sentry or Bugsnag. <strong>PostHog</strong> includes <a href="/error-tracking">error tracking</a> natively, connected to session replays and user behavior data.</p></details><details><summary>Does Mixpanel have LLM analytics?</summary><p>No. Mixpanel doesn&#x27;t offer AI/LLM observability features. <strong>PostHog</strong> includes <a href="/llm-analytics">LLM analytics</a> for tracking AI product usage, monitoring model performance, analyzing token costs, and debugging LLM interactions – useful for teams building AI-powered features.</p></details><details><summary>Which is easier to set up – PostHog or Mixpanel?</summary><p>Both are designed for quick implementation. <strong>PostHog</strong> offers an <a href="/wizard">AI install wizard</a> that gets you running in under 90 seconds, plus autocapture that starts collecting events immediately. <strong>Mixpanel</strong> also supports autocapture and has straightforward SDK installation. The main difference is PostHog&#x27;s broader feature set means there&#x27;s more to explore, but you can adopt features incrementally.</p></details><details><summary>Which has better data warehouse integration?</summary><p>Different approaches. <strong>Mixpanel</strong> connects to external warehouses to import data and run queries in Mixpanel. <strong>PostHog</strong> offers an integrated data warehouse approach: you can use PostHog as your warehouse (data stays in PostHog and is accessible across all PostHog tools), or connect external warehouses (like Snowflake or BigQuery) as sources to sync the tables and fields you need into PostHog. Either way, queries run on PostHog compute.</p><p><strong>PostHog is better if:</strong></p><ul><li>You want to eliminate tool sprawl (Mixpanel is analytics-focused with warehouse connectivity as an add-on)</li><li>You value having the warehouse and analytics in one platform</li><li>You want features Mixpanel doesn&#x27;t offer, like surveys</li><li>You want transparent, usage-based pricing (1 million synced rows free per month)</li></ul><p><strong>Mixpanel&#x27;s approach is better if</strong> you have a limited use-case and need to keep data in an existing, external warehouse for compliance reasons.</p><p>Companies like <a href="/customers/headshotpro">HeadshotPro</a> and <a href="/customers/webshare">Webshare</a> use PostHog&#x27;s integrated warehouse as their single source of truth, eliminating the need to stitch together multiple vendors.</p></details><details><summary>How do I reduce costs on PostHog vs Mixpanel?</summary><p><strong>PostHog</strong> charges up to 80% less for anonymous events, so tracking your marketing website anonymously significantly reduces costs. You can also set billing limits per product to avoid surprises. <strong>Mixpanel</strong> charges the same rate for all events. Both offer free tiers (PostHog: 1M events; Mixpanel: 1M events with credit card). See our <a href="/pricing">pricing page</a> for a detailed calculator.</p></details><details><summary>Which has better support?</summary><p><strong>PostHog</strong> offers direct support from the engineers who build the product – you can often get help from the person who wrote the code you&#x27;re asking about. We also have active <a href="/questions">community forums</a> and extensive <a href="/docs">documentation</a>. <strong>Mixpanel</strong> has traditional tiered support with faster response times on higher plans.</p></details><details><summary>Is PostHog or Mixpanel better for startups?</summary><p><strong>PostHog</strong> is generally better for early-stage startups. The generous free tier covers most startup needs, and the <a href="/startups">PostHog for Startups</a> program offers $50k in additional credits. More importantly, you get a single platform that scales from MVP to growth stage without needing to add tools as you grow. Mixpanel also has a startup program, but you may need additional tools for feature flags, experiments, error tracking, and surveys.</p></details><details><summary>Can I migrate my data from Mixpanel to PostHog?</summary><p>Yes. See our <a href="/docs/migrate/mixpanel">Mixpanel to PostHog migration guide</a>.</p></details><details><summary>Can PostHog replace Google Analytics?</summary><p>Yes. PostHog can replace Google Analytics for many use cases – <a href="/blog/posthog-marketing">our marketing team uses PostHog</a>, for example. You can also integrate PostHog into your website using Google Tag Manager.</p><p>See our comparison of <a href="/blog/posthog-vs-ga4">PostHog and Google Analytics 4</a> and <a href="/blog/google-analytics-to-posthog">An intro to PostHog for Google Analytics users</a> for more.</p></details><details><summary>What&#x27;s included in PostHog&#x27;s free tier?</summary><p>Every PostHog user gets a generous amount of free usage each month: 1 million events for product analytics, 1 million synced rows for the data warehouse, 5,000 session recordings, 1 million API requests each for feature flags and A/B testing, and 1,500 survey responses.</p><p>You&#x27;ll never pay anything if you stay within these limits and you can set billing limits to avoid surprise bills.</p><p>A full breakdown and pricing calculator is on <a href="/pricing">our pricing page</a>.</p></details><details><summary>Can I use PostHog with a CDP? (Segment, Rudderstack, etc.)</summary><p>Yes. <strong>PostHog</strong> includes a <a href="/cdp">built-in CDP</a> that lets you import, transform, and export data without needing a separate tool. You can also integrate PostHog with third-party CDPs like Segment and Rudderstack. </p><p>See our docs on using <a href="/docs/advanced/cdp">PostHog with a CDP</a> for setup instructions, or browse our comparison of the <a href="/blog/best-customer-data-platforms-for-developers">best customer data platforms for developers</a> if you&#x27;re evaluating options.</p></details><details><summary>What about ad blockers?</summary><p>We recommend all users deploy a reverse proxy, which enables you to send events to PostHog Cloud using your own domain. Events sent from your own domain and are less likely to be intercepted by tracking blockers, ensuring you capture the best data possible.</p><p>We make this super easy by offering a <a href="/docs/advanced/proxy/managed-reverse-proxy">managed reverse proxy</a> – a no code solution that takes minutes to set up. We also have <a href="/docs/advanced/proxy">reverse proxy setup guides</a> for AWS Cloudfront, Caddy, Cloudflare, Netlify, Vercel, and more in our docs.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The 9 best GDPR-compliant analytics tools]]></title><description><![CDATA[The GDPR (General Data Protection Regulation) places significant restrictions on how you can use tools like Google Analytics to track and collect user…]]></description><link>https://posthog.com/blog/best-gdpr-compliant-analytics-tools</link><guid isPermaLink="false">b01a7c1b-a503-547b-95ee-578b9d74d2e4</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-blog-at-desk.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>The GDPR (General Data Protection Regulation) places significant restrictions on how you can use tools like Google Analytics to track and collect user data.</p><p>And, while there is <strong>no universal legal definition</strong> of what constitutes &quot;GDPR-compliant analytics&quot;, there are some fundamental principles you can follow:</p><ol><li><p><strong>You must acquire &quot;unambiguous consent&quot;:</strong> Tucking a notice away in your terms and conditions isn&#x27;t enough. This is why cookie banners are a thing. You need user consent if you&#x27;re collecting <a href="/blog/what-is-personal-data-pii">personally identifiable information</a>.</p></li><li><p><strong>Data must be handled securely:</strong> GDPR punishes breaches of privacy and security severely. Data must be held securely and staff trained in how to handle data. You must also delete any personal data you hold if a user requests it.</p></li><li><p><strong>Only collect data you actually need:</strong> The GDPR encourages organizations to only collect information they actually need. A free online newsletter, for example, needs a user&#x27;s email address and basic information, such as their name and what country or city they live in, but it doesn&#x27;t need their home or work address.</p></li></ol><p>Until recently, storing personal data on EU citizens in the US was also considered a potential breach of the GDPR, but a <a href="https://commission.europa.eu/law/law-topic/data-protection/international-dimension-data-protection/eu-us-data-transfers_en">new adequacy decision</a> agreed in July 2023 makes this less problematic. It&#x27;s still good practice to avoid transferring this data if you can, but it&#x27;s not a breach provided US-based companies participate in the new EU-US Data Privacy Framework.</p><h2 id="the-best-gdpr-compliant-analytics-tools">The best GDPR-compliant analytics tools</h2><p>There are numerous ways to achieve GDPR compliance, which you can broadly categorize as good, better or best:</p><ul><li><strong>Good:</strong> Data transferred to the US is anonymized</li><li><strong>Better:</strong> Data is stored in EU cloud servers</li><li><strong>Best:</strong> You self-host and control all data / no personal data is collected</li></ul><p>All the tools in this list offer one or more of these methods. We&#x27;ve also chosen a broad range of tools that includes in-depth product analytics platforms, lightweight &quot;privacy first&quot; platforms and open source <a href="/blog/ga4-alternatives">Google Analytics alternatives</a>.</p><table><thead><tr><th>Tool</th><th>Best for</th><th>EU hosting</th><th>Self-host</th><th>Cookieless</th><th>Free tier</th></tr></thead><tbody><tr><td>PostHog</td><td>Product teams and startups</td><td>✔</td><td>✔</td><td>✔</td><td>1M events</td></tr><tr><td>Plausible</td><td>Simple websites</td><td>✔</td><td>✔</td><td>✔</td><td>None</td></tr><tr><td>Umami</td><td>Privacy-first sites</td><td>✖</td><td>✔</td><td>✔</td><td>100k events</td></tr><tr><td>Fathom</td><td>Multi-site agencies</td><td>✔</td><td>✖</td><td>✔</td><td>None</td></tr><tr><td>Matomo</td><td>GA replacement</td><td>✔</td><td>✔</td><td>✔</td><td>Self-host only</td></tr><tr><td>Vercel</td><td>Vercel users</td><td>✖</td><td>✖</td><td>✔</td><td>50k events</td></tr><tr><td>Countly</td><td>Mobile apps</td><td>✔</td><td>✔</td><td>✖</td><td>500 MAU</td></tr><tr><td>TelemetryDeck</td><td>iOS/Android apps</td><td>✔</td><td>✖</td><td>✔</td><td>100k signals</td></tr><tr><td>GoAccess</td><td>Sysadmins</td><td>✔</td><td>✔</td><td>✔</td><td>Unlimited</td></tr></tbody></table><h3 id="1-posthog">1. PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/hogflix-dashboard.png" alt="posthog"/></p><p><a href="https://posthog.com">PostHog</a> is an all-in-one, open-source developer platform that combines <a href="/blog/best-open-source-analytics-tools">product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/error-tracking">error tracking</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/surveys">surveys</a>, and <a href="/experiments">experimentation</a> into a single platform. Think <a href="/blog/posthog-vs-amplitude">Amplitude</a> + <a href="/blog/posthog-vs-hotjar">Hotjar</a> + <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a> in one.</p><p>PostHog offers EU data hosting, so you can keep all your user data within the EU to comply with the GDPR. Hobbyists can also self-host PostHog Open Source via Docker Compose, though this is only recommended for smaller event volumes in the ~100k per month range. PostHog also supports event <a href="/docs/product-analytics/autocapture">autocapture</a>, so you can start collecting useful data immediately without instrumenting events by hand.</p><h4 id="who-is-posthog-for">Who is PostHog for?</h4><p>PostHog is especially helpful for engineers and product teams that want to understand how users use their product. It&#x27;s great for early-stage startups, but the powerful tool set and <a href="/apps">range of integrations</a> means it scales to suit any business size.</p><h4 id="features--benefits">Features &amp; benefits</h4><ul><li>An <a href="/products">all-in-one developer tool suite</a></li><li><a href="/blog/posthog-cloud-eu">EU data hosting available</a></li><li><a href="/docs/feature-flags">Feature flags</a>, <a href="/docs/experiments">A/B testing</a>, <a href="/docs/toolbar/heatmaps">heatmaps</a>, [session recording(/docs/session-replay) and more</li><li>A <a href="/data-stack">Data Warehouse</a> and <a href="/cdp">CDP</a></li><li>Unlimited ability to scale</li><li>Open source, via MIT license</li></ul><h4 id="posthog-and-gdpr-compliance">PostHog and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><p>Smaller projects can self-host PostHog Open Source using Docker Compose, but <a href="/eu">PostHog Cloud EU</a>, a fully-managed service with servers hosted in Frankfurt, Germany, is <strong>the best option for most users</strong>.</p><p>While PostHog uses cookies by default, it can be <a href="/tutorials/cookieless-tracking">configured not to use cookies</a>. To use PostHog without cookies, data is stored in a JavaScript object in <code>memory</code> that only lasts the duration of the pageview.</p><h4 id="how-much-does-posthog-cost">How much does PostHog cost?</h4><p>PostHog Cloud is <a href="/pricing">free to use up to 1 million events per month</a> and 5,000 recordings. Paid plans include support for multiple projects, and advanced features like <a href="/manual/experimentation">A/B and multivariate testing</a>, <a href="/manual/correlation">correlation analysis</a>, <a href="/manual/cohorts">cohorts</a> and <a href="/manual/group-analytics">group analytics</a>.</p><p><div></div></p><h3 id="2-plausible">2. Plausible</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/plausible-screenshot.png" alt="Plausible Analytics - open source analytics tools"/></p><p><a href="/blog/posthog-vs-plausible">Plausible</a> is a lightweight alternative to tools such as <a href="/blog/ga4-alternatives">Google Analytics</a>. It offers an effective way to track simple web metrics, such as page views and the number of unique visitors, but lacks the depth of a full product analytics platform. </p><p>Plausible’s lightweight nature does offer several benefits however, such as a small script size which means it has a minimal impact on page performance. This further distinguishes it from the bloat of Google Analytics.</p><p>Plausible’s intense focus on privacy makes it an attractive option for individuals, but also imposes restrictions on how data can be used and stored. There’s no way to identify users or track behavior across multiple sessions or devices, for example. </p><h4 id="who-is-plausible-for">Who is Plausible for?</h4><p><a href="/blog/posthog-vs-plausible">Plausible</a> is a good fit for small content and marketing teams who need to track simple website metrics, or for freelancers and bloggers who only need to monitor small sites. </p><h4 id="features--benefits-1">Features &amp; benefits</h4><ul><li>Lightweight script with minimal page speed impact</li><li>No need for any cookies, at all</li><li>Minimal data collection for users</li><li>No tracking across sessions, devices or sites</li></ul><h4 id="plausible-and-gdpr-compliance">Plausible and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><p>Plausible is made and hosted in the EU. It collects no personally identifiable information at all, making it ideal if you want basic, GDPR-compliant analytics.</p><h4 id="how-much-does-plausible-cost">How much does Plausible cost?</h4><p>Plausible charges by pageview with 1 million pageviews costing $69 per month. Paying annually grants you two free months per year – i.e. $69 per month becomes $690 per year. The open source version is free to self-host via Docker Compose.</p><h3 id="3-umami">3. Umami</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/umami.png" alt="umami analytics"/></p><p><a href="https://umami.is/">Umami</a> is an increasingly popular open-source analytics tool designed for privacy. Like Plausible, it&#x27;s easy to self-host and collects no personal information (such as IP addresses) making GDPR compliance easy. The downside, as usual with privacy-first analytics tools, is it only collects basic analytics data, so it&#x27;s best used for website analytics where you&#x27;re less concerned with understanding user behavior.</p><h4 id="who-is-umami-for">Who is Umami for?</h4><p>Privacy-conscious website owners who want a no-frills solution that doesn&#x27;t impact website performance.</p><h4 id="features-and-benefits">Features and benefits</h4><ul><li>Self-hosting cookieless tracking</li><li>Lightweight script with no performance impact</li><li>Basic event tracking for buttons and other UI elements</li></ul><h4 id="umami-and-gdpr-compliance">Umami and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><h4 id="how-much-does-umami-cost">How much does Umami cost?</h4><p>Umami has a free tier that includes 100k monthly events. 1 million events is $20 per month; additional events require a custom Enterprise quote.</p><h3 id="4-fathom">4. Fathom</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/gdpr-compliant-analytics/fathom.png" alt="Fathom - GDPR compliant analytics"/></p><p><a href="/blog/best-fathom-alternatives">Fathom</a> is a popular, privacy-friendly alternative to Google Analytics that&#x27;s built with user privacy at its core. It tracks common web statistics like unique visitors, page views, time on site, bounce rate, and referral data. It also has a basic event tracking system for measuring things like downloads, mailing list signups, and purchases.</p><p>While based in Canada, Fathom offers EU-hosting. It also employs what it calls intelligent routing. This ensures that non-EU users are routed via its US servers, while EU users are routed via its EU-based and owned servers. Fathom claims this means non-EU visitors get better performance compared to other, similar services that use EU-only hosting.</p><h4 id="who-is-fathom-for">Who is Fathom for?</h4><p><a href="/blog/posthog-vs-fathom">Fathom</a> is ideal for individual users and companies who only require basic web analytics. Unlike GA and other more advanced alternatives, such as PostHog or Matomo, Fathom is a simple, single-page application. It tracks all the basic analytics most people need, but can&#x27;t offer much insight into user behavior. It&#x27;s also useful for agencies as it supports up to 50 websites on its core pricing plans.</p><h4 id="features--benefits-2">Features &amp; benefits</h4><ul><li>Fast and lightweight tracking script</li><li>No cookie banner required</li><li>EU isolation and intelligent routing</li><li>Email reports</li><li>Multi-domain tracking</li></ul><h4 id="fathom-and-gdpr-compliance">Fathom and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Self Hosting:</strong> <span class="text-red text-lg">✖</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><p>As a privacy-first solution, Fathom is GDPR compliant out-of-the-box with no compromises. It&#x27;s also a cookie-less solution, so you don&#x27;t need cookie banners when using it.</p><h4 id="how-much-does-fathom-cost">How much does Fathom cost?</h4><p>Like Plausible, Fathom charges by pageview, though it&#x27;s a bit cheaper than Plausible. A website generating 1 million pageviews per month would pay $60 per month, compared to around $69 with Plausible. Fathom also offers two months free use for paying annually, but there is no free-to-use open source version (just a 7-day free trial of the cloud version).</p><h3 id="5-matomo">5. Matomo</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/matomo-screenshot.png" alt="Matomo - open source analytics tools"/></p><p><a href="/blog/posthog-vs-matomo">Matomo</a> is one of the most popular Google Analytics alternatives because it enables teams to collect a comparable level of information, but can be deployed on-premises so that you don’t need to share information with third-parties. Like PostHog, it’s also open source. </p><p>One of Matomo’s most appealing features is the ability to import existing Google Analytics data into Matomo when getting started, so that you don’t lose any previous insights.</p><p><a href="/blog/best-matomo-alternatives">Matomo</a> offers a wealth of other features, from custom alerts to tag managers and media analytics, though many of these are sold under per-feature subscriptions which can make the cost of on-premise deployments hard to predict. </p><h4 id="who-is-matomo-for">Who is Matomo for?</h4><p>Matomo is suitable for businesses of all sizes which need an alternative to Google Analytics. The cloud version of Matomo is also easy to setup, making it ideal for non-technical users.</p><h4 id="features--benefits-3">Features &amp; benefits</h4><ul><li>Cloud hosting on European servers</li><li>Self-hosting version available</li><li>All-in-one Google Analytics replacement</li><li>Google Analytics importer</li><li>Open source, via GPL 3.0</li></ul><h4 id="matomo-and-gdpr-compliance">Matomo and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><p>Matomo offers first-party cookies by default and robust tools to ensure personally identifiable information (PII) is anonymized. Additionally, it can be deployed either on-premises, or into EU-based cloud servers. Yes. Matomo offers the option of cookie-less tracking, though this does reduce the quality of data it collects.</p><h4 id="how-much-does-matomo-cost">How much does Matomo cost?</h4><p>Matomo&#x27;s core open source analytics is free to self-host. More advanced features, such as A/B testing and Custom reports, are add-ons charged for annually at varying rates. Its managed cloud service charges by hits (any pageview, event, download etc.) with 1 million hits costing £139 (approx. $170) per month.</p><p><strong>Related:</strong> <a href="/blog/posthog-vs-matomo">PostHog and Matomo compared</a></p><h3 id="6-vercel-web-analytics">6. Vercel Web Analytics</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/vercel.png" alt="vercel analytics"/></p><p>Vercel includes a lightweight, privacy-compliant analytics tool in all its front-end-as-a-service plans. Like most privacy-first tools, it tracks basic website metrics like pageviews, unique users, time on page, and referrers. You can also set up custom events you want to track (e.g. clicking a call to action). It records no personally identifiable information, so you can use it without cookie permission banners. It also includes a useful Speed Insights tool for keeping track of your website&#x27;s Web Vitals.</p><h4 id="who-is-vercel-web-analytics-for">Who is Vercel Web Analytics for?</h4><p>While it&#x27;s only available to Vercel customers, Vercel Web Analytics is ideal if you just need basic website analytics – e.g. for a company website. It does everything Plausible, Fathom and other privacy-first tools offer, so you don&#x27;t need to deploy them if you&#x27;re already using Vercel.</p><h4 id="features--benefits-4">Features &amp; benefits</h4><ul><li>Included with Vercel</li><li>Tracks all key website metrics</li><li>Supports custom events</li><li>No cookie banners needed</li></ul><h4 id="vercel-web-analytics-and-gdpr-compliance">Vercel Web Analytics and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Self Hosting:</strong> <span class="text-red text-lg">✖</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><p>Vercel doesn&#x27;t support hosting your analytics data in the EU, but it collects no personally identifiable information, so this isn&#x27;t necessary for GDPR compliance.</p><h4 id="how-much-does-vercel-web-analytics-cost">How much does Vercel Web Analytics cost?</h4><p>Free hobby deployments include up to 50,000 events per month. The Pro plan charges $3 per 100,000 additional events (or $0.00003 per event) and includes custom events; for an additional $10/month per team, you can  extend usage and capabilities through the Web Analytics Plus add-on, which includes UTM parameters and a longer reporting window. </p><h3 id="7-countly">7. Countly</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/countly-screenshot.png" alt="Countly - open source analytics tools"/></p><p>Like PostHog, <a href="https://count.ly/">Countly</a> is an extendable product analytics platform that offers self-hosted open source and enterprise editions, or cloud deployments, for organizations that want to understand product performance and user journeys in greater detail. </p><p>Countly offers a robust suite of features and an extensive range of integrations, including a Net Promoter Score (NPS) survey plugin. The ability to track crashes and errors, and to issue push notifications to mobile users, are also useful additions over most other analytics tools.</p><h4 id="who-is-countly-for">Who is Countly for?</h4><p>Countly&#x27;s range of features make it particularly attractive to mobile app developers, especially those working on multi-platform apps across iOS, Mac, Windows, and Android. Its open source Community Edition is available on a AGPL v3 license, though this version removes the majority of its user behavior features, such as retention, revenue tracking, user tracking, cohorts, funnels, and user flow.   </p><h4 id="features--benefits-5">Features &amp; benefits</h4><ul><li>Support for mobile, web, desktop and IoT devices</li><li>Extensible via plugins</li><li>Self-hosting (AGPL v3) and private cloud deployments available</li><li>Push notifications and crash analytics</li></ul><h4 id="countly-and-gdpr-compliance">Countly and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-red text-lg">✖</span></li></ul><p>Like PostHog, Countly can be deployed onto your own infrastructure, or in cloud servers based in the EU, so that data isn&#x27;t stored in servers outside of GDPR jurisdiction. It doesn&#x27;t offer a cookie-less tracking option, but it does have consent systems built in.</p><h4 id="how-much-does-countly-cost">How much does Countly cost?</h4><p>The SaaS version is free up to 500 MAU; for additional tracking, the Flex plan starts at $40/month for 1,000 MAU, and can scale up to 160,000 MAU at $4300/month. The Enterprise plan requires a custom quote.</p><p>Its open source Community Edition is free to self-host, but it excludes most of its user behavior features. </p><h3 id="8-telemetrydeck">8. TelemetryDeck</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/ga4-alternatives/telemetrydeck.png" alt="telemetrydeck"/></p><p><a href="https://telemetrydeck.com/">TelemetryDeck</a> is to app analytics what Plausible and Fathom are to website analytics – a lightweight tool that collects minimal personal information. Consequently, TelemetryDeck says developers can use it without tracking permission banners.</p><p>Unlike Plausible and Fathom, TelemetryDeck is an event-based analytics platform, making it more adept at understanding what users are doing in your app. It includes basic retention, funnel, page flow insights, and tracks useful app data such as app version, phone model and OS version, and average usage time.</p><h4 id="who-is-telemetrydeck-for">Who is TelemetryDeck for?</h4><p>TelemetryDeck is good for individual app developers who want a simple, effective solution for app analytics. It&#x27;s most comparable to Countly, though it doesn&#x27;t collect as much information on users, or offer as many features. There are first-party SDKs for Swift, Kotlin (for Android and Java), and Javascript (for Node and websites). There&#x27;s also a community SDK for the Unity game engine.</p><h4 id="features--benefits-6">Features &amp; benefits</h4><ul><li>App analytics for Android and iPhone apps</li><li>Doesn&#x27;t track any personally identifiable information</li><li>Tracks app version and phone OS version</li><li>Basic retention, funnel, and user path visualizations</li></ul><h4 id="telemetrydeck-and-gdpr-compliance">TelemetryDeck and GDPR compliance</h4><ul><li><strong>Open source:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Self-hosting:</strong> <span class="text-red text-lg">✖</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><p>TelemetryDeck makes GDPR compliance very easy. It doesn&#x27;t collect enough personal information to require opt-out banners, and it&#x27;s hosted in the EU.</p><h4 id="how-much-does-telemetrydeck-cost">How much does TelemetryDeck cost?</h4><p>TelemetryDeck&#x27;s free plan gives you up to 100,000 signals per month – signals are TelemetryDeck&#x27;s name for events. It offers 20% discount for annual plans, and has transparency pricing up to 500M signals for month; additional signals would require a custom quote.</p><h3 id="9-goaccess">9. GoAccess</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/gdpr-compliant-analytics/goaccess-gdpr-compliant.png" alt="GoAccess - open source analytics tools"/></p><p><a href="https://goaccess.io/">GoAccess</a> is a completely open source web log analyzer and viewer which runs in a browser-based terminal to give you an overview of the most common website metrics. This means it can act as a replacement for tools such as Google Analytics, though it falls short of a product analytics platform in capabilities. </p><p>Functioning in real-time, GoAccess is useful for spotting who is using up your bandwidth and identifying aggressive crawlers or bots, as well as tracking site metrics such as page views, visitors and time-on-page. The toolset, design and reliance on a terminal make it a popular choice for sysadmins. </p><h4 id="who-is-goaccess-for">Who is GoAccess for?</h4><p>GoAccess is for system administrators and software engineers who need to track web performance across smaller sites. It’s unsuitable for those needing a self-service analytics platform or who need easy integration with other tools or data warehouses. </p><h4 id="features--benefits-7">Features &amp; benefits</h4><ul><li>Open source, via MIT license</li><li>Completely real-time tracking</li><li>Customizable dashboards</li><li>Runs inside a terminal or browser</li></ul><h4 id="goaccess-and-gdpr-compliance">GoAccess and GDPR compliance</h4><ul><li><strong>Open Source:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>EU Cloud Hosting:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Cookieless Tracking:</strong> <span class="text-green text-lg">✔</span></li></ul><p>You can configure GoAccess to either not collect IP addresses or anonymize them, so it can be used without cookie banners.</p><h4 id="how-much-does-goaccess-cost">How much does GoAccess cost?</h4><p>GoAccess is open source and has no paid tiers.</p><h2 id="which-gdpr-compliant-analytics-tool-should-you-choose">Which GDPR-compliant analytics tool should you choose?</h2><ul><li>Want an all-in-one platform with analytics, session replay, feature flags, and EU hosting? Go with <strong>PostHog</strong>.</li><li>Need simple website metrics with zero personal data collection? <strong>Plausible</strong> or <strong>Fathom</strong> keep it minimal.</li><li>Building mobile apps and need privacy-first analytics? <strong>TelemetryDeck</strong> is purpose-built for iOS and Android.</li><li>Looking for a direct Google Analytics replacement you can self-host? <strong>Matomo</strong> imports your GA data.</li><li>Already using Vercel? Their built-in <strong>Vercel Web Analytics</strong> covers the basics.</li><li>Sysadmin who lives in the terminal? <strong>GoAccess</strong> analyzes server logs directly.</li></ul><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>Is Google Analytics GDPR compliant?</summary><p><strong>Google Analytics</strong> can be configured for GDPR compliance, but it requires effort. You need cookie consent banners, IP anonymization, and data processing agreements. Several EU data protection authorities have ruled against GA4 implementations, making alternatives like PostHog, Plausible, or Matomo safer choices for EU-focused businesses.</p></details><details><summary>Do I need cookie consent banners with GDPR-compliant analytics?</summary><p>Not always. Tools like <strong>Plausible</strong>, <strong>Fathom</strong>, and <strong>TelemetryDeck</strong> collect no personally identifiable information, so they don&#x27;t require consent banners. <strong>PostHog</strong> and <strong>Matomo</strong> can be configured for <a href="/tutorials/cookieless-tracking">cookieless tracking</a>, which also removes the banner requirement – though this limits some tracking capabilities.</p></details><details><summary>What&#x27;s the difference between EU hosting and cookieless tracking?</summary><p><strong>EU hosting</strong> means your data is stored on servers within the European Union, which satisfies GDPR data residency requirements. <strong>Cookieless tracking</strong> means no cookies are set on user devices, eliminating the need for consent banners. They solve different problems – you might want both, or just one, depending on your compliance needs.</p></details><details><summary>Which GDPR-compliant analytics tool is best for product teams?</summary><p><strong>PostHog</strong> is the best choice for product teams. It combines a full suite of developer tools, including product and web analytics, all with EU hosting. <strong>Matomo</strong> and <strong>Countly</strong> also offer product analytics features, but PostHog&#x27;s all-in-one approach means fewer tools to manage.</p></details><details><summary>Which is best for simple website analytics?</summary><p><strong>Plausible</strong> and <strong>Fathom</strong> are both excellent for basic website metrics. They&#x27;re lightweight, collect no personal data, and don&#x27;t require cookie banners. <strong>Plausible</strong> is open source if you want to self-host; <strong>Fathom</strong> offers intelligent routing for better global performance.</p></details><details><summary>Can I use GDPR-compliant analytics without self-hosting?</summary><p>Yes. <strong>PostHog</strong>, <strong>Plausible</strong>, <strong>Fathom</strong>, <strong>Matomo</strong>, and <strong>TelemetryDeck</strong> all offer managed cloud hosting with EU data residency. Self-hosting is optional – it gives you maximum control but isn&#x27;t required for GDPR compliance.</p></details><details><summary>What&#x27;s the best free GDPR-compliant analytics tool?</summary><p><strong>PostHog</strong> offers the most generous free tier for product analytics: 1 million events and 5,000 session replays per month with EU hosting. For simple website analytics, <strong>Umami</strong> offers 100k events free, and <strong>GoAccess</strong> is completely free and open source (though it requires self-hosting).</p></details><details><summary>Is Amplitude GDPR compliant?</summary><p><strong>Amplitude</strong> offers EU data residency and SOC 2 certification, so it can be configured for GDPR compliance. However, it&#x27;s not privacy-first – you&#x27;ll still need cookie consent banners. If GDPR compliance is a priority, consider <a href="/blog/posthog-vs-amplitude">PostHog</a> as an alternative with similar features plus transparent pricing.</p></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we use Logs at PostHog]]></title><description><![CDATA[If there’s something we do a lot here at PostHog (well, there’s many things but this one is top three), it’s  dogfooding  our own product.  This is a…]]></description><link>https://posthog.com/blog/how-posthog-uses-logs</link><guid isPermaLink="false">34cd3438-01e5-5039-97af-a2bd885283fb</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/milk_meme_1_049755a42a.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If there’s something we do a lot here at PostHog (well, there’s many things but this one is top three), it’s <a href="/product-engineers/dogfooding">dogfooding</a> our own product. </p><p>This is a crucial part of how we build better products. We&#x27;re building tools for engineers, so having our own engineers using them helps us get feedback, feature requests, and even haikus.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2026_01_22_at_15_53_53_2x_362b2ecaf8.png" alt="engineer giving logs feedback" classes="rounded"></div><p>Our team loves using <a href="https://app.posthog.com/logs">Logs</a> to debug PostHog. Here&#x27;s the most important things they&#x27;ve learned about doing this effectively so far.</p><h2 id="when-everything-looks-fine-isnt-true">When “everything looks fine” isn’t true</h2><p>For <div name="Sven Lange"></div>, Platform Engineer in the Infrastructure Team, opening Logs usually means something already feels off. It might start with an alert, a bug report, or a suspicious anomaly. Sometimes, that means sanity-checking reports of things like SQL injection attempts and confirming there was no real impact.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/Logs_screen_light_109f882754.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/Logs_screen_dark_fb1c06937f.png" alt="Logs user details" classes="rounded"></div><p>One case stood out: repeated out-of-memory crashes on a node, with no obvious explanation. Sven opened Logs, filtered down to everything running on that node, and then started ruling things out. Normal-looking logs went first, then more normal-looking logs, until only something odd remained - gzipped noise showing up where it really shouldn’t.</p><p>That “noise” turned out to be an application logging huge compressed payloads. Our previous internal log pipeline dutifully tried to read all of it, but the logs were far too large and it kept crashing, sometimes taking other applications with it.</p><p>This was exactly the kind of problem the previous logging setup was good at hiding. That system discarded the problematic data, so everything looked mostly fine… apart for the unexplained crashes.</p><p>This wasn’t just a one-off investigation. Sven flagged this pattern to the team as a logging failure, not an infrastructure one – the system was hiding exactly the data you’d want when something goes wrong. That kic ked off a round of changes around how large payloads are handled, surfaced, and filtered in Logs.</p><p>Today, that same investigation usually starts by carving things down instead of staring at a wall of output. Include and exclude filters came directly out of these cases – the need to rule things out quickly without guessing. Tracking slow HTTP requests, for example, is as simple as filtering for requests over 600 ms and seeing the results update immediately.</p><p>Sven still checks Grafana/Loki when he needs older history, but for day-to-day investigations PostHog Logs has become the default. It’s become the default for day-to-day investigations, especially when the problem isn’t obvious yet.</p><h2 id="logs-but-with-the-full-picture">Logs, but with the full picture</h2><p><div name="Rory Shanks"></div> and his team used to query built-in ClickHouse tables directly to inspect logs. It worked, but it wasn’t something you’d reach for when an issue was unfolding and you needed answers quickly. Until we built PostHog Logs.</p><p>Their setup now is intentionally simple. ClickHouse runs on EC2 as a <code>systemd</code> service. <code>systemd</code> writes logs to journald, Vector reads from <code>journald</code>, and sends everything to PostHog via OpenTelemetry. As a bonus, this doesn’t just include ClickHouse logs; it brings in system logs too.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/log_person_details_7948949dbb.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/log_person_details_dark_f2d3cbd9b4.png" alt="Logs screen" classes="rounded"></div><p>Configuration is minimal, maintenance is basically zero, and anything that supports OTel “just works.”</p><p>Most of Rory’s questions are straightforward but time-sensitive:</p><ul><li>When did this error start?</li><li>How widespread is it?</li><li>Can I quickly share this log with someone else?</li></ul><p>The signals were technically available before, but Logs makes it much faster to see patterns, understand impact, and collaborate. Errors are easier to scope, links are easy to share, and everything loads fast, noticeably lighter than setups they’d used before, especially when all they needed was to understand scope and timing.</p><h2 id="debugging-without-the-tab-circus">Debugging without the tab circus</h2><p><div name="Jon McCallum"></div>, Product Engineer in the Logs team, spends a lot of time inside Logs. Which actually makes total sense, because he’s one of the people working on it.</p><p>Jon rarely starts by staring at log lines and hoping for enlightenment (at least he says so). Instead, he narrows the blast radius first, a specific surface, service, or severity, until the noise drops enough for a pattern to show itself. As he tweaks the filters, the sparkline responds instantly, which is usually faster than his own intuition and much more honest.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/Logs_details_light_42368d34a6.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/Logs_details_dark_8b34015a7d.png" alt="Logs details" classes="rounded"></div><p>Once something stands out, he digs into the details. Because logs are ingested as structured data, whether they come from OpenTelemetry or PostHog’s own SDKs, the metadata isn’t just there for reference. A trace ID or request ID becomes the fastest way to reframe the investigation. </p><p>If he needs a quick reality check, Jon lets PostHog explain what the error is trying (and failing) to do, in human language. And when things are actively on fire, Live Tail is there to stream logs in real time. He says: </p><blockquote><p>The real superpower is how this connects to the front end, because we capture browser logs via PostHog JS. They’re automatically linked to the session and the user IDs. I can search for a front-end exception and jump directly into the session replay to watch the exact moment the bug happened.</p></blockquote><p>This means that logs are now part of the same space as <a href="/session-replay">replays</a>, <a href="/error-tracking">errors</a>, and <a href="/product-analytics">analytics</a>, which removes a lot of back-and-forth and makes debugging feel noticeably quicker.</p><h2 id="why-you-should-try-posthog-logs-too">Why you should try PostHog Logs too</h2><p>Across teams, Logs tends to show up at the same moment, when something feels off and you want to confirm or rule it out quickly.</p><p>We keep using Logs because it’s shaped by the same problems we run into while building PostHog. When it gets in the way, it gets changed. When it works, it becomes part of the routine.</p><p><a href="https://app.posthog.com/logs">Try it out</a> and start debugging where your data already is.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best web analytics tools for developers, compared]]></title><description><![CDATA[Welcome. Grab a chair. There's coffee in the back. No one's judging you for ignoring your analytics for six months. We've all been there. This is a…]]></description><link>https://posthog.com/blog/best-web-analytics-tools</link><guid isPermaLink="false">cc74c655-2b53-5e06-8e30-6d0f45daf15f</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Welcome. Grab a chair.</p><p>There&#x27;s coffee in the back. No one&#x27;s judging you for ignoring your analytics for six months. We&#x27;ve all been there.</p><p>This is a safe space for developers with a complicated relationship with web analytics.</p><p>If this sounds like you, you&#x27;re not alone. Most web analytics tools were built for marketers – not developers – which makes finding one that actually fits a modern dev workflow harder than it should be.</p><p>In this guide, we compare the best web analytics tools for developers, so you can understand your site, debug faster, and actually trust your data.</p><h2 id="what-features-do-you-need-in-a-web-analytics-tool">What features do you need in a web analytics tool?</h2><p>At a minimum, a web analytics tool should tell you what&#x27;s happening on your site:</p><ul><li>Pageviews, sessions, and unique visitors</li><li>Traffic sources and referrers</li><li>UTM and campaign tracking</li><li>Conversion or goal tracking</li><li>Real-time or near real-time reporting</li></ul><p>The best web analytics tools are actually platforms that go further and give you:</p><ul><li><strong>Event-based tracking</strong>, so you can track meaningful actions</li><li><strong>Funnels, paths, and retention</strong>, to understand how users move through your site and where they drop off</li><li><strong>Session replay and heatmaps</strong>, to see what users actually did</li><li><strong>Error tracking and performance context</strong>, so you can connect broken experiences to user impact</li><li><strong>Raw data access</strong> via SQL, APIs, or exports for custom queries, data retrieval, and external integrations</li><li><strong>Privacy-first design</strong> so you can skip cookie banners and stay GDPR/CCPA compliant</li><li><strong>Transparent pricing</strong> so a traffic spike doesn&#x27;t lead to a finance incident</li></ul><p>Here&#x27;s how some of the most popular web analytics tools compare:</p><p><div competitors="posthog,plausible,fathom,matomo,mixpanel,cloudflare"></div></p><p><em>Hey competitors 👋 We try our best to keep up with what you&#x27;re shipping, but if we got something wrong or this looks outdated, feel free to open a PR and we&#x27;ll fix it.</em></p><p>You might notice one obvious omission: <a href="/blog/ga4-alternatives">Google Analytics 4</a>. That&#x27;s intentional. GA4 is powerful and widely used, but it&#x27;s also opinionated, complex, and fundamentally built for a different audience. </p><p>Rather than rehash the same frustrations, this guide focuses on tools that are easier to reason about, more developer-friendly, or better aligned with modern product workflows.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Screenshot_2026_01_13_at_5_08_32_PM_e9584ccfa3.png" alt="Uno GA4"/></p><h2 id="whats-the-best-web-analytics-tool-for-developers">What&#x27;s the best web analytics tool for developers?</h2><h3 id="1-posthog">1. PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Posthog_web_analytics_679d394b35.png" alt="PostHog"/></p><p>PostHog is an all-in-one developer platform that combines <a href="/web-analytics">web analytics</a> with <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, <a href="/surveys">surveys</a>, and <a href="/llm-analytics">LLM analytics</a> in one place.</p><p>Unlike standalone web analytics tools, PostHog lets you follow a visitor&#x27;s journey from their first pageview through to product usage; you still get the fundamentals, but they&#x27;re directly connected to how users actually behave in your product. Every pageview can be tied to events, users, recordings, flag variants, errors, and more. </p><p>The web analytics dashboard includes <a href="/docs/web-analytics/dashboard">real-time activity</a>, <a href="/docs/web-analytics/conversion-goals">conversion goals</a>, and near-full compatibility with product analytics – meaning you can open any chart as an <a href="/docs/product-analytics/insights">insight</a>, query it with <a href="/docs/data-warehouse/sql">SQL</a>, or build funnels, retention, and cohorts on your web data.</p><p>You can also run <a href="/experiments">A/B tests</a> using web vitals as goals, track ad spend and ROAS with <a href="/docs/web-analytics/marketing-analytics">marketing analytics</a>, and embed analytics into your own product using the <a href="/docs/api">API endpoints</a> (in beta).</p><p>PostHog uses simple <a href="/pricing">usage-based pricing</a> with a generous free tier that includes 1 million events per month, which is enough for most early-stage teams to get real value before paying anything.</p><p><div to="https://posthog.com/docs/web-analytics/getting-started">Get started with PostHog Web Analytics – it&#x27;s free!</div></p><p><strong>Strengths:</strong></p><ul><li>Complete visitor-to-user journey tracking</li><li><a href="/products">Unified suite of developer tools in one platform</a></li><li><a href="/wizard">Developer-friendly setup</a> and <a href="/docs/libraries">SDKs</a></li><li><a href="/ai">PostHog AI</a> to query data in natural language and debug issues faster</li><li><a href="/docs/product-analytics/sql">SQL access</a> and raw data ownership</li><li><a href="/docs/endpoints">Flexible API</a> definitions with our endpoints product</li></ul><p><strong>Community:</strong></p><ul><li>PostHog is fully open source under the MIT license, actively maintained on <a href="https://github.com/PostHog/posthog">GitHub</a>.</li><li>The repository has 30k+ stars, 400+ contributors, and daily commits</li><li>Development happens <a href="/changelog">in public</a></li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">PostHog is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Developers who want full-stack visibility from website traffic through to product usage, and fast-growing startups that need a flexible platform that scales without requiring multiple tools.</p></div></div><hr/><h3 id="2-plausible">2. Plausible</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/plausible_49dba33714.webp" alt="Plausible"/></p><p><a href="/blog/posthog-vs-plausible">Plausible</a> is a lightweight, privacy-first analytics tool that positions itself as an ethical alternative to Google Analytics. </p><p>Adding Plausible to your stack is painless: setup takes minutes, the script is tiny, and the UI is refreshingly easy to understand. It doesn&#x27;t require cookies and is fully GDPR compliant out of the box.</p><p>The dashboard is intentionally simple: a single page with the essential metrics. You get traffic, sources, pages, locations, and devices. Plausible deliberately trades analytical depth for simplicity and strong privacy guarantees.</p><p>Because <a href="/blog/best-plausible-alternatives">Plausible</a> avoids deep user tracking by design, there&#x27;s no session replay, no detailed funnels, no user-level timelines, and no product analytics. Unique visitor counts are also <a href="https://plausible.io/data-policy#how-we-count-unique-users-without-cookies">approximations</a> – the tradeoff for being fully cookieless.</p><p>Plausible doesn&#x27;t have a free tier. Plans start at $9/month for a single site with 3 years of data retention, and scale to $14/month and $19/month as you add more sites, team members, and features like funnels, custom properties, revenue attribution, and API access. An Enterprise plan is available for larger setups, with SSO, higher API limits, raw data exports, and priority support.</p><p><strong>Strengths:</strong></p><ul><li>Extremely lightweight (~1KB script)</li><li>No cookies, fully GDPR/CCPA compliant</li><li>Excellent reliability, with 99.99% uptime over the last 30 days</li><li>Open source and self-hostable</li><li>Google Search Console integration</li></ul><p><strong>Community:</strong></p><ul><li><a href="https://github.com/plausible/analytics">Open source</a> under the AGPL license</li><li>24k+ stars on GitHub with active community contributions</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Plausible is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Privacy-conscious developers who want simple, essential website metrics without the bloat, heavy instrumentation, or privacy concerns of traditional analytics tools.</p></div></div><hr/><h3 id="3-fathom">3. Fathom</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/fathom_34ae33dcf6.webp" alt="Fathom"/></p><p>Speaking of privacy, <a href="/blog/posthog-vs-fathom">Fathom</a> is a minimalist, privacy-focused web analytics tool built for teams that want to minimize overhead. Like Plausible, it&#x27;s designed to be easy to install, easy to understand, and respectful of user privacy by default.</p><p>The script is lightweight (~2KB), works without cookies, and offers permanent data retention so you never lose historical analytics.</p><p><a href="/blog/best-fathom-alternatives">Fathom</a> integrates cleanly with almost any web stack; their script can be added to virtually any CMS, framework, or site setup (from WordPress and Webflow to modern frameworks like Next.js and Vue). There&#x27;s no complex setup, no special build steps, and no lock-in to a specific platform.</p><p>Pricing is straightforward and traffic-based. Plans start at $15/month for up to 100,000 pageviews and scale predictably as traffic grows, reaching $200/month for up to 10 million pageviews. Annual billing offers a 17% discount (roughly two months free), with higher tiers available for very high-traffic sites.</p><p><strong>Strengths:</strong></p><ul><li>Extremely simple setup with a lightweight (~2 KB) script</li><li>Clean integrations across common tools and platforms</li><li>Forever data retention included</li><li>Easy-to-use, powerful API </li><li>Built-in compliance with GDPR, CCPA, and PECR</li></ul><p><strong>Community:</strong></p><ul><li>Fathom Lite is <a href="https://github.com/usefathom/fathom">open source</a></li><li>The main product is closed-source but actively developed</li><li>Strong community of privacy advocates</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Fathom is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Developers who want privacy-friendly website analytics that integrate effortlessly with their existing stack and provide clean, reliable metrics without complexity.</p></div></div><hr/><h3 id="4-matomo">4. Matomo</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/matomo_69f99f4666.png" alt="Matomo"/></p><p><a href="/blog/posthog-vs-matomo">Matomo</a> is one of the most established <a href="/blog/best-open-source-analytics-tools">open-source web analytics platforms</a>, used by over one million websites, including government agencies, universities, and large enterprises.</p><p>Matomo&#x27;s interface will ring a bell to anyone who&#x27;s used Universal Analytics (RIP). It offers a comparable feature set, but with full data ownership.</p><p>Matomo is built for teams that want depth and flexibility, not minimalism. With great power comes great <del>responsibility</del> complexity. Setup, configuration, and ongoing maintenance can take more time, especially if you&#x27;re self-hosting or enabling multiple plugins.</p><p>The on-premise version is free and gives you complete control over your data. The cloud version includes premium features like heatmaps, session recordings, and A/B testing as paid add-ons; it starts at €22/month (excl. tax) for up to 50,000 hits, with discounts for annual billing.</p><p><strong>Strengths:</strong></p><ul><li>Complete data ownership with self-hosting</li><li>GDPR compliant with configurable privacy settings</li><li>Google Analytics data import</li><li>Extensive plugin ecosystem</li><li>Broad feature set, including funnels, heatmaps, session recording, and ecommerce analytics</li></ul><p><strong>Community:</strong></p><ul><li><a href="https://github.com/matomo-org/matomo">Open source</a> under GPL v3</li><li>21k+ stars with 400+ contributors</li><li>One of the oldest and most established open-source analytics projects</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Matomo is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Developers that need full-featured, self-hosted analytics with complete data ownership – and are comfortable managing the added complexity.</p></div></div><hr/><h3 id="5-mixpanel">5. Mixpanel</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/mixpanel_ca2e3a5b11.png" alt="Mixpanel"/></p><p><a href="/blog/posthog-vs-mixpanel">Mixpanel</a> is primarily a product analytics platform, but it now includes dedicated web analytics features that make it worth considering for certain use cases.</p><p>Unlike traditional web analytics tools that focus on pageviews and traffic, Mixpanel is built around events and users. You track actions like sign-ups, button clicks, feature usage, and conversions, then analyze them using funnels, retention, cohorts, and breakdowns.</p><p>This makes Mixpanel powerful for understanding how users interact with a web app after they arrive; it shines when your &quot;website&quot; behaves more like a product than a marketing site. The tradeoff is that it&#x27;s less useful (and more expensive) for content-heavy sites or teams focused on traffic sources, SEO performance, or page-level reporting.</p><p>Mixpanel offers a free plan that includes 1 million events per month, with paid plans scaling based on event volume as usage grows.</p><p><strong>Strengths:</strong></p><ul><li>Powerful funnels, retention, and cohort analysis</li><li>Real-time querying and fast dashboards</li><li>Strong support for product-led growth use cases</li><li>Mature ecosystem and integrations</li></ul><p><strong>Community:</strong></p><ul><li>Closed-source platform (SDKs are open source)</li><li><a href="https://www.mixpanel.com/community-slack">Active Slack community</a> with over 11k members</li><li>74 public repos on GitHub for SDKs and integrations</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Mixpanel is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Product-led web applications where understanding user actions, activation, and retention matters more than traditional traffic metrics like pageviews and referrers.</p></div></div><hr/><h3 id="6-cloudflare-web-analytics">6. Cloudflare Web Analytics</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/cloudflare_09b27f4c91.png" alt="Cloudflare"/></p><p>Cloudflare Web Analytics is a free, privacy-first analytics tool from Cloudflare. </p><p>You can deploy it either via a JavaScript snippet (like other analytics tools) or directly from Cloudflare&#x27;s edge if your site already uses their CDN – no client-side code required.</p><p>Cloudflare Web Analytics is intentionally basic: no funnels, no custom events, no user-level tracking, no session replay. Data retention is limited, and high-traffic sites may experience sampling.</p><p>It&#x27;s best thought of as a lightweight complement to other tools rather than a full analytics solution.</p><p>If you&#x27;re already using Cloudflare for DNS, CDN, or security, adding Web Analytics takes about 30 seconds. For everyone else, it&#x27;s still a quick JavaScript snippet away.</p><p><strong>Strengths:</strong></p><ul><li>Completely free with no traffic limits</li><li>No cookies, fully privacy-compliant</li><li>Edge-based tracking option (no JavaScript required for Cloudflare users)</li><li>Lightweight and fast</li><li>Simple, clean dashboard</li></ul><p><strong>Community:</strong></p><ul><li>Closed-source commercial product (part of Cloudflare&#x27;s free tier)</li><li>Active development as part of Cloudflare&#x27;s broader analytics suite</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Cloudflare Web Analytics is best for...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Developers already using Cloudflare who want free, privacy-first website metrics with zero setup – or anyone who needs a simple, no-cost baseline for traffic monitoring.</p></div></div><hr/><h2 id="which-web-analytics-tool-should-you-choose">Which web analytics tool should you choose?</h2><ul><li>Want web analytics connected to product analytics, session replay, feature flags, and experiments? <strong><a href="/web-analytics">PostHog</a></strong>.</li><li>Want simple, privacy-first traffic analytics with minimal setup? <strong>Plausible</strong> or <strong>Fathom</strong>.</li><li>Want full data ownership with a GA-style reporting model? <strong>Matomo</strong>.</li><li>Is your &quot;website&quot; really a product where activation and retention matter more than pageviews? <strong>Mixpanel</strong> or <strong>PostHog</strong>.</li><li>Want free, privacy-friendly traffic visibility and already use Cloudflare? <strong>Cloudflare Web Analytics</strong>.</li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><h4 id="for-high-growth-startups">For high-growth startups</h4><ul><li><strong>PostHog</strong> for a single platform that scales from marketing pages to product analytics without rebuilding your stack</li><li><strong>Plausible</strong> if you want simple, privacy-friendly traffic analytics early on</li></ul><h4 id="for-developer-first-teams">For developer-first teams</h4><ul><li><strong>PostHog</strong> if you want analytics that help you debug issues, ship fixes, and measure impact in one workflow</li><li><strong>Mixpanel</strong> if your web app is the product and custom events matter more than pageviews</li></ul><h4 id="for-privacy-conscious-teams">For privacy-conscious teams</h4><ul><li><strong>Plausible</strong> for simplicity and predictability</li><li><strong>Fathom</strong> for polished analytics with strong integrations and permanent data retention</li><li><strong>Matomo</strong> if you need full control and self-hosting</li></ul><h4 id="for-content-sites-and-marketing-teams">For content sites and marketing teams</h4><ul><li><strong>Plausible</strong> or <strong>Fathom</strong> for clean dashboards and predictable pricing</li></ul><h4 id="for-enterprises-and-regulated-organizations">For enterprises and regulated organizations</h4><ul><li><strong>Matomo</strong> for data ownership, configurable privacy controls, and flexible hosting</li><li><strong>PostHog</strong> if you want an all-in-one platform with strong governance and raw data access</li></ul><hr/><h2 id="faq">FAQ</h2><details><summary>What is web analytics, really?</summary><p><strong>Web analytics</strong> is the art and science of understanding how people find your site, what they do on it, and what happens next. At its simplest, that means tracking pageviews and referrers. At its most useful, <a href="/newsletter/misconceptions-about-analytics">it means understanding behavior, friction, and outcomes</a>.</p><p>Good web analytics answers questions like: Why did users bounce? Where did they drop off? What landing page worked?</p></details><details><summary>What metrics matter most in web analytics?</summary><p>Most teams should start with: <strong>channel types</strong> (where users come from), <strong>landing pages</strong> (where sessions start), <strong>bounce rate or engagement</strong> (how they spend, or dont spend, time on your website), and <strong>conversions</strong> (sign-ups, purchases, or key actions).</p><p>As your site becomes more product-like, event-based metrics (clicks, actions, feature usage) become more important than raw pageviews.</p></details><details><summary>Are pageviews still useful?</summary><p>Yes, but they&#x27;re rarely sufficient.</p><p><strong>Pageviews</strong> are good for understanding reach and interest, especially for content sites. They&#x27;re much less useful for explaining why users behaved a certain way or whether something broke.</p><p>That&#x27;s why many modern tools pair pageviews with <a href="/docs/product-analytics/capture-events">events</a>, <a href="/docs/product-analytics/funnels">funnels</a>, or <a href="/docs/session-replay">session replay</a>.</p></details><details><summary>What&#x27;s the difference between cookieless and cookie-based analytics?</summary><p><strong>Cookie-based analytics</strong> track users across sessions using identifiers stored in the browser. Cookieless analytics avoid this and rely on aggregated or anonymous signals instead.</p><p><a href="/blog/best-gdpr-compliant-analytics-tools">Cookieless tools are easier to make privacy-compliant and less invasive for users</a>. The tradeoff is less granular user-level tracking. For many sites, that&#x27;s a feature, not a bug.</p></details><details><summary>Is web analytics affected by ad blockers?</summary><p>Yes, especially tools that rely entirely on client-side JavaScript. Privacy-first tools, server-side collection, or edge-based analytics (like Cloudflare&#x27;s) tend to be more resilient, but no analytics setup is 100% immune. You can also <a href="/docs/advanced/proxy">set up a reverse proxy</a> to route analytics through your own domain, or combine client-side and server-side tracking to fill in gaps.</p><p>Even then, it&#x27;s best to treat web analytics as directionally accurate and focus on trends and patterns — not exact counts.</p></details><details><summary>Do I need to display a cookie consent banner?</summary><p>It depends on the tool and your jurisdiction. <strong>Plausible</strong>, <strong>Fathom</strong>, and <strong>Cloudflare Web Analytics</strong> don&#x27;t use cookies and generally don&#x27;t require consent banners. <strong>Google Analytics 4</strong> uses cookies by default and typically requires consent in the EU. <strong>Matomo</strong> and <strong>PostHog</strong> can be configured to run cookieless, but you&#x27;ll need to verify your setup meets local requirements.</p></details><details><summary>What&#x27;s the difference between web analytics and product analytics?</summary><p><strong>Web analytics</strong> focuses on traffic and pages (who visited, where they came from, what they viewed). <a href="/blog/what-is-product-analytics">Product analytics</a> focuses on behavior and users (what actions users took, how they activate, retain, or churn). We break this down in more detail in <a href="/docs/web-analytics/web-vs-product-analytics">web analytics vs. product analytics</a>.</p><p>Tools like <strong>PostHog</strong> combine both, so you can see how traffic turns into real <a href="/product-analytics">product usage</a>.</p></details><details><summary>What should I look for in analytics pricing?</summary><p>Watch for how tools measure usage. Some charge by pageviews, others by events, others by monthly tracked users. A site with 100k pageviews and 10k users will cost very different amounts depending on the model. Also check what&#x27;s included: some tools charge extra for features like funnels, session replay, or data exports.</p></details><details><summary>How much data retention do I actually need?</summary><p>6–12 months is enough for short-term optimization. 2–3 years is useful for trend analysis and seasonality. Forever retention sounds nice, but it only matters if you actually revisit historical data. Many teams don&#x27;t.</p></details><details><summary>Do I need session replay with web analytics?</summary><p>Not always — but it&#x27;s extremely useful when debugging issues or understanding drop-offs. Tools like <strong>PostHog</strong> link analytics directly to <a href="/blog/best-session-replay-tools">session replay</a>, so you can see exactly what users did instead of guessing from charts.</p></details><details><summary>Can I self-host my web analytics?</summary><p>Yes. Matomo, for example, offers a fully self-hosted option with complete data ownership. Some teams choose this for compliance, residency, or regulatory reasons, with the tradeoff of higher operational complexity.</p></details><details><summary>Which web analytics tool is best for content sites or blogs?</summary><p>For blogs, documentation, and marketing sites: <strong>Plausible</strong> and <strong>Fathom</strong> are ideal for clean dashboards and privacy-friendly metrics. <strong>Cloudflare Web Analytics</strong> works well for high-level traffic visibility with zero setup.</p></details><details><summary>Which web analytics tool is best for product-led web apps?</summary><p>If your website behaves like a product: <strong><a href="/web-analytics">PostHog</a></strong> is best if you want analytics plus <a href="/session-replay">replay</a>, <a href="/feature-flags">flags</a>, <a href="/experiments">experiments</a>, and debugging. <strong>Mixpanel</strong> is another good choice if you care primarily about events, funnels, and retention.</p></details><br/><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Stop AI slop: Run evals with LLM-as-a-Judge]]></title><description><![CDATA[Every time your AI product generates text, code, or images, it's being judged. Not against some complex scoring matrix or your internal metrics, but…]]></description><link>https://posthog.com/blog/stop-ai-slop</link><guid isPermaLink="false">e0d16288-1727-54b6-ba83-90dda1ba406e</guid><dc:creator><![CDATA[Cleo Lant]]></dc:creator><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/Film_Noir_Hog_Evals_beta_announcement_blog_95685493eb.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Every time your AI product generates text, code, or images, it&#x27;s being judged.</p><p>Not against some complex scoring matrix or your internal metrics, but by a user who&#x27;s tired, distracted, and one bad output away from a final verdict:</p><ul><li>&quot;This helped me.&quot;</li><li>&quot;This wasted my time.&quot;</li><li>&quot;This is AI slop and now I don&#x27;t trust you.&quot;</li></ul><p>If you’re shipping anything LLM-powered in production, you need a simple way to answer: “Is this AI model doing what I want it to?”</p><p>That&#x27;s what evaluations are for.</p><h2 id="your-judge-jury-and-execution-environment">Your judge, jury, and execution environment</h2><p>PostHog <a href="/docs/llm-analytics/evaluations">evaluations</a> use LLM-as-a-judge to automatically score generative AI outputs against criteria like relevance, helpfulness, or toxicity. </p><p><strong>How it works:</strong></p><ul><li>Write a short evaluation prompt </li><li>Choose a sampling rate (0.1% – 100%)</li><li>Define pass/fail criteria </li><li>Optionally add property filters to narrow which generations get evaluated</li></ul><p><em>To prevent false negatives, N/A is used when the evaluation prompt is not relevant to the LLM generation. For example, a &quot;mathematical accuracy&quot; evaluation would apply the N/A label to responses that contain no math.</em></p><p>Running evals with AI enables you to batch test hundreds or thousands of traces, then apply human judgement to investigate pass/fail samples. To help you get started, we included five pre-built templates:</p><table><thead><tr><th>Template</th><th>What it checks</th><th>Best for</th></tr></thead><tbody><tr><td><strong>Relevance</strong></td><td>Whether the output addresses the user&#x27;s input</td><td>Customer support bots, Q&amp;A systems</td></tr><tr><td><strong>Helpfulness</strong></td><td>Whether the response is useful and actionable</td><td>Chat assistants, support bots, productivity tools</td></tr><tr><td><strong>Jailbreak</strong></td><td>Attempts to bypass safety guardrails</td><td>Security-sensitive applications, apps with PII</td></tr><tr><td><strong>Hallucination</strong></td><td>Made-up facts or unsupported claims</td><td>RAG systems, knowledge bases</td></tr><tr><td><strong>Toxicity</strong></td><td>Harmful, offensive, or inappropriate content</td><td>User-facing applications</td></tr></tbody></table><p>You can also create custom evals to suit the specific use cases of your AI features, and get a temperature check on user sentiment (more on that later).</p><div class="flex justify-center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/h_600,c_limit,q_auto,f_auto/AI_Evals_Meme_45a28f5a92.png" alt="AInception"/></div><h2 id="why-use-evals-a-tale-of-two-math-problems">Why use evals? A tale of two math problems</h2><p><strong>Problem 1: Manual review doesn’t scale</strong></p><p><a href="/blog/best-open-source-llm-observability-tools">LLM observability tools</a> capture the inputs, outputs, latency, tokens, costs, and errors associated with AI workflows. This makes it simple for engineers to review generations and traces, and hunt for &quot;AI slop&quot;. </p><p>Slop (a disguting yet accurate term) is any output from an LLM that feels generic, low quality, or just plain wrong.</p><p>The problem with manual review is that it doesn&#x27;t scale. Suppose looking through one complex trace takes an engineer ~15 minutes:</p><ul><li>10 traces = 2.5 hours</li><li>100 traces = half a work week</li><li>10,000 traces = existential dread</li></ul><p>Since the average AI product has tens or hundreds of thousands of generations occurring per day, there&#x27;s no way to review them all and maintain sanity.</p><p><strong>Problem 2:  Margin of error affects your margins</strong></p><p>In January 2024, a user convinced <a href="https://www.bbc.com/news/technology-68025677">DPD</a>&#x27;s delivery chatbot to start swearing and criticizing the company. It wrote a poem calling itself &quot;a useless chatbot&quot; and DPD &quot;a customer&#x27;s worst nightmare.&quot; 1.3 million views later, the bot was disabled.</p><p>Around the same time, Air Canada&#x27;s chatbot told a bereaved customer they could retroactively apply for bereavement fares (a policy that didn&#x27;t actually exist). The airline argued the chatbot was &quot;a separate legal entity.&quot; A tribunal disagreed and ordered them to pay $812 plus fees.</p><p>This might not sound like a math problem to a product engineer, but it definitely does to legal and finance.</p><h2 id="writing-custom-evaluations">Writing custom evaluations</h2><p>Beyond monitoring for hallucinations and brand disasters, evals are a handy tool to define what &quot;good AI&quot; looks like for your product. </p><p>Good output or bad output? That depends on the task. An evaluation configured for a meme generator would pass content that an eval for a scientific research assistant would defintely fail.</p><p>Luckily, the <a href="https://hamel.dev/blog/posts/llm-judge/">best practices</a> for writing evals are simple:</p><ul><li>Set the domain expertise (<em>&quot;you are a world class sommelier&quot;</em> or <em>&quot;you are are evaluating whether a user is attempting to manipulate an LLM&quot;</em>)</li><li>Be specific about pass/fail criteria </li><li>Include examples of good vs bad, and edge cases when relevant</li><li>Keep prompts concise and specific (avoid trying to evaluate multiple things in one shot)</li></ul><p>Here&#x27;s a template you can use:</p><pre><code class="language-text">You are a [DOMAIN] evaluator judging whether an assistant response satisfies the requirement below.

Requirement:
[One sentence describing the single behavior being evaluated.]

Guidelines:
- This is a strict binary evaluation: only return &quot;pass&quot; if the requirement is clearly satisfied.
- Evaluate only the [requirement]. Do not grade style, tone, politeness, or creativity unless explicitly required.
- Do not assume missing information. Judge only what is present in the &lt;output&gt;.
- Return true only if the requirement is clearly satisfied.
- Return false if the response partially satisfies, avoids, or contradicts the requirement.

Examples:
- [Pass example]
- [Fail example]
- [Edge case example]

</code></pre><blockquote><p>LLMs fail in unpredictable ways. Using one LLM to judge another will sometimes produce bizarre results. Keep humans in the loop to verify the judge isn&#x27;t also hallucinating. Your evaluation criteria will drift as you discover new failure modes in production.</p></blockquote><p><strong>Examples of AI slop you can catch with evals:</strong></p><ul><li>Fake product capabilities and integrations (nightmare for sales and support)</li><li>Creepy name overuse: &quot;Hey Daniel 😊 That&#x27;s a great point Daniel, I&#x27;ve got you Daniel.&quot;</li><li>Made-up refund policies, cancellation terms, or upgrade rules</li><li>Off-brand responses that don&#x27;t match your voice</li><li>Lazy outputs, ignoring instructions or dropping context</li></ul><p>Evals are primarily used to prevent negative outputs or regressions, but you can also use them to search for positive signals. </p><p><strong>Examples of positive signals you can catch with evals:</strong></p><ul><li>Users discovering creative use cases for AI features you didn&#x27;t anticipate (potential feature gap)</li><li>Happy users who might become community champions or case studies (informal NPS)</li><li>Power users hitting rate limits (upsell opportunity)</li><li>Feature discovery moments: &quot;Wait, this can do X?&quot; (onboarding gaps)</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Screenshot_2026_01_22_at_9_19_27_AM_00100dd251.png" alt="evals in PostHog"/></p><p><div>Run multiple evals in parallel to spot-check different behaviors.</div></p><h2 id="connect-evals-to-your-product-data">Connect evals to your product data</h2><p>Evals are unit tests for your AI product. And like all product data, if you measure it, you can improve it. </p><p>But evals alone aren’t enough. A model can “work” and still fail to earn a habit.</p><p>This is important because AI-native products have a <a href="https://www.growthunhinged.com/p/the-ai-churn-wave">retention problem</a>. Generous free tiers and easy cancellation attracts &quot;AI tourists&quot; – they extract value, then disappear. </p><p>When you connect eval results to real user behavior, you can see which AI behaviors actually affect retention, where users get stuck, and what’s worth fixing next.</p><p><strong>The AI product improvement loop:</strong></p><p><strong>1. <a href="/llm-analytics">LLM Analytics</a></strong> shows what your AI is doing</p><ul><li>See inputs, outputs, latency, tokens, costs, errors</li><li>Summarize LLM traces and events for quick debugging </li><li>Run evals to batch test for issues and opportunities </li></ul><p><strong>2. <a href="/session-replay">Session Replay</a></strong> shows what users see when they interact with AI</p><ul><li>Compare the front-end user journey with the trace log </li><li>Watch how users react to poor outputs. Do they retry? Rage-click? Navigate elsewhere?</li></ul><p><strong>3. <a href="/product-analytics">Product Analytics</a></strong> connects AI quality to business metrics</p><ul><li>Track how AI feature usage correlates with retention, expansion, and revenue</li><li>Identify which AI features have the worst eval scores <em>and</em> the highest usage? (fix those first)</li></ul><div class="flex justify-center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_500,c_limit,q_auto,f_auto/AI_product_improvement_loop_7a8f570955.png" alt="AI product improvement loop"/></div><h2 id="try-it-now">Try it now</h2><p>If you&#x27;re already using <a href="/llm-analytics">LLM analytics</a> in PostHog, you can start creating evaluations right away. Your first 100 evaluation runs are on us. After that, you&#x27;ll need to use your LLM API key. Evals count as regular LLM events (100K events included on our free tier).</p><p><div to="http://app.posthog.com/llm-analytics/evaluations">Try evaluations in PostHog</div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Your product data just got a job: Workflows is now out]]></title><description><![CDATA[If your product data was a person, they'd basically be unemployed. They could get picked up in the occasional "freelance" query, but would ideally be…]]></description><link>https://posthog.com/blog/workflows-ga</link><guid isPermaLink="false">53249d1c-ee7e-55aa-9903-1fe011d78bb1</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/workflows_terminator_blog_3853c8567f.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If your product data was a person, they&#x27;d basically be unemployed. They could get picked up in the occasional &quot;freelance&quot; query, but would ideally be looking for more steady work. </p><p>We’ve always been good at collecting product data. In PostHog, you could see when a user hits an important milestone in your product, but couldn’t act on it. If PostHog already knows what happened, why does the next step have to happen in another system? That question is what led to Workflows.</p><p>Workflows is basically PostHog&#x27;s version of an employment agency, giving your data a steady job it can do all the time.</p><p>We introduced <a href="/blog/workflows-alpha">Workflows in alpha</a> asking: could we let teams define what happens next directly on top of the same events and user data they already trust for analytics? <a href="/blog/workflows-beta">During the beta</a>, we saw it used to automate onboarding, coordinate feature rollouts, and trigger messages based on real product behavior. </p><p>After seeing this usage and getting positive feedback, <strong><a href="https://app.posthog.com/workflows">Workflows</a></strong> is now generally available. </p><h2 id="what-does-workflows-do">What does Workflows do?</h2><p><strong><a href="https://app.posthog.com/workflows">Workflows</a></strong> lets you automate product-led actions directly from your PostHog data. When something happens in your product, you can respond immediately by sending an email, updating a user property, or triggering a Slack alert. This is done without syncing tools, duct-taped integrations, or API key scavenger hunts.</p><p>If you’ve used tools like Zapier, Make, Brevo, or ActiveCampaign, building workflows will feel familiar. The difference is that everything runs inside PostHog, without sending data to third-party tools or platforms.</p><p>Everything runs on the same event data you already track. Whether you’re sending a welcome email after onboarding or personalizing notifications based on an upgrade path, it all happens inside PostHog, without shipping data off to third-party platforms.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/workflows_onboarding_example_dark_c39bab95ea.png" alt="workflows-onboarding-example"/></p><h2 id="your-product-data-without-the-duct-tape">Your product data, without the duct tape</h2><p>Because your product data already lives in PostHog, Workflows can react to it in real time. You can trigger automation from:</p><ul><li>Product events and user actions</li><li>Person property and cohort membership updates</li><li>Feature flag exposure and experiment variants</li></ul><p>There’s nothing to sync and nothing to reconcile later. When something meaningful happens in your product, Workflows can respond immediately by updating user state, branching logic, or triggering the next step in the flow.</p><p>This also means your automation logic no longer lives in five different tools. Conditions, delays, exits, and actions sit next to the data they depend on, which makes workflows easier to build, easier to debug, and easier to evolve over time. Instead of coordinating systems that only partially agree on who a user is or what they’ve done, everything runs in one place, where your product truth already exists.</p><h2 id="product-changes-and-messaging-in-a-single-workflow">Product changes and messaging in a single workflow</h2><p>Workflows doesn’t stop at sending emails. Because it sits on top of PostHog’s feature flags and messaging system, a single workflow can coordinate both product changes and communication.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/trial_upgrade_nudge_example_fd8ca5f48d.png" alt="trial-upgrade-nudge-example"/></p><p>In one flow, you can:</p><ul><li>Enable or disable a feature flag</li><li>Assign users to a specific variant</li><li>Update person properties for future targeting</li></ul><p>This keeps what users see in the product and what they’re told about it in sync, without relying on separate systems to catch up later.</p><h2 id="less-theory-more-shipping">Less theory, more shipping</h2><p>At <a href="/customers/croissant">Croissant</a>, Workflows is used to act on intent signals without moving data between tools. Their growth team triggers follow-ups directly from PostHog events, keeping experimentation and iteration fast.</p><blockquote><p>“The main benefit is that everything’s already in PostHog. Syncing data across tools is always hit-or-miss, and expensive. Now it’s all in one place, and we can iterate way faster.”</p></blockquote><p>At <a href="/customers/grantable">Grantable</a>, Workflows builds on an analytics foundation where every feature is instrumented and measured. Product usage data now feeds automation directly, instead of stopping at dashboards.</p><blockquote><p>“We track usage, pipe that into dashboards for activation and retention, and now we’re starting to act on it automatically with Workflows.”</p></blockquote><p>Different products, same pattern: using trusted product events as the source of truth and acting on them without adding another automation layer to maintain.</p><p><strong>PostHog&#x27;s free tier</strong> allows you to send 10,000 messages monthly with all channels (push, email, SMS, and CDP events) included. After that, prices start at $0,005 per send, depending on the channel. Pricing decreases with volume and every channel has a generous volume discount. </p><p>Compared to most automation and messaging tools on the market, this makes Workflows one of the most accessible and cost-effective options available. Traditional automation platforms charge per task, quickly becoming expensive as workflows grow more complex, while customer messaging tools often bundle pricing around user profiles or locked plans. PostHog takes a different approach – you only pay for what you actually send, with no feature gating, no per-user pricing, and no extra tooling required to connect your product data.</p><h2 id="start-building-with-workflows">Start building with Workflows</h2><p>If your product already knows when someone signed up, finished onboarding, or hit a meaningful usage milestone, that information shouldn’t stop at a dashboard. </p><p>With Workflows, those signals can trigger messages, updates, or follow-up actions immediately, without routing data through another tool first. The result is fewer moving parts, less glue code, and your data &amp; actions living in the same tool you already love.</p><p>Learn more in the <a href="/docs/workflows">docs</a> or jump straight into launching your first <a href="https://app.posthog.com/workflows">workflow</a>.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to fix your app onboarding drop-off points]]></title><description><![CDATA[A PostHog recipe for people whose users keep leaving the table. Prep time ~30 minutes setup, ~1 week of data Difficulty Beginner-friendly Yields One…]]></description><link>https://posthog.com/blog/how-to-find-and-fix-app-onboarding-drop-off</link><guid isPermaLink="false">e20cc4b8-7f88-5ca7-9cf3-afacc1e54045</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/cooking_w_PH_hero_1_279b09be96.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><em>A PostHog recipe for people whose users keep leaving the table.</em></p><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Prep time</strong></td><td>~30 minutes setup, ~1 week of data</td></tr><tr><td><strong>Difficulty</strong></td><td>Beginner-friendly</td></tr><tr><td><strong>Yields</strong></td><td>One less broken onboarding flow</td></tr><tr><td><strong>Best for</strong></td><td>Product engineers, technical founders, growth teams</td></tr><tr><td><strong>Outcome</strong></td><td>Better onboarding conversion boosts all downstream metrics from activation to retention to revenue.</td></tr></tbody></table><p><div to="#step-1-prep-the-finish-line">Jump to recipe</div></p><hr/><p>Seeing your onboarding stats drop or stall can be discouraging, but <strong>here&#x27;s the good news:</strong> <a href="/founders/product-market-fit-game">it doesn&#x27;t mean your product sucks</a> (phew!)</p><p>Onboarding drop-offs are usually an indication of friction, not rejection. Users don&#x27;t rage-quit because they hate your product, they quit because something didn&#x27;t make sense, didn&#x27;t work, or asked for too much too soon.</p><p>It&#x27;s like attempting a beef wellington, realizing you&#x27;re in over your head somewhere around the &quot;wrap the beef in mushroom duxelles&quot; step, and bailing to order pizza instead. <em>Ask me how I know.</em></p><p><strong>Even better news</strong>: onboarding friction is measurable, debuggable, and fixable. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/recipe_card_296e169291.png" alt="App onboarding drop off recipe card"/></p><h2 id="what-youll-need">What you&#x27;ll need</h2><h3 id="ingredients">Ingredients</h3><p>You don&#x27;t need a massive stack for this recipe.</p><p><strong>Required:</strong></p><div class="space-y-4 pl-6"><div class="flex items-center gap-2"><button type="button" role="checkbox" aria-checked="false" data-state="unchecked" value="on" id="req-1" data-scheme="primary" class="flex size-5 items-center justify-center rounded border border-primary bg-primary dark:bg-accent text-primary outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark dark:data-[state=checked]:bg-light data-[state=checked]:border-dark dark:data-[state=checked]:border-light data-[state=checked]:text-white dark:data-[state=checked]:text-dark "></button><input type="checkbox" aria-hidden="true" tabindex="-1" style="position:absolute;pointer-events:none;opacity:0;margin:0;transform:translateX(-100%)" value="on"/><label for="req-1" class="text-sm cursor-pointer"><a href="/blog/best-open-source-analytics-tools">A product analytics tool</a> (for building your onboarding funnel)</label></div><div class="flex items-center gap-2"><button type="button" role="checkbox" aria-checked="false" data-state="unchecked" value="on" id="req-2" data-scheme="primary" class="flex size-5 items-center justify-center rounded border border-primary bg-primary dark:bg-accent text-primary outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark dark:data-[state=checked]:bg-light data-[state=checked]:border-dark dark:data-[state=checked]:border-light data-[state=checked]:text-white dark:data-[state=checked]:text-dark "></button><input type="checkbox" aria-hidden="true" tabindex="-1" style="position:absolute;pointer-events:none;opacity:0;margin:0;transform:translateX(-100%)" value="on"/><label for="req-2" class="text-sm cursor-pointer"><a href="/blog/best-session-replay-tools">A session replay tool</a> (for watching what users actually do)</label></div></div><p><em>Optional, but recommended:</em></p><div class="space-y-4 pl-6"><div class="flex items-center gap-2"><button type="button" role="checkbox" aria-checked="false" data-state="unchecked" value="on" id="opt-1" data-scheme="primary" class="flex size-5 items-center justify-center rounded border border-primary bg-primary dark:bg-accent text-primary outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark dark:data-[state=checked]:bg-light data-[state=checked]:border-dark dark:data-[state=checked]:border-light data-[state=checked]:text-white dark:data-[state=checked]:text-dark "></button><input type="checkbox" aria-hidden="true" tabindex="-1" style="position:absolute;pointer-events:none;opacity:0;margin:0;transform:translateX(-100%)" value="on"/><label for="opt-1" class="text-sm cursor-pointer"><a href="/docs/product-analytics/autocapture">Autocapture</a> (for skipping manual event setup)</label></div><div class="flex items-center gap-2"><button type="button" role="checkbox" aria-checked="false" data-state="unchecked" value="on" id="opt-2" data-scheme="primary" class="flex size-5 items-center justify-center rounded border border-primary bg-primary dark:bg-accent text-primary outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark dark:data-[state=checked]:bg-light data-[state=checked]:border-dark dark:data-[state=checked]:border-light data-[state=checked]:text-white dark:data-[state=checked]:text-dark "></button><input type="checkbox" aria-hidden="true" tabindex="-1" style="position:absolute;pointer-events:none;opacity:0;margin:0;transform:translateX(-100%)" value="on"/><label for="opt-2" class="text-sm cursor-pointer"><a href="/docs/data/cohorts">Cohorts or segmentation</a> (for slicing data by user type)</label></div><div class="flex items-center gap-2"><button type="button" role="checkbox" aria-checked="false" data-state="unchecked" value="on" id="opt-3" data-scheme="primary" class="flex size-5 items-center justify-center rounded border border-primary bg-primary dark:bg-accent text-primary outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark dark:data-[state=checked]:bg-light data-[state=checked]:border-dark dark:data-[state=checked]:border-light data-[state=checked]:text-white dark:data-[state=checked]:text-dark "></button><input type="checkbox" aria-hidden="true" tabindex="-1" style="position:absolute;pointer-events:none;opacity:0;margin:0;transform:translateX(-100%)" value="on"/><label for="opt-3" class="text-sm cursor-pointer"><a href="/feature-flags">Feature flags</a> (for safely rolling out fixes)</label></div><div class="flex items-center gap-2"><button type="button" role="checkbox" aria-checked="false" data-state="unchecked" value="on" id="opt-4" data-scheme="primary" class="flex size-5 items-center justify-center rounded border border-primary bg-primary dark:bg-accent text-primary outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark dark:data-[state=checked]:bg-light data-[state=checked]:border-dark dark:data-[state=checked]:border-light data-[state=checked]:text-white dark:data-[state=checked]:text-dark "></button><input type="checkbox" aria-hidden="true" tabindex="-1" style="position:absolute;pointer-events:none;opacity:0;margin:0;transform:translateX(-100%)" value="on"/><label for="opt-4" class="text-sm cursor-pointer"><a href="/experiments">Experiments</a> (for measuring your changes)</label></div><div class="flex items-center gap-2"><button type="button" role="checkbox" aria-checked="false" data-state="unchecked" value="on" id="opt-5" data-scheme="primary" class="flex size-5 items-center justify-center rounded border border-primary bg-primary dark:bg-accent text-primary outline-none disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark dark:data-[state=checked]:bg-light data-[state=checked]:border-dark dark:data-[state=checked]:border-light data-[state=checked]:text-white dark:data-[state=checked]:text-dark "></button><input type="checkbox" aria-hidden="true" tabindex="-1" style="position:absolute;pointer-events:none;opacity:0;margin:0;transform:translateX(-100%)" value="on"/><label for="opt-5" class="text-sm cursor-pointer"><a href="/surveys">Surveys</a> (for getting direct feedback from users)</label></div></div><br/><details><summary><strong>Substitutions</strong></summary><p><strong>No session replay tool?</strong> You can interview users directly instead, but you&#x27;ll be relying on their memory of what happened rather than what actually happened. It works, it&#x27;s just slower and less reliable. <a href="/blog/10x-engineers-do-user-interviews">Here&#x27;s our guide to running effective user interviews</a> if you go this route.</p><p><strong>No surveys?</strong> It&#x27;s okay, replays will get you 80% of the way there; the other 20% is context you&#x27;ll have to infer.</p><p><strong>No feature flags?</strong> You can ship straight to production. We won&#x27;t judge. (...we will judge a little.) If something breaks, you&#x27;ll just have to roll back manually. <a href="/product-engineers/feature-flag-benefits-use-cases">Here&#x27;s why we think feature flags are worth it</a>.</p><p><strong>No cohorts or segmentation?</strong> You can still run this recipe, you&#x27;ll just be looking at all users as one group. If your drop-off is consistent across everyone, that&#x27;s fine. If it&#x27;s not, you&#x27;ll have a harder time figuring out who&#x27;s actually struggling.</p></details><p>You&#x27;ll also need:</p><ul><li><strong>A clear definition of what &quot;successful onboarding&quot; looks like</strong>. This is <a href="/newsletter/wtf-is-activation">your activation event</a> – the moment a user has gotten enough value to stick around (more on this below).</li><li><strong><a href="/tutorials/event-tracking-guide">Events firing</a> &amp; at least a few hundred users going through your flow</strong>. You need enough data to spot patterns. If you&#x27;re at an earlier stage, you can still follow this recipe; just watch more replays and lean harder on qualitative signals until your numbers catch up.</li></ul><h3 id="want-to-cook-with-posthog-great-choice"><strong>Want to cook with PostHog? Great choice.</strong></h3><p>If you haven&#x27;t set it up yet, <a href="/docs/getting-started/install">start here</a>. Make sure you&#x27;re capturing the key events in your onboarding flow (signups, form completions, button clicks, etc.). If you have autocapture enabled, you&#x27;re probably already covered.</p><p>We highly recommend calling <a href="/docs/product-analytics/identify"><code>posthog.identify()</code></a> when users sign up or log in; you&#x27;ll be able to track them across sessions and devices, which makes your funnel data much more reliable.</p><p><div to="https://app.posthog.com/signup">Cook with PostHog – it&#x27;s free!</div></p><h2 id="step-1-prep-the-finish-line">Step 1: Prep the finish line</h2><p>Before you can fix your onboarding, you need to <a href="/docs/new-to-posthog/activation">define what a successful onboarding flow actually means</a>. This is your activation event, the foundation of your activation metrics and the thing you&#x27;ll measure everything against.</p><p>Ask yourself: What&#x27;s the moment when a user has gotten enough value that they&#x27;re likely to stick around? What you&#x27;re looking for is a <strong>value-producing action</strong>.</p><p>Some examples:</p><ul><li><strong>For an e-commerce app</strong>: Added item to cart and completed checkout</li><li><strong>For a streaming service</strong>: Watched their first video or listened to their first song</li><li><strong>For a project management tool</strong>: Created their first project and invited a teammate</li><li><strong>For a fintech app</strong>: Linked their bank account or made their first transaction</li><li><strong>For a social app</strong>: Followed their first account or posted their first content</li><li><strong>For an analytics product</strong>: Sent their first event and created an insight</li><li><strong>For a CRM</strong>: Added their first contact and sent an email</li></ul><p>Not sure what yours is? Try looking at your retention data – <a href="/product-engineers/customer-retention-metrics">what do retained users do that churned users don&#x27;t?</a> That should give you a starting point. </p><p>Here&#x27;s <a href="/product-engineers/activation-metrics">how we figured out our activation metric at PostHog</a> (spoiler: it took a few iterations).</p><p>Pick one. Be opinionated. You can always adjust later.</p><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>Don&#x27;t confuse the appetizer for the main course; signing up or landing on a dashboard aren&#x27;t meaningful enough steps to be considered product activations, for example. Also, your activation event might change over time – what predicted retention two years ago might not be the best signal today, so revisit it if needed.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when....</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You can complete the sentence: &quot;A user has successfully onboarded when they ____.&quot;</p></div></div><hr/><h2 id="step-2-build-a-funnel">Step 2: Build a funnel</h2><p>Now you&#x27;re ready to cook.</p><p>In your analytics tool, create a funnel with the steps a user must complete to reach your activation event.</p><p>A simple example:</p><ol><li><code>$pageview</code> on <code>/signup/success</code> (or a custom <code>signed_up</code> event)</li><li><code>profile_completed</code></li><li><code>first_project_created</code></li><li><code>teammate_invited</code> (the last step is your activation event)</li></ol><p>A few tips:</p><ul><li>Start with 3-5 steps max. Too many steps and you&#x27;ll have trouble identifying the real problem areas.</li><li>Use sequential order (the default) so users must complete steps in the order you&#x27;ve defined.</li><li>Set a reasonable conversion window (7 to 14 days is a good starting point).</li></ul><p><strong>If using PostHog:</strong></p><p>Head to <a href="https://app.posthog.com/insights">Product Analytics</a> → <strong>New insight</strong> → <a href="/docs/product-analytics/funnels"><strong>Funnel</strong></a>. If you have <a href="/docs/product-analytics/autocapture">autocapture</a> enabled, many of these events may already be tracked for you; check your <a href="https://app.posthog.com/events">activity</a> to see what&#x27;s coming in.</p><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>Start with your core flow. Once it&#x27;s optimized, create separate funnels for specific segments. Don&#x27;t forget to name your funnel something specific (e.g., &quot;Self-serve onboarding Q1 2025&quot;) so future-you knows what it&#x27;s measuring when you have 47 funnels.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when....</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Your funnel is prepped, ending with your activation event, saved, and ready to collect data.</p></div></div><hr/><h2 id="step-3-let-it-simmer">Step 3: Let it simmer</h2><p>Save your funnel and let data collect for at least a week. You need enough users going through the flow to see meaningful patterns; looking too early is how you end up &quot;fixing&quot; problems that don&#x27;t exist.</p><p>As a rough guideline:</p><ul><li>A few hundred users entering onboarding is usually enough to start</li><li>More is better if you plan to <a href="/blog/how-to-do-user-segmentation">segment by user type or device later</a></li></ul><p>While you wait, you can:</p><ul><li><a href="/docs/session-replay">Set up session replay, if you haven&#x27;t already</a></li><li><a href="/docs/surveys/creating-surveys">Prep an exit survey for later</a> (we&#x27;ll use it in Step 6)</li></ul><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>Resist the urge to peek daily. Set a calendar reminder for one week out – watching the pot won&#x27;t make it boil faster.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Your data has had time to marinate – at least a few hundred users through the funnel with clear conversion rates at each step. Undercooked data leads to undercooked fixes.</p></div></div><hr/><h2 id="step-4-find-the-leak">Step 4: Find the leak</h2><p>Now that your funnel is showing you where users are falling off, look for:</p><ul><li><strong>The step with the lowest relative conversion rate</strong> – this is usually your biggest opportunity</li><li><strong>Absolute numbers</strong> – sometimes a step has decent conversion but is still losing you thousands of users</li></ul><p>If everyone drops off at the same step, it&#x27;s probably a UX problem. Something about that step is broken or confusing for all users.</p><p>If only <em>some</em> users drop off, it&#x27;s a context problem. Something about who they are or how they got there is causing friction.</p><p>If it&#x27;s a context problem, try segmenting your funnel to find a clearer diagnosis:</p><ul><li>New users vs. returning users</li><li>Invited users vs. self-serve signups</li><li>Browser, device, or OS</li><li>Plan type or pricing tier</li></ul><p><strong>If using PostHog:</strong></p><p>Click on the drop-off number in your funnel to see the actual users who didn&#x27;t make it. Use <a href="/docs/product-analytics/funnels#breakdowns">breakdowns</a> to slice your funnel by user properties, device, or any event property. If you have many steps or breakdown values, you can also sort for poor performers in terms of number of conversions, conversion percentage, and even time in the <strong>Detailed results</strong> section.</p><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>You can export your cohort of dropped-off users and use it to target them with win-back marketing campaigns or surveys later.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You&#x27;re able to say: &quot;Users drop off most at <em>[this step]</em>&quot; and &quot;It affects <em>[these users]</em> more than others.&quot; If you can&#x27;t say both, don&#x27;t move on yet.</p></div></div><hr/><h2 id="step-5-watch-the-replays">Step 5: Watch the replays</h2><p>You know where users drop off, <a href="/tutorials/explore-insights-session-recordings">now you need to find out <em>why</em></a>.</p><p>Watch 10–15 recordings. You&#x27;re looking for patterns:</p><ul><li>Are users getting confused at a specific UI element?</li><li>Are they rage-clicking something that doesn&#x27;t work?</li><li>Are they abandoning after seeing a specific screen (pricing, permissions request, etc.)?</li><li>Are they hitting errors? (Check the console logs in the replay; PostHog <a href="/docs/session-replay/console-log-recording">captures these</a> too.)</li><li>Is something failing quietly? Look at network requests if you have <a href="/docs/session-replay/network-recording">network recording</a> enabled.</li></ul><p>If recordings are looking wildly different from one user to the next, go back to Step 4 and segment further; you&#x27;re probably mixing multiple problems together. </p><p><strong>If using PostHog:</strong></p><ul><li><p>Fastest way: Click directly on the drop-off in your funnel – PostHog will pull up recordings for those users automatically. (This is one of the nice things about having replay and analytics in one tool!)</p></li><li><p>Manual way: In <a href="https://app.posthog.com/replay">Session Replay</a>, click <strong>Show filters</strong> → <strong>Filter for events or actions</strong> → select the last event users completed before dropping off. See our <a href="/tutorials/filter-session-recordings">session replay filtering guide</a> for more.</p></li></ul><p>If you saved a cohort in Step 4, you can filter replays by that cohort directly.</p><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>Don&#x27;t just watch drop-offs. Sometimes successful users struggled through the same friction – they just pushed through anyway. Watch both to taste the difference.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You&#x27;re able to say &quot;Users drop off here because <em>[this thing]</em> keeps happening.&quot;</p></div></div><hr/><h2 id="step-6-fold-in-survey-data-optional-but-recommended">Step 6: Fold in survey data <em>(optional, but recommended)</em></h2><p>This step isn&#x27;t required, but it can be the difference between a good fix and the right fix.</p><h3 id="exit-survey-for-users-who-drop-off">Exit survey (for users who drop off)</h3><p>Trigger this when users are about to abandon your onboarding flow:</p><ul><li><strong>Question:</strong> &quot;What&#x27;s stopping you from finishing setup?&quot; (open text)</li><li><strong>Display conditions:</strong> Show on your onboarding URL + after 30–60 seconds of inactivity, or on exit intent</li></ul><p>You likely won&#x27;t get a ton of responses, but the ones you do get can be really useful signals.</p><h3 id="completion-survey-for-users-who-made-it">Completion survey (for users who made it)</h3><p>Survey users who did complete onboarding to understand what almost stopped them:</p><ul><li>&quot;What was the hardest part of getting started?&quot;</li><li>&quot;What, if anything, almost made you give up?&quot;</li></ul><p>Trigger this right after your activation event fires; they&#x27;ll remember while it&#x27;s fresh.</p><p><strong>If using PostHog:</strong></p><p>Go to <a href="https://app.posthog.com/surveys">Surveys</a> → <a href="/docs/surveys/creating-surveys"><strong>New survey</strong></a>.</p><p>You can set display conditions based on URL, user properties, or events. For the completion survey, trigger it when your activation event fires.</p><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>Keep surveys short. One or two open-ended questions max. Users will give you more when you ask for less. Also, remember survey responses are seasoning, not the main dish; it&#x27;s okay to just have a handful of responses. A few strong signals beat hundreds of vague ones.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You&#x27;ve seasoned your data with user feedback that confirms, refines, or challenges what you saw in replays.</p></div></div><hr/><h2 id="step-7-form-a-hypothesis-and-ship-a-fix">Step 7: Form a hypothesis and ship a fix</h2><p>By now you should have:</p><ul><li>Quantitative data on where users drop off (funnel)</li><li>Behavioral data on what they were doing (replays)</li><li>Direct feedback on what they were thinking (surveys)</li></ul><p>Mix these into a hypothesis: &quot;[These] Users are dropping off at [step] because [reason].&quot;</p><p>Some common fixes:</p><ul><li><strong>Simplify your flow</strong> – reduce fields, remove friction, break it into smaller steps, make a required field optional</li><li><strong>Add guidance</strong> – tooltips, progress indicators, inline help</li><li><strong>Squash any bugs</strong> – if replays showed errors, fix them</li><li><strong>Reorder the flow</strong> – maybe you&#x27;re asking for too much too soon</li></ul><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>One ingredient at a time. If you change five things at once, you won&#x27;t know what fixed it (or broke it). Also, write down your hypothesis before you ship. It&#x27;s easy to retrofit a narrative after you see results – having it on record keeps you honest.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You&#x27;ve got one fix in the oven, designed to address your hypothesis.</p></div></div><hr/><h2 id="step-8-taste-before-serving-optional-but-recommended">Step 8: Taste before serving <em>(optional, but recommended)</em></h2><p>Whatever the change, don&#x27;t dump it straight into production, roll it out gradually if you can <a href="/blog/best-open-source-feature-flag-tools"><strong>using feature flags</strong></a>.</p><p>Feature flags let you:</p><ul><li>Release to 10–20% of users first, then ramp up</li><li>Target specific user segments (e.g., new users only)</li><li>Kill the change instantly if something goes wrong</li></ul><p>Want statistical proof it worked? <a href="/product-engineers/how-to-do-ab-testing">Run an A/B experiment</a>. This is optional, <a href="/product-engineers/ab-testing-mistakes">not every fix needs one</a>. But it&#x27;s worth it when:</p><ul><li>The change is significant (like a full flow redesign)</li><li>You&#x27;re debating between multiple solutions</li><li>You need to convince stakeholders with data</li></ul><p>While step isn&#x27;t mandatory, <a href="/newsletter/what-we&#x27;ve-learned-about-ab-testing">it helps avoid &quot;we think this worked&quot; decisions</a>.</p><p><strong>If using PostHog:</strong></p><p>Use <a href="/docs/feature-flags">feature flags</a> to roll out your fix to a percentage of users first.</p><p>To run an experiment, go to <a href="https://app.posthog.com/experiments">Experiments</a> → <a href="/docs/experiments/creating-an-experiment"><strong>New experiment</strong></a>. Use your feature flag as the basis – PostHog will split users into control and test groups and track your funnel as the goal metric.</p><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>If you&#x27;re nervous about a big change, start at 5% rollout. You can always ramp up, but you can&#x27;t un-serve a burnt dish. Also, not every fix needs a full experiment – but if it&#x27;s a big change, or you need to convince stakeholders, statistical proof is worth the extra time.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re ready for the next step when...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Your fix is out of the kitchen, live (ideally behind a feature flag) and collecting data.</p></div></div><hr/><h2 id="step-9-measure-the-improvement">Step 9: Measure the improvement</h2><p>After your fix has been live for a bit:</p><ul><li>Go back to your funnel</li><li>Compare conversion rates before and after your change (most analytics tools let you view trends over time)</li><li>Watch a few new replays to confirm the friction is gone</li></ul><p>Things to check:</p><ul><li>Did funnel completion improve?</li><li>Did drop-off move to a different step?</li><li>Do replays show smoother behavior?</li></ul><p><strong>If using PostHog:</strong></p><p>Set your funnel&#x27;s <strong>Graph type</strong> to <strong>Historical trends</strong> to see conversion over time.</p><p>If you used a feature flag or experiment, check the results in <a href="https://app.posthog.com/experiments">Experiments</a> to see the impact with statistical significance. For another perspective on your funnel, you can also break it by whether that feature flag was enabled for that user.</p><details><summary><strong>👨‍🍳 Chef&#x27;s tip</strong></summary>Screenshot your before/after funnels. They make great artifacts for retros, stakeholder updates, and convincing your team that this stuff actually works.</details><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 3.5a8.5 8.5 0 1 0 0 17 8.5 8.5 0 0 0 0-17ZM2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm8-1a.75.75 0 0 1 .75-.75H12a.75.75 0 0 1 .75.75v5.25a.75.75 0 0 1-1.5 0v-4.5h-.5A.75.75 0 0 1 10 11Z" clip-rule="evenodd"></path><path d="M11.5 8a.5.5 0 0 1 1 0 .5.5 0 0 1-1 0Z"></path><path fill-rule="evenodd" d="M12 8.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Zm0-1.25a.5.5 0 1 0 0 1 .5.5 0 0 0 0-1Z" clip-rule="evenodd"></path></svg></div><strong class="text-lg">You&#x27;re done when...</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>You can see a lift in activation rates after deploying your fix.</p><p>If it didn&#x27;t work as expected, that&#x27;s okay. Go back to Step 4 with a new hypothesis. Onboarding optimization is iterative, you&#x27;re rarely done after one fix.</p></div></div><hr/><h2 id="why-this-recipe-works-especially-well-with-posthog">Why this recipe works especially well with PostHog</h2><p>Most teams piece this workflow together across 3–4 different tools: analytics in one place, replays in another, surveys or feature flags somewhere else. It works, but it&#x27;s slow and you lose context switching between tabs.</p><p>With PostHog, <a href="/products">everything&#x27;s connected in one place</a>:</p><ul><li><strong>Funnels</strong> show you where users drop off</li><li><strong>Breakdowns</strong> show you who&#x27;s struggling</li><li><strong>Session replay</strong> shows you why</li><li><strong>Surveys</strong> tell you what users were thinking</li><li><strong>Feature flags</strong> let you ship fixes safely</li><li><strong>Experiments</strong> confirm whether the fix actually worked</li></ul><p><a href="https://app.posthog.com/signup">Get started free</a> with 1M events, 5K recordings, and 1M feature flag requests free every month!</p><p><div></div></p><h3 id="faq">FAQ</h3><details><summary><strong>What is product activation?</strong></summary><p>Product activation is the moment a user experiences enough value to stick around. It&#x27;s the bridge between signing up and becoming an engaged user, and it&#x27;s one of the most important metrics for product-led growth.</p><p>The key product activation metrics to keep an eye out for are <strong>activation rate</strong> (% of signups who activate), <strong>time to activate</strong> (how long it takes), and <strong>onboarding completion rate</strong> (% who finish your onboarding flow). Track all three to get the full picture.</p></details><details><summary><strong>What&#x27;s the difference between app onboarding and product activation?</strong></summary><p><strong>Onboarding is the flow</strong> — the steps you guide users through. <strong>Activation is the outcome</strong> — the moment they get value. Good onboarding leads to activation, but they&#x27;re not the same thing.</p></details><details><summary><strong>What is onboarding drop-off?</strong></summary><p><strong>Onboarding drop-off</strong> is when users start your onboarding flow but leave before completing it. They signed up and showed intent, but never reached the point where they experienced real value from your product (your activation event).</p><p>Onboarding drop-off is <a href="/tutorials/churn-rate">not the same as churn</a> – these users never really started using your product in the first place.</p></details><details><summary><strong>What&#x27;s the difference between onboarding drop-off and churn?</strong></summary><p><strong>Onboarding drop-off</strong> happens before users get value. They never activate.</p><p><strong>Churn</strong> happens after activation. Users got value, used the product for some time, and then stopped.</p><p>Drop-off is usually caused by UX friction or broken flows. Churn is more often driven by value, habit, pricing, or competition.</p></details><details><summary><strong>What causes users to drop off during onboarding?</strong></summary><p>The most common causes are:</p><ul><li>Asking for too much information too soon  </li><li>Confusing or unclear UI  </li><li>Unclear next steps or lack of guidance  </li><li>Broken flows, errors, or silent failures  </li><li>Required steps that don&#x27;t feel required  </li><li>Onboarding that takes too long to complete  </li></ul></details><details><summary><strong>What&#x27;s a good onboarding completion rate?</strong></summary><p>There&#x27;s no universal benchmark.</p><p>For self-serve SaaS, <strong>20–40%</strong> onboarding completion is common. Higher-touch products with sales involvement often see higher rates.</p><p>More important than benchmarks is tracking your own completion rate over time and improving it incrementally.</p></details><details><summary><strong>What&#x27;s the biggest mistake teams make with onboarding analytics?</strong></summary><p>Optimizing the wrong metric.</p><p>Teams often track signups, pageviews, or dashboard loads instead of the action that actually predicts retention. <strong>If your activation event is wrong, everything downstream will be misleading.</strong></p></details><details><summary><strong>How do I reduce onboarding drop-off?</strong></summary><p>Start by diagnosing the problem.</p><p>Identify where users drop off, then look at what actually happens at that step. Fix <strong>one thing at a time</strong> by simplifying the flow, adding guidance, removing unnecessary fields, fixing bugs, or reordering steps.</p><p>Roll out changes gradually so you can measure impact and roll back if needed.</p></details><details><summary><strong>What tools do I need to track and fix onboarding drop-offs?</strong></summary><p>At a minimum, you need:</p><ul><li><a href="/blog/best-open-source-analytics-tools"><strong>Product analytics</strong></a> to build funnels and see where users drop off  </li><li><a href="/blog/best-session-replay-tools"><strong>Session replay</strong></a> to understand what users were doing before they left  </li></ul><p>You can assemble this with separate tools (for example, analytics, replay, feature flags, and experiments), but that usually means more setup, more context switching, and slower iteration.</p><p>Or you can use a unified platform like PostHog to do all of this in one place.</p></details><details><summary><strong>Can I do this without a unified analytics tool?</strong></summary><p>Yes, but it&#x27;s harder.</p><p>Most teams end up stitching together funnels, replays, surveys, and experiments across multiple tools, which slows analysis and makes it harder to connect cause and effect.</p><p>A unified stack makes it much easier to move from “where users drop off” to “why” to “did this fix work?”</p></details><hr/><h3 id="pairs-well-with">Pairs well with</h3><ul><li><a href="/product-engineers/aarrr-pirate-funnel">The AARRR pirate funnel explained</a></li><li><a href="/newsletter/what-we&#x27;ve-learned-about-ab-testing">10 things we&#x27;ve learned about A/B testing</a></li><li><a href="/newsletter/think-like-a-growth-engineer">How to think like a growth engineer</a></li><li><a href="/blog/product-for-engineers-1">What we&#x27;ve learned about talking to users</a></li><li><a href="/newsletter/50-product-learnings">50 things we&#x27;ve learned about building successful products</a></li></ul><p>...hungry for more?</p><p><div></div></p><h3 id="did-you-make-this-recipe">Did you make this recipe?</h3><p>Share your before-and-after funnel below.</p><p>⭐⭐⭐⭐⭐ &quot;<em>Finally fixed our onboarding. Down to only 3 existential crises per quarter.</em>&quot; – Actual user, probably</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Meet Logs (beta) – more debugging context, all in PostHog]]></title><description><![CDATA[Every developer's debugging journey ends at the same destination. You can start with an  error  and get context with a  session replay , but…]]></description><link>https://posthog.com/blog/logs-beta</link><guid isPermaLink="false">5690f095-2239-52e2-82f3-6ab359373f58</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/hogs_logs_675386f4fe.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every developer&#x27;s debugging journey ends at the same destination. You can start with an <a href="/error-tracking">error</a> and get context with a <a href="/session-replay">session replay</a>, but eventually, you&#x27;ll need logs to see what&#x27;s actually happening in your system. This progression is so familiar, we barely think of it anymore.</p><p>We built <a href="/docs/logs">Logs (now in beta)</a> for this debugging journey. Not as a new tool to adopt, but as the part of the investigation you were doing anyway. Now you can get the backend context behind your errors and session replays next to your favorite tools in PostHog, without having to leave the platform and open another tab. </p><h2 id="where-context-gets-messy">Where context gets messy</h2><p>When logs live outside the rest of your debugging workflow, they lose their most important attribute: context. You leave the error view, open another tool, recreate the timeframe, match request IDs, and hope you’re looking at the same execution path you were just investigating.</p><p>The logs are still accurate and the system is still observable. But the story you’re trying to piece together fragments, and understanding takes longer than it should. At PostHog, we don’t think logs should be something you switch to. They should be already there when you need them.</p><h2 id="debug-faster-with-logs-next-to-session-replays-and-error-tracking">Debug faster with Logs next to Session Replays and Error Tracking</h2><p>With Logs, the debugging journey is continuous. </p><ul><li>When you’re looking at an exception, the logs surrounding that failure are immediately available. </li><li>When you’re watching a session replay, you can see what the backend was doing during that exact interaction. </li><li>When you’re investigating a specific user or event, the relevant logs are part of the same view, not a separate search problem.</li></ul><p>You&#x27;re no longer reconstructing the timeline manually. The frontend behavior, backend activity, and failure point stay connected, making understanding faster and less error-prone.</p><p>Logs is built on OpenTelemetry, which means you don’t have to change how you log or adopt a proprietary SDK. If you’re already sending logs via OTLP, they work with PostHog out of the box.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Group_2_06b7915c26.png" alt="Logs integration"/></p><h2 id="whats-next-for-logs-and-the-debugging-journey">What&#x27;s next for Logs and the debugging journey</h2><p><a href="https://app.posthog.com/logs">Logs is in beta today</a>, free to use, and focused on tight integration with the rest of the PostHog debugging experience. </p><p>Over the coming months, we’re working on deeper connections with Error Tracking and Session Replay, better defaults for viewing logs tied to users and events, and early AI-powered investigation so you can ask questions instead of reading through lines.</p><p>The long-term goal is straightforward, even if it’s ambitious: build a logging product where you don’t need to read log lines to understand your system. </p><p><a href="https://app.posthog.com/logs">Try it out</a> with your existing OpenTelemetry setup and let us know what you think, we’d love to have you help us shape this product. </p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why small teams crush tiger teams]]></title><description><![CDATA[There are a few core milestones in the lifecycle of a PostHog employee.  The first one is when your friends or family ask, "So… what does your company…]]></description><link>https://posthog.com/blog/why-small-teams-crush-tiger-teams</link><guid isPermaLink="false">4b055466-79d6-5017-9eff-5439538bfca1</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/tiger_teams_blog_header_83cb760c02.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are a few core milestones in the lifecycle of a PostHog employee. </p><p>The first one is when your friends or family ask, &quot;So… what does your company actually do?&quot; and suddenly you&#x27;re explaining the concept of B2B SaaS to your 87-year-old grandpa who just recently figured out how to operate Alexa.</p><p>Once that&#x27;s settled, one of two things happens: you&#x27;ve either bored them to death (RIP grandpa) and they never ask about it again, or they double down on wanting to better understand how on earth you do what you do.</p><p>&quot;But how do you handle <a href="/products">that many products</a>?!&quot; </p><p>Congratulations, you&#x27;ve reached the next milestone: talking about <a href="/newsletter/small-teams">small teams</a>. If they&#x27;ve ever worked in a large company, the response is predictable: &quot;Oh okay, so like tiger teams.&quot;</p><p>This is the moment where I take a deep breath, as the self-appointed president of the Tiger Team Hater Club™️.</p><p>No.</p><p><strong>Not</strong> like a tiger team.</p><p>Let me explain why.</p><h2 id="what-even-is-a-tiger-team">What even is a tiger team?</h2><p>The term &quot;tiger team&quot; originated in the military (because of course it did) and was popularized by NASA, who famously assembled one during the Apollo 13 mission in 1970. Remember &quot;<em>Houston, we have a problem</em>&quot;? Well, they were the group tasked with dealing with said problem.</p><p>It has since been usurped by corporations who wanted their problem-solving initiatives to sound less boring (&quot;temporary cross-functional committee&quot; doesn&#x27;t have quite the same ring to it).</p><p>A tiger team is typically a group of specialists and subject matter experts pulled into a smaller unit to tackle a specific problem, investigate a failure, or push through a critical project. The goal is to stay agile and deploy focused efforts when there&#x27;s urgency – a deliberate contrast to the slow, bureaucratic pace of traditional org structures.</p><p>The intent behind it is good. The execution rarely is.</p><h2 id="how-small-teams-at-posthog-are-different">How small teams at PostHog are different</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/tiger_teams_diagram_0d11cd3503.jpg" alt="Small teams vs tiger teams diagram"/></p><p>PostHog is organized into organizational units called &quot;<a href="/handbook/company/small-teams">small teams</a>&quot;. Each small team is a multi-disciplinary, self-sufficient group of 2-6 people who own an area of the product or company. We have small teams spanning product, engineering, and operations (<a href="/teams">see the full list here</a>).</p><p>Small teams at PostHog operate like their own tiny startups. They have their own goals, their own roadmap, their own retrospectives, and even their own revenue. They make their own decisions about what to build and how to build it.</p><p>And crucially: they actually <em>can</em> make their own decisions. </p><p>Here&#x27;s why that matters:</p><h4 id="tiger-teams-get-performative-autonomy">Tiger teams get performative autonomy</h4><p>Someone somewhere recognized that the normal way of doing things (i.e. the <a href="/newsletter/how-startups-lose-their-edge">endless approvals</a>, the alignment meetings, the death-by-committee) was too slow to solve urgent problems. So they thought: what if we pulled together our best people, gave them a focused mission, and let them move fast?</p><p>Good instinct. Makes sense.</p><p>The problem is that tiger teams don&#x27;t always get what they <em>actually</em> need to succeed: real, self-contained autonomy. Instead, they get the aesthetics of authority: a cool name, a &quot;war room&quot; (aka a sad corner office with a big table, post-its, and fluorescent lights), and maybe some pizza budget. </p><p>If autonomy isn&#x27;t already part of the culture, fully letting go can feel like too big a leap, even for the most open-minded leaders. What if the tiger team they created makes the wrong call? Every decision still reflects back on them, so leadership holds on to the steering wheel, even if they loosen the grip a little. Approval chains might get shortened, but there&#x27;s still a leash.</p><h4 id="small-teams-get-real-autonomy">Small teams get real autonomy</h4><p>At PostHog, small teams have final call on what ships – no external QA, no approval chains, no waiting for someone three levels up to sign off. The team lead isn&#x27;t a manager; they&#x27;re responsible for making sure the team ships, not for telling people what to do.</p><p>This is usually how tiger team defenders push back: &quot;but what about cross-functional collaboration?&quot; Small teams don&#x27;t mean siloed teams. At PostHog, toe-stepping is actively encouraged. You can (and should) raise PRs for things outside your team&#x27;s domain, and we consult each other whenever it <a href="/newsletter/communication-mistakes">makes sense to do so</a>. </p><p>The difference is that we treat <a href="/newsletter/collaboration-sucks">collaboration as a resource to pull from, not a process to comply with.</a></p><hr/><h4 id="tiger-teams-are-band-aids">Tiger teams are band-aids</h4><p>Tiger teams are the corporate equivalent of calling in a SWAT team to fix your leaky faucet. Sure, they&#x27;ll get the job done, but at what cost? And more importantly, what happens when the faucet starts leaking again next month?</p><p>Here&#x27;s the fundamental issue: tiger teams are designed around problems, not products. They&#x27;re reactive by nature. Something breaks, someone assembles the Avengers, they heroically save the day, everyone gets a pat on the back, and they go back to their regular jobs. </p><p>Tiger teams are, therefore, a symptom of organizational dysfunction – a sign that your normal operating mode can&#x27;t handle important problems in its &quot;normal state&quot;. They exist because someone realized that day-to-day operations are too <a href="/newsletter/this-is-why-youre-not-shipping">bogged down by collaboration</a> to actually ship anything urgent. </p><h4 id="small-teams-are-long-term-solutions">Small teams are long-term solutions</h4><p>When you own something permanently, you think about it differently. This changes behavior in subtle but important ways. </p><p>A tiger team might ship a quick fix that technically solves the problem but creates technical debt. Why wouldn&#x27;t they? They won&#x27;t be around to pay it off. Worse, they can have an incentive to <em>not</em> fix things too permanently.</p><p>For example, a former organization of one of our engineers was in a constant state of &quot;red alert&quot; (their version of a tiger team). The folks involved had no incentive to improve how the organization worked. This was because, if they solved the upstream problem of organization dysfunction, they&#x27;d lose their autonomy (and special status) as a tiger team.</p><p>A small team, on the other hand, doesn&#x27;t benefit from problems – and knows that every shortcut taken is a loan against their own future productivity. So they think long-term by default, and the quality of work tends to be higher, because Future Them is going to deal with it if it&#x27;s not.</p><p>Tiger teams are renters putting a bucket under the leak. Small teams are owners fixing the pipe.</p><hr/><h4 id="tiger-teams-are-deceptively-inefficient">Tiger teams are deceptively inefficient</h4><p>They feel fast because there&#x27;s urgency and focus and probably some executive breathing down everyone&#x27;s necks, but it&#x27;s an inefficient approach.</p><p>These are people who don&#x27;t usually work together, which means they&#x27;re spending the first chunk of their time building context, learning each other&#x27;s working styles, and figuring out who actually makes decisions (see: performative autonomy). </p><p>Then, once they ship their fix, high-fives all around, and everyone goes back to their regular jobs. But where does the knowledge go? Who maintains the thing they built? Who remembers why certain decisions were made six months from now when something breaks again? The answer is usually &quot;nobody&quot; or &quot;some poor soul who wasn&#x27;t even on the original team.&quot; </p><p>Then the next fire starts, and you do it all over again.</p><h4 id="small-teams-are-nimble-by-default">Small teams are nimble by default</h4><p>Knowing that smaller, more autonomous units move faster, but only applying that insight when there&#x27;s a fire to put out is akin to knowing that exercise is good for you, but only working out when you&#x27;re already having a heart attack.</p><p>Having an organizational structure grounded in velocity and autonomy isn&#x27;t something we switch on during emergencies, it&#x27;s <a href="/founders/how-come-we-ship-so-much">how we operate all the time</a> – whether we&#x27;re responding to an outage or building a new feature on a random Tuesday.</p><p>Small teams skip the startup costs that make tiger teams slow. The context is already there. The relationships are already built. The codebase is already familiar. When something needs to ship, they just... ship it.</p><h2 id="moving-from-tiger-teams-to-small-teams">Moving from tiger teams to small teams</h2><p>Tiger teams are what happens when you admit your org is too slow – but only sometimes, and only for special problems, and only temporarily. <a href="/newsletter/small-teams">Small teams are what happens when you decide to fix the actual problem.</a></p><p>Whether you&#x27;re rethinking how your org operates or ignoring everything I just said and spinning up a tiger team anyway, here&#x27;s the cheat sheet:</p><p><strong>Make speed the norm.</strong> If you only move fast during emergencies, <a href="/founders/how-come-we-ship-so-much">your normal is too slow</a>. Audit your day-to-day processes: how many approvals does it take to ship something small? How many meetings happen before code gets merged? If the answer makes you uncomfortable, that&#x27;s your sign to cut them in half.</p><p><strong>Give people real autonomy, not the semblance of it.</strong> Ask yourself: if this team decided to ship something tomorrow, what would stop them? Count the blockers, and if the answers involve a bunch of people who aren&#x27;t on the team, something needs to change. Approval chains are signals you don&#x27;t trust your teams to make good decisions. <a href="/newsletter/43-lessons-about-hiring-for-startups">If you&#x27;ve hired well, remove the roadblocks</a>. If you haven&#x27;t, that&#x27;s a different problem.</p><p><strong>Let teams own products, not problems.</strong> When teams have real, long-lasting ownership, they build context over time, catch issues before they become fires, and actually care about long-term quality. If you do spin up a tiger team, define who owns the output once they disband: What does &quot;done&quot; look like? Who owns it after? If you can&#x27;t answer these before kickoff, you&#x27;re creating a handoff nightmare.</p><p>And if any of this resonated, welcome to the Tiger Team Hater Club™️. Grab a t-shirt, make yourself at home, and if you want to see what working in small teams actually looks like, <a href="/careers">PostHog is hiring</a>.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we built user behavior analysis with multi-modal LLMs (in 5 not-so-easy steps)]]></title><description><![CDATA[PostHog captures a lot of user behavior data — the pages people visit, the buttons they click, and everything in between, all captured as events and…]]></description><link>https://posthog.com/blog/multi-modal-llm-user-behavior-analysis</link><guid isPermaLink="false">42e78137-0853-567a-a4f2-bb03c57c66ee</guid><dc:creator><![CDATA[Alex Lebedev]]></dc:creator><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/519290681_b3c074ed_f976_4e91_8c37_498387c9dbe1_a48312c745.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog captures a lot of user behavior data — the pages people visit, the buttons they click, and everything in between, all captured as events and <a href="/session-replay">session recordings</a>. By “a lot,” I mean billions of events and terabytes of S3 snapshots. Watching those sessions is incredibly useful for understanding how products are actually used, but there’s an obvious problem: there are far too many to review manually.</p><p>So, we created a tool to watch and analyze user sessions. It highlights the issues - so you can find what&#x27;s broken without watching hundreds of hours of recordings yourself. It&#x27;s called <a href="/docs/posthog-ai/session-summaries">Session Summaries</a>, <strong>we release it in beta today</strong>. You can use it right now, for free, with PostHog AI.</p><p>In this post, I&#x27;ll walk through what we learned through the process of building it, where we messed up, and lots of practical tips on how to make user behavior analysis work in production. All the code is <a href="https://github.com/PostHog/posthog">open-source</a>, and here&#x27;s a 36-second demo of how it works:</p><p><div class="mb-4 rounded border border-primary bg-accent"><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/minivied_v2_onrxvy_5cb76704aa.mov" class="my-0  rounded"></video></div></p><h2 id="step-1-analyzing-a-single-user-session-should-be-easy">Step 1: &quot;Analyzing a single user session should be easy&quot;</h2><p>Let&#x27;s forget about scaling for a moment and focus just on a single user session: a user visited a website or app, navigated a bit, did something useful, and left. The logic seems straightforward: take all the session events, send them to an LLM, and get a summary.</p><p>However...</p><h3 id="not-all-the-context-is-equally-useful">Not all the context is equally useful</h3><p>Usually, each user-generated event has lots of metadata attached to it. User info, URLs, event type, CSS selectors, timestamps, and so on. In PostHog&#x27;s case, a single session with all metadata could easily exceed 1 million tokens. Even if we forget about pricing and context limits, providing too much data will cause the lost-in-the-middle effect: the LLM will highlight what happened at the very start or end but completely miss the main part.</p><p><strong>Our approach:</strong></p><ul><li>We start with what&#x27;s essential: keeping a minimal set of events and fields, and adding new ones only if they increase the quality of the summary.</li><li>Mappings for everything. If event data includes URLs, we use a <code>url_N</code> alias and attach a mapping. Same for tab IDs, and any repeating parameters.</li><li>CSV input. Neither JSON nor TOON (heh) will provide the same generation quality per input token.</li><li>We don&#x27;t return JSON either. If it works with free text - awesome, if not - we return YAML or CSV.</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Frame_1_609e3c3e7e.png" alt="Inputs"/></p><p><div>Carefully select what data goes into the pipeline</div></p><h3 id="parallelization-breaks-the-narrative">Parallelization breaks the narrative</h3><p>If a user spends hours on your site, their session could be huge. If you have lots of such users (like we do), it’s tempting to split each session into segments and analyze them in parallel to cut latency. It&#x27;s a trap. If the LLM doesn&#x27;t know what happened before or after, it loses critical context on what the current segment&#x27;s events actually mean, so the combined result is worthless.</p><p><strong>Our approach:</strong></p><ul><li>Wherever possible, process the data for the entire session in one large call, so the LLM has full context (up to 200k tokens). If you must segment (the context too large), do it in a separate step, then provide each parallel call with full context for its own segment and just minimal context for the previous and next ones. Lots of context for the current slice, a little for its neighbors to keep the LLM grounded.</li><li>Hope that users are ok with waiting for a couple of minutes. Using faster models (like OpenAI <code>nano</code> ones) can allow streaming the summary after 10-15s, but thinking models on &quot;high&quot; provide better results quality-wise, and quality is the goal.</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_11_29_at_21_20_57_fb0e292e9d.png" alt="Single session summary"/></p><p><div>Here&#x27;s how you can get a summary of a single session from chat, or Replay player</div></p><h3 id="crying-wolf-effect">Crying wolf effect</h3><p>Fast-growing products (startups specifically) have a bad habit of generating lots of exceptions spurious, especially frontend ones. LLMs see this, panic, and hallucinate a summary of the session in which the user completely failed on all their goals. In reality, the user successfully got what they came for and didn&#x27;t even notice these exceptions.</p><p><strong>Our approach:</strong></p><ul><li>We programmatically pre-filter events that look like <a href="/docs/error-tracking/issues-and-exceptions">exceptions</a>, especially if one causes multiple others as an avalanche, and they create a context that LLM can&#x27;t ignore. For example, drop all JS exceptions that aren&#x27;t API errors.</li><li>We tried... It didn&#x27;t help (Check Step 2).</li></ul><h2 id="step-2-see-what-the-user-sees">Step 2: See what the user sees</h2><p>Even with noise reduction, the core problem remains: we can&#x27;t be sure whether the issues highlighted by the LLM actually affected users. A TypeError in logs looks scary, but if a retry succeeded in 200ms - the user never noticed. Since we have lots of snapshots, we can generate videos of the sessions and see what the user saw.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Frame_4_2466b126e7.png" alt="Video validation"/></p><p>When the single-session summary flags something as a &quot;blocking error&quot; - an exception that supposedly prevented the user from completing their goal - we don&#x27;t trust it blindly. Instead, we:</p><ul><li>Generate a ~10-second video clip, starting a couple of seconds before the flagged event</li><li>Send the clip to a multi-modal LLM to transcribe the video</li><li>Confirm or deny the issue, and update the summary</li></ul><p>And it works pretty well, but it raises the question: why not use only the session recording? Why use events at all?</p><h3 id="video-explains-the-issue-but-not-the-reason">Video explains the issue, but not the reason</h3><p>If we use only video, we can see that the user visited the page, waited for 5 seconds at the loading state, and left. We don&#x27;t see the ClickHouse timeout error, outdated data cached in Redis, or malformed query parameter in the users URL. We know what happened, but creating a detailed report would require extensive manual investigation - so why read the summary in the first place?</p><p><strong>Our approach:</strong></p><ul><li>Approach 1 (what we&#x27;re doing now): Combine videos with issues highlighted by LLM from the events, to triage them before surfacing.</li><li>Approach 2 (in progress): We transcribe all the videos of user sessions and combine them with events, creating complete blobs of data that will (almost) never hallucinate when summarized.</li></ul><p>We haven&#x27;t shipped approach 2 (yet) because...</p><h3 id="videos-are-heavy">Videos are heavy</h3><p>At first glance, transcribing all the user session videos seems like a no-brainer. For example, Gemini Flash multi-modal models cost 10-20 times cheaper than thinking LLMs from Anthropic or OpenAI (or even Gemini&#x27;s own). It can go even lower with open-source models.</p><p>However, let&#x27;s try basic math, using numbers from now (end of 2025).</p><ul><li>One frame of video at a good-enough resolution costs 258 Gemini Flash tokens.</li><li>If <code>1 frame per second * 60 seconds in a minute * 60 minutes in a hour * 258 tokens = 929k tokens</code>.</li><li>Meaning, analyzing just one large-ish session already costs a million tokens.</li></ul><p>We can even use lighter models and lower resolutions, but at some point, the quality drop is too much. Also, these models are this cheap because they aren&#x27;t exactly clever. We can ask it to transcribe what&#x27;s on the screen, but it won&#x27;t be able to make meaningful conclusions on the whole journey. So, either we need to use a much more expensive model from the start, or we need another model to analyze transcription afterward.</p><p><strong>Our approach:</strong></p><ul><li>We don’t analyze the whole video — at least 40–60% is usually inactivity we can skip. We only need to transcribe the parts where the user actually did something. But we still need events or snapshots to identify those moments.</li><li>We don&#x27;t analyze all the videos - there&#x27;s a clear set of parameters (like event count, or active duration) that can be used to decide if it&#x27;s worthwhile to check this session.</li></ul><h3 id="videos-are-really-heavy">Videos are <em>really</em> heavy</h3><p>Even with all the optimizations above, video files add up. A 10-second GIF clip at 1080p can be 7-15MB. Multiply by hundreds of thousands of sessions, and we&#x27;re looking at terabytes of storage costs daily. The example is obviously laughable, but even with the regular <code>.mp4</code> format (tens of times smaller), it&#x27;s easy to reach terabytes pretty quickly.</p><p><strong>Our approach:</strong></p><ul><li>We use <code>.webm</code>. It&#x27;s roughly half the size of the <code>.mp4</code>, supported by most multimodal models, and can be played in most browsers by default (in the UI or not).</li><li>We render videos at 8-10x - 1 frame per second is usually enough for LLM to understand the context well.</li><li>Keep in mind that <code>puppeteer</code>, <code>playwright</code>, and similar libraries have different recording settings, and speeding up can result in data loss.</li></ul><h2 id="step-3-analyze-lots-of-sessions-at-once">Step 3: Analyze lots of sessions at once</h2><p>A single session summary is useful enough, but watching one session at a time doesn&#x27;t solve the original problem - there are thousands of sessions, and we need to find issues across them. We decided to start small, with 100-session batches. It won&#x27;t cover all the sessions, but it can cover a good enough sample (or a specific org), and already saves tons of time.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_11_28_at_23_13_11_203c4282d4.png" alt="Session group summary"/></p><p><div>You can check the pattern based on severity and issue types</div></p><p>The session group summary surfaces patterns across sessions, including severity, the number of affected sessions, and specific examples. The complex part, obviously, is how to extract these patterns.</p><h3 id="patterns-are-hard-to-catch">Patterns are hard to catch</h3><p>In an ideal world, we’d send 100 single-session summaries in one LLM call and get back an extracted set of patterns. Sadly, that breaks down on multiple levels. First, we’d hit the model’s context limits — enriched summaries are heavy on metadata. Second, even if they did fit, we’d run into the same lost-in-the-middle problem, with the first and last sessions getting far more attention than everything in between.</p><p>Also, we could&#x27;ve just picked a sample of sessions and selected patterns from them, but then the quality of the final report would be too dependent on our luck in picking the initial sessions. LLMs love finding patterns, but without proper control, we would&#x27;ve gotten either duplicates or incredibly insightful &quot;wow, users clicked buttons&quot; ones.</p><p><strong>Our approach:</strong>
We use a four-phase pipeline instead of a single prompt:</p><ol><li>Summarize each session individually (in parallel).</li><li>Extract patterns from summaries in chunks of meaningful size (to keep attention in the middle).</li><li>Combine patterns extracted from each chunk by either joining similar ones or extending the list.</li><li>Iterate over chunks of single-session summaries to assign events back to patterns for concrete examples.</li></ol><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Frame_2_57724cfa0e.png" alt="Four-phase pipeline"/></p><h3 id="crying-wolf-effect-now-with-patterns">Crying wolf effect (now with patterns)</h3><p>Even if we got patterns, there&#x27;s just too much data to process easily, so we need to rank them properly. For example, a blocking error that happens once in 100 sessions is annoying. The same error in 80 sessions is critical. Or the exception could occur 10 times, but only for a single user out of 100, and saying &quot;issue X happened 15 times&quot; could cause a false alarm.</p><p><strong>Our approach:</strong></p><ul><li>We limit 1 example per session per pattern. So, if the report says &quot;happened 15 times,&quot; you can be sure it happened in 15 different sessions, not one user rage-clicking the same broken button.</li><li>We calculate detailed pattern statistics: occurrence count, affected sessions, percentage of total, and severity.</li><li>The default report shows only issues with blocking errors by default, but you can show other types if you want to dig deeper.</li></ul><h3 id="patterns-need-to-be-verifiable">Patterns need to be verifiable</h3><p>Extracting patterns is only half the job. If users can&#x27;t verify that the patterns are real, they won&#x27;t trust the report. &quot;Users experience checkout timeouts&quot; is useful. &quot;Users experience checkout timeouts - here are 5 specific sessions where it happened, with timestamps and video clips&quot; is actionable.</p><p>To make it work, we needed a way to easily display the whole story to the user and give them the tools to validate the issue themselves. So we did.</p><p><strong>Our approach:</strong></p><ul><li>We display not just the issue, but also the segment that the issue was part of, what happened before the issue, and what happened after.</li><li>We ensure the timestamp and event type of the issue are clear and easy to validate.</li><li>Or even easier, we load the video of the session at the moment it happened (actually, a couple of seconds before).</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_11_29_at_21_01_27_26a86978c8.png" alt="Issue example"/></p><h2 id="step-4-make-it-work-reliably">Step 4: Make it work reliably</h2><p>Now we have a pipeline that works across 100 sessions: single-session summaries → video validation → pattern extraction → pattern enrichment. The problem? It&#x27;s fragile. If the whole thing falls apart because of one bad response, the feature is unusable.</p><p>To make it more predictable, we use Temporal workflows, with each workflow spawning hundreds of atomic and easily retriable activities, so we’ll get a proper result - sooner or later.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_11_29_at_20_52_52_3177a60a33.png" alt="Temporal logic"/></p><p><div>Temporal workflow logic on a small sample of sessions</div></p><h3 id="expect-every-one-of-the-llm-calls-to-fail">Expect every one of the LLM calls to fail</h3><p>We&#x27;re making ~150-200 LLM calls per a single report, any of which can (and often will) fail. Timeouts, rate limits, malformed responses, hallucinations, and lots of other creative reasons my human mind isn’t capable of predicting. Treating every such failure as fatal means the feature never works in production.</p><p><strong>Our approach:</strong></p><ul><li>We set failure thresholds instead of stopping at the first error. Each stage lets roughly 20–25% of requests fail (after exceeding the retries) so the process can keep moving.</li><li>A report based on 80 sessions instead of 100 is usually good enough to find patterns, compared to not getting a report at all.</li><li>It gets even more creative with streaming, as incomplete chunks will raise lots of false alarms. So, we have conditional tracking and logging to handle such cases.</li></ul><h3 id="aggressive-caching">Aggressive caching</h3><p>If any analysis step fails, but you have proper atomic activities and cache the results, you can even retry the whole workflow for cheap. Storage is cheap and fast (especially non-persistent ones, like Redis), while LLM calls are not and take time.</p><p><strong>Our approach:</strong></p><ul><li>If it’s an isolated step (like a single session summary that can be used as-is), we use DB.</li><li>If it’s an intermediate step (like pattern extraction), we use Redis.</li><li>The main logic is “will it change the result if I add one more session to the input?”.</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Frame_3_2a8ed7a277.png" alt="Basic retry logic"/></p><h3 id="phenomenal-cosmic-power-itty-bitty-living-space">“Phenomenal cosmic power, itty bitty living space”</h3><p>Temporal is amazing for orchestrating complex workflows, but it has limits. Event history is capped at around 2MB. When we tried to use it as-is, we hit the limit even before making a single LLM call – just by pulling the data to analyze from the DB (an obvious anti-pattern).</p><p>Redis, as a stateful bridge, provides plenty of opportunities for workarounds. Firstly, we can store all the intermediate steps there without the need to calculate space (and just pass the keys). Secondly, we use Redis to stream the progress, LLM calls, combined data, and whatever else we want, with great latency.</p><p><strong>Our approach:</strong></p><ul><li>Clear Redis TTLs (24 hours tops), as even with seemingly unlimited memory, we slow it down significantly if not paying attention.</li><li>Gzip compression for everything (on the input/output).</li><li>If storing in the DB, the Redis step is skipped explicitly to avoid duplicating data for nothing.</li></ul><h2 id="step-5-ship-the-beta-learn-iterate-we-are-here">Step 5: Ship the beta, learn, iterate (We are here)</h2><p>Session Summaries are available now in free, public beta. So, if you want to check our findings above, give it a try. Just ask <a href="/blog/8-learnings-from-1-year-of-agents-posthog-ai">PostHog AI</a> to summarize your sessions. Worst case: you’ll notice where we messed up. Best case: you’ll learn something useful about your users and your product.</p><p><strong>What Session Summaries can do:</strong></p><ul><li>Find issues: Surface recurring problems that actually impact users</li><li>Chat: Ask follow-up questions to dig deeper</li><li>Video validation: Confirm issues with the visual proof</li></ul><p><strong>What it will be able to do soon:</strong></p><ul><li>Full video understanding: Find sessions with a specific behavior and answer free-form questions</li><li>Proactive alerts: Analyse thousands of sessions in the background and provide signals on where to look</li><li>Go beyond sessions: make it work with Error tracking, Support tickets, LLM traces, you name it</li></ul><p>We’ll share more updates and learnings down the road. Or we&#x27;ll get distracted by something shiny. Probably both.</p><p>In the meantime, try it, break it, and let us know.</p><hr/><p>P.S. If you are still reading and find it interesting, we&#x27;re hiring <a href="/careers/ai-product-engineer">AI Product Engineers</a>. We have tons of ideas to ship, and we&#x27;d love to hear yours.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best Contentsquare alternatives & competitors, compared]]></title><description><![CDATA[Contentsquare is a beast, and we mean that in a good way – it's one of the most comprehensive digital experience platforms out there. They've doubled…]]></description><link>https://posthog.com/blog/best-contentsquare-alternatives</link><guid isPermaLink="false">ba04f4b8-9a69-5642-afd8-02cb4730740c</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Contentsquare is a beast, and we mean that in a good way – it&#x27;s one of the most comprehensive digital experience platforms out there. They&#x27;ve doubled down on their market dominance by acquiring <a href="/blog/best-hotjar-alternatives">Hotjar</a> and <a href="/blog/best-heap-alternatives">Heap</a>, bringing a powerful suite of tools under one umbrella.</p><p>If you&#x27;re a Fortune 500 company with a dedicated analytics team and complex multi-platform flows to optimize, Contentsquare makes a ton of sense: it&#x27;s built for scale, handles massive traffic, and gives you the kind of behavioral depth that can justify six-figure software budgets. </p><p>That said, not everyone wants (or needs) enterprise-grade complexity.</p><p>Plenty of teams want something they can set up before lunch, or scale without selling a kidney on the gray market. Some want replay plus analytics, others want transparent pricing, and many just want to know why a user rage clicked the same button seventeen times.</p><p>If that sounds familiar, this guide is for you: we&#x27;ll break down the best Contentsquare alternatives – from all-in-one platforms built for developers to lightweight tools focused on behavior tracking and replay.</p><h2 id="best-contentsquare-alternatives">Best Contentsquare alternatives</h2><h3 id="1-posthog">1. PostHog</h3><p>PostHog is an all-in-one developer platform that combines <a href="/product-analytics"><strong>product analytics</strong></a>, <a href="/web-analytics"><strong>web analytics</strong></a>, <a href="/session-replay"><strong>session replay</strong></a>, <a href="/error-tracking"><strong>error tracking</strong></a>, <a href="/feature-flags"><strong>feature flags</strong></a>, <a href="/experiments"><strong>experiments</strong></a>, <a href="/surveys"><strong>surveys</strong></a>, <a href="/llm-analytics"><strong>LLM analytics</strong></a>, and more. Instead of stitching together five or six tools, you get everything in one place.</p><p>The advantage of using PostHog is context. You&#x27;re not just watching a session recording, you&#x27;re connecting it to funnels, flags, experiments, errors, user properties, and long-term retention. You can see exactly what a user clicked, what test variants they were exposed to, what errors they hit, and how it all may have impacted your product metrics.</p><p>Pricing is transparent and usage-based, with 1 million events and 5,000 recordings free each month, which is enough for most early-stage teams. More than 90% of companies using PostHog never pay a cent.</p><p><strong>Choose PostHog if:</strong> You want everything from analytics to replay to experiments in one place, without slowing down for heavyweight setup or multi-tool maintenance.</p><h4 id="posthog-vs-contentsquare">PostHog vs Contentsquare</h4><div competitors="posthog,contentsquare"></div><details><summary>Main differences between PostHog and Contentsquare</summary><ul><li>PostHog is built for engineers and technical founders, offering multiple developer tools, backend SDKs, and an integrated data warehouse. Contentsquare focuses on digital experience analytics for web or mobile experiences, large organizations,  and enterprise marketing teams.</li><li>PostHog is open source. Contentsquare is closed and cloud only.</li><li>PostHog is transparent, has usage-based pricing, and is self-serve. Contentsquare offers a free tier, but paid plans (Pro and Enterprise) require a custom quote.</li></ul></details><details><summary>Main similarities between PostHog and Contentsquare</summary><ul><li>Both offer session replay, heatmaps, and behavior analytics with AI assistants to help with analysis</li><li>Both support large volumes of traffic and data. </li><li>Both are used to reduce UX friction and uncover conversion blockers.</li></ul></details><h3 id="2-fullstory">2. FullStory</h3><p><a href="/blog/posthog-vs-fullstory">FullStory</a> is one of the closest like-for-like alternatives to Contentsquare. It&#x27;s built around high-fidelity session replay, detailed event capture, and powerful search capabilities that let you find specific sessions based on any user interaction or DOM event.</p><p>If you need to inspect frontend behavior down to the pixel, FullStory is one of the most polished options available. Its mobile SDKs are mature and well-maintained, and it includes funnels, user journeys, frustration signals (rage clicks, error clicks), and lightweight product analytics.</p><p>That said, FullStory sits firmly in enterprise territory. It&#x27;s powerful, but you&#x27;ll feel the cost once you start pushing real volume through it.</p><p><strong>Choose FullStory if:</strong> You want enterprise-grade digital experience analytics with best-in-class session replay.</p><h4 id="fullstory-vs-contentsquare">FullStory vs Contentsquare</h4><div competitors="fullstory,contentsquare"></div><details><summary>Main differences between FullStory and Contentsquare</summary><ul><li>FullStory focuses more on session replay and granular event search. Contentsquare emphasizes enterprise journey analytics, AI-driven insights, and broader UX intelligence.</li><li>FullStory has an additional employee experience product that ecommerce, food, and hospitality companies might find useful. </li><li>FullStory offers more developer-friendly replay, DOM capture, and event inspection. Contentsquare is built more for UX and marketing analytics teams.</li></ul></details><details><summary>Main similarities between FullStory and Contentsquare</summary><ul><li>Both provide session replay, heatmaps, funnels, journeys, and frustration signals.</li><li>Both support large-scale traffic on high-volume sites.</li><li>Both are used for UX diagnostics, conversion optimization, and identifying where users get stuck.</li></ul></details><h3 id="3-microsoft-clarity">3. Microsoft Clarity</h3><p>Microsoft Clarity is the &quot;wait, this is actually free?&quot; alternative. It gives you heatmaps, frustration signals (rage clicks, dead clicks, excessive scrolling), and unlimited session replay without charging anything. For teams watching their burn rate, Clarity feels almost too generous.</p><p>Setup is simple: just drop in the script, and within a few hours you&#x27;ll be capturing full sessions and everything they entail. It won&#x27;t replace full product analytics, but for quick insight into how users behave on your site, it certainly punches above its weight.</p><p>Of course, you get what you pay (or, in this case, don&#x27;t pay) for. Clarity doesn&#x27;t offer funnels, user journeys, advanced segmentation, or the kind of detailed event tracking you&#x27;d expect from Contentsquare. </p><p>You also can&#x27;t tie recordings to custom user properties or filter by feature flags. If you need customer context or debugging detail, you&#x27;ll hit limits fast. But as a no-strings-attached replay and heatmap tool, it&#x27;s hard to beat.</p><p><strong>Choose Microsoft Clarity if:</strong> You want a lightweight tool with free heatmaps and session recordings, and you&#x27;re fine using other tools for analytics and experimentation.</p><h4 id="microsoft-clarity-vs-contentsquare">Microsoft Clarity vs Contentsquare</h4><div competitors="microsoft_clarity,contentsquare"></div><details><summary>Main differences between Clarity and Contentsquare</summary><ul><li>Clarity is completely free with no usage limits. Contentsquare has a free tier (up to 20k sessions) and transparent Growth pricing, but Pro and Enterprise tiers require custom quotes.</li><li>Clarity focuses on heatmaps, session replay, and frustration signals with AI-powered session summaries. Contentsquare provides journey analysis, zone-based heatmaps, and advanced segmentation across multiple touchpoints.</li><li>Clarity offers straightforward replay for debugging and UX evaluation. Contentsquare provides structured analysis tools built for large organizations with dedicated analytics teams.</li></ul></details><details><summary>Main similarities between Clarity and Contentsquare</summary><ul><li>Both offer session replay, heatmaps, and frustration metrics like rage clicks.</li><li>Both use AI to summarize sessions and surface insights (Clarity Copilot and Contentsquare Sense).</li><li>Both help teams understand how users interact with key pages and UI elements.</li><li>Both can support high-traffic sites without breaking under load.</li></ul></details><h3 id="4-glassbox">4. Glassbox</h3><p>Glassbox is another digital experience platform often mentioned alongside Contentsquare. It&#x27;s built for organizations where user journeys span multiple platforms, multiple teams, and complex technical environments.</p><p>Its strength is visibility across everything. Glassbox captures web and mobile sessions, maps customer journeys end-to-end, highlights friction points, and includes the compliance and governance features big companies actually need – role-based access controls, data retention policies, audit logs, the works.</p><p>Like Contentsquare, pricing requires a sales conversation – but if compliance is a top priority, Glassbox delivers.</p><p><strong>Choose Glassbox if:</strong> You need deep journey analytics, replay for both web and mobile, and strong compliance features out of the box.</p><h4 id="glassbox-vs-contentsquare">Glassbox vs Contentsquare</h4><div competitors="glassbox,contentsquare"></div><details><summary>Main differences between Glassbox and Contentsquare</summary><ul><li>Glassbox leans heavily into compliance, governance, and data privacy. Contentsquare emphasizes UX intelligence, zoning analysis, and AI-driven insights.</li><li>Glassbox uses tagless autocapture that requires no manual event configuration. Contentsquare offers more advanced segmentation and retrospective analysis tools for understanding user behavior.</li><li>Glassbox supports very detailed journey mapping with enterprise guardrails. Contentsquare has broader UX exploration tools.</li></ul></details><details><summary>Main similarities between Glassbox and Contentsquare</summary><ul><li>Both offer comprehensive journey analytics, session replay, and heatmaps.</li><li>Both target large companies with complex customer flows and strict data requirements.</li><li>Both require more setup, onboarding, and contract negotiation than lighter DX tools.</li></ul></details><h3 id="5-quantum-metric">5. Quantum Metric</h3><p>Quantum Metric takes a slightly different approach from Contentsquare. While it still offers session replay, journeys, and behavior analysis, its real differentiator is tying user frustration directly to business impact with actual dollar amounts (CFOs, rejoice!). Instead of just telling you what users struggled with, Quantum Metric wants to tell you how expensive that struggle was.</p><p>It&#x27;s marketed as a &quot;continuous product design&quot; platform, which basically means it helps teams spot identify issues, quantify the revenue impact, and prioritize fixes based on real financial outcomes. For enterprise teams juggling hundreds of features and endless backlogs, that&#x27;s a compelling angle.</p><p>Like Contentsquare and Glassbox, Quantum Metric is built for the enterprise world. It&#x27;s powerful, but it&#x27;s not something you spin up during a coffee break and immediately push into production.</p><p><strong>Choose Quantum Metric if:</strong> You want enterprise-level replay and journey analytics tied directly to revenue and performance impact.</p><h4 id="quantum-metric-vs-contentsquare">Quantum Metric vs Contentsquare</h4><div competitors="quantum_metric,contentsquare"></div><details><summary>Main differences between Quantum Metric and Contentsquare</summary><ul><li>Quantum Metric focuses on quantifying UX issues in dollars. Contentsquare focuses on deep behavioral and interaction-level analysis.</li><li>Quantum Metric includes operational and performance signals in its UX workflows. Contentsquare leans more into pure behavioral intelligence.</li><li>Quantum Metric emphasizes real-time impact detection. Contentsquare emphasizes detailed UX exploration and segmentation.</li></ul></details><details><summary>Main similarities between Quantum Metric and Contentsquare</summary><ul><li>Both offer session replay, heatmaps, journey mapping, and frustration signals.</li><li>Both are built for enterprises with high traffic and complex customer journeys.</li><li>Both use AI to surface insights and automatically detect issues in the customer experience.</li></ul></details><h2 id="which-contentsquare-alternative-should-you-choose">Which Contentsquare alternative should you choose?</h2><ul><li>If you want an all-in-one platform built for engineers – replay, analytics, feature flags, experiments, surveys, and debugging all tied together – go with <strong>PostHog</strong>.</li><li>If you need enterprise-grade replay and behavior analysis with extremely polished UI and excellent mobile support, <strong>FullStory</strong> is the closest analog to Contentsquare.</li><li>If you want unlimited replay for free and you&#x27;re okay with sticking to the basics, <strong>Microsoft Clarity</strong> is shockingly good value.</li><li>If you&#x27;re in a regulated industry, need strict data governance, or handle journeys that look like fractals, <strong>Glassbox</strong> is a strong enterprise option.</li><li>If you need to tie UX issues directly to dollar impact and automatically prioritize what hurts the business most, <strong>Quantum Metric</strong> is built for that.</li></ul><h2 id="faq">FAQ</h2><details><summary>What is Contentsquare used for?</summary><p><strong>Contentsquare</strong> is a digital experience analytics platform that helps teams understand how users behave across websites and mobile apps. It combines four main products: Experience Analytics (session replay, heatmaps, journeys), Product Analytics (funnels, user paths, web analytics), Voice of Customer (feedback surveys and user testing), and Experience Monitoring (error tracking, frustration signals, performance monitoring).</p><p>Teams use Contentsquare to optimize the full customer journey, from initial landing pages through checkout flows, by visualizing exactly where users struggle, drop off, or disengage. It&#x27;s particularly strong for e-commerce, SaaS, and large-scale digital businesses that need to balance behavioral analytics with performance monitoring across multiple platforms.</p></details><details><summary>How does Contentsquare handle frontend frameworks like React, Vue, or Next.js?</summary><p><strong>Contentsquare</strong> works with modern frontend frameworks, but its instrumentation relies heavily on automatic DOM capture. This can be noisy in large client-side apps. Developer-oriented platforms like <strong>PostHog</strong> give you more control through first-party SDKs and explicit event capture, which is often easier to reason about in complex SPAs.</p></details><details><summary>Can Contentsquare help me debug frontend issues?</summary><p>To a degree. You can spot rage clicks, dead zones, and UI friction, but you won&#x27;t get console logs, network requests, or JavaScript errors tied directly into session replay. Tools like <strong>FullStory</strong> and <strong>PostHog</strong> provide more debugging context because they combine replay with richer technical signals.</p></details><details><summary>Does Contentsquare support mobile app session replay?</summary><p>Yes, but support varies depending on your mobile stack. Platforms like <strong>FullStory</strong> and <strong>Glassbox</strong> generally offer more flexible mobile SDKs and more reliable replay for native iOS and Android apps. For a more in-depth comparison, see our guide to the <a href="/blog/best-mobile-app-session-replay-tools">best mobile app session replay tools</a>.</p></details><details><summary>Why look for Contentsquare alternatives?</summary><p>Many teams want something easier to implement, faster to understand, or far more affordable. Others want analytics, experiments, and feature flags alongside replay, rather than just UX analysis. Contentsquare is powerful, but it&#x27;s built – and priced – for enterprise organizations.</p></details><details><summary>Which alternatives work best for engineering teams?</summary><p><strong>PostHog</strong> is purpose-built for <a href="/product-engineer/what-is-a-product-engineer">product engineers</a> – it combines analytics, replay, feature flags, and experiments in one platform with a data warehouse, so you&#x27;re not juggling multiple tools. <strong>FullStory</strong> and <strong>Quantum Metric</strong> are also strong alternatives, but are more geared toward product managers and analysts.</p></details><details><summary>Is Contentsquare still a good choice?</summary><p>Yes, especially for large organizations with complex user journeys and dedicated analytics teams. It&#x27;s an incredibly powerful tool, but if you&#x27;re a startup or product-engineering team that wants to move quickly, it will likely feel heavy.</p></details><details><summary>What&#x27;s the best Contentsquare alternative overall?</summary><p>For most teams, it&#x27;s <strong>PostHog</strong>. You get product analytics, web analytics, session replay, feature flags, experiments, surveys, and error tracking all in one platform with an integrated data warehouse – without the complexity, vendor demos, or enterprise overhead. Other solid options include <strong>FullStory</strong> (enterprise replay), <strong>Clarity</strong> (free and simple), <strong>Glassbox</strong> (governance-heavy orgs), and <strong>Quantum Metric</strong> (business impact tracking).</p></details><details><summary>Do any alternatives integrate with feature flag or experimentation platforms?</summary><p><strong>PostHog</strong> has native feature flags and A/B testing built in, so there&#x27;s no need for separate tools like LaunchDarkly or Optimizely.</p><p>Other platforms like <strong>FullStory</strong> and <strong>Quantum Metric</strong> offer integrations with third-party experimentation tools, but you&#x27;ll need to manage multiple vendors and data sources.</p></details><details><summary>Which Contentsquare competitor is open source?</summary><p><strong>PostHog</strong> is open source (MIT license) with a public roadmap. Most other digital experience platforms are closed-source and cloud-only.</p><p>If you&#x27;re exploring open source options, we also break them down in our guide to the <a href="/blog/best-open-source-session-replay-tools">best open-source session replay tools</a>.</p></details><details><summary>Which Contentsquare alternatives include session replay?</summary><p>Nearly all the major ones do. <strong>PostHog</strong>, <strong>FullStory</strong>, <strong>Microsoft Clarity</strong>, <strong>Glassbox</strong>, and <strong>Quantum Metric</strong> all include session replay in some form.</p><p>If you&#x27;re comparing replay tools more broadly, check out our deep dives on the <a href="/blog/best-session-replay-tools">best session replay tools</a> and the <a href="/blog/best-mobile-app-session-replay-tools">best mobile app session replay tools</a>.</p></details><details><summary>What&#x27;s the cheapest alternative to Contentsquare?</summary><p><strong>Microsoft Clarity</strong> is completely free. <strong>PostHog</strong> is also extremely affordable thanks to its <a href="/pricing">generous free tiers across products and usage-based pricing</a>.</p></details><details><summary>Which alternatives are GDPR and HIPAA compliant?</summary><p><strong>PostHog</strong>, <strong>FullStory</strong>, <strong>Glassbox</strong>, and <strong>Quantum Metric</strong> are all GDPR-ready. </p><p>For HIPAA compliance, <strong>PostHog</strong> and <strong>Quantum Metric</strong> support HIPAA-ready deployments, while <strong>Contentsquare</strong> and <strong>Glassbox</strong> do not sign Business Associate Agreements (BAAs).</p><p>Always verify compliance requirements with vendors directly for your specific use case.</p></details><br/><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[8 learnings from 1 year of agents – PostHog AI]]></title><description><![CDATA[Today we launch  PostHog AI, the AI agent built into PostHog . A year in the making, we've gone a long way from our first chat prototype made over a…]]></description><link>https://posthog.com/blog/8-learnings-from-1-year-of-agents-posthog-ai</link><guid isPermaLink="false">73981b80-350a-589d-a91e-91064e8891d0</guid><dc:creator><![CDATA[Michael Matloka]]></dc:creator><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/515178785_18a6e619_601a_4758_aaaa_06deb2695902_4a267826d4.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today we launch <strong>PostHog AI, the AI agent built into PostHog</strong>. A year in the making, we&#x27;ve gone a long way from our first chat prototype made over a hackathon. It all started with just one tool: &quot;create trends chart&quot; - and no real <a href="https://simonwillison.net/2025/Sep/18/agents/">agentic capabilities</a>.</p><p>Now, PostHog AI can access your data and setup via dozens of tools, and works tirelessly in a loop until it achieves the task you give it. Like a product analyst, it creates multi-step analyses of product usage, writes SQL queries, sets up new feature flags and experiments, digs into impactful errors - and more, all across PostHog. Thanks to a thorough beta period, it&#x27;s already <a href="https://posthog.com/customers/rayfit">used by thousands of users weekly</a>.</p><p>The road here has been full of adventures. Agents are paradoxical: some say <a href="https://lucumr.pocoo.org/2025/11/21/agents-are-hard/">agent design is hard</a>, and they&#x27;re right! Others say <a href="https://fly.io/blog/everyone-write-an-agent/">it&#x27;s incredibly easy to build one</a> – weirdly that&#x27;s true at the same time.</p><p>Here&#x27;s what I can tell you <em>we</em> have learned about <a href="/newsletter/building-ai-agents">building productive agents</a> so far.</p><h2 id="1-watch-out-for-the-bulldozer-of-model-improvements">1. Watch out for the bulldozer of model improvements</h2><p>The one constant of a year of building: model improvements change more than what you think at first. It&#x27;s shocking how reasoning models were still experimental 12 months ago, because today reasoning is essential to PostHog AI&#x27;s capabilities. Tool use has improved massively, as frontier models of November 2025 are able to make sense of complex tools with much greater reliability. We&#x27;re currently using Claude Sonnet 4.5 for the core agent loop, as it hits a sweet spot of quality, speed, and cost – but even this will be out of date before you know it.</p><p>The two model-related step changes in our implementation were:</p><ul><li>introduction of cost-effective reasoning with OpenAI&#x27;s o4-mini – this significantly improved and simplified creation of complex queries, especially those requiring data exploration to get right, ReAct BeGone!</li><li>reliable use of tools with the Claude 4 family from Anthropic – the agent could finally be let loose to use a wider variety of tools without going off track</li></ul><p>It remains hard to estimate what impact a model upgrade will really have! <a href="https://www.seangoedecke.com/are-new-models-good/">A great post on this by Sean Goedecke</a>. While the progress isn&#x27;t so obvious as GPT-2 vs. GPT-3, it&#x27;s still relentless.</p><h2 id="2-agents-beat-workflows">2. Agents beat workflows</h2><p>Graph-style workflows seemed like the right choice for getting work done. In the GPT-4o era, calling tools in a loop with the same system prompt was a recipe for confusion, and so we&#x27;ve spent months chasing new graph-based ways of orchestrating tools. Just look at the architecture iterations we&#x27;ve cycled through, back when our assistant <a href="/blog/why-we-killed-our-ai-product-assistant">was a hedgehog named Max</a>. The initial one couldn&#x27;t even answer questions with text, it could exclusively create queries, whatever the user input was!</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/0_4bf2079f8e.png" alt="Max v0"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/1_29c665ed1c.png" alt="Max v1"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/2_919f46dc86.png" alt="Max v2"/></p><p>The truth is, graphs are a terrible way of orchestrating free-form work. In a graph, the LLM can&#x27;t self-correct and context is all too easily lost. Today, thanks to the advances in model capabilities, the PostHog AI architecture is pleasingly straightforward:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/3_a44006789d.png" alt="PostHog AI"/></p><p>By looping back, the LLM is able to execute across dozens of steps, while continuously verifying output. A hard-coded workflow may be cheap to execute, but it&#x27;s all moot when it can&#x27;t actually get work done.</p><blockquote><p>What is the odd &quot;switch mode tool&quot; in the chart? <em>Shhh</em>, it&#x27;s our not-so-secret sauce. Switching modes is a variant of tool search – critical in scaling our agent&#x27;s number of tools to PostHog&#x27;s entire surface area. More on the topic in a separate upcoming post.</p></blockquote><h2 id="3-a-single-loop-beats-subagents">3. A single loop beats subagents</h2><p>Even in an agentic loop, it&#x27;s tempting to organize task execution into specialized subagents. Doesn&#x27;t it feel so clever to come up with these architectures? &quot;The Widget CEO will delegate work to the Widget Engineer, and then the work will be verified by the Widget Tester, with input from the Widget Product Manager&quot;.</p><p>While the idea is smart, the results are… dumb. Context is everything for an LLM - when every layer of abstraction introduces loss of context, the ability to string tools together and self-correct course washes away. Subagents still have their place – when you&#x27;re looking to parallelize work, that&#x27;s the way to go. What&#x27;s important is that the delegated tasks are self-contained, and ideally independent.</p><p>As we&#x27;ve seen with Claude Code&#x27;s success, incredible things come out of a single LLM loop with simple tools. God bless emergent behavior.</p><h2 id="4-to-dos-are-a-super-power">4. To-dos are a super-power</h2><p>Right, so it&#x27;s all in having single LLM loop with a single message history, and that&#x27;s magically better.</p><p>Well, okay, there&#x27;s one more secret ingredient: the <code>todo_write</code> tool. So deceptively simple and universal, it&#x27;s a natural way of keeping the LLM on track. Every time the LLM uses it at the end of a step, it reinforces what it needs to do next – there&#x27;s nothing this tool actually needs to <em>do</em>.</p><p>Suddenly instead of getting lost after a few tool calls, the agent can keep going and going, constantly correcting course. Writing to-dos is one of those intuitive super-powers, the way chain-of-thought used to be.</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/todos_17634fa3c2.png" width="523"/><h2 id="5-wider-context-is-key">5. Wider context is key</h2><p>Did I mention context matters? It really does, at every step of a task, because people define tasks in the most ambiguous ways. How would <em>you</em> answer &quot;where do users drop off in cfmp conversion&quot;? It looks like a bunch of typos sneaked in - unless you know CFMP is a product offerred by the user, and then you need to understand how it fits into their world (this is a real example). What your agent needs is a <code>CLAUDE.md</code> equivalent – core context that&#x27;s always attached.</p><p>Core context massively improves agent trajectories, but it&#x27;s a new to-do for a user, and none us love it when a new tool creates setup work. We&#x27;ve found it critical for core context creation to be effortless, yet not forced. Ultimately, as all great artists do, we stole from the best – and implemented the <code>/init</code> command, snatched from Claude Code.</p><p>In PostHog AI, <code>/init</code> learns about your product and business via multi-step web search (currently using GPT-5-mini). The results form the agent&#x27;s <a href="/docs/posthog-ai/edit-memory">project-level memory</a>. In the case your data doesn&#x27;t contain URLs to work with, a few questions are asked directly, but it&#x27;s something we try to minimize.</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/init_0a12b8b5cf.png" width="535"/><p>Context is <em>everywhere</em>. It lives on the web, but it lives in your Slack too, in your email inbox, in your notes app. This is one of the problems in applied AI that already have a number of solutions, but aren&#x27;t <em>solved</em> yet. We have some ideas, stay tuned for those.</p><h2 id="6-show-every-step">6. Show every step</h2><p>We&#x27;ve tried hiding some of the details that seemed raw. The full chains of reasoning, the failed tool calls, the tool call arguments, all hidden from the user&#x27;s view. The constant feedback was: &quot;I can see the output, but <em>feels hard to trust it when the process was a mystery</em>.&quot;</p><p>PostHog AI has since started streaming every tool call and reasoning token. It turns out humans are like LLMs – or maybe it&#x27;s the reverse. A black box is uninspiring no matter how good the results are. Details give us confidence in what&#x27;s happening. Show it all, the good, the bad, the ugly.</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Screenshot_2025_11_25_at_20_29_30_badd899b59.png" width="710"/><h2 id="7-frameworks-considered-harmful">7. Frameworks considered harmful</h2><p>Early on, we migrated from the OpenAI Python SDK to LangChain + LangGraph. Today, we absolutely wouldn&#x27;t.</p><p>Every time you use a framework, you lock into its ecosystem. Remember the memes that JavaScript gets a new frontend framework every second? That&#x27;s LLMs now, only LLMs evolve much faster than JS ever did, and the frameworks deliver less value. The ecosystems are fragile.</p><p>LLM calling abstractions like LiteLLM or Vercel AI crumble when AI providers add new models or new features. See: the mess that web search results are, as OpenAI and Anthropic format them entirely differently, while the frameworks try to maintain one facade.</p><p>Even worse: LLM call orchestrators like LangGraph. While conceptually elegant, they lock you into a specific way of thinking, and when that way <a href="#agents-beat-workflows">becomes obsolete</a> – good luck refactoring everything away.</p><p>AI may settle upon its React one day, but for now the framework wars rage on. It might just be best to stay neutral and low-level. It&#x27;s just calling function at the end of the day.</p><h2 id="8-evals-are-not-nearly-all-you-need">8. Evals are not nearly all you need</h2><p><a href="https://x.com/gdb/status/1733553161884127435">Some</a> say evals can be all you need. For foundation models: certainly, those datasets are foundational. For agents: evals are a great tool to have, but things get nuanced.</p><p>Reality is <em>gnarly</em>: for many real-world, multi-step tasks, setting up a realistically complex environment is a greater challenge then building the agent itself. Such an environment must support every possible tool call the agent can make if you want to judge actual performance. <a href="http://johnsalvatier.org/blog/2017/reality-has-a-surprising-amount-of-detail">Reality has a surprising amount of detail</a>, after all. You can cover the expected happy paths easily with evals, but soon users will create plenty of paths you wouldn&#x27;t have thought of.</p><p>What we&#x27;ve found even more important than raw evals: looking at real usage, and evaluating the agent&#x27;s work ad-hoc. For this, we&#x27;ve been running <strong><em>Traces Hour</em></strong> - a weekly gathering of the PostHog AI team focused 100% on analyzing LLM traces from production, i.e. real user interactions. (Plug: <a href="https://posthog.com/llm-analytics">PostHog LLM analytics</a> is great for this.) Evals make the most sense when they stem from such investigations. Engineering is 10x&#x27;d when you grasp your users&#x27; experience, and this goes for building agents too.</p><h2 id="where-were-now">Where we&#x27;re now</h2><p>We&#x27;ve been using PostHog AI for months. It&#x27;s not perfect, but it handles the reality of product data: everything is interconnected. Events feed into sessions, sessions branch into errors, clicks overlap multiple paths – a bowl of tangled noodles.</p><p>PostHog AI untangles that structure and reconstructs a clean, logical sequence. We use it to debug SQL, understand user behavior, set up experiments, and analyze errors – work that would normally mean digging through multiple screens or writing queries.</p><p>Try it out now: <a href="https://app.posthog.com/">Open PostHog</a>, click &quot;PostHog AI&quot; in the top right, grant AI access to data (requires admin permissions), run <code>/init</code>, and start asking it to do things.</p><h2 id="up-next">Up next</h2><p>This is just the start. What&#x27;s coming: deep research capabilities, sophisticated session analysis, proactive insights from background analysis, and tighter integration with code. Over the next weeks and months we&#x27;ll be sharing far more of what we&#x27;ve learned too.</p><p>And if you find this exciting, so much that you&#x27;ve already built at least a toy agent – we&#x27;re hiring <a href="/careers/ai-product-engineer">AI Product Engineers</a>! There&#x27;s lots more we want to ship, and I&#x27;d love to have you on board. <a href="/careers/ai-product-engineer">Apply right here.</a></p><p><strong>PostHog AI – for builders, from builders.</strong></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why we killed our AI product assistant]]></title><description><![CDATA[jk, we didn't really do that. Like everyone else, our AI journey started with a chatbot. From the first “you're absolutely right!” it crawled, then…]]></description><link>https://posthog.com/blog/why-we-killed-our-ai-product-assistant</link><guid isPermaLink="false">80cf356a-db3b-596f-a62e-d883b4b27b34</guid><dc:creator><![CDATA[Cleo Lant]]></dc:creator><pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/why_we_killed_our_ai_assistant_9e9565192e.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><em>jk, we didn&#x27;t really do that.</em></p><p>Like everyone else, our AI journey started with a chatbot. From the first “you&#x27;re absolutely right!” it crawled, then walked, then became a lanky teenager with confidently wrong opinions.</p><p>Our beloved hedgehog, Max, was the face that greeted you at every AI interaction. It kept learning, and eventually grew into a very capable product assistant. We learned a lot about <a href="/newsletter/building-ai-features">building AI-powered features</a> along the way. </p><p><strong>The problem:</strong> Even as we added AI capabilities across the platform, people still thought of Max AI as &quot;the chat bot.&quot; The broader vision (AI woven through every product) wasn’t landing.</p><p>We didn&#x27;t want to be another company with <a href="https://posthog.com/newsletter/marketing-for-devs">hand-wavy marketing</a> like “it&#x27;s not just a chat bot, it&#x27;s… [insert amazing AI capability here]”, which meant we needed to rethink how we positioned our AI capabilities in the minds of our users.  </p><h2 id="the-assistant-becomes-the-architect">The assistant becomes the architect</h2><p>Lots of beta users loved Max, but a comparison that kept coming up internally was Clippy; a paperclip animated assistant from Microsoft Office in the late 90’s, known for its intrusive, and unhelpful pop-ups (It was widely disliked and was removed in Office 2007).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/0822_SM_Clippy_help_o6nlh3_49954d3c4c.webp" alt="automation screenshot"/></p><p><div>Clippy was ahead of its time. Prove me wrong.</div></p><p>Clippy was the Kool-Aid Man busting through your wall; Max AI was opt-in and useful, but still it&#x27;s an important lession in perception. Product assistants don’t work when they feel like a novelty UI. Whether users see your AI as a gimmick or a genuine tool is something you have to own, especially if you&#x27;re building an AI-native product. </p><p>Deciding how to address this was a hot topic at PostHog. A single Slack thread blew up with over 90 comments! The discussion was pretty intense, hitting on all the key angles from engineering to marketing. Did the mascot add to the user experience, or did it doom perception of PostHog AI as <a href="/blog/ai-community-answers">‘just a chat bot&#x27;</a>.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/Screenshot_2025_11_10_at_3_05_26_PM_b886c5699e.png" alt="automation screenshot"/></p><p>In the end, we decided to axe Max. Not because we hate joy (we like it so much we <a href="/blog/why-os">risked tanking our conversion rate</a>). We did it because the mascot was a limiting factor.</p><p>Max AI became PostHog AI. Not just a character that lives in one corner, but the underlying architecture of PostHog product intelligence (sorry for sneaking a ‘not just’ statement in there).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/Operation_Axe_Max_dcde574e08.png" alt="automation screenshot"/></p><p><div>Don’t worry, we asked Max if he was ok with it. He said it was our call</div></p><h2 id="why-our-ai-got-noticeably-better-since-beta">Why our AI got noticeably better since beta</h2><p>Long before this pivot, and as it was happening, the real work of improving PostHog AI was happening deep within PostHog. The <div slug="posthog-ai"></div> was building a shared infrastructure with the same philosophy as <a href="/docs/sql">PostHog SQL</a>: a single system for each small team to extend.</p><p><strong>Without it:</strong> </p><ul><li>fragmented experience</li><li>duplicated effort</li><li>maintenance nightmare</li><li>Teams stuck building simple features from scratch instead of advanced stuff by default</li></ul><p><strong>With it:</strong> </p><ul><li>shared agent system any product can extend</li><li>reusable components that work everywhere</li><li>consistent UX patterns</li><li>platform-level improvements that benefit everyone automatically</li></ul><p>Overhauling the guts was a good move. It enables deterministic tool‑calling, tighter context packing, and fine-tuned reasoning. </p><p>Translation: fewer “sorry I can’t do that yet” moments, faster replies, cheaper inference. </p><p>Key differences from older architectures:</p><ul><li><strong>Less hallucination</strong>: The agent always checks your data before giving an answer</li><li><strong>Full visibility</strong>: All tool calls are visible to the agent throughout the conversation</li><li><strong>Maintained context</strong>: The agent remembers every decision it made and can build on them</li><li><strong>Explainable</strong>: Chain-of-thought is visible and easy for you to investigate</li></ul><p>What PostHog AI can do now:</p><ul><li><strong>Search and filter</strong>: Find insights, filter session recordings, search documentation</li><li><strong>Create and modify</strong>: Build dashboards, create insights, set up surveys</li><li><strong>Write SQL</strong>: Generate and debug PostHog SQL queries for custom analysis</li><li><strong>Configure and Test</strong> Set up and validate feature flags and experiments</li><li><strong>Teach you PostHog</strong>: Explain how features work, recommend best practices, and clarify terms</li></ul><p><em>Interested in a technical deep-dive? Peep our <a href="/handbook/engineering/ai/architecture">AI platform architecture</a></em></p><h2 id="how-this-changes-who-can-use-posthog">How this changes who can use PostHog</h2><p>As a company, we’re well known for our <a href="/newsletter/ideal-customer-profile-framework">ICP discipline</a>. Knowing who you’re building for is important — it keeps teams focused, docs clean, and marketing honest. But as PostHog AI matures, we need to keep an eye on the expanding circle.</p><p>Tools like Cursor, Replit, and automation platforms such as Make or n8n are built with technical users in mind. Yet their intuitive interfaces also draw in less technical users — people who might not code every day but still have real <a href="/newsletter/how-to-uncover-your-users-real-problems">problems to solve</a> and <a href="/blog/workflows-alpha">workflows to automate</a>.</p><p>That’s not exactly our goal with PostHog AI.</p><p>We’re doubling down on technical users. PostHog AI helps them move faster by automating the tedious parts, connecting insights across products, and turning analysis into “what should I work on next?”</p><p><strong>A nice side effect</strong>: it also makes PostHog easier for everyone around them. PMs can self-serve data, marketers can ask smarter questions, and analysts can spend less time as human middleware.</p><div class="flex justify-center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_500,c_limit,q_auto,f_auto/Post_Hog_AI_ICP_9d952d17ae.png" alt="PostHog AI ICP" class="rounded"/></div><p><div>A common piece of feedback we hear during user interviews is that PostHog AI helps with adoption of PostHog across the org.</div></p><h2 id="build-systems-not-assistants">Build systems, not assistants</h2><p>Assistants are what you build when intelligence sits <em>next</em> to your product. Systems are what you build when intelligence becomes <em>part of it</em>.</p><p>For us, that meant letting go of Max as a mascot in order to shape the perception of PostHog AI as an architecture that connects everything together. It reasons across data, automates work, and makes each part of the product a little smarter.</p><p>Some folks miss the personality:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Post_Hog_AI_name_crit_9b7a2449b6.png" alt="automation screenshot"/></p><p>But most people won’t care, so long as the tool makes their workflow better:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/hype_example_e74c3fed7c.png" alt="automation screenshot"/></p><h2 id="try-it">Try it</h2><p><a href="/docs/posthog-ai/allow-access">Enable PostHog AI</a> and ask it a question you actually care about this week. Need some inspiration? Check out our <a href="/docs/posthog-ai/example-prompts">example prompts</a>.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Workflows graduate to beta! Product data, meet automation]]></title><description><![CDATA[When we first introduced  Workflows (in alpha) , it was still a bit rough around the edges, and many of you were brave enough to test it. Since then…]]></description><link>https://posthog.com/blog/workflows-beta</link><guid isPermaLink="false">14dd7e08-1585-5b3d-ba91-d716723f46cd</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/workflows_beta_cover_a04e206b7a.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When we first introduced <a href="/blog/workflows-alpha">Workflows (in alpha)</a>, it was still a bit rough around the edges, and many of you were brave enough to test it. Since then, we’ve spent a lot of time fixing, refining, and adding power where it counts.</p><p>Now, Workflows has officially graduated to beta.</p><p>So, what does that mean in practice? You can finally automate product-led actions, like sending emails, updating properties, or triggering Slack alerts, directly from your PostHog data. No syncing tools, no duct-taped integrations, no API key scavenger hunts.</p><p>Everything runs on the same event data you already track. Want to send a welcome email when a user completes onboarding? You can build the email and trigger it with an event or a delay. Want to adding branching logic based on their upgrade path? You can do that too.</p><p>Workflows now support a range of actions:</p><ul><li>Send emails, from simple notifications to full <a href="/docs/workflows/email-drip-campaign">drip campaigns</a></li><li>Trigger Slack messages or webhooks based on live product events</li><li>Add delays, conditions, and branches to control when and how actions fire</li><li>Update user properties or trigger events as part of your automation</li></ul><p>If you’ve used Zapier, Make, Brevo, Active Campaign or similar tools before, the idea will feel familiar, but this time, everything happens inside PostHog. It’s faster, more reliable, and you don&#x27;t need to send data to third-party platforms.</p><p>Teams like <a href="/customers/grantable">Grantable</a> are already seeing the benefits. Evan Rallis, who leads product &amp; growth there, told us:</p><blockquote><p>“PostHog Workflows just lives on top of the event data and the amazing user data you already have. The setup was incredibly easy.”</p></blockquote><p>Evan said it&#x27;s almost twice as fast to build automations in Workflows than with other tools, in part because he doesn&#x27;t need to switch to a third-party tool and wait for data to sync.</p><p>Workflows are still free during beta, so now’s a good time to experiment. Try building something small – maybe an onboarding reminder, a feedback request, or a Slack alert when a user hits a key milestone.</p><p>You can learn more in the <a href="/docs/workflows">docs</a> or jump straight into launching your first <a href="https://app.posthog.com/workflows">workflow</a>.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best Rollbar alternatives & competitors, compared]]></title><description><![CDATA[Rollbar is one of the most dependable tools for catching errors in production. It's lightweight, integrates easily with most frameworks, and gives…]]></description><link>https://posthog.com/blog/best-rollbar-alternatives</link><guid isPermaLink="false">6db8699c-97c7-5e0c-bc7c-788610f9344c</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Rollbar is one of the most dependable tools for catching errors in production. It&#x27;s lightweight, integrates easily with most frameworks, and gives developers real-time visibility into what&#x27;s breaking.</p><p>Developers like Rollbar because it&#x27;s simple and reliable, but simplicity only gets you so far. As your product grows, so does the need for context, and some of the <a href="/blog/best-error-tracking-tools">best error tracking tools</a> available today go beyond traditional error reporting by combining debugging context, session replay, and observability in one place. </p><p>In this guide, we&#x27;ll take a closer look at some of the best Rollbar alternatives, including tools with broader capabilities.</p><h2 id="best-rollbar-alternatives">Best Rollbar alternatives</h2><h3 id="1-posthog">1. PostHog</h3><p>PostHog is a developer platform that goes far beyond just <a href="/error-tracking">error tracking</a>. It combines <a href="/product-analytics">product analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/llm-analytics">LLM analytics</a>, <a href="/surveys">surveys</a>, and more, giving developers visibility into what went wrong and why.</p><p>Instead of showing only stack traces, PostHog links errors to real user sessions. You can replay the exact actions that caused the issue, see what users did before the crash, and trace frontend behavior back to backend exceptions.</p><p>PostHog&#x27;s <a href="/pricing">pricing is transparent and usage-based</a>, with 1 million events and 5000 replays free each month. More than 90% of companies use it for free!</p><p><strong>Choose PostHog if:</strong> You want to consolidate your stack and stop paying for six different tools.</p><h4 id="posthog-vs-rollbar">PostHog vs Rollbar</h4><div competitors="posthog,rollbar"></div><details><summary>Main differences between PostHog and Rollbar</summary><ul><li>PostHog ties every exception to a real user session and product data. Rollbar just shows you the error.  </li><li>PostHog is open source with a public roadmap and MIT license. Rollbar is proprietary and cloud-only.  </li><li>PostHog uses simple usage-based pricing with generous free tiers. Rollbar pricing scales by error volume and plan tier.</li></ul></details><details><summary>Main similarities between PostHog and Rollbar</summary><ul><li>Both capture and aggregate exceptions in real time.  </li><li>Both integrate with popular frameworks, GitHub, and Slack.  </li><li>Both support alerting and triaging across environments.</li></ul></details><h3 id="2-sentry">2. Sentry</h3><p>Sentry is one of the most established names in error tracking; it&#x27;s mature, reliable, and most developers have used it at some point. </p><p>Known for its precise stack traces, powerful grouping, and strong integrations across frontend and backend frameworks, Sentry also offers performance monitoring, so you can spot slow transactions and bottlenecks alongside exceptions.</p><p>Its open-source roots make it transparent, and self-hosting is an option for teams that need full control over their data. For most users, though, the managed Cloud version is easier to run – just expect the bill to climb as you scale.</p><p><strong>Choose Sentry if:</strong> You need a reliable, mature error monitoring tool with broad framework support and rich traces.</p><h4 id="sentry-vs-rollbar">Sentry vs Rollbar</h4><div competitors="sentry,rollbar"></div><details><summary>Main differences between Sentry and Rollbar</summary><ul><li>Sentry includes built-in performance monitoring; Rollbar focuses only on error tracking.  </li><li>Sentry offers both a self-hosted open-source option and a managed Cloud service; Rollbar is fully proprietary and cloud-only.  </li><li>Sentry&#x27;s UI is built for large teams juggling multiple projects; Rollbar&#x27;s simplicity works better for smaller setups.</li></ul></details><details><summary>Main similarities between Sentry and Rollbar</summary><ul><li>Both provide real-time error detection, grouping, and notifications.  </li><li>Both integrate with GitHub, Slack, and CI/CD tools.  </li><li>Both support wide language and framework coverage.</li></ul></details><h3 id="3-logrocket">3. LogRocket</h3><p>LogRocket also focuses on helping developers and product teams understand what users actually did before an error occurred. It combines session replay, network and console logs, and performance metrics in one interface.</p><p>By pairing replay with detailed technical data, LogRocket helps frontend developers reproduce and fix issues faster, without needing to guess or wait for user screenshots. It&#x27;s especially useful for JavaScript-heavy apps, SPAs, and UX troubleshooting.</p><p>LogRocket doesn&#x27;t cover backend or server-side error tracking, so you&#x27;ll still need another tool for your API layer.</p><p><strong>Choose LogRocket if:</strong> You&#x27;re debugging gnarly frontend issues and need to see exactly what users clicked.</p><h4 id="logrocket-vs-rollbar">LogRocket vs Rollbar</h4><div competitors="logrocket,rollbar"></div><details><summary>Main differences between LogRocket and Rollbar</summary><ul><li>LogRocket emphasizes frontend debugging with visual replays; Rollbar focuses on backend error tracking.  </li><li>LogRocket captures user interactions, network calls, and console logs; Rollbar tracks server exceptions.  </li><li>LogRocket&#x27;s pricing is usage-based but not fully transparent; Rollbar provides tiered plans.</li></ul></details><details><summary>Main similarities between LogRocket and Rollbar</summary><ul><li>Both detect JavaScript errors and surface them with stack traces.  </li><li>Both integrate with alerting and collaboration tools like Slack and GitHub.  </li><li>Both are used by engineering teams to reduce debugging time.</li></ul></details><h3 id="4-datadog">4. Datadog</h3><p><a href="/blog/best-datadog-alternatives">Datadog</a> is a full observability platform combining application performance monitoring (APM), logs, metrics, traces, and error tracking. Its Real User Monitoring (RUM) connects frontend sessions with backend traces to show the full blast radius of a crash or slowdown.</p><p>While Datadog&#x27;s depth and integrations are unmatched, its complexity and cost make it more suited to enterprise-scale teams than startups. Still, it does a great job at providing a single pane of glass across infrastructure, application performance, and user behavior.</p><p>If you&#x27;re already using Datadog for metrics or APM, enabling its error tracking and RUM modules can help unify your monitoring stack.</p><p><strong>Choose Datadog if:</strong> You&#x27;re at enterprise scale and need a single pane of glass across infrastructure, application performance, and user behavior.</p><h4 id="datadog-vs-rollbar">Datadog vs Rollbar</h4><div competitors="datadog,rollbar"></div><details><summary>Main differences between Datadog and Rollbar</summary><ul><li>Datadog covers full-stack observability (APM, logs, metrics); Rollbar focuses only on application errors.  </li><li>Datadog&#x27;s RUM module includes replay-like functionality with performance data; Rollbar doesn&#x27;t offer this.  </li><li>Datadog is enterprise-grade with enterprise pricing; Rollbar is lighter-weight and easier to set up.</li></ul></details><details><summary>Main similarities between Datadog and Rollbar</summary><ul><li>Both provide real-time exception alerts.  </li><li>Both integrate with popular frameworks and deployment tools.  </li><li>Both support team collaboration via dashboards and notifications.</li></ul></details><h3 id="5-bugsnag">5. Bugsnag</h3><p>Bugsnag centers around application stability. It measures crash-free sessions and release health to show how each deployment affects users, and uses a stability score to help you prioritize the most impactful issues first.</p><p>The platform&#x27;s mobile SDKs are excellent, particularly strong for mobile teams that need visibility into release regressions and app performance. Bugsnag supports frontend and backend frameworks too, but its mobile game is where it really shines.</p><p>Bugsnag is developer-friendly, but unlike PostHog or Sentry, it doesn&#x27;t include replay or analytics features; it&#x27;s laser-focused on stability instead.</p><p><strong>Choose Bugsnag if:</strong> You&#x27;re a mobile or web team focused on app stability, crash-free sessions, and release health tracking.</p><h4 id="bugsnag-vs-rollbar">Bugsnag vs Rollbar</h4><div competitors="bugsnag,rollbar"></div><details><summary>Main differences between Bugsnag and Rollbar</summary><ul><li>Bugsnag focuses on stability metrics and release health; Rollbar centers on raw error tracking.  </li><li>Bugsnag&#x27;s mobile SDKs are significantly better than Rollbar&#x27;s.  </li><li>Bugsnag visualizes the impact of each deployment; Rollbar lacks release-based insights.</li></ul></details><details><summary>Main similarities between Bugsnag and Rollbar</summary><ul><li>Both detect, group, and alert developers to errors in real time.  </li><li>Both integrate with popular languages, frameworks, and version control systems.  </li><li>Both are designed to reduce MTTR (mean time to resolution).</li></ul></details><h3 id="6-airbrake">6. Airbrake</h3><p>Airbrake is one of the earliest error tracking tools and, similar to Rollbar, remains popular for its simplicity and low overhead. It gives you basic aggregation, trend tracking, and notifications, nothing fancy, nothing confusing.</p><p>Setup is quick, SDKs cover most major languages, and the UI focuses on what small teams need most: catching and resolving exceptions fast.</p><p>Airbrake lacks features like session replay or performance monitoring, but its straightforward approach and affordable plans make it ideal for smaller apps or early-stage startups.</p><p><strong>Choose Airbrake if:</strong> You&#x27;re a small team or startup that needs simple, affordable error tracking without enterprise complexity.</p><h4 id="airbrake-vs-rollbar">Airbrake vs Rollbar</h4><div competitors="airbrake,rollbar"></div><details><summary>Main differences between Airbrake and Rollbar</summary><ul><li>Airbrake is simpler and cheaper; Rollbar offers more advanced automation and grouping.  </li><li>Airbrake&#x27;s interface and setup are lighter-weight; Rollbar&#x27;s dashboard provides more configuration options.  </li><li>Airbrake is better suited to small projects; Rollbar scales better for enterprise needs.</li></ul></details><details><summary>Main similarities between Airbrake and Rollbar</summary><ul><li>Both capture and report errors in real time.  </li><li>Both integrate with GitHub, Slack, and most major frameworks.  </li><li>Both just work.</li></ul></details><h2 id="which-rollbar-alternative-should-you-choose">Which Rollbar alternative should you choose?</h2><ul><li>Want an all-in-one platform that ties errors to user sessions, analytics, flags, experiments, and more? Go with <strong>PostHog</strong>.  </li><li>Need deep stack traces and performance tracing? <strong>Sentry</strong> is the mature choice.  </li><li>Debugging difficult frontend issues? Pick <strong>LogRocket</strong>.  </li><li>Enterprise-scale observability? <strong>Datadog</strong> ties everything together.  </li><li>Mobile team tracking release health? Choose <strong>Bugsnag</strong>.  </li><li>Small team or early-stage startup? <strong>Airbrake</strong> keeps things simple and affordable.</li></ul><h2 id="faq">FAQ</h2><details><summary>What is Rollbar used for?</summary><p>Rollbar is an error tracking platform that helps developers detect, group, and monitor exceptions in real time. It&#x27;s popular for its simplicity, strong SDK support, and instant error alerts across environments.</p></details><details><summary>Why look for Rollbar alternatives?</summary><p>As teams grow, they often need tools that go beyond just catching errors, such as session replay, analytics, or observability. Rollbar excels at alerting, but modern tools like <strong>PostHog</strong> and <strong>Sentry</strong> provide more context for debugging and measuring user impact.</p></details><details><summary>What&#x27;s the best Rollbar alternative overall?</summary><p><strong>PostHog</strong> is the best all-around Rollbar alternative for most teams. It combines error tracking with session replay, product analytics, feature flags, and A/B testing, giving developers a complete view of both the technical issue and its user impact.</p></details><details><summary>Which Rollbar competitor is open source?</summary><p>Both <strong>PostHog</strong> and <strong>Sentry</strong> have open-source roots. PostHog is fully MIT-licensed with a public roadmap, while Sentry offers a self-hosted option alongside its cloud service.</p></details><details><summary>Is Rollbar still a good choice?</summary><p>Yes. Rollbar is fast, simple, and reliable. But if you&#x27;re scaling, need replay or analytics, or want more context around crashes, other tools may serve you better.</p></details><details><summary>Which Rollbar alternative includes session replay?</summary><p><strong>PostHog</strong> and <strong>LogRocket</strong> both include session replay features, so you can watch exactly what users did before an error occurred.</p></details><details><summary>What&#x27;s the cheapest alternative to Rollbar?</summary><p><strong>Airbrake</strong> is the most budget-friendly option for small projects. <strong>PostHog</strong> is also cost-effective thanks to its generous free tier and transparent usage-based pricing.</p></details><br/><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Workflows are now in Alpha and I already broke mine]]></title><description><![CDATA[We've been building  Workflows  for a while now: this is our Zapier-style automation builder you can use to trigger actions based on live user…]]></description><link>https://posthog.com/blog/workflows-alpha</link><guid isPermaLink="false">03bcb9be-e5b9-5dc8-a6af-1d1f3eacb96b</guid><dc:creator><![CDATA[Sara Miteva]]></dc:creator><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/this_is_fine_6336efb0ae.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We&#x27;ve been building <strong><a href="https://posthog.com/docs/workflows">Workflows</a></strong> for a while now: this is our Zapier-style automation builder you can use to trigger actions based on live user behavior. And, while it’s still in its early days, it’s already packing some serious muscle.</p><p>You can define triggers (like “user viewed this page” or “performed this event”), add logic (delays, splits, or exit conditions), and finish with actions — such as sending an email, updating a property, or firing an event to another tool.</p><p>Everything you automate runs on live product data — who clicked what, which feature they used, and how recently. Because it’s built into PostHog, there’s no syncing or connectors to manage.</p><p>This direct link to behavioral data is <a href="https://posthog.com/customers/grantable">what customers say makes the biggest difference</a>:</p><blockquote><p>“PostHog Workflows just lives on top of the event data and the amazing user data you already have. The setup was incredibly easy.”<br/>
— Evan Rallis, Head of Product &amp; Growth at Grantable</p></blockquote><p>Channel-wise you’re already live with <strong>email</strong> (and Slack, Twilio, etc. coming soon) – and you can tie in any real-time destination you have set up.</p><p>No fragile API scripts or custom backend logic required – just build visually, publish, and let it run.  It&#x27;s so simple even a marketer can build with it, so I decided to try it out. </p><h2 id="what-i-built">What I built</h2><p>As a product marketer working on this product, I immediately started thinking about how we could dogfood it, so I set up an automation that resulted in some unexpected outcomes. </p><p>Here’s what my very simple test campaign looked like:
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/workflows_alpha5_87ccea24d4.png" alt="automation screenshot"/></p><h3 id="trigger">Trigger</h3><p>This is where you choose who gets to enter your automation. I chose a Pageview event – meaning everyone who comes to the URL that contains workflows will enter this flow.
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/workflows_alpha6_e74b0b9d8a.png" alt="trigger screenshot"/></p><p>The issue was that I hadn&#x27;t limited how often someone could enter it. The default was once every 30 minutes. We added this capability after I had created this workflow, and totally missed to edit it. </p><p>So, if someone refreshed the page a few times, the workflow happily sent them another <em>“test test test.”</em></p><h3 id="delay">Delay</h3><p>I added a delay of four days before sending the email — a friendly reminder for users who’d visited the page recently.</p><p>You can add conditions or fallback actions here if something fails, but I didn’t (because what could possibly go wrong?).
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/workflows_alpha7_68e4f7ac0d.png" alt="delay screenshot"/></p><h3 id="email">Email</h3><p>The email editor is a simple, visual builder for creating and testing automated emails triggered by user behavior.  </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/email_editor_scr_1b5a96b84b.png" alt="email editor screenshot"/></p><p>You can personalize fields, add dynamic properties, and drag in elements like text, buttons, or images while previewing the result on desktop or mobile.</p><p>Here&#x27;s the email I sent:
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/workflows_alpha1_04ea076a13.png" alt="workflows email"/></p><h2 id="when-it-broke">When it broke</h2><p>On Monday morning after setting up the campaign, I was happy and caffeinated, walking to my coworking space, feeling productive and ready for the week. </p><p>I was genuinely excited to see how users would react to my campaign from the previous week.  Maybe I&#x27;d get some quick replies or some feedback!</p><p>And… I got replies all right - but not quite the kind I expected.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/grouped_test_f1ecac3667.png" alt="reply to my email 1"/></p><p>So, yes, my workflow worked – but a little too well. </p><p>Luckily, only a few users experienced the mini spam storm, and most took it as a joke (thankfully reducing my panic level from “delete everything” to “mild existential dread”). Once I had stopped laughing/crying, I fixed it and learned something useful in the process.</p><p><strong>Lesson learned:</strong> always double-check your entry conditions.
And maybe… don’t test live workflows before your second coffee.</p><h2 id="what-we-learned">What we learned</h2><p>This mistake actually turned into great feedback. </p><p>People loved how easy it was to build automated flows using their own PostHog data – sending messages, triggering logic, or running any action you can imagine. </p><p>This even helped me identify users who were real fans of Workflows. We invited them for interviews, got some use cases from them, and they provided some very useful feedback. <em>So, it turned out to be a win after all.</em>
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/workflows_alpha11_914d2caad1.png" alt="positive response 1"/>
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/workflows_alpha10_15acaba857.png" alt="positive response 2"/></p><p>Since it’s in alpha, coming to beta soon, it’s free for you to try now, and we’d love to have you <a href="https://app.posthog.com/workflows">kick the tyres as we refine it</a>.</p><p>Just maybe set your entry limits first.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[I've consistently underestimated how important communication is as a CEO]]></title><description><![CDATA[We take pride in investing as much as possible in our ability to ship cool projects and not in hiring a gazillion managers. As a result, we only have…]]></description><link>https://posthog.com/blog/ceo-diary-6</link><guid isPermaLink="false">c3c5f6b2-70dc-5d57-859d-91b8c4a62fdc</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We take pride in investing as much as possible in our ability to ship cool projects and not in hiring a gazillion managers. As a result, we only have an exec team of 5 (AKA <div slug="blitzscale"></div>), with roughly 150 people working here. And that includes Tim and me as half of this team. Everyone else is doing a ton of individual contributor work.</p><p>As we&#x27;ve grown, I&#x27;ve repeatedly underestimated how sharply the importance of communication from the exec team increases. I up the effort, but the requirement ups by more each time we grow, despite knowing it&#x27;s important. I&#x27;ve even had feedback in <a href="/handbook/people/feedback">360 reviews</a> of &quot;if you did nothing else, just do a good job of the all-hands and that&#x27;d be great&quot;.</p><p>The number of people each exec is responsible for is increasing exponentially <a href="/newsletter/building-a-startup-that-scales">as we scale</a>. In the early days, we had zero direct or indirect reports each, at 15 people, we had roughly 8 people per exec. Today, it&#x27;s around 35. By the next big offsite, it will be around 80.</p><p>There are unfortunate consequences of this: </p><ul><li>Less communication is felt </li><li>It seems more out of the blue</li><li>Everyone thinks it has come from &quot;more DMs&quot;. </li></ul><p>This can make things seem disjointed. The reality is — we&#x27;ve kept up about the same level of public communication, and really don&#x27;t suddenly hold lots of secret meetings, but the team or individual level comms are now further removed from an &quot;unrelated&quot; employee (since you can&#x27;t be buddies with 149 other people), who is more likely as a result to be blindsided by a change we&#x27;ve decided to make. That doesn&#x27;t feel good for anyone.</p><h2 id="not-knowing-everything-that-is-happening">Not knowing everything that is happening</h2><p>When we&#x27;re tiny, it&#x27;s very easy for each exec to know, and be involved in, pretty much everything that is happening. At our current scale, there is too much for one person to hold it all in their head at a meaningful level of depth. Some people are better at this than others.</p><p>Seeing this, the way we&#x27;ve divided the work is based on skills — <a href="/community/profiles/28693">Raquel</a>, <a href="/community/profiles/28625">Charles</a>, and <a href="/community/profiles/30205">Ben</a> on the exec team are exceptionally good at handling a larger number of people and projects. <a href="/community/profiles/27730">Tim</a> and <a href="/community/profiles/27732">I</a> are better at things that need to go from 0 to 1. This has worked well for the four of us, each enjoying their role and being good at it.</p><p>One of the mistakes I think <em>I</em> have been making is talking in all-hands mostly about the projects I am focused on (a lot of AI). However, this doesn&#x27;t reflect the bulk of the daily work at the company. The other stuff does greatly matter but I&#x27;ve not felt like an expert in it.</p><h2 id="clarity-vs-transparency">Clarity vs transparency</h2><p>It feels easier to make a mess inside a bigger company — it&#x27;s pretty easy to just chuck 3 other people on a call and hash out something if things get messy, since everyone has all the context. At 150, you can&#x27;t do that.</p><p>I&#x27;ve tried to be a little clearer when I communicate because of this. However, that often means <em>less</em> communication (it takes time to make things more polished) <em>and</em> it is less transparent — I&#x27;m not sharing half baked thoughts quite so much.</p><p>Tim and I think we should share these ideas a little earlier, and in a way that solicits feedback — we think we&#x27;ve tried too hard to be polished, and frankly to make changes &quot;quickly&quot; without lots of committees and consensus, which is creating too much &quot;top down&quot; communication and not making us quicker as a result.</p><h2 id="so-what-are-you-going-to-do-about-it">So, what are you going to do about it?</h2><p>Ok, hypothetical h2 tag voice, there is a solution.</p><p>I will balance the content of the <a href="/handbook/exec/all-hands-topics">all-hands</a> more. If I don&#x27;t have the depth to really nail a topic, I will get other people involved.</p><p>When we have big ideas for changes, we&#x27;ll solicit feedback on them when they&#x27;re not 100% watertight as ideas. We&#x27;ll reduce the level of polish and increase the level of transparency (and mess, at times).</p><p>Beyond that, a little <em>more</em> time on communication is likely worth it. That doesn&#x27;t mean more meetings, it means a reminder to myself mostly to write down thoughts and to share them publicly. Like this one.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we made feature flags even faster and more reliable]]></title><description><![CDATA[Feature flags  are high stakes. An outage affects not only our customers, but our customer's customers, who's experience it impacts. When flags are…]]></description><link>https://posthog.com/blog/even-faster-more-reliable-flags</link><guid isPermaLink="false">45f59603-b55e-5ba4-b704-1702f3271967</guid><dc:creator><![CDATA[Dylan Martin]]></dc:creator><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/flags_c5beffa331.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><a href="/feature-flags">Feature flags</a> are high stakes. An outage affects not only our customers, but our customer&#x27;s customers, who&#x27;s experience it impacts. When flags are slow, our customer&#x27;s entire application slows down. Unreliability doesn&#x27;t just make us look bad, but our customers too.</p><p>We&#x27;ve <a href="/blog/how-we-improved-feature-flags-resiliency">written before</a> about making PostHog&#x27;s feature flags more resilient through local evaluation, caching strategies, and architectural improvements. Those improvements worked well, but as we&#x27;ve grown significantly over the past two years, we hit new scaling challenges that required a more fundamental rework.</p><p>This post is about the next chapter: how we completely rewrote our feature flag evaluation service from scratch in Rust to make it faster and more reliable.</p><h2 id="why-rewrite-our-feature-flag-service">Why rewrite our feature flag service?</h2><p>Our previous work focused on architectural patterns like <a href="/docs/feature-flags/local-evaluation">local evaluation</a>, caching, and graceful degradation. Those improvements worked well, but the core Django-based service still had fundamental bottlenecks that no amount of optimization could fix.</p><p>The problems fell into a few categories:</p><p><strong>Technical debt had accumulated over time.</strong> Database queries were doing heavy lifting that belonged in application code. Cohort evaluations required expensive joins across multiple tables. Most critically, we were evaluating flag conditions inside database queries rather than in memory, which meant every flag evaluation required parsing conditions in SQL and transferring more data than necessary.</p><p><strong>We were hitting hard efficiency limits.</strong> The Django service was handling ~500k requests per minute but required 300 pods to do so, costing around $8k per month just for compute resources. That&#x27;s a lot of money for what should be a relatively simple operation.</p><p><strong>Reliability was still fragile.</strong> The service relied heavily on PgBouncer for connection pooling, which introduced complexity and additional failure modes. We lacked proper code-level timeout primitives and were relying on PgBouncer settings that were clunky and often failed during database slowdowns, leading to cascading failures.</p><p>When we looked at projections for 5x-ing our current load, the math didn&#x27;t work. We needed a fundamentally different approach.</p><h2 id="what-changed">What changed</h2><h3 id="we-rewrote-it-in-rust">We rewrote it in Rust</h3><p>Moving from Django to Rust was a significant decision that we didn&#x27;t take lightly. We evaluated several options:</p><ul><li><strong>FastAPI with async Python</strong> would have been the easiest migration path, reusing business logic, but offered limited performance gains and still lacked good timeout primitives.</li><li><strong>Node.js with HyperExpress</strong> showed promising benchmarks but locked us into a C++ binding with a small community (1.3k GitHub stars), creating future maintenance risk.</li><li><strong>Rust with axum</strong> required starting from scratch but offered the best long-term characteristics.</li></ul><p>The benchmark differences were stark: Rust&#x27;s axum framework was achieving ~32k requests per second compared to Django&#x27;s ~1.5k—a 21x throughput improvement. But beyond raw performance, Rust offered several advantages crucial for flag infrastructure:</p><p>The language&#x27;s type system makes it much harder to write buggy code, which matters when you&#x27;re building infrastructure that thousands of applications depend on. We also had confidence from our capture service rewrite, where Rust had already demonstrated massive efficiency gains.</p><p>Most importantly, Rust gave us proper code-level timeout primitives, eliminating our problematic dependency on PgBouncer-level settings. No more relying on external connection pooling for reliability.</p><h3 id="we-moved-evaluation-logic-out-of-the-database">We moved evaluation logic out of the database</h3><p>The biggest architectural change was moving flag condition evaluation from SQL to application code. Previously, we were doing complex property matching inside database queries, which required expensive joins and data transfers.</p><p>Now we:</p><ol><li>Fetch all relevant person properties in a single query at the start of each request</li><li>Evaluate all flag conditions in memory, in parallel</li><li>Return results without additional database round-trips</li></ol><p>This front-loads the database work while moving CPU-intensive evaluation logic to where it belongs – in application code that can leverage multiple cores effectively. It also means we&#x27;re transferring less data and can cache person properties more effectively.</p><h3 id="we-implemented-app-level-cohort-caching">We implemented app-level cohort caching</h3><p><a href="/docs/data/cohorts">Cohort-based flags</a> were some of our slowest queries because they required complex joins to determine membership. We now cache cohort membership at the application level rather than computing it on-demand for every flag evaluation.</p><p>This eliminated one of our biggest performance bottlenecks and made cohort-based flags just as fast as simple property-based flags.</p><h3 id="we-simplified-the-architecture">We simplified the architecture</h3><p>We removed PgBouncer from the deployment entirely. Fewer moving parts means fewer things that can break, and much simpler debugging when they do.</p><p>The new service connects directly to the database with proper connection pooling built into the Rust application itself, giving us much better control over timeouts and error handling.</p><h2 id="results">Results</h2><p>The improvements were immediate and substantial:</p><p><strong>Performance gains:</strong></p><ul><li>p99 latency: 904ms → 85.4ms (10.6x faster, 90.5% reduction)</li><li>p95 latency: 381ms → 42.9ms (8.9x faster, 88.7% reduction)  </li><li>p90 latency: 160ms → 31.2ms (5.1x faster, 80.5% reduction)</li><li>p50 latency: 21.7ms → 11.8ms (1.8x faster, 45.6% reduction)</li></ul><p>These aren&#x27;t just synthetic benchmarks—these are real-world improvements under production load with the same traffic patterns.</p><p><strong>Cost reduction:</strong></p><p>The efficiency gains were also substantial. Our Django service required ~300 pods to handle ~500k requests per minute at a cost of ~$8.8k/month. The new Rust service handles the same ~500k req/min using ~90 pods, costing around ~$2.8k/month.</p><p>That&#x27;s a 68% reduction in compute costs while serving identical traffic. The new service uses just 32% of the compute resources compared to the previous implementation.</p><p><strong>Reliability improvements:</strong></p><p>By decoupling flag evaluation from database performance, we&#x27;ve eliminated a major source of cascading failures. Even during periods of database pressure or maintenance, the flags service remains responsive.</p><p>Cohort-based flags, which were previously our achilles heel requiring complex joins, now resolve instantly from cache. The proper timeout handling means we fail fast and gracefully instead of hanging indefinitely when things go wrong.</p><p>In the 3 months after migrating to this new service, we had zero feature flag outages.<sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup></p><h2 id="what-this-rewrite-taught-us">What this rewrite taught us</h2><p>This rewrite reinforces a principle we&#x27;ve learned repeatedly at PostHog: sometimes the best optimization is doing less. Fewer database queries, fewer service dependencies, fewer opportunities for things to go wrong.</p><p>The performance gains are impressive, but the reliability improvements matter more. Feature flags are infrastructure that needs to be boring – predictable, fast, and invisible when working correctly. When flags start having issues, they don&#x27;t just affect your monitoring dashboards; they affect your customers&#x27; actual applications.</p><p>By simplifying the architecture and eliminating external dependencies like PgBouncer, we&#x27;ve built a system that&#x27;s much easier to reason about and significantly harder to break. It&#x27;s one of those rewrites where everything just works better.</p><h2 id="how-you-can-benefit-from-this-or-go-even-faster">How you can benefit from this (or go even faster)</h2><p>If you&#x27;re using PostHog&#x27;s feature flags, you&#x27;re already benefiting from these improvements automatically. No configuration changes, no migration steps – just better performance and reliability.</p><p>For even faster flag evaluation, consider enabling <a href="/docs/feature-flags/local-evaluation">local evaluation</a> for your server-side applications. While this rewrite dramatically improved <a href="/docs/api/flags">our <code>/flags</code> endpoint</a>, local evaluation eliminates network round-trips entirely by evaluating flags directly on your server. It&#x27;s the fastest possible way to evaluate flags, especially for high-traffic applications.</p><p>As we continue evolving our feature flag infrastructure, our focus remains on the fundamentals: making flags fast, reliable, and cost-effective. Because the best feature flag service is one you never have to think about.</p><div class="footnotes"><hr/><ol><li id="fn-1">Yes, I did curse myself by writing this <a href="https://github.com/PostHog/post-mortems/blob/main/2025-09-29-flags-is-down.md">and we had one last week</a>.<a href="#fnref-1" class="footnote-backref">↩</a></li></ol></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best session replay tools for developers, compared]]></title><description><![CDATA[Picture this: you've spent days building a feature. It looks perfect on dev and checks are green. You hit deploy, grab a coffee, and feel good about…]]></description><link>https://posthog.com/blog/best-session-replay-tools</link><guid isPermaLink="false">d8ef603f-693e-53f0-9459-95cba25a700c</guid><dc:creator><![CDATA[Natalia Amorim]]></dc:creator><pubDate>Sun, 30 Mar 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Picture this: you&#x27;ve spent days building a feature. It looks perfect on dev and checks are green. You hit deploy, grab a coffee, and feel good about it.</p><p>Then your inbox starts lighting up with support tickets.</p><p>You check the logs. Nothing.<br/>
You try to reproduce it yourself. Works on my machine.<br/>
You ask the user what they did. &quot;I don&#x27;t know, it just broke.&quot;</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/w_500,c_limit,q_auto,f_auto/gettyimages_946339470_640x640_1d2c0e210e.jpg" alt="Confusion illustration"/></p><p>This is when session replay tools save you. Instead of guessing, you get to watch exactly what happened: every click, every error, every network call that blew up.</p><p>In this guide, we&#x27;ll compare the best session replay tools for developers, what each one does well, where they fall short, and how to choose the right fit for your stack.</p><h2 id="what-features-do-you-need-in-your-session-replay-tool">What features do you need in your session replay tool?</h2><p>A good session replay tool gives you visibility into the real user experience. It shows where users click, what they see, which errors pop up, and how they move through your product.</p><p>Most solid tools include:</p><ul><li>Automatic DOM recording and playback  </li><li>Event timelines that let you jump to key actions  </li><li>Basic privacy controls like input masking and field hiding  </li><li>Frontend SDKs for modern frameworks  </li><li>Live or near real-time session availability  </li></ul><p>Developer-focused tools go further with:</p><ul><li><strong>Console and network capture</strong> so you can see which request failed or which error fired  </li><li><strong>Performance and frustration signals</strong> like rage clicks and layout shifts  </li><li><strong>Error tracking integration</strong> to trace an exception back to the exact replay  </li><li><strong>Analytics tie in</strong> so you can jump from funnels or user paths directly into sessions  </li></ul><p>Here&#x27;s how some of the most popular session replay tools compare:</p><p><div competitors="posthog,logrocket,fullstory,hotjar,openreplay,microsoft_clarity,replay_io"></div></p><h2 id="whats-the-best-session-replay-tool-for-developers">What&#x27;s the best session replay tool for developers?</h2><h3 id="1-posthog">1. PostHog</h3><p><a href="/">PostHog</a> is an all-in-one developer platform that goes beyond session replay by combining <a href="/product-analytics">product analytics</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/error-tracking">error tracking</a>, and even <a href="/llm-analytics">LLM analytics</a> in one place.</p><p>Each recording gives you the complete context including the related user, events, feature flag variant, and any triggered errors. You can watch what happened, inspect console logs and network calls, identify the issue, ship a fix behind a feature flag, and measure the impact without switching tools.</p><p>PostHog uses simple usage-based pricing with optional caps. The free tier includes 5,000 web sessions and 2,500 mobile sessions per month, which is enough for most early teams.</p><p><strong>Strengths:</strong></p><ul><li>Recordings with full user and event context  </li><li>Console, network, rage click, and performance tracking  </li><li>Usage-based pricing with optional billing caps  </li><li>Mobile support (iOS, Android, React Native, Flutter)  </li><li>Unified suite: analytics, feature flags, surveys, experiments, error tracking, LLM analytics, and more  </li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">PostHog is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Developers who want full context behind user behavior, and fast-growing startups that need a flexible, affordable platform that scales without locking them into multiple tools.</p></div></div><p><div></div></p><h3 id="2-logrocket">2. LogRocket</h3><p><a href="/blog/posthog-vs-logrocket">LogRocket</a> focuses on giving developers a clear, structured view of what happened during a user session. When something breaks, it shows the exact sequence of user actions along with DOM snapshots, console output, JS errors, network calls, and even Redux or Vuex state mutations.</p><p>It integrates well with existing systems too. You can open a replay from a Sentry issue, send logs to <a href="/blog/best-datadog-alternatives">Datadog</a>, and attach recordings directly to Jira tickets.</p><p>LogRocket supports both web and mobile apps, though the mobile replay experience isn&#x27;t as deep as the web version.</p><p><strong>Strengths:</strong></p><ul><li>Detailed session recordings with console, network, and state data</li><li>Strong framework coverage (React, Vue, Next.js)  </li><li>Solid integrations (Sentry, Datadog, Jira)  </li><li>Growing set of AI-powered features for analysis and debugging</li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">LogRocket is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Frontend engineers who want a replay tool packed with granular event data and AI insights.</p></div></div><h3 id="3-fullstory">3. FullStory</h3><p><a href="/blog/posthog-vs-fullstory">FullStory</a> is a heavyweight in the session replay space and is widely used by enterprise and product teams.</p><p>Its real strength is behavioral analytics: funnels, heatmaps, and journey mapping. Recordings are smooth and polished, though console and network data isn&#x27;t as deep as developer-focused tools.</p><p>It includes powerful search and segmentation features, letting teams filter by events, errors, form interactions, device types, and more. For large teams, the collaboration tools stand out too: shared notes, saved segments, and easy links for PMs and designers.</p><p><strong>Strengths:</strong></p><ul><li>Best-in-class behavioral analytics (funnels, journeys, heatmaps) </li><li>Strong UX and conversion analytics  </li><li>Advanced search and segmentation  </li><li>Great collaboration tools  </li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">FullStory is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Product and UX teams that want visual clarity and deep behavioral insights rather than technical debugging.</p></div></div><h3 id="4-hotjar">4. Hotjar</h3><p><a href="/blog/posthog-vs-hotjar">Hotjar</a> focuses on qualitative insights and quick wins for UX and conversion optimization. It&#x27;s easy to set up and gives you heatmaps, scroll maps, and session recordings without developer overhead.</p><p>You won&#x27;t get console logs, network requests, or state changes, but you will get a clear sense of where users get stuck or drop off. Hotjar also includes feedback tools (surveys, polls, and widgets) which help teams gather qualitative insights directly from users.</p><p><strong>Strengths:</strong></p><ul><li>Simple setup and intuitive UI  </li><li>Heatmaps and scroll maps  </li><li>Built-in feedback tools  </li><li>Pre-built frustration and engagement segments  </li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Hotjar is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Product, UX, and marketing teams focused on understanding user behavior and improving conversion rates.</p></div></div><h3 id="5-openreplay">5. OpenReplay</h3><p>OpenReplay is an open-source, developer-friendly replay platform that captures full frontend context. It includes console logs, network requests, performance metrics, and detailed event timelines. You can extend it with plugins or integrate it with your observability stack.</p><p>Because it can be self-hosted, teams with strict compliance, residency, or security requirements often choose OpenReplay over commercial SaaS tools. You control where data lives, how long it&#x27;s retained, and which internal systems it connects to.</p><p><strong>Strengths:</strong></p><ul><li>Open source and self-hostable</li><li>Full console and network capture  </li><li>Plugin architecture and flexible integrations  </li><li>Strong privacy and data ownership  </li><li>Developer-first setup  </li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">OpenReplay is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Engineering teams that want full control over data collection and self-hosting, with flexibility to customize their replay pipeline.</p></div></div><h3 id="6-microsoft-clarity">6. Microsoft Clarity</h3><p><a href="/blog/best-microsoft-clarity-alternatives">Microsoft Clarity</a> is a surprisingly capable free tool with unlimited session recordings. It&#x27;s incredibly simple to add via script or Tag Manager and works well for high-traffic sites.</p><p>It includes rage click detection, scroll depth, heatmaps, and simple playback. But it&#x27;s not designed for debugging since there&#x27;s no console or network capture.</p><p>The fact that it&#x27;s genuinely free with unlimited recordings makes it an attractive option for small teams and startups.</p><p><strong>Strengths:</strong></p><ul><li>Completely free with no limits  </li><li>Fast setup and lightweight SDK  </li><li>Heatmaps included  </li><li>GA4 integration  </li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Microsoft Clarity is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Small teams and non-technical users who need basic replay and behavior insights without a budget.</p></div></div><h3 id="7-replayio">7. Replay.io</h3><p>Replay.io is different. Instead of just recording the DOM, it records browser execution. That means you can step backward and forward through code, inspect variables, and see exactly how state changed over time – like &quot;time-travel debugging&quot; built for the web.</p><p>It integrates with Playwright and Cypress, making it useful for debugging automated tests too.</p><p>The downside is that it&#x27;s overkill for simple UX analysis. Recordings are heavier, setup is more involved, and it appeals primarily to engineering teams working on complex frontend apps.</p><p><strong>Strengths:</strong></p><ul><li>Deep debugging with code-level replay  </li><li>Variable and state inspection  </li><li>Great for flaky test debugging  </li></ul><div class="ph-callout mt-4 mb-6 p-4 border rounded bg-accent border-primary"><div class="flex items-center gap-2 mb-0.5"><div class="shrink-0 opacity-75"><svg class="LemonIcon size-6" width="100%" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.126 1.709c-.454-.945-1.8-.945-2.253 0L8.363 6.94l-5.777.757c-1.04.137-1.462 1.42-.695 2.144l4.222 3.987-1.06 5.695c-.193 1.036.903 1.822 1.822 1.326L12 18.082l5.124 2.767c.92.496 2.015-.29 1.822-1.326l-1.06-5.695 4.223-3.987c.767-.724.344-2.007-.696-2.144l-5.777-.757-2.51-5.231Z"></path></svg></div><strong class="text-lg">Replay.io is best for</strong></div><div class="ph-text pl-8 text-[15px] [&amp;_p]:text-[15px] [&amp;_*]:text-[15px] [&amp;&gt;*:last-child]:mb-0 [&amp;_code]:text-[13px] [&amp;_pre]:text-[13px] [&amp;_code]:bg-primary [&amp;_pre]:bg-primary !leading-relaxed"><p>Frontend engineers debugging complex async or stateful issues that traditional replay tools can&#x27;t capture.</p></div></div><hr/><h2 id="which-session-replay-tool-should-you-choose">Which session replay tool should you choose?</h2><ul><li>Want one platform for replay, analytics, feature flags, error tracking, and experiments? <strong><a href="/session-replay">PostHog</a></strong>  </li><li>Need frontend debugging with AI-assisted insights? <strong>LogRocket</strong>  </li><li>Want polished playback and behavioral analytics? <strong>FullStory</strong>  </li><li>Prefer developer flexibility and self-hosting? <strong>OpenReplay</strong>  </li><li>Need deep, code-level debugging? <strong>Replay.io</strong>  </li><li>Want something free and unlimited? <strong>Microsoft Clarity</strong>  </li><li>Focused on UX and conversion? <strong>Hotjar</strong>  </li></ul><h3 id="recommendations-by-team-type">Recommendations by team type</h3><h4 id="for-high-growth-startups">For high-growth startups</h4><ul><li><strong>PostHog</strong> for transparent pricing, scalability, and a broad toolkit that replaces multiple SaaS tools  </li><li><strong>Microsoft Clarity</strong> if budget is very tight and you only need lightweight insights  </li></ul><h4 id="for-enterprise-or-large-product-teams">For enterprise or large product teams</h4><ul><li><strong>FullStory</strong> for advanced analytics, segmentation, and collaboration  </li><li><strong>LogRocket</strong> for reproducible frontend debugging across large codebases, with AI-assisted insights</li></ul><h4 id="for-developers-and-engineering-heavy-teams">For developers and engineering-heavy teams</h4><ul><li><strong>PostHog</strong> if you want replay plus analytics, feature flags, and error tracking in one workflow  </li><li><strong>LogRocket</strong> for detailed debugging data tied to frontend events  </li><li><strong>Replay.io</strong> for stepping through code and debugging complex async issues  </li><li><strong>OpenReplay</strong> if you want full control with the option to self-host  </li></ul><h4 id="for-less-technical-teams-pms-ux-marketing">For less technical teams (PMs, UX, marketing)</h4><ul><li><strong>Hotjar</strong> for quick UX insights, heatmaps, and user feedback  </li><li><strong>Microsoft Clarity</strong> for simple, free behavior analysis at scale  </li><li><strong>FullStory</strong> if you need enterprise-grade UX analytics and collaboration features</li></ul><h2 id="is-posthog-right-for-you">Is PostHog right for you?</h2><p>Here&#x27;s the (short) sales pitch.</p><p>We&#x27;re biased, obviously, but PostHog is the best choice for session replay if:</p><ul><li>You want replays connected to analytics, feature flags, error tracking, and more – so you can go from a funnel drop-off directly to the session that explains why</li><li>You value open source and transparent pricing</li><li>You want to try before you buy with 5,000 web recordings and 2,500 mobile recordings free every months</li></ul><p>It&#x27;s completely free to get started – no credit card required. Our <a href="/wizard">setup wizard</a> handles configuration in minutes, or you can check out our <a href="/docs">docs</a> to do it yourself.</p><p><div></div></p><h2 id="frequently-asked-questions">Frequently asked questions</h2><details><summary>Can I use session replay for debugging in production?</summary><p>Yes, as long as masking and privacy settings are configured correctly. All tools in this list support some level of automated masking.</p></details><details><summary>Can I record localhost or staging sessions for debugging?</summary><p>Yes, most tools support this. <strong>PostHog</strong>, <strong>LogRocket</strong>, and <strong>Replay.io</strong> work well for development debugging. <strong>Replay.io</strong> is particularly good for this since it integrates with Playwright and Cypress for test debugging.</p></details><details><summary>Can session replay tools slow down my app?</summary><p>Modern tools are optimized for performance, but implementation matters. <strong>PostHog</strong> and <strong>LogRocket</strong> use web workers and compression to minimize impact. <strong>Microsoft Clarity</strong> is extremely lightweight. <strong>Replay.io</strong> records more data and can be heavier. Always test in staging and monitor performance metrics after deployment.</p></details><details><summary>Do I need session replay if I already have error tracking?</summary><p>Yes. Error tracking tells you <em>what</em> broke and <em>where</em> in your code. Session replay shows you <em>how</em> the user got there and what they were trying to do. Together, they dramatically reduce time to resolution. Tools like <strong>PostHog</strong> and <strong>LogRocket</strong> integrate both, so you can click directly from an error to the session replay.</p></details><details><summary>What&#x27;s the best session replay tool for developers?</summary><p><strong>PostHog</strong> if you want full context across analytics, network calls, and events. <strong>LogRocket</strong> if you want something closer to production DevTools.</p></details><details><summary>What&#x27;s the difference between PostHog and LogRocket?</summary><p>Both are full-featured platforms, but they prioritize different workflows.</p><p><strong>LogRocket</strong> is built around the session replay experience. Everything else – error tracking, performance monitoring, product analytics – is designed to enrich the replay with more debugging context. It&#x27;s optimized for the &quot;watch what happened, then fix it&quot; workflow that frontend engineers love.</p><p><strong>PostHog</strong> flips that model. Session replay is one tool among many in a unified developer platform. You might start in analytics, notice a conversion drop, jump into replays to see why, then use feature flags to test a fix. It&#x27;s built for teams that want to move between insights and action without switching tools.</p><p>Choose LogRocket if session replay is your primary workflow. Choose PostHog if you want replay as part of a broader development toolkit.</p></details><details><summary>Which session replay tool is best for mobile apps?</summary><p><strong>PostHog</strong> and <strong>LogRocket</strong> both support iOS and Android with native SDKs. <strong>UXCam</strong> is another strong option built specifically for mobile. Avoid web-only tools like <strong>Replay.io</strong> if mobile is your primary platform.</p><p>For a detailed comparison, see our guide to the <a href="/blog/best-mobile-app-session-replay-tools">best mobile app session replay tools</a>.</p></details><details><summary>Which session replay tool is best for UX and marketing teams?</summary><p><strong>FullStory</strong> and <strong>Hotjar</strong> both shine for user experience and conversion insights.</p></details><details><summary>Which is the cheapest session replay tool?</summary><p><strong>Microsoft Clarity</strong> is completely free. <strong>PostHog</strong> also has a generous free tier (5,000 web recordings and 2,500 mobile recordings per month) with transparent usage-based pricing.</p></details><details><summary>Which session replay tool integrates best with analytics?</summary><p><strong>PostHog</strong>. You can jump between analytics views and individual session recordings seamlessly. <strong>FullStory</strong> also has strong analytics but is more UX-focused. </p></details><details><summary>How is PostHog different from other session replay tools?</summary><p><strong>PostHog</strong> is more than a session replay tool. It gives developers full context by combining all the tools needed to build a successful product in one platform.</p><ul><li><strong>All-in-one toolkit:</strong> <a href="/product-analytics">Product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replay</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">experiments</a>, <a href="/surveys">surveys</a>, <a href="/llm-analytics">LLM analytics</a>, and <a href="/error-tracking">error tracking</a>  </li><li><strong>Developer-first:</strong> Transparent APIs, <a href="/docs/product-analytics/sql">SQL query builder</a>, open source, and a <a href="/roadmap">public roadmap</a>  </li><li><strong>Transparent pricing:</strong> Generous free tiers and <a href="/pricing">usage-based billing</a>  </li><li><strong>Trusted by teams:</strong> Used by <a href="/customers">Supabase, Lovable, ElevenLabs, ResearchGate</a>, and more</li></ul></details><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What I learned attending my first ever hackathon]]></title><description><![CDATA[We sponsored the  recent hackathon hosted by ElevenLabs  – and I got to be in the room in San Francisco as it unfolded, and behind-the-scenes during…]]></description><link>https://posthog.com/blog/elevenlabs-hackathon</link><guid isPermaLink="false">7fd35076-bb95-59aa-8b94-d678674f27df</guid><dc:creator><![CDATA[Kevan Gilbert]]></dc:creator><pubDate>Fri, 07 Mar 2025 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog_elevenlabs_hackathon_fd48b58db2.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We sponsored the <a href="https://elevenlabs.io/blog/announcing-the-winners-of-the-elevenlabs-worldwide-hackathon">recent hackathon hosted by ElevenLabs</a> – and I got to be in the room in San Francisco as it unfolded, and behind-the-scenes during the planning and judging. </p><p>The two days saw furious sprints of heads-down building, punctuated by kitchen snack breaks and hallway pacing, leading to pre-demo jitters and delirious applause as it all came to an end (while the same flow played out in cities around the world). </p><iframe src="https://www.youtube-nocookie.com/embed/eFsQqTqnfz4" class="rounded shadow-xl"></iframe><p>What I noticed was the thread of humanity that flowed through the whole thing, even while next-generation AI demos played out in front of us. Here are some of the highlights and lessons I noticed from my part in the event. </p><h2 id="1-imperfection-is-trustable">1. Imperfection is trustable</h2><p><strong>Project:</strong> <a href="https://devpost.com/software/john-ai">DealWise</a> (San Francisco winner)</p><p>Just before the hackathon, Yvonne and Jason had spent days dealing with accommodation issues. Having just moved to San Francisco, they were spending hours on the phone, getting quotes for household services. So naturally, at the hackathon, they decided to build an AI voice agent that could take over the work. Not only would it do the actual calling, it would interact with sales reps, get a quote, put it in a database, and make a recommendation back to team.</p><p>The demo was flawless, yet it was flawed-ness that made it all work, all stemming from a curious insight: When they first gave their agent a voice, it was a clear, professional one. But call recipients would take one listen, recognize the inhumanity, literally say “shut up,” and end the call. When the developers instead added slight pauses, a mild accent, and some natural hesitation, the folks on the other end <em>engaged</em> with the AI caller, and completed the process. </p><p>It was fascinating to see the team learn it was the messier style of human communication that generated more acceptance. The imperfection built more trust.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog_dealwise_9b33d8b450.png" alt="Yvonne and Jason presenting DealWise"/></p><h2 id="2-problem-solving-means-noticing-pain">2. Problem solving means noticing pain</h2><p><strong>Project:</strong> <a href="%5Bhttps://devpost.com/software/john-ai%5D(https://devpost.com/software/roadmate-t28eqk)">RoadMate</a> (San Francisco second place winner)</p><p>Connecting your phone to your dashcam and an AI agent, RoadMate monitors your drowsiness during long road trips, helps you keep your eyes on the road, and can call your emergency contact if things get dicey. The demo from Russel, Anwar and William impressed the judges from both a technical execution standpoint, and for its social impact.</p><p>But what inspired this direction? There was nothing about road trips, car hardware or accident prevention anywhere in the brief. </p><p>It was chosen because William&#x27;s own friend had been in an accident while driving the week prior, losing control due to drowsiness (injured, though thankfully not seriously). The picture of the accident scene was in the pitch deck. </p><p>It wasn’t pretty, but it was a reminder that problem solving means noticing pain – and that means being open to what’s actually hitting you in life. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/roadmate2_d4c0167b6e.png" alt="Roadmate"/></p><h2 id="3-weirdness-is-your-weapon">3. Weirdness is your weapon</h2><p><strong>Project:</strong> <a href="https://devpost.com/software/pendantic">HIPPO</a> (San Francisco third place winner)</p><p>The best builders at the hackathon were the ones that combined their own unique perspectives <em>with</em> the available tech. </p><p>One brilliant team consisted of <a href="https://qki.ai/">cookie-researching</a> academic <a href="https://en.wikipedia.org/wiki/Lexicology">lexicologists</a>. Maria, Johnathan, Jamie and Annalece put that odd speciality to use in crafting a real-time language-analysis bot that can join your meeting, and give you a breakdown on how participants are doing in terms of floor-sharing, sentiment, information density and more. </p><p>They called their app HIPPO — a reference to the term for how a meeting’s energy tilts towards the “Highest Paid Person’s Opinion.” While the base tech helped provide some great capabilities, without the weirdness, you don&#x27;t get a HIPPO.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/hippo_072227da50.png" alt="HIPPO"/></p><h2 id="4-accessibility-will-be-the-default">4. Accessibility will be the default</h2><p><strong>Project:</strong> <a href="https://devpost.com/software/badgermole-ai">Badgermole</a> </p><p>Benedict, Jennifer and Wei built an application that could use your phone’s camera, identify and speak out any scene it saw, in the language of your choosing. Seen as an aid for those with visual impairments, <a href="https://devpost.com/software/badgermole-ai">Badgermole</a> was a see-and-speak agent that was a clear breakthrough for accessibility. </p><p>Why didn’t it win? Strangely, it’s because these features are becoming default settings out of the box already, when you use OpenAI tools, or even Apple’s emerging accessibility features. </p><p>The team’s social impact insight into the need for accessibility aids across cultures was spot-on, and the demo showed a ready-to-rock instance of real-world applicability. The only hazard was: this already exists. </p><p>A loss for the team, but a win for humans as a whole.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/badgermole_dacf3196f7.jpg" alt="Badgermole in action"/></p><h2 id="5-theres-room-to-take-toys-seriously">5. There&#x27;s room to take toys seriously</h2><p><strong>Project:</strong> <a href="https://devpost.com/software/milo-smart-talking-toys">Milo</a> </p><p><a href="https://devpost.com/software/milo-smart-talking-toys">Milo the Talking Dinosaur</a> was an AI-powered kids toy that the judges instantly respected. Powered by a Raspberry Pi, equipped with a camera, microphone, speaker and web access, teammates Abel, Marco, Ivy and Selali built a plush stuffie who could listen to and interact with its child caretaker. But the key feature was “Home Base,” the parental control interface that can receive custom prompts and guidance to nudge the learning aims of the child.</p><p>What became apparent was the value for children with unique learning needs and diverse neurotypes, be it ADHD or Autism, who could interact with a toy programmed to meet their unique reality. Reminders, timers, conversational interaction, speech coaching and more, would all be possible in a toy designed for engagement and growth. </p><p>Though the visual of a stuffed dino with its computer-innards splayed out during the demo was perhaps unsightly, this vision of a future that features customized, supportive, assistive learning devices gathered a lot of interest at the hackathon. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Milo_cec23617df.png" alt="The Milo team, presenting to the judges"/></p><h2 id="6-ai-builders-let-you-focus-more-on-serving-users">6. AI builders let you focus more on serving users</h2><p>“We built the app itself in <a href="https://lovable.dev/">Lovable</a>,” said one hacker during a demo. “It saved us 20 hours of coding.” </p><p>20 hours? Where did the surplus time get spent?  From the range of human-centered products being displayed at the hackathon, it was clear the time went instead towards user testing, iteration and fine-tuning models to meet human needs. </p><p>Speed already matters at a hackathon, and sponsor Lovable made its platform credits readily available for participants. This meant that every hacker was able to spend zero dollars to spin up a workable codebase for their web apps, get to something testable in much less time than usual — saving the rest for the evergreen question of “Does this meet a real human need?”</p><h2 id="7-posthog-is-for-when-youre-ready-to-ask-that-">7. PostHog is for when you’re ready to ask that 👆</h2><p>Hackers burnt through their Lovable, ElevenLabs, Fal.ai and Make.com credits like they grew on trees; the Discord channels lit up with platform-specific participant questions, all weekend long. Meanwhile, over in the PostHog channel, it was relatively quiet. Until the very end.</p><p>It was as if people finished building, and then looked around to ask: “I should make sure this actually works for real people.”</p><p>The feature set in <a href="/products">PostHog’s suite of products</a> is all about gathering real-world insights: does my product work? Are people using it? How? What’s converting? Where are people getting lost and frustrated? And it’s these questions that you can start asking as soon as your prototype is clickable. </p><h2 id="8-people-love-posthog-and-joy-is-not-proprietary">8. People LOVE PostHog (and joy is not proprietary)</h2><p>I’m new to PostHog, so I was surprised when I showed up to the event in my <a href="/merch">PostHog hoodie</a>, and somebody asked for a selfie — as if I’d built the thing! “You work for PostHog?” somebody else asked, seeing my backpack. “That’s sick.” </p><p>I asked a few people why that mattered to them, and the fandom seems to have a few roots: first, people told me they loved that the product is completely free to use, and have really maxed out access to these credits for their personal projects (like Maria, whose clever drinking games app is tracked with PostHog.) </p><p>Second, people appreciate the allegiance to technical users; it really allows for depth and customization. Lastly, well, it’s the brand: billboards, hedgehogs, vibe and all. </p><p>It makes me wonder, what would happen if more brands were powered by values like generosity, open source-ness, and humour? Would it get old? Or would it mean more places are sparking more joy? </p><p>If you can believe it, PostHog doesn’t actually have a monopoly on those things...you, too, can bring them to what you make.</p><h2 id="9-meatspace-matters">9. Meatspace matters</h2><p>Meatspace: the cyberspace-inspired word for people interacting with real bodies in the physical realm. </p><p>This hackathon could have taken place online (and one chapter did), but the chemistry of in-person just hits different. From sharing food to overhearing an idea, to on-the-spot testing, to the contagion of energy as the submission deadline approaches, there is something unleashed when people choose to work in proximity. </p><p><a href="/founders/remote-culture">This isn’t a rallying cry for RTO</a>, it’s an invitation to be co-located when it really matters. Whether for social connection or a focused sprint, getting off of the screen and into real-life can help with a lot of stuckness. </p><h2 id="10-related-there-really-is-a-room-where-it-happens">10. Related: There really is a “room where it happens”</h2><p>The hackathon was hosted at Intercom’s offices, and running point on tech that day was unsung hero Alan McGlinchey, head of startups at Intercom. He ensured people had access to the space, ferried mics back and forth during the demos, and even brought his kiddo to work on a Saturday. As I thanked him for his work, I remarked at how physically-bound this whole thing was:</p><p>“I had thought the internet was supposed to democratize building and creating for the web,” I said to Alan. “We could be hacking anywhere. But here we all are: physically in a building, in the city of San Francisco, as if it’s the location itself that matters.”</p><p>Alan agreed emphatically. “There really is a centre of gravity that San Francisco has. If you’re serious about moving things forward in tech, the people, the money, and the decisions all happen physically here.” </p><h2 id="11-talent-isnt-bound-by-geography">11. Talent isn’t bound by geography</h2><p>While some folks I met have been working in startups for years — I talked to folks who were ex-Uber, ex-Meta — there are others who are just getting started. People with talent, ideas, perspective and grit, who can hack with the best of ‘em, but don’t happen to live in the right city or know the right people. </p><p>I talked to one participant who was here from India, building an incident-response app for infrastructure teams, who was curious to learn more about product marketing. Some of the teams that blew us away as judges consisted of new grads who had not yet had a “real job,” yet ended up landing in second place, leaving us judges wide-eyed and amazed. </p><p>It was a reminder to me of the importance of hiring globally and working remotely (<a href="/handbook/company/culture">as we do at PostHog</a>), and trying to find ways to make sure future-making events can hold the door open for talent no matter where it finds you.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Did you know AI is answering our community questions?]]></title><description><![CDATA[AI. You may have heard of it. Sure, ChatGPT is pretty cool, but when it comes to AI chatbots that try to replace a human in a product support context…]]></description><link>https://posthog.com/blog/ai-community-answers</link><guid isPermaLink="false">ffd51370-7ba5-5a6e-aa5c-7ff4f2a58ea9</guid><dc:creator><![CDATA[Cory Watilo]]></dc:creator><pubDate>Thu, 03 Oct 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/max_ai_poster_b829564bbf.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>AI. You may have heard of it.</p><p>Sure, ChatGPT is pretty cool, but when it comes to AI chatbots that try to replace a human in a product support context, I&#x27;ve generally been underwhelmed. The experience generally isn&#x27;t great, and I&#x27;m often left with more frustration than before I skeptically asked the question in the first place.</p><p>But it&#x27;s not all the fault of LLMs. It also has to do with the available information about a product that an LLM consumes. And for a technical product like PostHog, the documentation has to be extensive enough to answer very nuanced questions. (This is tricky as information is constantly changing and there&#x27;s always room for improvement!)</p><p>As the <del>product owner</del> <em>totally official</em> &quot;webmaster&quot; of PostHog.com, I&#x27;ve contemplated how we can make use of AI to help answer questions... and until now, I&#x27;ve lacked a good solution.</p><h2 id="why-ai-chatbots-have-a-bad-rap">Why AI chatbots have a bad rap</h2><p>There are a lot of <em>&quot;wrong&quot;</em> ways to do AI chatbots – and there are many examples of this even before we collectively started using true AI.</p><p>How many times have you tried to create a support ticket but then:</p><ul><li>been first prompted to review a list of &quot;related questions&quot; that may solve your issue</li><li>been <em>blocked</em> from submitting until you explicitly confirm that none of the suggested answers are helpful</li></ul><p>And now in a world of <em>actual</em> AI, we see a new set of issues – largely centered around LLMs not understanding the question, the context, or straight up hallucinating.</p><p>In no world would we want to subject our very technical audience to these types of dreaded experiences.</p><p>This isn&#x27;t to say <em>all</em> AI chatbots are bad. A couple of exceptions come top of mind mainly Intercom and Shopify. But the status quo that the industry has to overcome is the negative connotation of historically bad chatbot interactions.</p><h2 id="our-approach">Our approach</h2><p>The reason we&#x27;ve been so cautious to introduce AI is that we&#x27;re very intentional about earning (and not losing) the trust of our audience. We do this in a handful of ways:</p><ol><li>We don&#x27;t use fancy words that don&#x27;t add actual value</li><li>We try to be relatable and show a personality</li><li>We traded in the <a href="/sales">value-based sales model</a> for a no-BS approach (self-service, fair, usage-based pricing)</li><li>We avoid gimmicky marketing tactics (like popups and jamming CTAs into every available whitespace)</li></ol><p>So for an AI solution to mesh well with our brand&#x27;s vibe (yes, we&#x27;re about the vibes), it needs to be accurate and succinct in its replies, and never make up a false answer.</p><p>After all, if you interact with an AI chatbot and don&#x27;t get the answer you&#x27;re looking for, you&#x27;re likely to write it off entirely. And that&#x27;s exactly what I want to avoid.</p><h2 id="where-we-decided-to-implement-ai">Where we decided to implement AI</h2><p>The most <a href="/newsletter/building-ai-features">natural place to include an AI chatbot</a> would be in our <a href="/docs">docs</a>. But I was hesitant to start here, as the conversational nature of AI meant we&#x27;d lack control over the quality and accuracy of the responses. So I decided to try something different.</p><p>Our <a href="/questions">community questions</a> section is where users can ask questions directly in the docs. And we currently have... a lot of open (unanswered) questions. But because they&#x27;re posted in a forum-style format, there&#x27;s no expectation of a live chat experience. And this presented an opportunity...</p><p>Today customers may wait hours (or even longer) for a response from a human. <strong>So what if AI could answer <em>only</em> the questions it was highly confident it could answer, then leave the rest for a human?</strong></p><p>Using this approach, AI can <em>add</em> value by instantly responding if it has a high degree of confidence, but it won&#x27;t <em>detract</em> from the experience if it doesn&#x27;t have the solution, simply leaving those questions open as they normally would.</p><h2 id="introducing-inkeep">Introducing Inkeep</h2><p>This whole idea came about from an <a href="https://inkeep.com?utm_source=posthog">Inkeep</a> ad on LinkedIn – which is incredible to say because I&#x27;m generally allergic to ads. But Inkeep&#x27;s ad spoke to me.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_ad_9b53d43fda.png" classes="rounded" alt="Inkeep&#x27;s LinkedIn ad"></div><p>I took the bait, and they quickly set me up with <a href="https://share.inkeep.com/posthog/3003538eb7fd">a custom sandbox</a> to try them out. They&#x27;re indexing our docs, tutorials, blog posts, handbook, existing community answers, and even GitHub repos. (This also means it&#x27;s aware of bug reports, feature requests, and open pull requests - <em>huge!</em>)</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_sandbox_4ca8513bf0.png" classes="rounded" alt="Inkeep sandbox"></div><p>They even themed the sandbox to match our brand. &lt;3</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_email_f22b3b7112.png" classes="rounded" alt="Inkeep email"></div><p>To vet the quality of the answers, I started copy/pasting unanswered community questions into the sandbox and seeing what Inkeep could produce. And to say I wasn&#x27;t let down should tell you something. It was good enough to where I was willing to try it out on our real questions.</p><h2 id="how-it-works">How it works</h2><blockquote><p>Inkeep&#x27;s pre-built library of UI components works great for most companies. But out of the kindness of their hearts, they went the extra mile for us.</p></blockquote><p><strong>Here&#x27;s how our setup works:</strong></p><ol><li><p>When a new question is posted, we send it to Inkeep&#x27;s LLM.</p></li><li><p>Typically within ~20 seconds, we get a response. During this time, we show that we&#x27;re searching for an answer.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_in_progress_5599f03642.png" classes="rounded" alt="AI answer in progress"></div></li><li><p>In the response, we get a <code>confidence</code> score.</p><pre><code>const KnownAnswerConfidence = z.enum([
  &quot;very_confident&quot;,
  &quot;somewhat_confident&quot;,
  &quot;not_confident&quot;,
  &quot;no_sources&quot;,
  &quot;other&quot;,
]);
</code></pre><p><strong class="text-green">If the confidence score is high enough,</strong> we show the answer to the user.</p><p><strong class="text-red">If Inkeep <em>isn&#x27;t</em> confident in the answer,</strong> we show a message that says we couldn&#x27;t find an answer, and that a human will appear as soon as possible.</p></li></ol><p>When an AI answer is presented, we show feedback buttons so the original poster can tell us if the answer was helpful. We use this information to improve the quality of the answers.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_review_6a6510b750.png" classes="rounded" alt="How&#x27;s the AI answer?"></div><h2 id="demo">Demo</h2><p>Here&#x27;s what it looks like to submit a question and receive an AI answer from Inkeep.</p><div videoLight="https://res.cloudinary.com/dmukukwp6/video/upload/inkeep_demo_71fa820a65.mp4" alt="Inkeep answers a PostHog question" classes="rounded shadow-xl"></div><h2 id="how-were-tracking-feedback">How we&#x27;re tracking feedback</h2><p>As you can imagine, every time a customer rates a response, we&#x27;re sending the information into PostHog as a custom event. Along with the event, it sends properties like the sentiment (&quot;helpful&quot; or &quot;not helpful&quot;) and the category of the question. (This will help us identify if certain areas of our documentation needs to improve.)</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_event_957c7b340d.png" classes="rounded bg-light dark:bg-dark" alt="Feedback event"></div><p>Now that this is live, we&#x27;re monitoring feedback in Slack. PostHog&#x27;s recently introduced support for <a href="/changelog?id=2069">realtime destinations</a> in data pipelines.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_slack_config_b865638953.png" classes="rounded" alt="Realtime Slack notification config"></div><p>This allowed me to configure notifications when we get feedback about an AI answer.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/inkeep_slack_973620665a.png" classes="rounded" alt="Slack notification"></div><h2 id="so-hows-it-working">So how&#x27;s it working?</h2><p>Overall, it&#x27;s working pretty well! In fact, it worked so well <a href="/questions/autocapture-event-bubbling">in one case</a> that the original poster replied to share his delight.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/positive_reply_1_ce48f0fc3a.png" classes="rounded" alt="Customer approved"></div><p>In other examples, we were receiving feedback that the answer <em>wasn&#x27;t</em> helpful. But after reviewing the response, the best way to accurately summarize the bulk of feedback is: &quot;The answer is <em>correct,</em> but I didn&#x27;t <em>like</em> the answer.&quot; (This is usually the case when a feature isn&#x27;t yet supported and it&#x27;s not the answer the customer was hoping for.)</p><p>This resulted in a lower overall success rate. So we modified the response options to better understand the different reasons why a response might not meet the mark.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/ai_responses_cc819a5877.png" classes="rounded" alt="Response options"></div><p>With these additional feedback options, we&#x27;re able to use it to inform areas for improvement. For example, if someone says, <em>&quot;I think this is a bug&quot;,</em> we&#x27;ll take a closer look. Or if they choose the <em>&quot;Answer is wrong&quot;</em> option, we&#x27;ll take a look into what might be missing from the documentation.</p><p>It&#x27;s also won over some internal support from developers on the PostHog team:</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/positive_reply_2_90d983c0e5.png" classes="rounded" alt="Developer approved"></div><hr/><p>We&#x27;re still early in our days of exploring AI – and don&#x27;t worry, AI <em>is</em> coming to the PostHog app when we feel it&#x27;s ready.</p><p>But I couldn&#x27;t give you a better rationale for a slow rollout than how a colleague explained it to me:</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/anonymous_colleague_ec9787d2ed.png" classes="rounded" alt="Anonymous quote"></div><p>Hopefully the next time you <a href="/questions">ask a question</a> in our community, you&#x27;ll get the answer you&#x27;re looking for. And even better – if you get it even faster than a human could answer.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How not to be boring]]></title><description><![CDATA[The world would be more fun if most startups hadn't undergone a personality bypass. But, sadly, most software companies look and feel the same…]]></description><link>https://posthog.com/blog/brand</link><guid isPermaLink="false">9b3e4293-1337-5c82-9a15-23b47fdeb37c</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Fri, 13 Sep 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/brand_startup_1aa2b151d6.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>The world would be more fun if most startups hadn&#x27;t undergone a personality bypass. But, sadly, most software companies look and feel the same.</p><p>Founders have no end of excuses for this. It’s more important to build your MVP and validate it, or you need to find product-market fit and make money so you can survive.</p><p>Creating a cool website won&#x27;t help with either, right?</p><p>Wrong. Let me explain why.</p><h2 id="what-would-stop-me-from-using-this-thing">&quot;What would stop <em>me</em> from using this thing?&quot;</h2><p>This was the most important conversation <a href="/community/profiles/27730">Tim</a> and I had before launching PostHog.</p><p>It was going to be free on launch day, but we knew users would still be wary of wasting their time deploying a piece of software produced by a two-person startup. </p><p>Being open source helped because people could inspect the code, but we concluded the majority would turn away at the website, the docs, and the readme first.</p><p>That&#x27;s why we set out to create a website and brand that felt both unique and intentional, including a <a href="/handbook">public handbook</a> that explained what we were doing, why, and how.</p><p>An obviously templated or generic website signals:</p><ol><li><p><strong>The team behind the product isn&#x27;t very strong.</strong> The product probably won&#x27;t improve quickly, or become a &quot;must use&quot; tool. Those startup launches that everyone hears about? They&#x27;ve put energy into their appearance.</p></li><li><p><strong>The product may not exist in a few more weeks.</strong> Why should a potential customer invest time in a product if it&#x27;s obvious the team making it threw its website together in a day, or ripped it from an existing template?</p></li></ol><p>So, as frustrating as it might be to spend extra time and effort on something &quot;superficial&quot; like a website, remember you&#x27;re providing your product to human beings. Everyone judges books by their covers.</p><h2 id="you-need-to-create-your-brand-for-someone">You need to create your brand for someone...</h2><p>One of the most important things we did was to <a href="/newsletter/ideal-customer-profile-framework">create an Ideal Customer Profile</a>.</p><p>When we launched, we weren&#x27;t sure whether to focus on engineers, product managers, or both. But we soon realized that we could go all-in on engineers and technical founders, who now make up around 80% of our users.</p><p>Our brand and product has become more oriented towards these users as a result.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/newsletter/icp/posthog-icp.png" alt="posthog icp"/></p><p>Here are some ways we got more specific for this audience after we zeroed-in on it:</p><ul><li><p><strong>We added code examples to the homepage</strong>, such as how to track an event, or identify a user, and examples of what you can do with our API.</p></li><li><p><strong>We made buying PostHog easy</strong> – the &quot;You&#x27;ll hate PostHog if&quot; section of our homepage calls out the pet hates of engineers when buying SaaS products.</p></li><li><p><strong>We chose a transparent, flexible pricing model.</strong> It&#x27;s more complex, but also <a href="/blog/analytics-pricing">much better value</a>. We’ve found technical users tolerate a little more complexity if it helps them save money, and only pay for what they use.</p></li><li><p><strong>We focused on power user features</strong>, such as <a href="/docs/sql">SQL access</a> and a <a href="/blog/data-warehouse-at-posthog">built-in data warehouse</a>, so technical people can get to the underlying data and debug things.</p></li><li><p><strong>We redesigned our entire UX</strong> to have more flexibility, greater information density, and a dark mode. We want PostHog to <a href="/blog/posthog-as-a-dev-tool">look like a dev tool</a>, not an analytics product.</p></li></ul><h2 id="but-your-brand-must-be-a-reflection-of-you">...but your brand must be a reflection of <em>you</em></h2><p>We’re often impressed at the level of polish others achieve. But, quoting Cory, our lead designer:</p><blockquote><p>&quot;We aren&#x27;t the best in the world at being polished, but we can be the best in the world at being ourselves&quot;.</p></blockquote><p>We sometimes make business decisions based on who we are, and what we want to do – not always what may, for example, generate the most revenue growth.</p><p>We chose this path because there was less competition for a self-hosted product. We could build a refined point solution that anyone could self-host, and not worry about competing with cloud-based competitors with over $100m in annual revenue.</p><p>But we soon realized we just love shipping new features. After our first hackathon, we wound up with session replay – i.e. a new feature big enough to be its own product. It took off and this resulted in our current multi-product approach.</p><p>Eventually, we removed our paid, self-hosted offering entirely, and went all in on multi-product in cloud, and &quot;getting in first&quot; with early-stage companies, not enterprises.</p><p>We kept the open-source product, though we stress it&#x27;s for hobbyists because it&#x27;s cheaper and easier for companies to have us host it for them.</p><p>This strategy works because:</p><ol><li>Being broad lets us compete by being way wider than everyone else.</li><li>Being broad also means we can charge less by cross-selling multiple products.</li><li>It reflects who we are – passionate engineers who love shipping new products.</li></ol><p>Had we stuck with the original plan, we’d have lost interest because we weren’t doing what we enjoy. We apply the same mindset to our brand.</p><p>If you don’t love it, why will anyone else?</p><h2 id="your-brand-isnt-just-your-website">Your brand isn&#x27;t just your website...</h2><p>It&#x27;s how your company is experienced by others. Your company is the product and:</p><ul><li>How much you invest in each function in your company relative to each other.</li><li>What <a href="https://newsletter.posthog.com/p/hiring-and-managing-cracked-engineers">you look for when you hire people</a>, and the process you use to hire them.</li><li><a href="https://newsletter.posthog.com/p/how-we-decide-what-to-build">How you decide what to build</a>. Do you ship features early, or do you focus on meeting the needs of your largest customer with every new thing?</li><li>The degree to which you’re led by design, engineering product, sales, or marketing. How many people are in each function, but also your processes for deciding what to work on.</li><li>The frequency and style with which you <a href="/blog/how-we-built-email-onboarding">email your customers</a>, for marketing, product updates or your <a href="/product-engineers/activation-metrics">activation</a> flow.</li><li>The kind of people you hire into customer success or sales.</li><li>The background and experience of those in your marketing team.</li><li>The tone of voice on your website.</li><li>Who is on your board.</li><li><a href="https://newsletter.posthog.com/p/10-essential-lessons-about-saas-product">How your pricing works</a>.</li><li>How your social media works.</li><li>How helpful you are to random founders that message you.</li><li>The marketing channels you pick.</li><li>What you talk about in your blog. I&#x27;m writing this piece for brand reasons –transparency / equipping developers with knowledge to build successful products. I don’t care if it converts people, I just want to leave an impression. And it&#x27;s who I am – I&#x27;m writing this to pass the time on a long flight.</li></ul><p>Everything matters.</p><h2 id="you-cant-8020-everything">You can&#x27;t 80:20 everything</h2><p>A lot of design or brand work has an <em>increasing</em> marginal return. This is because a great brand&#x27;s purpose is that you stand out. You do <em>not</em> stand out by being average!</p><p>So, if you&#x27;re serious, go nuts on your brand. Go weirdly hard.</p><p>To give you an example, we built a <a href="/merch">merch store</a>:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/merch_store_a97f57c226.png" alt="merch store"/></p><ul><li><p>We started with me emailing users for their address and size, ordering merch and having it delivered to my house, and me then posting it internationally to them. <a href="https://paulgraham.com/ds.html">Do things that don&#x27;t scale</a>.</p></li><li><p>Next, we set up a store on Shopify. I just threw our logo onto an amusingly wide selection of items – PostHog shower curtain, anyone? It was cool to just have merch for sale and a way of giving it.</p></li><li><p>Then we created custom components and built it into our website directly, so it&#x27;s perfectly integrated.</p></li><li><p>Then we booked a photo shoot and took custom photos of our team wearing everything.</p></li><li><p>Now we&#x27;re working on limited editions of certain items to create collectible series of t-shirts</p></li></ul><p>Who knows what happens next!</p><p>This single thing is easy enough to copy, but it&#x27;s just one activity among hundreds that builds a brand.</p><h2 id="doesnt-this-imply-doing-everything-to-a-really-high-standard-and-a-ridiculous-workload">Doesn&#x27;t this imply doing everything to a really high standard and a ridiculous workload?</h2><p>Yes. You can be iterative with it, though.</p><p>Not everything was amazing on day one, but we keep improving and tweaking everything over time.</p><p>So get out there, and be bold</p><p>If your brand isn&#x27;t going to turn off some people that might have bought your product, then it isn&#x27;t strong enough to stand out.</p><p>Engage your best customers with your brand, and put off your worst ones.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Matomo]]></title><description><![CDATA[PostHog and Matomo help you understand how your users are using your site and product, but they're very different tools below the surface: Matomo…]]></description><link>https://posthog.com/blog/posthog-vs-matomo</link><guid isPermaLink="false">12c82158-2f27-5046-bbc6-5b809d7da429</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 04 Sep 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/comparisons/matomo.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog and Matomo help you understand how your users are using your site and product, but they&#x27;re very different tools below the surface:</p><p><a href="/blog/best-matomo-alternatives">Matomo</a> focuses on tracking sessions, making it ideal for running analytics on large content and e-commerce websites. It&#x27;s designed to look and feel similar to Google Analytics 3, AKA Universal Analytics.</p><p>PostHog can also replace Google Analytics, but it offers a wider suite of tools for <a href="/product-analytics">product analytics</a>, <a href="/web-analytics">web analytics</a>, <a href="/session-replay">session replays</a>, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, <a href="/surveys">user surveys</a>, and much more.</p><h2 id="how-is-posthog-different-from-matomo">How is PostHog different from Matomo?</h2><h3 id="1-its-an-all-in-one-platform">1. It&#x27;s an all-in-one platform</h3><p>Matomo charges extra for features like funnel analysis, cohorts, path analysis, A/B testing, and session recording. These are also considered add-ons and are not tightly integrated with the main analytics product. In PostHog, all of these tools work together and each comes with a generous free tier.</p><h3 id="2-its-built-for-engineers">2. It&#x27;s built for engineers</h3><p>Rather than focusing on marketers like Matomo, PostHog focuses on the tools engineers need to build better products.</p><p>On top of product analytics, this includes A/B testing, feature flags, a complete API, direct SQL access, and more. PostHog also includes a data warehouse so you can import and query data from other sources as well as destinations to send your data to external warehouses or other tools.</p><h3 id="3-seamless-integrations-with-the-tools-you-already-use">3. Seamless integrations with the tools you already use</h3><p>PostHog is built to work with the tools you already use.</p><p>That means you can import data and query from sources like Stripe, Hubspot, Zendesk, S3, and more. You can also export data in batches to your data warehouse like Snowflake or BigQuery as well as a range of real time destinations like Google Ads and Slack.</p><h2 id="feature-comparison">Feature comparison</h2><h3 id="platform">Platform</h3><p>Both PostHog and Matomo offer a range of tools for tracking and analyzing your site and product. PostHog offers more tools for understanding and improving your product, while Matomo focuses more on marketing analytics.</p><div competitors="posthog,matomo"></div><blockquote><p>💡 <strong>Good to know:</strong> Matomo&#x27;s first paid tier comes with 1,500 heatmap pageviews and 150 session recordings per month.</p></blockquote><h3 id="web-analytics">Web analytics</h3><p>Both PostHog and Matomo offer all the features you expect from <a href="/blog/ga4-alternatives">Google Analytics alternatives</a>.</p><div competitors="posthog,matomo"></div><h3 id="product-analytics">Product analytics</h3><p>Product analytics reveals the evolution of both tools. While PostHog has always focused on product analytics, Matomo has expanded its offering from a focus on web analytics.</p><div competitors="posthog,matomo"></div><h3 id="integrations">Integrations</h3><p>A simple way to compare integrations:</p><ul><li>PostHog has more integrations with dev tools.</li><li>Matomo has more integrations with e-commerce and CMS platforms.</li></ul><p>But this doesn&#x27;t mean either lacks those types of integrations.</p><div competitors="posthog,matomo"></div><blockquote><p>💡 <strong>Good to know:</strong> Although PostHog doesn&#x27;t have dedicated integrations for CMS or ecommerce platforms, our script snippet makes it easy to use PostHog with basically any of these including <a href="/docs/libraries/shopify">Shopify</a>, <a href="/docs/libraries/wordpress">WordPress</a>, and <a href="/docs/libraries/webflow">Webflow</a>.</p></blockquote><h3 id="security-and-compliance">Security and compliance</h3><p>Matomo positions itself as a Google Analytics alternative that protects your data and customer privacy, but PostHog offers all of its privacy and compliance features (and more).</p><div competitors="posthog,matomo"></div><blockquote><p>💡 <strong>Good to know:</strong></p><ul><li>Matomo&#x27;s on-premise offering can be made HIPAA compliant, but not their cloud offering.</li><li>PostHog is self-hostable under a MIT license <a href="/docs/self-host/open-source/disclaimer">without guarantee</a> or support.</li></ul></blockquote><h2 id="frequently-asked-questions">Frequently asked questions</h2><h3 id="how-much-do-posthog-and-matomo-cost">How much do PostHog and Matomo cost?</h3><p>Matomo&#x27;s Cloud offering starts at $29/month for 50,000 hits. This includes 1,500 heatmap pageviews and 150 session recordings per month.</p><p>PostHog is <a href="/pricing">entirely usage-based</a>. Its free tier includes:</p><table><thead><tr><th>Feature</th><th align="center">Free usage per month</th><th align="center">Additional cost</th></tr></thead><tbody><tr><td>Product analytics</td><td align="center">1 million events</td><td align="center">From $0.00005/event</td></tr><tr><td>Session replay</td><td align="center">5,000 recordings</td><td align="center">From $0.005/recording</td></tr><tr><td>Surveys</td><td align="center">1500 responses</td><td align="center">From $0.10/response</td></tr><tr><td>Feature flags and A/B testing</td><td align="center">1 million API requests</td><td align="center">From $0.0001/request</td></tr><tr><td>Data warehouse</td><td align="center">1 million synced rows</td><td align="center">From $0.000015/row</td></tr></tbody></table><p>You&#x27;ll never pay anything if you stay within these limits and you can set billing limits to avoid surprise bills.</p><h3 id="does-posthog-offer-a-free-trial">Does PostHog offer a free trial?</h3><p>Matomo offers a free trial, but PostHog doesn&#x27;t, what gives?</p><p>Instead of a free trial, PostHog offers a free forever tier as long as you stay under the free limits. You don&#x27;t even need a credit card, but adding one unlocks all the features (we have billing limits you can use too).</p><h3 id="can-posthog-also-replace-google-analytics">Can PostHog also replace Google Analytics?</h3><p>Yes. PostHog can replace Google Analytics for many use cases – <a href="/blog/posthog-marketing">our marketing team uses PostHog</a>, for example. You can integrate PostHog into your website using Google Tag Manager. See our comparison of <a href="/blog/posthog-vs-ga4">PostHog and Google Analytics 4</a> and <a href="/blog/google-analytics-to-posthog">An intro to PostHog for Google Analytics users</a> for more.</p><h3 id="can-i-migrate-from-matomo-to-posthog">Can I migrate from Matomo to PostHog?</h3><p>Yes. See our <a href="/docs/migrate/matomo">Matomo to PostHog migration guide</a> for more.</p><h3 id="is-posthog-hard-to-install-and-use">Is PostHog hard to install and use?</h3><p>Although PostHog has many features, it isn&#x27;t necessarily complicated. Our <a href="/web-analytics">web analytics</a> dashboard is similar to Matomo&#x27;s:</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2024_10_01_at_11_39_58_2x_5dff6baf53.png" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2024_10_01_at_11_40_26_2x_76efad2201.png" classes="rounded" alt="PostHog web analytics dashboard"></div><p>Our <a href="/docs/getting-started/install?tab=snippet">install snippet</a> is also only a couple of lines:</p><p><div></div></p><p>Our users range from <a href="/customers/headshot-pro">individual indie hackers</a> to <a href="/customers/mintlify">YC-backed startups</a> to <a href="/customers/researchgate">massive enterprises</a>.</p><hr/><p>Still deciding? Check out our <a href="/blog/best-web-analytics-tools">roundup of the best web analytics tools</a> for more options.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[We built an internal tool to generate changelog images for social media]]></title><description><![CDATA[PostHog's marketing team recently  created a plan  to improve our social media presence. One of the  ideas  was to share our  changelog updates  in a…]]></description><link>https://posthog.com/blog/changelog-image-generator</link><guid isPermaLink="false">97bd3a76-c416-5b3b-87a4-ca77b0fc050e</guid><dc:creator><![CDATA[Cory Watilo]]></dc:creator><pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/changelog_image_poster_f60be59481.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog&#x27;s marketing team recently <a href="https://github.com/PostHog/meta/issues/218">created a plan</a> to improve our social media presence. One of the <a href="https://github.com/PostHog/meta/issues/232">ideas</a> was to share our <a href="/changelog">changelog updates</a> in a more visual way – using a graphic instead of just a text-based post.</p><h2 id="why-image-based-updates">Why image-based updates?</h2><p>Image-based posts perform better on X than linking out to another site. <div name="Ian Vanagas"></div> originally trialed this with &quot;visual essays&quot;. After posting a few of these, we quickly updated the design to match our brand.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/visual_essay_d3b07fbd64.png" classes="rounded" alt="Visual essay example"></div><p>So that works great for the occasional visual essay, but for changelog posts, we had a problem... we didn&#x27;t have the bandwidth to create images for every new changelog post – nor should design be a blocker for the marketing team. And I didn&#x27;t want to force anyone to use Figma to create these images.</p><p>So we started to think... could we productize this so our team could generate high-quality images automatically? After all, our <a href="/changelog">changelog updates</a> already include most of the information we&#x27;d need.</p><p>A couple years ago, we had done something similar for auto-generating <a href="/blog/dynamic-open-graph-images">custom open graph images</a> for most pages on the website, so we thought... why not do something similar here?</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/synergy_997b3b5c83.png" classes="rounded" alt="Github discussion"></div><h2 id="figma-mockup">Figma mockup</h2><p>So I got to work, mocking up a template that would pull information from our self-rolled CMS.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/changelog_mockup_0c8bcba585.png" classes="rounded" alt="Changelog image mockup"></div><h2 id="how-we-did-it">How we did it</h2><p>I wrote up <a href="https://github.com/PostHog/posthog.com/issues/9149">an issue</a> outlining how I thought we&#x27;d be able to combine data from changelog updates, small teams, and team members for use in the rendered images.</p><h3 id="changelog-data">Changelog data</h3><p>Our changelog entries already included <code>title</code>, <code>description</code>, <code>screenshot</code>, <code>update_type</code>, and associated <code>product</code> and <code>team</code>.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/changelog_editor_ef77bb982b.png" classes="rounded" alt="Changelog editor"></div><h3 id="product-branding">Product branding</h3><p>Each PostHog product has an icon and color associated with it. These are defined in a JSON file that builds our navigation submenus.</p><pre><code>{
  name: &#x27;Data warehouse&#x27;,
  url: &#x27;/docs/data-warehouse&#x27;,
  color: &#x27;lilac&#x27;,
  icon: &#x27;IconDatabase&#x27;,
}
</code></pre><p>(The <code>color</code> maps to a HEX value defined in Tailwind.)</p><h3 id="customization">Customization</h3><p>Then it just comes down to visual polish, so we added a few options.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/edit_options_787a9644c6.png" classes="rounded" alt="Changelog image options"></div><h3 id="hedgehogs">Hedgehogs</h3><p>And what PostHog graphic wouldn&#x27;t be complete without a hedgehog?</p><p>Recently, <div name="Lottie Coxon"></div> organized our <a href="https://www.figma.com/design/I0VKEEjbkKUDSVzFus2Lpu/Hoggies?node-id=2226-55&amp;t=UfQboIrCRcRuvSSK-1">hedgehog library</a> and named each hedgehog.</p><p>This made it easy for our front end developer <div name="Eli Kinsey"></div> to export them and create a searchable library (based off the filenames).</p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/hedgehog_library_58a0f71928.mp4"></video></p><p>Now we can choose any hedgehog image from our library – as long as it&#x27;s uploaded to a folder in Cloudinary.</p><h3 id="generating-the-image">Generating the image</h3><p>We used <a href="https://github.com/bubkoo/html-to-image">html-to-image</a> to render the final product. When a team member clicks the <em>download</em> button, the image is generated <a href="https://github.com/bubkoo/html-to-image#how-it-works">in a very clever way</a>, then downloaded to the client.</p><h2 id="the-final-product">The final product</h2><p>And voila, here&#x27;s an example of our first image produced with this new tool. You should <a href="https://twitter.com/posthog/status/1828458717810983330">check it out on X</a> - and give us a follow while you&#x27;re there!</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/changelog_post_598cd1a031.png" classes="rounded" alt="Changelog post on X"></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What we built at our windswept Mykonos hackathon]]></title><description><![CDATA[As a fully-remote company with 47 misfits spread across ten countries, our offsites are a vital part of our culture. They’re a great way to get to…]]></description><link>https://posthog.com/blog/mykonos-hackathon</link><guid isPermaLink="false">60f79c2f-f1be-5732-b345-2f20c98e9299</guid><dc:creator><![CDATA[James Temperton]]></dc:creator><pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/mykonoshackathon_979cf7bec6.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a fully-remote company with 47 misfits spread across ten countries, our offsites are a vital part of our culture. They’re a great way to get to know colleagues better, and the connections formed during offsites bring extra energy and creativity to our work throughout the rest of the year.</p><p>This year, we headed to Mykonos – not to rave, but to code. And to enjoy a cocktail or two in the sun, of course.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/hackathon2_3d7257a965.jpg" alt="PostHog&#x27;s 2024 offsite in Mykonos"/></p><p>Our all-company offsites are a mix of socializing, group activities, strategic sessions, Post-its, workshops, more Post-its, and, the star of the show, the annual PostHog hackathon. </p><p>Everyone in the company has to pitch a couple of ideas, then we all vote on our favorites, assemble teams, and have a little over a day to go from pitch to demo. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/hackathon1_e2aa8bd928.jpg" alt="PostHog&#x27;s 2024 offsite in Mykonos"/></p><p>In some cases, our hackathon projects are ready to ship right away. Some have even become core parts of our product – <a href="/session-replay">session replay</a> started as a hackathon project, as did our <a href="/docs/data-warehouse">data warehouse beta</a>.</p><p>Here’s what we built in Mykonos.</p><h2 id="our-own-programming-language">Our own programming language</h2><p><div people="Marius Andra,Anirudh Pillai"></div></p><p>What’s cooler than having your <a href="/docs/sql">own query language</a>? Having your own general purpose programming language, of course! That’s literally what we built: PostHog’s first ever programming language, <a href="/docs/hog">Hog</a>. (Earlier versions of this name included Hög and Höge, but turns out we&#x27;re anti-umlaut.)</p><p>Things moved fast the week after Mykonos: we split up the existing product analytics team and built a new team to productize Hog. We plan to use Hog to build our CDP and messaging products, and might even pivot the entire company around it. </p><p>Why? Because, in the past, we’ve sometimes struggled to build UI fast enough for users to take advantage of new products that are ready to ship. Hog will mean anyone can drop down into hacker mode and get things done. We move fast. You move fast. Everyone is happy.</p><p>It was just another PostHog hackathon, no big deal. Stay tuned for the aftermath.</p><h2 id="realtimehog-3000">RealTimeHog 3000</h2><p><div people="James Greenhill,Zach Waterfield,Michael Matloka,Brett Hoerner"></div></p><p>Seeing people using your product live boosts dopamine levels. Probably. PostHog does that, but right now we keep you waiting a bit. </p><p>Before a PostHog event is available for querying, it goes through our ingestion pipeline, where users are identified and the events themselves enriched. The process takes seconds, rarely a minute – a delay imperceptible in analytical queries, but a dopamine decrease in the live view.</p><p>The solution? Introducing RealTimeHog 3000, a <a href="https://github.com/PostHog/livestream">livestream</a> service powering our first truly real-time view of user activity. The process is simple: </p><ol><li>Consume the raw events from the same Kafka topic as our ingestion service. </li><li>Stream them to you ASAP using server-sent events.</li></ol><p>The lack of person data is a fair trade-off, because it doesn’t get more live than this. User activity appears within milliseconds of happening on the other side of the world.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/realtime1_f40652b636.gif" alt="RealTimeHog 3000"/></p><p>Speaking of data being processed live, perhaps at some point you’ve wondered if PostHog actually scales, or just talks the talk. </p><p>To dispel any doubts, we developed one extra feature: an anonymized stream of all events being captured globally, with only the geolocation included. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/Screenshot_2024_05_31_at_9_53_45_AM_86d275de54.png" alt="The PostHog globe"/></p><p>Millions of events per minute, and they look great on a 3D globe on PostHog’s website, where each event is an arc from the user’s location to that of the relevant data center. Global scale, visualized for your pleasure.</p><h2 id="mykologs">MykoLogs</h2><p><div people="Paul D&#x27;Ambra,Tom Owers,Ted Kaemming"></div></p><p>MykoLogs is a logging product that integrates with the existing PostHog SDKs, bringing backend logs straight into a shiny new product on PostHog. </p><p>The best part? You can link backend logs to session recordings through the user’s session ID – letting you debug what was happening on the backend during your user&#x27;s API requests. MykoLogs plays nicely with all other PostHog products, meaning logs and session replay are now BFFs. Debugging has never been this breezy!</p><p>It&#x27;s internal-only for now, but could one day be made public. </p><h2 id="the-presidential-briefing">The presidential briefing</h2><p><div people="Charles Cook,Eric Duong,James Hawkins,James Temperton"></div></p><p>As PostHog grows as a company, keeping track of everything that’s happening will get harder. Yes, we <a href="/newsletter/remote-working">write everything down</a> but that creates a lot of reading, and a lot of noise. The solution? An AI-generated briefing, tailored to each individual team member and their interests.</p><p>The presidential briefing was built by scraping PRs and issues from GitHub, along with Slack messages, and then training an LLM to understand what’s interesting and important. The bot then produces a pithy briefing that removes the noise and gives people just the information they need.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/hackathon_president_73aa5ced1a.png" alt="The presidential briefing"/></p><p>While just a proof-of-concept for now, if we were to ship it we’d want to add more data sources and build it using Llama to avoid the need to send any data to external services.</p><h2 id="10x-terms">10x terms</h2><p><div people="Cory Watilo,Andy Vandervell,Fraser Hopper"></div></p><p>Are you fed up with lawyers making everything so hard to understand? Are you fed up with those nerds in Brussels making us sign DPAs for everything? Not anymore! On PostHog.com, we’ve made all the legal stuff fun – and kept the lawyers happy.</p><p>First up, we summarized our <a href="/terms">terms</a> and <a href="/privacy">privacy policy</a> in plain English. You can still read the long, legal-y version, but it’s now way easier to understand what it actually means. And we didn’t stop there. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/hackathon_dpyay_53b6334a36.png" alt="Terms, PostHog style"/></p><p>Then we took on our data processing agreement, or DPA, to create a generator that makes this hugely exciting task even more fun. You can quickly populate your own form, select the data region, and, if you want, add some pizazz with fairy tale or Taylor Swift mode. DPA? <a href="/dpa">Try DPYAY!</a></p><h2 id="zenhog">ZenHog</h2><p><div people="Dylan Martin,Tiina Turban,Marcus Hof,Neil Kakkar"></div></p><p>Our support flow currently uses Zendesk and that goes through email. This causes three problems: </p><ol><li>Emails sometimes bounce</li><li>There are long delays in checking emails</li><li>It’s really clunky to add other team members via CC.</li></ol><p>It’s not the most optimal flow. So, imagine if instead users could view and respond to their open support tickets without ever having to leave PostHog? Yhat&#x27;s exactly what we built.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/supporthog_9bf5751e2a.gif" alt="SupportHog"/></p><p>But that&#x27;s not all, if you&#x27;re using Zendesk then you could, in the future, add this view to your customer-facing website with just a few clicks. Like the sound of this project? <a href="https://posthog.com/roadmap">Got to our public roadmap</a>, search for &#x27;Customer support product&#x27;, and vote for it.</p><p><div></div></p><h2 id="the-referral-scheme">The referral scheme</h2><p><div people="Ben White,Raquel Smith,Joe Martin"></div></p><p>Everyone loves a pyramid scheme, right?! </p><p>Wait, no, we mean a <em>referral program.</em> Ben, Raquel, and Joe worked together to build a referral product right into PostHog. This means we can offer sweet merch, platform credits, good vibes, and other things to loyal PostHog users who lure in their friends and family. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/referralscheme_d3c3622d48.png" alt="Referral scheme"/></p><p>What’s more, as the referral program product is built right into PostHog, you can build your own for your customers. The system is hooked up to Zapier to automate the process for redeeming codes making the whole thing a doddle. </p><p>It’s not shipped yet, but we’re close.</p><h2 id="managed-reverse-proxy">Managed reverse proxy</h2><p><div people="Frank Hamand,David Newell,Steven Shults"></div></p><p>Everyone loves ad-blockers. But, for a lot of our customers, they stop data from reaching PostHog. </p><p>You can already deploy a reverse proxy to PostHog Cloud to get around this, but it’s a somewhat convoluted process that requires you to jump through 16 hoops and login to AWS. <a href="/docs/advanced/proxy">Our docs on this are great</a>, but Frank decided to build a better solution.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/reverseproxies_36abec68b3.png" alt="Managed reverse proxy"/></p><p>During the hackathon, he built the reverse proxy functionality right into PostHog. The option is tucked away in the PostHog settings. </p><p>Simply add in any domain you control and the system will spit out a CNAME that you then need to set in your DNS provider. Wait a few seconds for the update to happen and voila, the reverse proxy is live.</p><h2 id="ab-testhog">A/B TestHog</h2><p><div people="Ian Vanagas,Juraj Majerik,Lior Neu-ner"></div></p><p>Want to know how to improve your website but don’t know where to start? You need A/B TestHog. Enter a website URL, click ‘Analyze’ and an ingenious generative AI system will give you a bunch of recommendations for what A/B tests you might run to take your website to the next level. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/abtesthog1_eef0030d9b.png" alt="A/B TestHog"/></p><p>These are all expertly authored by an AI, and include the goal metrics, secondary metrics, and guardrail metrics and detailed instructions of what to change for your test.</p><h2 id="hermes">HERMES</h2><p><div people="Annika Schmid,Simon Fisher,Mine Kansu"></div></p><p>At PostHog, we love speaking to our users. Maybe a bit too much. Right now, our master customer interviews doc is 382 pages long and contains almost 200 user interviews. It’s a great resource, but it’s getting a bit unwieldy. </p><p>But we&#x27;ve now entered a bold new era of feedback management at PostHog thanks to HERMES, or... Holistic Evaluation Repository for Managing Enhancements and Suggestions.</p><p>This is effectively a database of user interviews, showing who was interviewed, who they work for, what they do, how much they pay for PostHog, the products they talked to us about, and an AI-generated summary of our user interview notes. The database is searchable and you can easily add new interviews in a couple of clicks.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/hermes1_275dc08370.jpg" alt="HERMES"/></p><p>The database is linked right into PostHog, making it easy to see associated user and organization profiles. It’s also hooked into Vitaly, our customer success tool, to automatically pull in more customer and business information.</p><p>HERMES also uses ChatGPT to generate a summary of the features requested during the interview based on the human-authored interview notes. This makes it easy to share actionable feedback from users directly with the product team responsible for that feature. </p><p>As part of the project, we also revamped our system for categorizing and tracking feature requests from customers, making it easier for us to see what people want and prioritize the most important product work.</p><h2 id="data-crunching">Data crunching</h2><p><div people="Sandy Spicer,Tim Glaser"></div></p><p>PostHog crunches a lot of data, especially on very complext queries. To help users better understand the hard work we’re doing when they make a query, we built a loading bar that includes live data on how much data we&#x27;re crunching (database rows and data volume) and CPU usage we&#x27;re deploying to generate an answer for you.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/datacrunch1_7ab73f5ab4.jpg" alt="Data crunching"/></p><p>If you feel the need for a quick distraction while you wait, you could also check out <a href="/changelog?id=2014">Hedgehog mode 2.0</a>, which also shipped recently.</p><h2 id="cli">CLI</h2><p><div people="Manoel Aranda Neto,Daniel Esneider Jaramillo"></div></p><p>We build products for engineers, so there’s nothing better than bringing PostHog closer to their natural environment: the terminal.</p><p>The PostHog CLI is a command line that allows users to do a few things that are normally tucked away in the PostHog app: creating, reading, updating, deleting, and enabling or disabling feature flags, for example. The PostHog CLI authentication flow is also seamless as it spins up a new browser and allows you to log in with your SSO instead of copying and pasting tokens manually.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/cli_fb71d1730d.png" alt="CLI"/></p><p>In the future, the CLI could be expanded with more features such as creating surveys, and events, installing SDKs automatically, uploading debug symbols, using the CLI as a package, or even as a GitHub action. And, even better, you could do all of that with natural language, no need to memorize all commands by heart.</p><p>It&#x27;s an internal tool for now, but could be made public if people ask for it enough...</p><h2 id="4-years-at-posthog">4 years at PostHog</h2><p><div people="Coua Phang,Kendal Hall"></div></p><p>We’re still a young company, but some of our wonderful team members have now been with us for four years or more. So we want to celebrate them. Coua and Kendal came up with a great anniversary gift scheme, meaning our longest-serving colleagues get something special to celebrate. </p><p>This year, Marius, Eric, James G, Lottie, Charles, and Michael all celebrate four years at PostHog and will get to pick between a fancy luggage set (handy for traveling to all-team offsites and other PostHog meet-ups), or a James Hawkins-approved coffee machine.</p><h2 id="forbidden-secret-project">Forbidden secret project</h2><p><div people="Lior Neu-ner,Annika Schmid,Mine Kansu"></div></p><p>We have a Slack channel called #do-more-weird for odd, fun ideas, and this hackathon project belongs there.</p><p>Head to the <a href="https://posthog.com/careers">careers page</a> and click on James Hawkins&#x27; face for an inspirational surprise...</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best HIPAA-compliant A/B testing tools]]></title><description><![CDATA[What do  Optimizely , Convert, and Webtrends Optimize have in common? They're popular A/B testing tools None of them are HIPAA-compliant And, while it…]]></description><link>https://posthog.com/blog/best-hipaa-compliant-ab-testing-tools</link><guid isPermaLink="false">5eb6a967-dac4-5d1e-b65b-19cb4a4dd621</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 04 Mar 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/open-source-testing-tools/testinghog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>What do <a href="/blog/posthog-vs-optimizely">Optimizely</a>, Convert, and Webtrends Optimize have in common?</p><ol><li>They&#x27;re popular A/B testing tools</li><li>None of them are HIPAA-compliant</li></ol><p>And, while it&#x27;s tempting to live without A/B testing for your healthcare product, doing so is like trying to navigate an ocean by sailing roughly in the correct direction. You&#x27;ll probably arrive somewhere, but it won&#x27;t be where you intended.</p><h2 id="what-you-need-for-hipaa-compliance">What you need for HIPAA compliance</h2><p>You need to comply the <a href="https://www.hhs.gov/ocr/privacy/hipaa/administrative/privacyrule/index.html">Privacy Rule</a> and the <a href="https://www.hhs.gov/ocr/privacy/hipaa/administrative/securityrule/index.html">Security Rule</a>. Breaching either can result in hefty financial penalties, but for the sake of this guide we&#x27;re mostly interested in how the Privacy Rule impacts analytics and A/B testing.</p><p>There are three ways to comply with the Privacy rule when adopting analytics and testing tools:</p><ol><li><p><strong>Anonymize all PHI and identifiers:</strong> There are two so-called &quot;<a href="https://www.hhs.gov/hipaa/for-professionals/privacy/special-topics/de-identification/index.html#standard">De-identification Standards</a>&quot; – &quot;Expert Determination,&quot; where an expert verifies that data isn&#x27;t personally identifiable, and &quot;Safe Harbor&quot; where all 18 types of identifier are removed. The former is preferable simply because applying the Safe Harbor approach can render data effectively useless for analytical purposes.</p></li><li><p><strong>Sign a BAA with a third-party tool:</strong> You must sign a Business Associate Agreement (BAA) with any third-party platform that handles your protected health information (PHI). This can mean signing multiple agreements, though, such as one with your analytical partner, but also any tools you use for importing and exporting data from your <a href="/blog/cdp-vs-data-warehouse">data warehouse</a>.</p></li><li><p><strong>Self-host and keep control of all your data:</strong> The less common is to self-host tools for analytics and experimentation on your own infrastructure. This reduces the number of BAAs and general legal wrangling needed to generate user insights. The only downside is you&#x27;ll need the expertise to manage self-hosted instances, or third-party support to do so, and you are wholly liable for any security breaches.</p></li></ol><p>These are the broad principles, but <strong>please consult an expert</strong> before making any final decision on how to implement tools in compliance with HIPAA.</p><h2 id="the-best-hipaa-compliant-ab-testing-tools">The best HIPAA-compliant A/B testing tools</h2><h3 id="1-posthog">1. PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/ab-testing.png" alt="PostHog"/></p><h4 id="features">Features</h4><ul><li><strong>Product analytics:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web analytics:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Session replay:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Feature flags:</strong> <span class="text-green text-lg">✔</span></li><li><strong>A/B testing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Surveys:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self-hostable:</strong> <span class="text-green text-lg">✔</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li></ul><h4 id="summary">Summary</h4><p><a href="https://posthog.com/">PostHog</a> is an open source all-in-one platform that combines A/B testing with product analytics, session replay, feature management, and user surveys – everything you need to understand user behavior. All these tools are seamlessly integrated and, because you get everything in one, you only need to sign one BAA for all your analytics needs.</p><p>PostHog offers a BAA on its <a href="/platform-packages">platform packages</a>, which start at $250 and include <a href="/pricing">generous monthly free allowances</a>, such as 1 million analytics events every month. You can also self-host the open-source edition for free, though this isn&#x27;t recommended as it&#x27;s provided without support or guarantee.</p><h3 id="2-kameleoon">2. Kameleoon</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hipaa-compliant-ab-testing/kameleoon.png" alt="kameleoon"/></p><h4 id="features-1">Features</h4><ul><li><strong>Product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Web analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Session replay:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Feature flags:</strong> <span class="text-green text-lg">✔</span></li><li><strong>A/B testing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Surveys:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Self-hostable:</strong> <span class="text-red text-lg">✖</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li></ul><h4 id="summary-1">Summary</h4><p>Kameleoon is an A/B testing and personalization platform. It supports A/B and <a href="/product-engineers/what-is-multivariate-testing-examples">multivariate testing</a>, and feature flags for managing the rollout of new features and running tests. In addition to testing, it has a real-time personalization engine that&#x27;s particularly useful for e-commerce. It doesn&#x27;t have any deeper analytics features, so you&#x27;ll need to run it alongside another <a href="/blog/best-hipaa-compliant-analytics-tools">HIPAA-compliant analytics tool</a> to gather deeper user behavior data.</p><p>Kameleoon doesn&#x27;t publish pricing publicly, but conversion optimization consultants BrillMark <a href="https://www.brillmark.com/kameleoon-ab-testing-platform/#:~:text=The%20yearly%20licensing%20pricing%20for,pay%20for%20the%20annual%20license">reports</a> pricing starts at $35,000 per year and scales based on traffic volume, making it a premium option.</p><h3 id="3-vwo">3. VWO</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hipaa-compliant-ab-testing/vwo-testing.png" alt="vwo testing"/></p><h4 id="features-2">Features</h4><ul><li><strong>Product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Web analytics:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Session replay:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Feature flags:</strong> <span class="text-green text-lg">✔</span></li><li><strong>A/B testing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Surveys:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Self-hostable:</strong> <span class="text-red text-lg">✖</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li></ul><h4 id="summary-2">Summary</h4><p><a href="/blog/best-vwo-alternatives">VWO</a> is best known as an A/B testing platform for e-commerce websites and mobile apps, though it also offers basic session replay and analytics tools as part of its myriad pricing tiers. A/B testing features include support for multi-armed bandit, a visual editor, and advanced targeting options, such as targeting based on screen resolution.</p><p>Unlike most tools in this list, VWO charges separately for website and mobile apps based on monthly tracked users (MTUs) for both, so it can get expensive quickly if you need both. VWO offers a BAA when you pay for the Security Plus Add-on ($529 per month).</p><h3 id="4-launchdarkly">4. LaunchDarkly</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-mobile-app-ab-testing-tools/launch-darkly.png" alt="LaunchDarkly mobile app A/B tests"/></p><h4 id="features-3">Features</h4><ul><li><strong>Product analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Web analytics:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Session replay:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Feature flags:</strong> <span class="text-green text-lg">✔</span></li><li><strong>A/B testing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Surveys:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Self-hostable:</strong> <span class="text-red text-lg">✖</span></li><li><strong>BAA available:</strong> <span class="text-green text-lg">✔</span></li></ul><h4 id="summary-3">Summary</h4><p><a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> is primarily a feature management platform for controlling what users see and when, and managing the rollout of new features. However, it also offers an experimentation suite, albeit as a paid add-on.</p><p>As a tool designed for engineers, LaunchDarkly supports running experiments on the front and back end. This enables engineers to run experiments to measure the performance impact of API and infrastructure changes, for example.</p><h2 id="faq">FAQ</h2><h3 id="who-does-hipaa-apply-to">Who does HIPAA apply to?</h3><p>HIPAA applies to &quot;covered entities,&quot; such as healthcare providers who transmit any health information in electronic form, health plans, and healthcare clearinghouses. Mobile apps fall under HIPAA if they store protected health information (PHI), and share it with any covered entity.</p><p>HIPAA also applies to &quot;business associates,&quot; which, according to the <a href="https://www.hhs.gov/hipaa/for-professionals/covered-entities/sample-business-associate-agreement-provisions/index.html">US Department of Health and Human Services</a>, are &quot;a subcontractor that creates, receives, maintains, or transmits protected health information on behalf of another business associate.&quot;</p><p>Under HIPAA, the A/B testing tools in this guide would all be considered business associates.</p><h3 id="what-is-phi-protected-health-information">What is PHI (Protected Health Information)?</h3><p>Protected Health Information (PHI) is any information about health status, provision of healthcare, or payment for healthcare that can be linked to an individual.</p><p>This includes medical records, laboratory results, billing information, and any other information that identifies an individual and relates to their past, present, or future physical or mental health condition, treatment, or payment for healthcare services.</p><h3 id="is-self-hosting-better-than-signing-a-baa">Is self-hosting better than signing a BAA?</h3><p>There&#x27;s no objective correct answer here. In theory, self-hosting is preferable as it means you don&#x27;t share any data with third-parties (business associates), and thus you don&#x27;t need to sign a BAA.</p><p>But self-hosting also presents additional risks. You&#x27;re wholly liable for ensuring your A/B testing infrastructure is secure, which can be challenging if you don&#x27;t have the internal expertise to manage this. If this is the case, it may be better to rely on a HIPAA-compliant business associate who has experience hosting analytics at scale.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we built our onboarding email flow (with actual performance data)]]></title><description><![CDATA[Updated July 26, 2024:  Added information about Onboarding 6.0
 Updated Feb 18, 2025:  Added information about Onboarding 7.0 Marketers believe…]]></description><link>https://posthog.com/blog/how-we-built-email-onboarding</link><guid isPermaLink="false">03d88bd9-4222-5ee0-9939-17b9ac10bfbe</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 19 Feb 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/blog_onboarding.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><strong>Updated July 26, 2024:</strong> Added information about Onboarding 6.0
<strong>Updated Feb 18, 2025:</strong> Added information about Onboarding 7.0</p></blockquote><p>Marketers believe onboarding emails are a powerful tool for driving engagement. Everyone else thinks they&#x27;re annoying and ineffective. The truth, as always, is a little more complicated.</p><p>People, and developers in particular, hate onboarding campaigns because the bad ones are so memorable. And how would you know what &quot;good&quot; looks like without signing up and risking a flood of tedious outreach emails from sales reps?</p><p>We don’t do those sort of outreach emails. This is what we do instead, and how we got there over 7 major iterations. We think it works and we&#x27;ve included performance data so you can judge for yourself.</p><h2 id="onboarding-10-the-one-where-it-started-costing-lots">Onboarding 1.0: The one where it started costing lots</h2><p>Back in 2022, our onboarding flow was powered by Mailchimp and was <em>very</em> simple. In fact, nobody actually knew what it looked like. So, I mapped it in <a href="https://github.com/PostHog/posthog.com/issues/3202">an RFC</a>.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/onboarding/onboarding_1.png" alt="Onboarding 1.0"/></p><p><div>The first map we did of what our email onboarding flow looked like</div></p><p>We didn’t do welcome emails for new users, and even our monthly changelog emails were only sent to 660 opted-in users. I decided to change this and imported 30,000+ users into that email list. </p><p>The move was covered by our T&amp;Cs and, because it was one email a month about actual product updates, we figured nobody would mind. The good news was that we were right and didn&#x27;t get a single complaint and only a handful of unsubscribes.</p><p>The bad news is that it sent our Mailchimp costs skyrocketing. This is because Mailchimp&#x27;s pricing is based partly on how many emails you send each month, and it has low limits that make it entirely unsuited for a complex onboarding campaign. We started searching for a platform with more predictable and scalable pricing.</p><h2 id="onboarding-20-the-one-where-we-chose-a-new-email-tool">Onboarding 2.0: The one where we chose a new email tool</h2><p>Towards the end of 2022, we finally moved off of Mailchimp. We looked at tools such as Braze, Hubspot, and Customer.io, ultimately choosing the latter because it had <a href="/blog/transparent-enterprise-pricing">more transparent pricing</a> and we had an existing app for pushing data to it. Signing the deal was arduous – Customer.io wanted almost ten separate meetings before they took our money, but at least they didn&#x27;t send any awful sales outreach emails!</p><p>I’d observed from other companies that we needed to at least add a welcome email for new users, and I wanted to add checks after 24, 96, and 168 hours to see if users had ingested events. If yes, we’d send them some basic usage advice. If no, we’d offer them help. This was the very least I felt we could do. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/onboarding/onboarding_2.png" alt="Onboarding 2.0"/></p><p><div>Onboarding 2.0 added more checks to try and validate ingestion and three simple introductory emails</div></p><p>This didn’t perform as well as you’d think, however, mainly because the ingestion checks were unreliable. Users kept complaining about getting the wrong emails, so we threw this all out and moved to a new plan.</p><blockquote><p>💡 <strong>Tip:</strong> Something we learned for our welcome email was not to send it immediately after sign-up. The email is meant to give users initial direction, but first they need to set up ingestion – we added a one hour delay so that users can get data to work with first. </p></blockquote><h2 id="onboarding-30-the-one-where-we-started-tracking-data">Onboarding 3.0: The one where we started tracking data</h2><p>By Q3 2023, we were adding more and more new products to PostHog. We wanted to feature these in our flow, but we were also worried about becoming spammy. Thankfully, now that we had Customer.io in place, we were able to judge this based on the data. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/onboarding/onboarding_3.png" alt="Onboarding 3.0"/></p><p><div>New emails for 3.0 tried to emphasize what was possible with PostHog, directing users to helpful blog content</div></p><p>Our conversion event was a user log-in within one week of opening an email. We hadn’t yet thought of anything better. </p><ul><li><strong>Open rate:</strong> 56%</li><li><strong>Click-through-rate:</strong> 7.4%</li><li><strong>Conversion rate:</strong> 3%</li><li><strong>Unsubscribe rate:</strong> 0.6%</li></ul><p>Based on this high open rate and low unsubscribe rate we felt that users didn&#x27;t mind getting the emails, and the click-through rate suggested they liked what they read. So, we continued adding more messages. </p><blockquote><p><strong>What does good look like for an email onboarding flow?</strong>
Benchmarks vary wildly by industry, implementation, and product. As a rule though, the guideline benchmarks I use from my experience in other startups are:</p><ul><li><strong>Open rate:</strong> Anything above 40% is OK. 50% is the goal.</li><li><strong>Click-through-rate:</strong> Anything above 4% is OK. 6% is the goal. </li><li><strong>Conversion rate:</strong> Anything above 3% is OK. 5% is the goal. </li><li><strong>Unsubscribe rate:</strong> Anything below 1% is OK. 0% is the goal.</li></ul></blockquote><h2 id="onboarding-31-the-one-where-we-added-personalization">Onboarding 3.1: The one where we added personalization</h2><p>Data is important, but I strongly believe it doesn’t tell the whole story. You also need feedback and intuition. Most of the feedback on our emails came in <a href="https://github.com/PostHog/meta/issues/127">3.1</a>, when we started sending personalized recommendations to users from <a href="mailto:joe@posthog.com">my personal email</a>.</p><p>How this works is simple: when a user signs up, they can optionally tell us what their role is. If their <code>role_at_organization</code> = <code>engineer</code> we trigger an email from me telling them about <a href="https://newsletter.posthog.com/">our Product for Engineers newsletter</a>. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/onboarding/onboarding_31.png" alt="Onboarding 3.1"/></p><p><div>Onboarding 3.1 was when we really started tailoring emails based on what we knew about users</div></p><p>This email performed very well, with a 68% open rate and a 16% CTR. Two emails into the flow and developers were already opting in to <em>more</em> emails! </p><p>Best of all, though, because it was personalized and came from me directly, it also earned a steady trickle of replies. I responded in kind and was able to feed in further improvements, including adding another option for <code>role_at_organization</code> = <code>founder</code>.</p><h2 id="onboarding-33-the-one-where-we-added-experiments">Onboarding 3.3: The one where we added experiments</h2><p>In <a href="https://github.com/PostHog/meta/issues/140">3.3</a>, we started running a series of tests and experiments. We removed the <code>founder</code> targeted email, which invited teams to join <a href="/startups">PostHog for Startups</a>, because it was <em>too</em> successful and cannibalised revenue.</p><p>Most of the tests we ran proved inconclusive, or outright failed. Subtle changes to subject lines or body copy had no noticeable impact. We learned that users did <em>slightly</em> prefer <a href="/lottie">Lottie’s</a> hedgehog art over screenshots of the app, but the difference was a negligible 1-2% in CTR. </p><p>One successful experiment we did roll out was adding more personalized emails for non-technical users. If <code>role_at_organization</code> = <code>marketing</code>, <code>sales</code> or <code>product</code> <em>and</em> a user had not created an <a href="/docs/data/actions">action</a> within 12 hours, I’d send them another personal tip. These emails averaged a steady 6% CTR and 54% open rate, so we kept them in, but interestingly I didn&#x27;t see many replies on these messages.</p><h2 id="onboarding-40-the-one-where-we-filtered-by-icp">Onboarding 4.0: The one where we filtered by ICP</h2><p><a href="https://github.com/PostHog/meta/pull/150/">4.0</a> was a massive step up in complexity as a result of our growing number of features. By late 2023 the flow had 28 separate emails, of which users would get a maximum of 6 over several weeks. We still worried this would be too many, but the low (0.4%) unsubscribe rate suggested otherwise.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/onboarding/onboarding_4.png" alt="Onboarding 4.0"/></p><p><div>Onboarding 4.0 split high-ICP users out into their own email flow because our CS team would reach out directly</div></p><p>By this point we’d also changed our conversion event to mean a user enabling billing for a product within one week of opening an email - a far better indicator of if the emails are delivering value than simply measuring logins. </p><ul><li><strong>Open rate:</strong> 52%</li><li><strong>Click-through-rate:</strong> 4%</li><li><strong>Unsubscribe rate:</strong> 0.4%</li><li><strong>Conversion rate:</strong> 6%</li></ul><p>Around this point we also started filtering out teams in our <a href="/newsletter/ideal-customer-profile-framework">ideal customer profile</a> (ICP) using a scoring system implemented in Hubspot. If a user scored over a certain threshold they’d be moved out of the usual flow so our <div slug="customer-success"></div> could reach out directly. We’ve since removed this check because it felt too salesy and didn’t perform well, however. </p><h2 id="onboarding-50-the-gosh-thats-complicated-one">Onboarding 5.0: The gosh-thats-complicated one</h2><p>The next version was where things got out of hand. It contained over 53 emails and 38 timed events and was, quite simply, a pain in the ass to explain to everyone internally.</p><p>The goal of this flow was to focus on <a href="/product-engineers/activation-metrics">improving activation</a>, and build on some parallel improvements to our in-app onboarding flow. When a user signed up to PostHog we asked them to select a product to setup first: analytics, replays, flags, or surveys. <a href="https://github.com/PostHog/meta/issues/172">Onboarding 5.0</a> builds off that selection by encouraging users to use that product, and then showing how other features can combine with it.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/onboarding/onboarding_5.png" alt="Onboarding 5.0"/></p><p><div>Onboarding 5.0: Messy, complex, and highly personalized to user interests</div></p><p>The hope was that this would improve in-app activation, which we roughly define as: </p><ul><li><strong>Product analytics:</strong> Events ingested, 1 insight created, 1 dashboard created</li><li><strong>Session replay:</strong> 5 recordings viewed</li><li><strong>Feature flags:</strong> 1 feature flag created</li><li><strong>Surveys:</strong> 1 survey launched</li></ul><p>To avoid annoying users, we added a time block based on our activation criteria – if a user hasn’t activated after two emails, we stop sending them emails for six weeks. We also use an unsubscribe notice that tells users how many emails they can typically expect: one email per week, for six weeks.</p><p>And as for performance?</p><ul><li><strong>Open rate:</strong> 50%</li><li><strong>Click-through-rate:</strong> 2.4%</li><li><strong>Conversion rate:</strong> 3.5%</li><li><strong>Unsubscribe rate:</strong> 0.4%</li></ul><h2 id="onboarding-60-the-one-that-lasted-almost-a-whole-year">Onboarding 6.0: The one that lasted almost a whole year</h2><p>The <a href="https://github.com/PostHog/meta/issues/212">next version</a> was where we decided to simplify things. We stripped out a bunch of the flows which were adding maintenance overheads and bought everything down to a far simpler, linear flow where every email was determined by a simple user choice. Already using session replays? Fine, we&#x27;ll email you about something else then. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/6_0_workflow_0a235a781a.png" alt="Onboarding 6.0"/></p><p><div>Onboarding 6.0: Simpler. Better. Funnier.</div></p><p>It&#x27;s also where, following some feedback, I decided to more directly embrace the PostHog tone of voice and make everything a little bit more sassy and anarchic. I added things like calling out product names, or the irony of emailing users about an email. I also made liberal use of memes from Lottie. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/email_unsub_6015c09eb1.png" alt="memes"/></p><p>The biggest change, however, was changing just over 50% of the emails to come from me. As in, directly from my email address. Users can (and do) respond to them, and a growing amount of my time is now spent chatting with users over email - time well spent, in other words.</p><p>You&#x27;d think doing things like actively goading users into unsubscribing would be bad for conversion rates and subscriptions. You&#x27;d be wrong. </p><ul><li><strong>Open rate:</strong> 52%</li><li><strong>Click-through-rate:</strong> 3.1%</li><li><strong>Conversion rate:</strong> 2.2% (with a new conversion event of activating any single product)</li><li><strong>Unsubscribe rate:</strong> 0.3%</li></ul><h2 id="onboarding-70-the-current-one">Onboarding 7.0: The current one</h2><p>In 2025, I decided to revisit the onboarding flow with a two main goals. First, I wanted to more actively encourage cross-sell again, but this time with a focus on doing it just for products that combined <em>really</em> well. I&#x27;d decided that what held previous attempts at cross-sell back wasn&#x27;t the idea, but just that the content was a bit m&#x27;eh. Secondly, I wanted to design a secondary flow which focused on pulling in feedback for our betas - but that&#x27;s another story. </p><p>The approach I took was to tie the flow into some new events we had access to that captured which products a user was interested in during their in-app onboarding. Here, we enable users to select multiple products and then funnel them into focusing on the first. That meant it could be the role of email to then encourage activation for the secondary products later. </p><p>The new onboarding features a new loop when users first sign up that assesses whether they&#x27;ve successfully ingested <em>any</em> data across any of our products. If they haven&#x27;t we first attempt to help them with that before moving on. After they&#x27;ve got data coming in (or they time out on this logic) we move into product emails. First, we look at what their primary product intent was and check if they&#x27;ve successfully activated with that product. If they haven&#x27;t, we drop them an email to help. If they have, we check if there&#x27;s a product that may combine well with it and if they&#x27;ve activated that too. If they&#x27;ve activated on everything we want them to, we drop them an email about a higher-level, free feature or beta. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/email_example_e36d3308f9.png" alt="email example"/></p><p><div>Onboarding 7.0: Memes, and a personal touch</div></p><p>I&#x27;ve tried to make the emails a lot more fun and anarchic than they were even in Onboarding 6.0, but in 7.0 I also took on feedback from users about the sort of content that would help. A lot of users wanted to know how we personally use PostHog, or what they can learn from other customers. Additionally, 100% of the onboarding emails now come directly from me (albeit still automated) and the emails themselves have a new design which actually works in dark mode. </p><p>At the time of writing it&#x27;s still a little early to know how successful these new experiments will be, but the early response is positive. After being live for a week this version has already equalled the CTR of the previous version, though the jury remains out on the overall conversion rate. </p><h2 id="what-we-learned">What we learned</h2><p>Across the ~five~ six major versions (and many other smaller iterations) of our email onboarding, there are a few definite things we&#x27;ve learned. </p><h3 id="email-works-for-engineers-too">Email works for engineers too</h3><p>As I said at the start, the conventional wisdom is that engineers are particularly skeptical of any marketing activity, and likely to unsubscribe to emails. However, our unsubscribe rates have been consistently low enough to disprove this. If the emails add value for engineers and are <a href="/founders/writing-for-developers">well-written for that audience</a>, they can still be effective. </p><h3 id="you-can-send-more-emails-than-you-think">You can send more emails than you think</h3><p>One of our consistent worries has been that we send too many emails. Again though, the low unsubscribe rate suggests that users aren&#x27;t getting annoyed by this. The current email flow gives users approximately six emails, yet we&#x27;ve not heard any complaints about this. </p><p>We think the reason for this is...</p><ol><li><p>We space emails out quite conservatively. Users will typically only get one email per week, and we are defensive about deviating from this schedule. </p></li><li><p>We tell users how many emails they&#x27;ll get. It&#x27;s added to the welcome email, right next to the unsubscribe button. This means users know we value their time and can unsubscribe <em>before</em> they get annoyed.</p></li><li><p>Our emails are actually worth reading. We don&#x27;t send those awful outreach emails from sales reps, we don&#x27;t run limited-time discounts, and we don&#x27;t beg users to pay more. We just tell them how to get more out of PostHog. </p></li></ol><h3 id="users-prefer-fun-visual-art-to-screenshots">Users prefer fun visual art to screenshots</h3><p>I mean, who <em>wouldn&#x27;t</em> want to look at a cute hedgehog instead of a graph? </p><p>We&#x27;ve run tests on this several times and <a href="/lottie">Lottie&#x27;s</a> art is victorious by a small margin every time. </p><h3 id="personalization-matters">Personalization matters</h3><p>Personalization doesn&#x27;t mean calling users by their first name using a <a href="https://customer.io/docs/journeys/using-liquid/">liquid</a> tag and pretending to be best buds. It means providing the right content, at the right time, in the right way. </p><p>We do this in several ways in the latest version – delaying our welcome email, tailoring the emails users receive based on their choices, and sending newsletter invites from my personal address. If nothing else, the replies I frequently receive from users are a testament to how effective this is. </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[We're building a better PostHog community by closing our public Slack]]></title><description><![CDATA[One of the great things about being open source is that we’ve grown a vibrant community around the project. Since launch we’ve accepted code from over…]]></description><link>https://posthog.com/blog/slack-closure</link><guid isPermaLink="false">f2b91d94-b145-5c01-9405-c120a8101d7e</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Sat, 13 Jan 2024 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-company-culture-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>One of the great things about being open source is that we’ve grown a vibrant community around the project. Since launch we’ve accepted code from over 500 contributors and swapped ideas with thousands of users in our public Slack group. </p><p>Now, though, we’re closing that Slack group in favor of creating a better, more scalable, and helpful PostHog community <a href="/questions">here on our site</a>. In this post, I’ll explain why we’re doing this, and what comes next. </p><blockquote><p><strong>TL;DR:</strong> We’re closing the Slack group on Jan 24 2024 and inviting members to join the 1,500 users who have already moved to the <a href="/questions">new community forum</a>. As thanks you&#x27;ll receive a unique community achievement when you create an account. This decision only impacts the public Slack group, not private Slack channels for users who pay for additional support.</p></blockquote><h2 id="why-were-changing-the-way-we-do-community">Why we&#x27;re changing the way we do community</h2><p>PostHog has grown incredibly fast over the last four years, and throughout that time the public Slack group has been the central hub of our community. It&#x27;s been a place where we chat to users, listen to feature requests, answer questions, and solicit feedback. </p><p>However, with over 5,000 members in the community, it&#x27;s become clear we&#x27;ve outgrown Slack as a platform. Messages quickly disappear from the chat history, it is disconnected from our main support flow, and useful solutions aren&#x27;t searchable on our site or via Google. </p><p>We&#x27;ve explored a few things to fix this, including joining a paid plan ($7.25+ per user, per month) and <a href="/blog/aruba-hackathon#maxai-our-friendly-posthog-support-ai">building our own AI bot</a>, but earlier this year we realized a new approach was needed.</p><p>So, we decided to build something better. </p><h2 id="introducing-the-posthog-community-forum">Introducing the PostHog community forum</h2><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/blqgFrIaWY0?si=gSj1eNrGQ8l0ANlw" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe><p>Rather than using an off-the-shelf forum platform, like vBulletin or phpBB, we decided to create our own forum using Strapi as a headless CMS. The forum has already been live for several months while we worked out the kinks, and has over 1,500 active members. </p><p>The new forum provides a dedicated area where you can post questions for both the PostHog team and the wider community. Anyone can respond, and answers can be selected as the preferred solution to help guide other users in the future. All of this content is connected to our main support flow, lives permanently on our website, and is visible to search engines, which is enough on its own to make the forums a better place for seeking community support.</p><p>We&#x27;ve also integrated the forum into other parts of the site. You can, for example, post questions when browsing the PostHog docs, and we&#x27;ll automatically aggregate them into sortable categories. This is especially helpful if you&#x27;re following a guide and something isn&#x27;t clear enough for you - just pop a question on it and we&#x27;ll take a look.</p><p>Profiles are also a big part of the forum; a place where you can add info, track discussions you&#x27;re involved in, and display achievements earned through the community. In fact, we&#x27;re giving everyone who joins the PostHog community from the public Slack a unique achievement to say thanks for the support!</p><p>You can even open your profile to function as an Ask Me Anything (AMA) - something <a href="/james">James</a>, <a href="/community/profiles/30200">Cory</a>, and <a href="https://posthog.com/community/profiles/29070">myself</a> have already done.</p><blockquote><p><strong>Ready to join the community?</strong> <a href="/questions">Create an account today</a> and, if you&#x27;ve previously signed up to the public Slack group, you&#x27;ll get a unique achievement to display on your community profile!</p></blockquote><h2 id="what-happens-next">What happens next?</h2><p>One option for the public Slack would have been to just leaving it running in parallel to the forums, but that would leave Slack users in limbo. Instead, we&#x27;ll close the Slack in favor of the PostHog community forum. Currently you need to create an account to sign-up to the community, but soon we&#x27;ll merge this with your normal PostHog account. </p><p>On January 12, we&#x27;ll archive all channels in the public PostHog Slack, so that no new discussion or replies can be posted. This will give you chance to move on-going conversations to a new location, such as the PostHog community, without losing anything. </p><p>A week later, on January 22, we&#x27;ll close the Slack group permanently and delete all existing content. </p><p><strong>Important:</strong> Private Slack channels for paying users will continue to function as normal via Slack Connect, and we’ll continue to handle the majority of customer support via the in-app help. Obviously, the <a href="https://github.com/PostHog/">GitHub repos</a> will also continue to function as normal and you can add comments or submit there too.  </p><p>Thank you to everyone who participated in the Slack group over the last four years. Your support and feedback has helped us immensely, and we’ve deeply enjoyed speaking with you. We very much hope that all of you will <a href="/questions">join us in the new community soon</a>!</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing Notebooks for PostHog]]></title><description><![CDATA[Today we’ve released a major change, dubbed PostHog 3000, which updates the look and feel of PostHog dramatically. You can read all about what’s…]]></description><link>https://posthog.com/blog/introducing-notebooks</link><guid isPermaLink="false">c577ce30-e7d4-5e2a-8d01-166456854c4e</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 19 Dec 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/announcing-notebooks/notebooks.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today we’ve released a major change, dubbed PostHog 3000, which updates the look and feel of PostHog dramatically. You can read all about what’s changed and why in <a href="/blog/posthog-as-a-dev-tool">Cory’s post about the redesign</a>. </p><p>Suffice to say that the new version has a lot to offer. It’s got dark mode! It’s got data density! It’s got side panels! It’s got... notebooks?</p><p><a href="/docs/notebooks">Notebooks</a> is a brand new feature, available to all users for free. Think of it as an ever-present place to collect data from within PostHog, explore it, add context, and even share with others. </p><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/B73WnVRi0ko?si=omi18C2GRfattspq" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe><p>Notebooks help in a wide variety of typical tasks, or workflows. </p><p>Investigating a bug report? Drag and drop session replays into a scratchpad and watch them as normal, or add timestamped comments to break things down.</p><p>Researching a new idea? Collect insights and add them to your proposal seamlessly, alongside survey results or cohorts. </p><p>Planning a launch? Embed the feature flags, events, persons, or cohorts you’ll need to deploy changes and track success. </p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1710055416/posthog.com/contents/images/blog/announcing-notebooks/pizza_survey.mp4"></video></p><p>Or, obviously, you can use a notebook as just a daily scratchpad. This is actually the default behavior, whereby a freshly opened notebook will persist only in the browser until you save it.</p><p>There’s no limit to how many notebooks you can create, or how you can share them within your organization. Colleagues can even collaborate with you by adding to a notebook, though we block multiplayer editing to stop things getting too messy.</p><p>We’ve been testing notebooks internally and with some users for the past few weeks, and have found they’ve already become indispensable to the way we work. We’ve created notebooks for running engineering sprints, tracking marketing activities, investigating errors, and even monitoring feature adoption. </p><p>Best of all, we’re just getting started. We have a <em>lot</em> <a href="https://github.com/PostHog/posthog/issues/15680">more planned for notebooks</a>, including more templates, more sharing options, and built-in cheatsheets to help you get even more from PostHog. We’d love to know any feedback or ideas you have — or you can just jump straight in and <a href="https://app.posthog.com/notebooks">start creating your own notebooks immediately</a>. </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why we've launched PostHog user surveys]]></title><description><![CDATA[Today, we’ve announced  user surveys  are out of beta and in general release, complete with  new pricing . Short version? Pricing is usage-based, with…]]></description><link>https://posthog.com/blog/why-we-made-surveys</link><guid isPermaLink="false">38b4be92-1ffb-50a5-8d61-587904e65179</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 23 Oct 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-survey.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Today, we’ve announced <a href="/surveys">user surveys</a> are out of beta and in general release, complete with <a href="/pricing">new pricing</a>. Short version? Pricing is usage-based, with a free tier for small projects and an improved offer for everyone who participated in the beta. </p><p>Launches like this are always exciting for us, but this one is <em>especially</em> notable because it firmly establishes PostHog as an all-in-one tool for building better products. </p><p>Why is this important? Because spreading everything out across multiple platforms <em>sucks</em>. Replays in HotJar, feature flags in LaunchDarkly, surveys in Pendo, analytics in Amplitude (but not your SQL insights, those go somewhere else), and experiments in Google Optimize? That only lays a foundation for frustration, incompatibility, and inconsistency.</p><p>It’s also a pain having to log in and out of new platforms all the time. </p><p>Imagine creating surveys triggered by the same events you track in your analytics.</p><p>Imagine tracing a survey response back to session replay in just a few clicks.</p><p>Imagine trialling a new feature as an A/B test, collecting feedback on it with surveys, and finally shipping the new feature to everyone, without ever switching tools.</p><p>Imagine your qualitative and quantitative data in one place, connected to the tools you need dissect and act on it.</p><p>That’s the vision we have for PostHog – an all-in-one platform where you can research users, observe usage, analyze data, test ideas, deploy changes, and measure impact consistently, and easily. </p><p>No more tool juggling, compatibility wrestling, unclear pricing, or botched integrations – just a single, open-source platform that does it all.</p><p>Surveys aren’t <a href="/handbook/company/values#we-havent-built-our-defining-feature-yet">our defining feature</a>, but they’re an essential part of this vision. They add valuable real user feedback to the powerful, qualitative data you can already analyze using PostHog</p><h2 id="whats-new-in-posthog-surveys">What&#x27;s new in PostHog surveys?</h2><p>Since we shipped the <a href="/changelog?id=1945">initial beta in June</a> with open text surveys, we&#x27;ve added:</p><ul><li><strong><a href="/changelog?id=1932">July 25:</a></strong> Emoji and number rating survey types</li><li><strong><a href="/changelog?id=1952">August 8:</a></strong> Multiple choice surveys</li><li><strong><a href="/changelog?id=1902">August 18:</a></strong> Wait periods and thank you messages</li><li><strong><a href="/changelog?id=1954">September 14:</a></strong> Automatic NPS calculation</li><li><strong><a href="/changelog?id=1947">October 10:</a></strong> Redesign and multiple step surveys</li><li><strong><a href="/changelog?id=1947">October 19:</a></strong> Survey templates for NPS, CSAT, CES and more</li></ul><p>These features make surveys perfect for the most common use-cases, including NPS surveys, customer satisfaction surveys, and <a href="/blog/measure-product-market-fit">product-market fit surveys</a>. </p><p>Dozens of teams participated in the beta and hundreds of developers contributed PRs and ideas elsewhere in our code to help us get this far. There are over 81,000 engineers in the PostHog community now, and we couldn’t have built surveys without their support and feedback — we’re thrilled to release surveys fully so they can start collecting feedback from their communities too. </p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we made feature flags faster and more reliable]]></title><description><![CDATA[Feature-flags-as-a-service is an interesting space. If your service stops working, it affects both your customers  and  your customer's customers…]]></description><link>https://posthog.com/blog/how-we-improved-feature-flags-resiliency</link><guid isPermaLink="false">c2cd7c8c-bbf9-5c55-b31f-330ab54a394b</guid><dc:creator><![CDATA[Neil Kakkar]]></dc:creator><pubDate>Fri, 08 Sep 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Feature-flags-as-a-service is an interesting space. If your service stops working, it affects both your customers <em>and</em> your customer&#x27;s customers, since they rely on you to make sure their app works.</p><p>Contrast it with the PostHog interface not loading, where the problem is constrained to our customers. It&#x27;s not great, for sure, but it&#x27;s better than event ingestion and feature flags going down.</p><p>Further, flags are very sensitive to latency. If it takes 5 seconds for your flags to evaluate, that holds up your customer&#x27;s application for 5 seconds. You can&#x27;t wait to load them asynchronously, either, as you need this result to determine what to show. Your business logic depends on the flag.</p><p>This is why the <div slug="feature-flags"></div> has spent the last few months making PostHog&#x27;s feature flags fast and resilient. Our goal was to ensure that:</p><ol><li>Neither the SDKs that query flags, nor the API interface, should go down if the PostHog interface does</li><li>Latency-sensitive flags resolve in 50ms or less. </li></ol><p>This post is about how we did it, and what we learned along the way.</p><blockquote><p>Two years later, we made flags even faster and even more reliable. Check out <a href="/blog/even-faster-more-reliable-flags">this newer post</a> for details.</p></blockquote><h2 id="special-problem-constraints">Special problem constraints</h2><p>Before we jump into how we improved things, it&#x27;s worth listing out constraints that we can use to create solutions that otherwise wouldn&#x27;t be possible.</p><ol><li><p><strong>Flags are deterministic:</strong> If I roll out a flag to 30% of people, the person who&#x27;s inside this window remains inside this window even if the rollout percentage goes up to 40, 80, or 100%. This is because we compute a hash of the user ID and the flag key, and use it evaluate.</p></li><li><p><strong>We don&#x27;t always need a server:</strong> As a result of (1), we need a server to determine whether a flag is enabled only if the flag depends on person properties, so we need to check against known properties.</p></li><li><p><strong>Flags are evaluated multiple times in a session:</strong> For example, whenever properties change our flag might change, and the same for when the user identity changes. We can leverage this behavior in our solution.</p></li><li><p><strong>The caching problem:</strong> It&#x27;s not reasonable for us to cache the <em>results</em> of flag evaluation for users because this:</p><ul><li>Blows up the size of the cache.</li><li>Doesn&#x27;t work for new people we are seeing for the first time.</li><li>Isn&#x27;t flexible enough to leverage properties changing over time for users.</li></ul></li></ol><h2 id="making-feature-flags-fast">Making feature flags fast</h2><p>Since flags are deterministic, we technically don&#x27;t need a server to evaluate them. This insight led to creating <a href="/docs/feature-flags/local-evaluation">local evaluation of feature flags</a>, where our SDKs download flag definitions, evaluate them locally, and only fallback to our servers when this is not possible.</p><p>As we saw in our problem constraint, local evaluation can fail when we don&#x27;t know properties the flag depends on. To combat this, the SDK interface allows passing in properties that you already know of. We then use these passed in properties to figure out if flag computation is possible.</p><p>This optimization is great because it cuts out all network I/O <em>and</em> makes evaluation CPU-bound, which reduces latency from 500ms to 10-20ms.</p><p>This only works on server-side libraries, however. Flag definitions can have personal identifiable information, like user email IDs, and require auth to download them, which means we can&#x27;t expose these on the client-side libraries.</p><p>As a result, our client still has not-great latency. To combat this issue, we introduced <a href="/docs/feature-flags/bootstrapping">bootstrapped feature flags</a>. You can initialize a client-side PostHog SDK by passing in a client ID and flags. This ensures flags are instantly available, and unlocks creating cool features like redirecting on page load based on feature flags.</p><p>How do you get the flags to pass in to the client SDK? If you must call PostHog&#x27;s servers manually to do this, it defeats the purpose. This is where <em>synergy</em> between local evaluation and bootstrapping comes in: you use your server-side SDK to evaluate flags locally, then pass these along to your frontend to bootstrap flags.</p><p>Overall, this has been working well. There&#x27;s growing pains of replicating every new feature in flags in all server-side SDKs, but other than that the core functionality is solid.</p><h2 id="making-feature-flags-reliable">Making feature flags reliable</h2><p>We want feature flags to work reliably, even when our server is down, but there&#x27;s no such thing as reliable-no-matter-what-happens. An asteroid wiping out data centers worldwide, or an AGI taking over are very unlikely, but if they do occur, there&#x27;s not much we can do. You can&#x27;t negotiate with the laws of thermodynamics.</p><p>Thankfully, asteroids don&#x27;t hit us every week. PgBouncer issues, on the other hand, are a weekly annoyance – PgBouncer is a connection pooler for Postgres.</p><p>So, when thinking about reliability, we want to prioritize defending against things that happen frequently, or have a high chance of occurring over time. This includes things like Redis, Postgres, or PgBouncer going down. </p><p>Then, if we have the resources and nothing better to prioritize, we can focus on defending against asteroids.</p><h3 id="client-side-handling-partial-flag-evaluation">Client-side handling: Partial flag evaluation</h3><p>Since flags are evaluated multiple times in a session, sending a partial response when we can&#x27;t access the database is preferable to retrying and not sending a response at all. Further, if a client is waiting for flag evaluation before loading their content, we don&#x27;t want to slow this down. We want to return results as soon as possible.</p><p>So, we enable partial updates on our client side SDKs. Whenever there&#x27;s an error computing all flags, we do a partial update: keep the old values for flags we failed to compute, and use the new value for flags we didn&#x27;t fail to compute.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/flag-resiliency/partial-eval.png" alt="partial flag eval"/></p><p>As we&#x27;ve noted before, the only flags that can fail evaluation are ones that depend on specific properties. Further, if a property change is triggering flag evaluation, the client SDK can send these new properties alongside the request, and we use these properties as overrides for flag evaluation. We automatically send these properties for all properties set via the SDK helpers.</p><p>This solution is special because flags that affect the most people will almost never go down. Flags affecting a small % (property based) can be unavailable more often. This is one reason we recommend creating flags that match all people when possible.</p><p>Since the server-side SDKs are stateless, this partial evaluation model doesn&#x27;t really work. Local evaluation is the best way to maintain reliability, or sending known properties alongside requests to make evaluation of property based flags reliable.</p><h3 id="server-side-handling-flag-evaluation-when-databases-are-down">Server-side handling: Flag evaluation when databases are down</h3><p>Now we can dig deeper into how exactly evaluation works when the database is down. One thing I&#x27;ve overlooked so far is that we need the database for multiple parts of flag evaluation:</p><ol><li>To get person properties</li><li>To get the flag definitions.</li><li>Figuring out the right project for which to get feature flags (auth token-matching)</li></ol><p>The database going down means all three functionalities go down. Without flag definitions, we can&#x27;t know what flags to evaluate. Without the project auth, we don&#x27;t know which project to get to.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/flag-resiliency/local-eval.png" alt="local flag eval"/></p><p>The solution here is caching: we cache flag definitions per project, and also the mapping from auth token to project. This means we don&#x27;t rely on the database for the critical components to return a response.</p><p>Caching person properties is unreasonable, as there can be billions of people with thousands of properties each that wouldn&#x27;t fit in a cache. </p><p>Since we don&#x27;t need a server to determine which person belongs to which bucket, we just need to compute the hash of the person ID and the flag to determine evaluation for simple flags (see special problem constraint #1). This enables database-free responses.</p><p>However, note that if Redis (our cache), and Postgres (our database) both go down at the same time, we do end up unable to respond. This should be much rarer though, as these are both independent system deployments.</p><p>Is that all we need to do? Not quite. As we found the painful way, just because we can defend against the database going down, doesn&#x27;t mean our responses will be fast.</p><h3 id="different-ways-postgres-can-fail">Different ways Postgres can fail</h3><p>When you can&#x27;t connect to the database, it&#x27;s a quick operation: you tried connecting, you failed, you raise an error, and any system depending on you can quickly make a decision.</p><p>However, what if the database isn&#x27;t down, but just painfully slow? For example:</p><ul><li>You&#x27;re deadlocked in a transaction.</li><li>You have several transactions running at the same time, slowing the overall system down.</li><li>When a potentially infinite loop is hammering the database hundreds of time a second.</li></ul><p>To us, a database that can&#x27;t quickly respond is equivalent to a database that is down. To defend against this, we introduced statement timeouts of one second for flag evaluations. This helps us quickly catch if things are slow, and defends against timing out.</p><h3 id="different-ways-pgbouncer-can-fail">Different ways PgBouncer can fail</h3><p>PgBouncer manages connections to our Postgres database, and things can go wrong here too.</p><p>The most popular way PgBouncer fails is when there are too many clients waiting for a connection. In this case, you&#x27;re connected to PgBouncer, but waiting for a database connection to free up, so you can make your query.</p><p>The default wait for this setting is two minutes, which is way too long for us. PostHog times out at 10 seconds, so we want flags to have a much smaller timeout here. Currently, this is globally set at one second for all our systems.</p><h3 id="separating-out-deployment-for-feature-flags">Separating out deployment for feature flags</h3><p>One other way to defend against the database being too slow is to have a dedicated read-replica for flag evaluation. We&#x27;ve set up a separate deployment for feature flags (so it doesn&#x27;t go down with the app), and have created a separate read-replica, so it doesn&#x27;t hit statement timeouts because something else is hammering the database.</p><p>This has made flags a lot more reliable.</p><h2 id="when-things-dont-go-as-expected">When things don&#x27;t go as expected</h2><p>One frustrating issue we found towards the end is that when the database is slow, even setting a statement timeout during a session can take too long, which means by the time we figure out the database is slow, it&#x27;s too late.</p><p>Currently, we&#x27;re thinking of introducing a separate PgBouncer pool for feature flags, which has these timeouts set on the connection itself.</p><p>In the long term, having this sync python service that can&#x27;t handle app level timeouts well has been troublesome. We&#x27;re considering rewriting this with an async paradigm that&#x27;s more efficient and allows for easily setting timeouts in the app, so we don&#x27;t have to rely on the database level settings, and can once again share the connection pool with the rest of the app, rather than creating separate sub-pools.</p><p>The next step is to make sure flags remain reliable with all the exciting features we have in the works. Our main goal is to ensure none of these new features detract from reliability, since when it comes to flag, reliability is a lot more important than that shiny new feature.</p><p>And if you are interested in shiny new features, you can see what we&#x27;re working on via our <a href="/roadmap">public roadmap</a> or <a href="https://github.com/PostHog/posthog/">repo</a>.</p><h2 id="appendix-the-metrics">Appendix: The metrics</h2><p>This post would be incomplete without talking about the metrics.</p><p>Our p99 latency went down from about ~500ms to 300ms, while the p90 latency tanked to ~60ms.</p><p>As you can imagine, the p90 is so low because these requests don&#x27;t touch the database at all, everything is handled in memory. What was surprising to me was that 90% of requests fall into this category.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/flag-resiliency/latency.png" alt="latency"/></p><p>When we are in incident mode, i.e. the app is down completely, feature flag p99 latency drops down to ~80ms as well, because we start skipping all database related flags where these properties weren&#x27;t sent.</p><p>You can see a similar story on <a href="https://status.posthog.com/uptime/1t4b8gf5psbc?page=3">our status page</a>, where feature flags related incidents went down.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: ClickHouse vs Redshift]]></title><description><![CDATA[We've written extensively comparing ClickHouse to other analytical databases, including  Google BigQuery ,  Elastic , and  Apache Druid . Most of…]]></description><link>https://posthog.com/blog/clickhouse-vs-redshift</link><guid isPermaLink="false">290a5ff0-63a3-5a97-91f5-69aadd72e98a</guid><dc:creator><![CDATA[Mathew Pregasen]]></dc:creator><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We&#x27;ve written extensively comparing ClickHouse to other analytical databases, including <a href="/blog/clickhouse-vs-bigquery">Google BigQuery</a>, <a href="/blog/clickhouse-vs-elasticsearch">Elastic</a>, and <a href="/blog/clickhouse-vs-druid">Apache Druid</a>. Most of those articles had the same gist – a tuned ClickHouse instance is faster by many orders of magnitude, but lacks some general-purpose features, making it unsuitable for certain use cases. </p><p>ClickHouse with Amazon Redshift are the most comparable databases we&#x27;ve explored to date. While ClickHouse is still faster, Redshift&#x27;s infrastructure optimizations makes the comparison closer than usual. While query speed on most databases are orders of magnitude slower than ClickHouse, Redshift is only 2-5x slower on a majority of queries.</p><p>Both have multiple configurations such as ClickHouse Cloud AWS, ClickHouse Cloud GCP, and Redshift&#x27;s recent AQUA and AutoMV update. Certain optimizations from these could make query speeds even closer, but this comparison will speak more broadly on each product.</p><h2 id="overview">Overview</h2><p>Redshift and ClickHouse are both online analytical processing, or OLAP, databases that can handle petabytes of data at impressive speeds. Unlike online transaction processing, or OLTP, databases, such as MySQL or <a href="/blog/clickhouse-vs-postgres">Postgres</a>, OLAP databases are designed to efficiently return aggregations of data. </p><p>From a cultural point of view, the two products are wildly different. ClickHouse is an open-source project developed by a relatively small startup. Amazon Redshift, meanwhile, is closed-source and is built and maintained by a company that needs no introduction. And while both have significant overlap, they are sometimes used in conjunction. </p><p>Comparing Redshift and ClickHouse today is particularly apt because <a href="https://www.youtube.com/watch?v=pnPHEOlRcHQ">Redshift’s most recent AWS talk</a> centered around ClickHouse’s forte: analytics. </p><h2 id="what-is-clickhouse">What is ClickHouse?</h2><p>ClickHouse is a SQL-based data warehouse that can deliver aggregations at amazing speeds.</p><p>Like many other open-source projects, ClickHouse started behind closed doors. The original ClickHouse was an internal project for Yandex, built for Yandex.Metrica, a Google Analytics analog popular in Russia. In 2016, ClickHouse was spun out into its own open-source project and is managed today by ClickHouse Inc. with some contributions by Altinity Inc. </p><p>ClickHouse was engineered to number crunch big data, returning aggregates at subsecond speed. Consistently one of the fastest databases in its space, ClickHouse accomplishes remarkable efficiency through columnar storage, dynamic materialized views, and specialized multicore engines.</p><p>Like many open-source projects, ClickHouse can be optionally deployed via paid, managed solutions – including  one by ClickHouse Inc. known as ClickHouse Cloud, and another Kubernetes-based solution by Altinity Inc. known as Altinity.Cloud. </p><p>ClickHouse has enjoyed considerable success since its founding in 2016, counting Cloudflare, Microsoft, GitLab, Clearbit, and even us at PostHog as users. Because <a href="/docs/how-posthog-works/clickhouse">ClickHouse</a> is often employed to power <a href="/tutorials/embedded-analytics">user-facing analytics</a>, it comes as no surprise that its users are traditional tech companies. </p><h2 id="what-is-amazon-redshift">What is Amazon Redshift?</h2><p>Amazon Redshift is a SQL-based data warehouse that also enables number crunching on structured (and semi-structured) data. Redshift is exclusively available in AWS and is often used by AWS users for any analytics queries functionally impossible via standard databases like Postgres. </p><p>One of Redshift’s biggest selling points is its ability to scale automatically as data needs grow. Because it is tightly integrated with AWS, importing data from other AWS services is also relatively straightforward. Redshift is also easy to deploy inside a VPC and can easily encrypt data at rest or in transit. </p><p>Because Redshift is a multipurpose analytical database, its customers are wide-ranging, including Nasdaq, PBS, McDonald&#x27;s, Roche, and Merck. </p><h2 id="architecture">Architecture</h2><h3 id="redshifts-ultra-complex-architecture">Redshift’s (ultra-complex) architecture</h3><p>Redshift has a particularly complex architecture, which is a byproduct of Amazon’s enormous preexisting infrastructure, and Redshift’s goal of being an all-purpose database. </p><p>Redshift’s architecture is massively parallel, shared-nothing, and columnar. “Shared-nothing” means that individual Redshift clusters don’t have overlapping data, and “massively parallel” indicates that it splits computation between nodes. </p><p>On paper, these are standard premises behind an OLAP database. Redshift uses a leader node (sometimes called a master node) that acts as a load balancer, handling transactions between SQL clients and compute nodes. </p><p>Compute nodes, through some complexity discussed below, transact with storage that is often built on AWS S3, though support for other storage solutions, like RDS, has been added recently. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-redshift/Redshift_Simplfiied.png" alt="Redshift Simplfiied.png"/></p><p>Redshift becomes a bit more complex once we dive into its multiple layers of computation optimizations, both organizational and with bare-metal hardware. </p><p>The first is Redshift Spectrum, which refers to an army of EC2 machines that compute nodes can recruit to split a single query into parallel computations. More accurately, Redshift Spectrum is a layer between compute nodes and storage – while compute nodes divvy up queries via the leader node, Spectrum splits a single query’s computation between many machines. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-redshift/Amazon_Redshift_Spectrum.png" alt="Amazon Redshift Spectrum.png"/></p><p>The easiest way to describe this setup is to walk through a single query. Imagine a <a href="/blog/best-open-source-business-intelligence-tools">business intelligence (BI) tool</a> that wants to learn the total sum of sales across a company’s history. In order: </p><ol><li>A leader node accepts the query and delegates it to a compute node.</li><li>A compute node employs Redshift Spectrum to execute the summation.</li><li>Thousands of machines in Spectrum begin adding up multiple months of sales data each, returning those aggregations to the compute node.</li><li>The compute node adds all the micro-aggregations together, calculating a total aggregation across all data. </li><li>The compute node returns that value to the leader node. </li><li>The leader node returns that value to the BI tool. </li></ol><p>Things get extra complicated and efficient, with Amazon’s 2019 release of AQUA (Advanced Query Accelerator). AQUA evolved because SSD bandwidth increased immensely over time, but more storage doesn’t inherently mean faster queries, especially when the bottleneck is now between the memory-compute bus. </p><p>AQUA is a hardware optimization that enables storage units to run computations without burdening the main compute layers (e.g., Redshift Spectrum). It is <strong>not</strong> a replacement for Spectrum, it just eases the load by handling standard tasks, such as encryption or compression, as well as precomputing simple aggregations of data. </p><p>According to AWS, AQUA boosts performance by 10x on average by precomputing queries. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-redshift/AQUA.png" alt="AQUA.png"/></p><p>AQUA shifts Amazon’s shared-nothing model to something similar to a shared storage model. Because AQUA precomputes data, it encourages developers to use a single Redshift managed storage layer that multiple Redshift clusters can interact with.</p><h3 id="clickhouses-traditional-architecture">ClickHouse’s (traditional) architecture</h3><p>ClickHouse’s traditional architecture differ for some managed instances, but it best represents overall design differences. </p><p>ClickHouse extends a shared-nothing architecture, combining CPU, storage, and memory into a single, beefy machine. But while ClickHouse’s design is fundamentally monolithic, it also supports sharding a database across multiple instances using Apache ZooKeeper. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-redshift/Shared_Nothing_Architecture.png" alt="Shared Nothing Architecture.png"/></p><p>Because ClickHouse bundles everything into the same instance, it can scale that instance into three discrete dimensions – storage, memory, and compute. Although, scaling an already provisioned instance isn’t trivial; a new instance needs to be spun up and the data needs to be manually migrated. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-redshift/Clickhouse__3_Dimensions.png" alt="Clickhouse_ 3 Dimensions.png"/></p><p>Like Redshift, ClickHouse employs techniques for pre-aggregating data to return faster queries. Redshift accomplishes this by specialized in-memory hardware that precomputes queries. ClickHouse, by contrast, uses materialized views with custom settings that dynamically and efficiently precompute data once new data is ingested. </p><p>In layman&#x27;s terms ClickHouse is a speedboat whereas Amazon Redshift is an aircraft carrier – one is most definitely feature-packed (Redshift), while the other is faster (ClickHouse). And sometimes, that speed is the deciding factor.</p><h3 id="clickhouse-clouds-architecture">ClickHouse Cloud’s architecture</h3><p>A common point of confusion is the distinction between ClickHouse and ClickHouse Cloud, particularly in regard to architecture. While ClickHouse is a monolithic titan, ClickHouse Cloud decouples storage and compute. It is deployed on AWS and, as of very recently, GCP. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-redshift/ClickHouse_Cloud_Architecture.png" alt="ClickHouse Cloud Architecture.png"/></p><p>ClickHouse Cloud was modeled after Google BigQuery, offering out-of-the-box integrations with ELT providers, an interactive SQL console, automated backups, caching, and automatic replication. </p><h2 id="why-clickhouse-is-still-faster-with-a-caveat">Why ClickHouse is still faster (with a caveat)</h2><p>The general consensus of speed tests is that ClickHouse is faster [<a href="https://clickhouse.com/blog/redshift-vs-clickhouse-comparison">1</a>][<a href="https://www.firebolt.io/comparison/redshift-vs-clickhouse">2</a>][<a href="https://altinity.com/blog/clickhouse-vs-redshift-performance-for-fintech-risk-management">3</a>]. However, this speed comparison isn’t as cut-and-dry as most other ClickHouse comparisons. </p><p>The ClickHouse and Redshift comparison comes down to the nitty-gritty. Both offer materialized views with incremental updates, SIMD vector executions, and strong compression standards. The difference is that Redshift’s optimizations are created to optimize queries without much configuration (and, by contrast, some limited efficacy), while ClickHouse’s optimizations take work and effort, but are tuned for a project’s unique needs. </p><p>There are some limitations of Redshift that ClickHouse <a href="https://clickhouse.com/blog/redshift-vs-clickhouse-comparison">calls out</a> itself. The first limitation is that Redshift only allows up to 50 concurrent queries; this is a valid concern, particularly for analytics or data products where concurrent queries are abundant. </p><p>The second limitation is that Redshift needs to compile first-time queries to optimize them, which adds a few seconds of delay. This compilation time isn’t ideal for analytics products where users are constantly customizing first-time queries to the database. ClickHouse also notes that it has better compression than Redshift, scoring something in the realm of 2x compression.</p><p>A common criticism of ClickHouse, meanwhile, is that it lacks a results cache, which is a flagship feature of Redshift. A results cache is excellent for applications with predictable, repeatable queries. Thankfully, ClickHouse has addressed this concern with a new update in February of this year; the project now supports <a href="https://clickhouse.com/blog/introduction-to-the-clickhouse-query-cache-and-design">a configurable cache</a>. </p><p>A counterargument to ClickHouse’s speed supremacy is that it requires a lot more work. Materialized views need to be configured by engineers. In general, it requires more technical oversight to streamline queries. </p><p>Meanwhile, Redshift has AutoMV, which automatically creates materialized views. Redshift is ideal for companies that want a faster solution than Google BigQuery, but cannot afford to spend too much time tuning queries. </p><h2 id="how-clickhouse-and-redshift-often-work-together">How ClickHouse and Redshift often work together</h2><p>Because ClickHouse is faster at certain queries, while Redshift is a more general-purpose product that is easier to connect to a preexisting AWS stack, they can work well together with redundant data. ClickHouse <a href="https://clickhouse.com/blog/redshift-vs-clickhouse-comparison">has a fantastic guide</a> detailing step-by-step how to connect the two. </p><p>There are a number of ETL providers that enable streaming data between Redshift and ClickHouse, but given Redshift is already embedded in the AWS ecosystem, many developers use AWS Glue. While AWS Glue lacks a native ClickHouse connector (for now), it can <a href="https://clickhouse.com/blog/redshift-vs-clickhouse-comparison#using-aws-glue-for-streaming-data-between-redshift-and-clickhouse">execute Python scripts</a> that can be used to ingest data. Additionally, AWS EventBridge and AWS Lambda can be used to automatically trigger an ETL job after new data is ingested.</p><h2 id="summary">Summary</h2><p>ClickHouse and Redshift are both fantastic OLAP solutions that can efficiently return aggregations of data. ClickHouse is typically faster, beating out Redshift by 2-5x margins, but it requires more engineering effort, and isn’t as tightly embedded with other tools. Redshift, by contrast, works nicely with other AWS products. </p><p>Because of their differences, ClickHouse and AWS Redshift are sometimes used in conjunction, connected via an events manager (like AWS EventBridge) and an ETL solution (like AWS Glue). </p><p>We chose ClickHouse at <a href="https://posthog.com/">PostHog</a> because we needed to return aggregations for unpredictable queries for hundreds of customers. Because of ClickHouse, PostHog is fast and can deliver results at “click of a button” speeds. </p><h2 id="further-reading">Further reading</h2><p>Consider the following resources if you want to learn more about the differences between ClickHouse and Redshift.</p><ul><li><a href="https://clickhouse.com/docs/en/integrations/redshift">ClickHouse guide to migrating data from Redshift to ClickHouse</a></li><li><a href="https://clickhouse.com/blog/redshift-vs-clickhouse-comparison">Optimizing Analytical Workloads: Comparing Redshift vs ClickHouse</a></li><li><a href="https://altinity.com/blog/2017/6/20/clickhouse-vs-redshift">Altinity&#x27;s ClickHouse vs Redshift benchmarking</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing HouseWatch: An open-source toolkit for ClickHouse]]></title><description><![CDATA[We are big fans of ClickHouse. We rely on it heavily to store and retrieve the massive amount of data we process every day. In doing this at scale for…]]></description><link>https://posthog.com/blog/introducing-housewatch</link><guid isPermaLink="false">86124948-9978-590b-b263-68f6cf16732e</guid><dc:creator><![CDATA[Ian Vanagas]]></dc:creator><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We are big fans of ClickHouse. We rely on it heavily to store and retrieve the massive amount of data we process every day. In doing this at scale for multiple years now, we’ve built a lot of expertise and systems related to ClickHouse. </p><p>To formalize and share these, we’ve recently built and launched <a href="https://github.com/PostHog/HouseWatch">HouseWatch</a>, an open-source suite of tools for monitoring and managing ClickHouse. HouseWatch is free and works with your existing ClickHouse instance. You can <a href="https://github.com/PostHog/HouseWatch">clone it from GitHub</a> and deploy it via Docker Compose.</p><h2 id="why-we-built-housewatch">Why we built HouseWatch</h2><p>We started using ClickHouse in August 2021 when we <a href="/blog/how-we-turned-clickhouse-into-our-eventmansion">moved away from Postgres</a>.</p><p>ClickHouse provides tons of easily queryable metadata about your system, but knowing how and what to query is difficult. From our usage of ClickHouse, we’ve built an intuition for this – some of which we’ve documented in our <a href="/handbook/engineering/clickhouse">ClickHouse manual</a>. </p><p>We’ve also built many systems and processes for managing clusters. These include:</p><ul><li>Tracking metrics via Grafana</li><li>Querying via Metabase</li><li>Running operations on nodes through <code>ssh</code></li><li>Managing async migrations with <a href="/blog/async-migrations">custom-built tools</a></li></ul><p>To share our expertise, formalize these tools, and centralize them in one place, our engineers Li, Yakko, and CTO Tim built the first version of HouseWatch at our <a href="/blog/aruba-hackathon">Aruba offsite</a>. We felt it would be useful to us, and support other ClickHouse users as well.</p><h2 id="features">Features</h2><p>HouseWatch provides a central location for the tools we use to monitor and manage ClickHouse.</p><h3 id="query-performance-and-analysis">Query performance and analysis</h3><p>To help understand the performance of all the queries on your ClickHouse clusters, we provide a list of normalized queries and their performance metrics, with an emphasis on active and slow queries. </p><p>Each query includes metrics on average run time, calls per minute, percentage of all IOPs, total IOPs, and percentage of run time. It also includes details on the query itself and the <code>EXPLAIN</code> statement. From this, you can sort, monitor, and improve important, slow, or high-stress queries.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/introducing-housewatch/slow.png" alt="Slow"/></p><h3 id="schema-stats">Schema stats</h3><p>HouseWatch provides stats for all the tables for your cluster and lets you dive into the details for each of them. For each table, you can see columns, parts, compressed and uncompressed disk space sizes, disk usage, and more.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/introducing-housewatch/table.png" alt="Schema"/></p><h3 id="query-editing-and-benchmarking">Query editing and benchmarking</h3><p>With the size of data ClickHouse stores and processes, optimizing your queries is critical. To help you do this, you can run and edit queries in HouseWatch, as well as test and compare them.</p><p>You can run queries on your ClickHouse cluster and receive results visualized in HouseWatch. For query comparisons, you can write two queries, run them, and then get metrics on performance across the duration, read bytes, CPU usage, memory usage, and more. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/introducing-housewatch/compare.png" alt="Compare"/></p><p>We’ve also built a natural language query editor that uses GPT to create ClickHouse queries based on the table and instructions you provide.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/introducing-housewatch/ai.png" alt="AI"/></p><h3 id="logs-and-errors">Logs and errors</h3><p>Like any good monitoring tool, HouseWatch provides access to logs and errors from ClickHouse. For both, you can search for specific ones, as well as see the number of and most recent occurrences.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/introducing-housewatch/errors.png" alt="Errors"/></p><h3 id="operations">Operations</h3><p>Last but not least is our operations tool. This is inspired by our <a href="/handbook/engineering/databases/async-migrations">async migrations tool</a>, which we&#x27;ve used in production for over a year. It enables you to run and monitor long-running operations like migrations or SQL commands. You can monitor their status, pause or stop them, and retry them if they fail. Failures come with automatic rollbacks as well.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/introducing-housewatch/operations.png" alt="Operations"/></p><h2 id="deploying-housewatch">Deploying HouseWatch</h2><p>First, clone the repo.</p><pre><code class="language-bash">git clone https://github.com/PostHog/HouseWatch
</code></pre><p>Next, create a <code>.env</code> file and add the following environment variables.</p><pre><code>CLICKHOUSE_HOST=localhost \
CLICKHOUSE_CLUSTER=mycluster \
CLICKHOUSE_USER=default \
CLICKHOUSE_PASSWORD=xxxxxxxxxxx \
</code></pre><p>Finally, run Docker Compose.</p><pre><code class="language-bash">docker compose -f docker-compose.yml up
</code></pre><h2 id="future-plans">Future plans</h2><p>We aspire for HouseWatch to be like <a href="https://pganalyze.com/">pganalyze</a> for ClickHouse. There is more to build to make this a reality including:</p><ul><li>An index advisor tool</li><li>A visualizer for <code>EXPLAIN</code> statements</li><li>Support for monitoring multiple instances</li><li>Automatic surfacing of known system issues </li></ul><blockquote><p>You can see our full to-do list, suggest a feature, find installation details, or contribute by going to the <a href="https://github.com/PostHog/HouseWatch">HouseWatch repo</a>.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing HogQL: Direct SQL access for PostHog]]></title><description><![CDATA[Today, we're releasing a major new feature as a public beta: the ability to directly query your PostHog data  using SQL . We call this  HogQL  because…]]></description><link>https://posthog.com/blog/introducing-hogql</link><guid isPermaLink="false">f0117186-933a-57d2-b486-498e37d3c38d</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 08 Jun 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog_ql.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Today, we&#x27;re releasing a major new feature as a public beta: the ability to directly query your PostHog data <a href="/blog/sql-for-analytics">using SQL</a>. We call this <a href="/docs/product-analytics/hogql">HogQL</a> because... hedgehogs love SQL, probably?</p><p>You can use <a href="/docs/hogql/expressions">HogQL expressions</a> to enhance insights, filter event lists, and write full queries to analyze data in any way you want. </p><p>PostHog&#x27;s existing insights are already incredibly powerful. HogQL turns insights Super Saiyan.</p><p>HogQL is free for all users of PostHog Cloud while in public beta – all we ask is that you <a href="http://app.posthog.com/home#supportModal">share your feedback with us</a>.</p><h2 id="what-is-hogql">What is HogQL?</h2><p>It&#x27;s a translation layer over ClickHouse SQL. It&#x27;s intuitive for anyone familiar with SQL, but it offers a few advantages and customizations.</p><p>Features unique to HogQL include simplified access to event and person properties, like the <a href="/tutorials/hogql-autocapture">autocapture element chain</a>. It also automatically adds joins when you query fields with data on a different table, such as <code>events.person.properties.$browser</code>.</p><p>You can also use subqueries, joins, table expressions, arrays, lambdas, and a whole host of other neat SQL features, including aggregations. </p><p>See our <a href="/docs/product-analytics/hogql">HogQL documentation</a> for a full <a href="/docs/product-analytics/hogql#supported-clickhouse-functions">list of supported ClickHouse SQL functions</a>.</p><blockquote><p><strong>Not a PostHog user?</strong> <a href="https://app.posthog.com/signup?utm_source=hogql-blog-top">Get started for free</a> – all users get 1 million events and 5k recordings free every month, <strong>no card required.</strong></p></blockquote><h2 id="what-can-you-do-with-hogql">What can you do with HogQL?</h2><p>Too much to list in one blog post, but here are a few examples:</p><h3 id="hogql-breakdowns--multiple-properties">HogQL breakdowns = multiple properties</h3><p>Want to break down signups by both pricing tier <em>and</em> overall usage? No problem. HogQL does that. With HogQL, you can add as many breakdown properties as you like. Go nuts.</p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1710055416/posthog.com/contents/images/blog/array/hog_breakdown.mp4"></video></p><blockquote><p><strong>🎓 Related tutorial:</strong> <a href="/tutorials/hogql-breakdowns">Using HogQL for advanced breakdowns</a></p></blockquote><h3 id="hogql-filters">HogQL filters</h3><p>Oh, look. You can use HogQL in filters too. Useful for <em>filtering</em> by multiple properties!</p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1710055416/posthog.com/contents/images/blog/array/hog_filters.mp4"></video></p><blockquote><p><strong>🎓 Related tutorial</strong> <a href="/tutorials/hogql-date-time-filters">Using HogQL for advanced time and date filters</a></p></blockquote><h3 id="hogql-aggregations">HogQL aggregations</h3><p><em>And</em> you can use HogQL to aggregate results in a funnel, too. Is there anything HogQL can&#x27;t do? Probably, yes, but we&#x27;ll enjoy finding out for sure. </p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1710055416/posthog.com/contents/images/blog/array/hog_aggregate.mp4"></video></p><blockquote><p><strong>🎓 Related tutorial</strong> <a href="/tutorials/hogql-sum-aggregation">The power of HogQL’s sum() aggregation</a></p></blockquote><h3 id="custom-sql-insights">Custom SQL insights</h3><p>Of course, the most powerful way to leverage HogQL within PostHog is via the new <a href="/docs/product-analytics/sql">SQL insight type</a>. This gives you direct SQL access to your data in PostHog, so you can create custom table insights that answer complex questions.</p><p>For example, while you can use a retention insight to discover which <strong>features</strong> keep users coming back for more, you could build an SQL insight to find which <strong>users</strong> keep coming back, and identify outliers. </p><p>We&#x27;re confident SQL insights will unlock deep analysis into how users use your products, and we can&#x27;t wait to hear <a href="http://app.posthog.com/home#supportModal">your feedback</a> and see how you use SQL access in PostHog. </p><p>To get a flavor, here&#x27;s an example query summarizing survey data. Its purpose? Determining which countries prefer pineapple on a pizza. This is serious analysis:<sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup></p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1710055416/posthog.com/contents/images/blog/array/pineapple_sql.mp4"></video></p><pre><code>   select properties.$geoip_country_name,
          countIf(not properties.does_pineapple_go_on_pizza) &gt; countIf(properties.does_pineapple_go_on_pizza)
            ? &#x27;🍅 Does not belong on pizza&#x27;
            : countIf(not properties.does_pineapple_go_on_pizza) = countIf(properties.does_pineapple_go_on_pizza)
              ? &#x27;🥦 It is a tie&#x27;
              : &#x27;🍍 Belongs on pizza&#x27;
          as Result,
          concat(
             repeat(&#x27;🍍&#x27;, countIf(properties.does_pineapple_go_on_pizza)),
             repeat(&#x27;🍅&#x27;, countIf(not properties.does_pineapple_go_on_pizza))
          ) as Answers,
          count() as `Number of answers`,
          concat(
            toString(round(countIf(properties.does_pineapple_go_on_pizza) / count() * 1000) / 10), &#x27;%&#x27;
          ) as `Percentage pineapple`
     from events
    where event = &#x27;pineapple_on_pizza_survey&#x27;
 group by properties.$geoip_country_name
 order by count() desc
    limit 100
</code></pre><h2 id="event-explorer--hogql--">Event explorer + HogQL = 🚀</h2><p>There. Is. Mooooorrrre.</p><p>As part of our work on HogQL, we&#x27;ve reworked all our insights as JSON objects, which you can customize. Just click the &#x27;View source&#x27; button in the top right (see below), and tweak the code directly.</p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1710055416/posthog.com/contents/images/blog/array/view-source.mp4"></video></p><p>You can also create custom table insights directly from Activity (previously &quot;Live Events&quot;) and Person &amp; Groups tabs. </p><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1710055416/posthog.com/contents/images/blog/array/custom_insights.mp4"></video></p><p>Just hit that &#x27;Open as a new insight&#x27; button (see above), tweak the JSON (if you want), and save your table to a dashboard or <a href="/docs/notebooks">notebook</a>.</p><p>Moving on... you can also use <a href="/docs/hogql/expressions">HogQL expressions</a> (e.g. <code>properties.$screen_width * $properties.screen_height</code>) and aggregations (e.g. <code>sum(properties.price)</code>) as columns. This is helpful not just for generating tables that summarize person and event information, but also for exploring the data in new and totally custom ways. </p><p>You could, for example, use HogQL to run currency conversions and normalize data into a single currency in its own column, or even extrapolate and project revenue, and usage figures, into the future. </p><h2 id="why-did-we-build-hogql-and-whats-next">Why did we build HogQL and what&#x27;s next?</h2><p>It started with a small idea and just got bigger.</p><p>We originally started thinking about HogQL back in January, while thinking about <a href="https://github.com/PostHog/posthog/issues/7963">a concept for universal search within PostHog</a>. </p><p>Over time, that plan evolved into creating <a href="https://github.com/PostHog/meta/issues/86">new ways for users to explore data</a> via direct queries. We wanted to enable to run formulas in what was then called the Live Events view, but is now &quot;Activity.&quot; </p><p>However, while this work was underway we realized we could potentially take it a step further and build full SQL support directly into PostHog as a new insight type... so we did! It was a short conversation. </p><p>We&#x27;re still actively developing all these ideas, as well as the implementation of HogQL within PostHog – seriously, check out this <a href="https://github.com/PostHog/meta/issues/81">massive mega issue</a>. This is, as the cliché goes, just the beginning. There&#x27;s at least 19 more Super Saiyan forms to go... 🔥</p><p>Got an opinion on what we should do next? Share it via the <a href="https://app.posthog.com/home#supportModal=feedback%3A">feedback modal in PostHog</a>, or let us know <a href="https://twitter.com/posthog">on Twitter</a>.</p><blockquote><p><strong>Not a PostHog user?</strong> <a href="https://app.posthog.com/signup?utm_source=hogql-blog-bottom">Get started for free</a> – all users get 1 million events and 5k recordings free every month, <strong>no card required.</strong></p></blockquote><p><div></div></p><div class="footnotes"><hr/><ol><li id="fn-1">68.5% of 🇺🇸 residents think 🍍 belongs on 🍕. People in 🇪🇸 are the greatest 🍍 deniers at 10%. One person in Aruba 🇦🇼 voted, but we&#x27;re pretty sure that was one of us during our <a href="/blog/aruba-hackathon">2023 all-company offsite</a>. We built some cool hackathon projects there, like our <a href="/templates">dashboard template library</a>, and an open-source tool for <a href="https://github.com/PostHog/HouseWatch">monitoring and managing ClickHouse clusters</a>. You could say it was openly... sourcey. &quot;<em>Hello, HR? Are bad puns a firing offense?</em>&quot;<a href="#fnref-1" class="footnote-backref">↩</a></li></ol></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What we built at our sun-kissed Aruba hackathon]]></title><description><![CDATA[Every year, Team PostHog congregates for our  annual all-company offsite . In previous years we've been to Italy, Portugal and Iceland. This year, we…]]></description><link>https://posthog.com/blog/aruba-hackathon</link><guid isPermaLink="false">b02e558e-3625-500b-89dd-e031fe894197</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 24 Apr 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/aruba/beach-hog.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every year, Team PostHog congregates for our <a href="/handbook/company/offsites">annual all-company offsite</a>. In previous years we&#x27;ve been to Italy, Portugal and Iceland. This year, we went to Aruba – a tiny, Caribbean island just off the north coast of Venezuela.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/aruba-vibes.jpeg" alt="posthog aruba"/></p><p>As a remote company, our offsites are a hugely important part of our culture. We encourage everyone to meet up when they can, be that through co-working, ad-hoc visits (<a href="/handbook/people/spending-money#budget-for-socializing">which we pay for</a>), or <a href="/handbook/company/offsites#small-team-offsites">small team offsites</a>, but we only get the whole company together once a year.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/people-shots.jpeg" alt="posthog aruba"/></p><p>When we do, we like to plan a mixture of fun social activities, strategic sessions and workshops, culture exercises, and (the most important bit) a 24-hour hackathon.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/aruba-hackathon-photos.jpeg" alt="posthog aruba"/></p><p>Here&#x27;s what we built during our Aruba hackathon.</p><h2 id="maxai-our-friendly-posthog-support-ai">MaxAI: Our friendly, PostHog support AI</h2><blockquote><p><strong>Note</strong>: MaxAI is now <a href="/docs/posthog-ai">PostHog AI</a>.</p></blockquote><ul><li><strong>Team Bandwaggoners:</strong> James Greenhill, Paul Hultgren, Eric Duong, Raquel Smith and Neil Kakkar</li></ul><p>Deployed on our Slack, app, website, and GitHub repos, MaxAI was the inevitable result of everyone wanting to play with GPT. </p><p>The goal was to create an AI bot that could answer support questions, easing the load on our <a href="/handbook/engineering/support-hero">support heroes</a> and making it easier for the community to find answers to their questions.</p><p>Built using Weaviate, Haystack, and <code>gpt-3.5-turbo</code>, MaxAI works by taking a user&#x27;s question, collecting all relevant docs and data to that question, generating a prompt with that context, and querying OpenAI for an answer.</p><p>Here&#x27;s a flowchart of the process:</p><pre><code class="language-mermaid">flowchart TD
    A[User Question] --&gt;|Embed| I(Question Vector)
    I --&gt;|Query Weaviate|J[Most Similar Docs]
    J --&gt;|Collect Prompt Params| C{Prompt Context}
    C --&gt; D[Limitations]
    C --&gt; E[Personality]
    C --&gt; F[Context Docs]
    F --&gt; G[String Prompt]
    E --&gt; G
    D --&gt; G
    G --&gt;|Query OpenAI|H[AI Response]
</code></pre><p>On the whole, Max gives useful answers – even when dealing with complex questions. Max is also dead handy for summarizing long support threads in Slack or GitHub issues. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/max-ai.jpeg" alt="maxai"/></p><p>That said, Max isn&#x27;t immune to hallucinating solutions – or even URLs for docs that don&#x27;t exist – if it doesn&#x27;t know the answer. It&#x27;s a work in progress, but we&#x27;ve released Max on <a href="/posts">our community page</a> as a beta. Drop him a DM! </p><p>Check out the <a href="https://github.com/PostHog/max-ai">MaxAI repo</a> for more info.</p><h2 id="dashboard-template-libraries-and-learning-tracks">Dashboard template libraries and learning tracks</h2><ul><li><strong>Team Vibes:</strong> Ian Vanagas, Joe Martin and Andy Vandervell</li></ul><p>The marketing team worked together to build (and ship) a <a href="/templates">public library of pre-built dashboards</a>, including an <a href="/templates/aarrr-dashboard">AARRR pirate metrics dashboard</a>, <a href="/templates/b2c-dashboard">templates for B2C</a> and <a href="/templates/b2c-dashboard">B2B products</a>, and a <a href="/templates/landing-dashboard">landing page report</a> for marketers transitioning from Google Analytics.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/templates.png" alt="dashboard templates"/></p><p>These dashboards are accessible from the &#x27;New Dashboard&#x27; modal in PostHog. Some templates require custom events, which you&#x27;ll be asked to configure before creating the dashboard – you can also change the events you track later.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/setup-events.png" alt="dashboard templates"/></p><p>Got a request for a dashboard? DM the team on our community Slack!</p><h2 id="a-curated-set-of-posthog-tutorials">A curated set of PostHog tutorials</h2><ul><li><strong>Team Not-ShuffleHog:</strong> Joe Martin and Eli Kinsey</li></ul><p>For Joe, one hackathon project wasn&#x27;t enough. He also worked with Eli Kinsey from the Website &amp; Docs team to ship <a href="/tracks">PostHog Tracks</a>, a new way to discover tutorials organized by role.</p><p>Tracks groups tutorials into curated lesson groups based on the common use-cases we see in PostHog. There are lesson tracks for Product Engineers, Front-end Developers, and Product Managers. </p><p>The team name is a reference to a hackathon project Joe is especially passionate about, but wasn&#x27;t able to work on this year. One day. </p><h2 id="a-built-in-data-warehouse-for-posthog">A built-in data warehouse for PostHog</h2><ul><li><strong>Team DataBeach:</strong> Marius Andra, Frank Hamand and Harry Waye</li></ul><p>Dubbed DataBeach because Frank and Harry started building the feature while sipping Piña Coladas by the beach, DataBeach is all about our long-term vision of <a href="/blog/modern-data-stack-sucks">simplifying the modern data stack</a> for startups. Less time spent wrangling data = more time shipping products. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/data-beach.png" alt="databeach"/></p><p>They teamed up with Marius to an build MVP consisting of custom tables that are created and queried through the PostHog UI and API. These tables provide a way to store and query data from sources such as Stripe, <a href="/tutorials/hubspot-reports">Hubspot</a> (see above), Intercom, and more, along with data from PostHog.</p><p>There&#x27;s more to build before PostHog is ready to be your data warehouse, but we&#x27;re working on it. Keep an eye on our <a href="/roadmap">public roadmap</a> for updates.</p><h2 id="leveling-up-posthog-support">Leveling up PostHog support</h2><ul><li><strong>Team Arubug:</strong> Tiina Turban, Simon Fisher, Paul D&#x27;Ambra, Cameron DeLeone, and Cory Watilo</li></ul><p>Anecdotally, our direct-to-an-engineer support is a big reason why people love us. But we&#x27;ve run into a few of inefficiencies as we&#x27;ve grown, such as:</p><ul><li>Support requests that lack the context an engineer needs to fix it</li><li>Lack of trends and aggregated info about support requests</li><li>Difficulty managing multiple sources for support requests</li></ul><p>Enter team Arubug, who decided there had to be a better way.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/bug-report.gif" alt="bug report"/></p><p>The team started by <a href="/tutorials/build-site-app">building a site app</a> for bug reports which sends a <code>$bug_report</code> event to PostHog.</p><p>These reports feed into a dashboard that tracks bug reports, helping us to identity trends. Bugs can be broken down as tables with relevant properties, and session replays, attached.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/arubug-table.png" alt="bug table"/></p><p>The team also built a communication tab into bug reports, so support can send emails and leave notes on tickets with additional context without leaving the app. Every email is a ClickHouse event tied to the initial UUID of the report event, with emails (for now) sent and received via Zapier.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/conversation-tab.png" alt="communication-tab"/></p><p>After the hackathon, we reviewed the plan and realized: </p><ol><li><p>Due to the increased complexity of our product, it&#x27;s hard for a single engineer to provide good support for all of our products. </p></li><li><p>Support heroes shield product teams from feedback about their product, impeding an important feedback loop.</p></li></ol><p>Consequently, we decided to use the hackathon in-app integration to triage support requests by product/team, and improve our integration with Zendesk instead of developing the communication tab further. </p><p>Now, instead of our single support hero, each team will handle support requests for their product, and tickets will be enhanced with useful context, such as session replays and product usage data. This process also enables us to collect aggregated info on bugs and requests, so we can identify common issues faster.</p><h2 id="hedgehog-mode--toolbar--awesomeness">Hedgehog mode + toolbar = awesomeness</h2><ul><li><strong>Team:</strong> Ben White, Grace McKenzie and Lottie Coxon</li></ul><p>Hedgehog mode is one of PostHog&#x27;s most powerful features – who wouldn&#x27;t want to play with our adorable mascot? </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/hats.gif" alt="hats"/></p><p>Currently, Max – accessible via the help menu in PostHog – can jump around, spin, wave, dance, and wave. For their hackathon, the team worked on accessories for Max, such as hats, glasses, and costumes, that PostHog users could unlock by completing certain tasks – e.g. watching a certain number of replays.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/toolbar.gif" alt="toolbar"/></p><p>They also set about revamping the PostHog Toolbar, replacing the dull but functional PostHog icon with an animated Max whose status changes when you select different toolbar features.</p><h2 id="posthog-beta-feature-previews">PostHog beta feature previews</h2><ul><li><strong>Team WE WILL DE-FEAT-URE MANAGEMENT YOU:</strong> James Hawkins, Michael Matloka and Annika Schmid</li></ul><p>We&#x27;re constantly building new features, but we have to invite users personally to try them out. It&#x27;s inefficient and not cool. James, Michael and Annika thought it would be better if PostHog users could join PostHog betas themselves. So, they built it. That is cool.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/feature-previews.png" alt="feature previews"/></p><p><div>Interface for creating feature preview entries, including screenshots and docs options</div></p><p>Feature previews is pretty simple. It&#x27;s a list of features we&#x27;re testing, including screenshots and basic information, that users can simply enable or disable whenever they like. When they do, they&#x27;re either automatically added to, or removed from, the relevant feature flag.</p><p>In the future, we hope to extend this feature to PostHog users who want to do the same for their own users.</p><h2 id="summer-social-events">Summer social events</h2><ul><li><strong>Team Plops (People &amp; Ops):</strong> Coua Phang and Kendal Hall</li></ul><p>Our hackathon isn&#x27;t just for engineering. The People &amp; Ops team used the time to plan summer events (IRL and virtual) for the PostHog team.</p><p>In June they&#x27;ve planned a virtual engraving workshop, in July a virtual escape room experience, and in August we&#x27;re getting together in Cambridge, UK for a scavenger hunt around the city, and a barbecue.</p><h2 id="event-based-automations">Event-based automations</h2><ul><li><strong>Team Automations:</strong> Luke Harries, Ben White, Thomas Obermüller, Cory Watilo </li></ul><p>Luke, Thomas, Ben and Cory built an MVP for automations in PostHog. In the MVP, automations have a source (event, action or cron job), logic (pause for / pause until), and sources (e.g. send a Slack message, create a GitHub Issue, add to cohort, add to feature flag, send an in-app message etc.).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/automation-posthog.png" alt="automations"/></p><p>Even this basic functionality has numerous helpful use cases, but long-term we expect to add more sources and destinations, and the ability to create automations based on event thresholds.</p><h2 id="housewatch-centralized-monitoring-and-management-for-clickhouse">HouseWatch: Centralized monitoring and management for ClickHouse</h2><ul><li><strong>Team HouseWatch:</strong> Li Yi Yu, Yakko Majuri, and Tim Glaser</li></ul><p>PostHog uses ClickHouse as our main event database, but we end up using a huge range of tools (Grafana, Metabase, pganalyze etc.) to monitor and manage it. Team HouseWatch built a centralized dashboard, so we can eliminate all this bloat and have everything in one place.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/aruba/housewatch.png" alt="housewatch"/></p><p>The homepage enables us to monitor things like execution count (queries per hour), and memory usage. There&#x27;s also a slow queries view, which will allow the team to proactively identify problematic queries and reach out to customers to help.</p><p>Other features include:</p><ul><li>Custer performance overview</li><li>Table size visualizations (including size by columns)</li><li>Ability to kill queries</li><li>Productized async migrations</li></ul><p>Needless to say, this is all backend work you will never see, but HouseWatch will make it easier for us to keep PostHog fast and reliable for you.</p><h2 id="whats-next">What&#x27;s next?</h2><p>Some hackathon projects, such as our new dashboard templates, have already shipped, while we&#x27;ve also revamped how we do support based on the work of Team Arubug. Others are still work-in-progress projects that we expect to ship in future – see our <a href="/roadmap">public roadmap</a> and <a href="https://github.com/PostHog/posthog">GitHub repo</a> for updates on what we&#x27;re working on.</p><p>Fancy joining us at our next all-company offsite? We&#x27;re <a href="/careers">always hiring</a>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: ClickHouse vs BigQuery]]></title><description><![CDATA[Both BigQuery and ClickHouse are databases designed to handle lots of data (like  loads  of data), but they have distinct philosophies and use cases…]]></description><link>https://posthog.com/blog/clickhouse-vs-bigquery</link><guid isPermaLink="false">8748c8cc-fad7-51e4-9d13-983abbf18a3e</guid><dc:creator><![CDATA[Mathew Pregasen]]></dc:creator><pubDate>Mon, 24 Apr 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Both BigQuery and ClickHouse are databases designed to handle lots of data (like <em>loads</em> of data), but they have distinct philosophies and use cases.</p><p>BigQuery is exceptional at handling complex business queries that can tolerate many-second (sometimes dozens of seconds) loading times at scale. Conversely, with some tuning ClickHouse can deliver sub-second performance on terabytes of data for predictable queries, making it ideal for powering customer-facing dashboards and analytics.</p><p>In this article, I’ll explain how BigQuery and ClickHouse work, and how their approaches create very different products and target use-cases. </p><h2 id="background">Background</h2><p>At first glance, comparing BigQuery and ClickHouse seems like a David versus Goliath situation. </p><p>While they both tackle search and analytics problems, are built on columnar data storage, and are available via managed infrastructure, BigQuery is an established name maintained by one of the infrastructure mob bosses (sorry, I mean <em>benevolent leaders</em>), while ClickHouse is a relative newcomer and an open source one at that.</p><p>That said, ClickHouse is exploding in popularity, has a hugely active development community, and is already used by the likes of Spotify, Uber, Cloudflare, and popular developer platforms like <a href="https://posthog.com/">PostHog</a>. Moreover, it has its origins in another big tech player, Yandex.</p><h3 id="what-is-clickhouse">What is ClickHouse?</h3><p>Over a decade ago, Yandex Metrica (a Google Analytics analog in Russia) needed to store petabytes of data targeting sub-second retrieval. This tight constraint served as the bedrock for ClickHouse. In 2016, ClickHouse was spun out into an independent open-source project, and is now actively maintained by ClickHouse Inc. with contributions from Altinity Inc.</p><p>In its stock form, ClickHouse is just a data warehouse. It does not include a user interface, nor any stateful management for querying data. Instead, developers directly interface with ClickHouse through the command line or an SDK wrapper library as they would any other database. However, ClickHouse Inc. also develops ClickHouse Cloud, a managed service that runs ClickHouse on the cloud in a style similar to BigQuery. </p><p>While these managed services are paid products, ClickHouse’s core remains open source. Most literature on ClickHouse focuses on stock ClickHouse, but I’ll also compare ClickHouse Cloud directly with BigQuery because they operate on the same decoupled infrastructure pattern. </p><h3 id="what-is-bigquery">What is BigQuery?</h3><p>BigQuery’s claim to fame was its novel way of decoupling storage and compute. Before BigQuery, databases would typically bundle storage and compute in the same box. Targeting reporting and analytical needs, BigQuery enables data engineers to store data without worrying about scaling clusters or storage. </p><p>BigQuery is exclusively available on GCP (Google Cloud Platform) and is tightly integrated with other GCP products. However, BigQuery can also connect to AWS and Azure storage through <a href="https://cloud.google.com/blog/products/data-analytics/introducing-bigquery-omni">BigQuery Omni</a>, though that defeats some of BigQuery’s all-in-one value-prop.  </p><p>One of the reasons that BigQuery touts a feature-rich and friendly user-interface is to appeal to marketers with some basic SQL skills. While BigQuery isn’t as non-technical friendly as <a href="/blog/clickhouse-vs-elasticsearch">Kibana</a> or <a href="/blog/clickhouse-vs-snowflake">Snowflake</a>, it does make using SQL easier by providing a GUI wrapper with the ability to save progress. Of course, for development purposes, BigQuery can also be accessed via GCP’s command line suite. </p><h2 id="architecture">Architecture</h2><h3 id="bigquerys-architecture">BigQuery’s Architecture</h3><p>BigQuery’s serverless architecture was novel at the time of its 2010 debut. Every BigQuery instance has variable storage units (distributed replicas) connected to variable compute units (calling slots); as an instance’s demands grow, so does its utilization of the storage and compute slots. Even today, this approach stands out — most databases parallelize compute, but not storage. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-bigquery/bigquery-architecture.png" alt="BigQuery Architecture.png"/></p><p>BigQuery extends many Google projects to make this happen. Specifically, BigQuery uses Colossus, Google’s file storage system; Borg, Google’s job scheduler; Dremel, a multi-tenant cluster that executes the queries; and Jupiter, Google’s petabit network. BigQuery works because Google has a massive general-purpose infrastructure designed for isolated storage and compute.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-bigquery/google-infra.png" alt="Google Infra.png"/></p><p>Amid being built on titanic infrastructure, BigQuery usually returns results in the order of <em>seconds</em>, not <em>milliseconds</em>, because it focuses on scalability, not per-query performance. </p><h3 id="clickhouses-traditional-architecture">ClickHouse’s (Traditional) Architecture</h3><p>ClickHouse utilizes a shared-nothing architecture where CPU, Storage, and Memory are stored in a single, beefy machine. While ClickHouse <em>does</em> support sharding databases across many physical instances managed under Apache Zookeeper, its fundamental design is monolithic. When you use ClickHouse (traditionally), everything is happening in the same place. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-bigquery/shared-nothing-architecture.png" alt="Shared Nothing Architecture.png"/></p><p>Accordingly, ClickHouse can scale in all three dimensions (storage, memory, and compute) by simply upgrading the machine. However, scaling isn&#x27;t as straightforward compared to BigQuery — compute cannot be added on a whim to the same instance, though you can add additional disks to an instance to scale capacity.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-bigquery/clickhouse-3-dimensions.png" alt="Clickhouse_ 3 Dimensions.png"/></p><p>ClickHouse’s magic happens in the way it compresses data, pre-aggregates data, and uses specialized engines to access a device’s full compute potential. If BigQuery is a commercial airliner, then ClickHouse is a fighter jet.</p><h3 id="clickhouse-clouds-architecture">ClickHouse Cloud’s Architecture</h3><p>ClickHouse Cloud flips ClickHouse’s monolithic architecture on its head. ClickHouse Cloud is ClickHouse Inc.’s paid offering that helps bridge the gap between ClickHouse and BigQuery. Not only does ClickHouse Cloud provide a UI for interfacing with ClickHouse like BigQuery, it deploys ClickHouse on decoupled storage and compute on AWS. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-bigquery/clickhouse-cloud-architecture.png" alt="ClickHouse Cloud Architecture.png"/></p><p>ClickHouse Cloud is unquestionably modeled after BigQuery and GCP. It offers similar features, such as out-of-the-box integrations with ELT providers, an interactive SQL console, automated backups, caching, and automatic replication. </p><p>However, ClickHouse Cloud is still <strong><em>not</em></strong> a pure replacement for BigQuery. ClickHouse Cloud simply makes managing, scaling, and protecting a ClickHouse instance easy — it does <strong><em>not</em></strong> alter the way ClickHouse works, including what it is and isn’t good at. </p><blockquote><p><strong>Using ClickHouse + GCS:</strong> It’s worth mentioning that another hybrid architecture exists — ClickHouse + Google Cloud Storage (GCS). Specifically, developers could replace ClickHouse’s in-unit storage with Google Cloud Storage instead. ClickHouse’s <a href="https://clickhouse.com/docs/en/integrations/gcs">integration with GCS</a> effectively decouples storage and compute, and works great for businesses that already use GCS. </p></blockquote><h2 id="why-clickhouse-is-faster">Why ClickHouse is faster</h2><p>Data warehouses like BigQuery and ClickHouse are used to return analytical queries. Queries might look like “a list of average revenue for the last four years” or “the median household income”. Not only do these queries change on <strong>every</strong> data insert, but computing many values can draw a lot of memory and processing power. </p><p>The performance difference between BigQuery and ClickHouse can be immense. BigQuery can take dozens of seconds to execute a query. ClickHouse, if tuned correctly, can execute the same query on <em>terabytes</em> of data with sub-second performance. </p><p>The <strong>&quot;tuned”</strong> bit is important — ClickHouse gives developers tooling to expedite expected queries. While BigQuery does some standard optimizations, like columnar storage (which we discuss in more detail in our <a href="/blog/clickhouse-vs-postgres">ClickHouse and Postgres comparison</a>), ClickHouse goes further. In particular, ClickHouse accomplishes its “fighter jet” speeds by leveraging four techniques:</p><ol><li>Granulated storage</li><li>Materialized views</li><li>Specialized engines</li><li>Vectorized query execution.</li></ol><h3 id="granulated-storage">Granulated Storage</h3><p>Most databases store data indexed via primary keys. When searching for that data, such as a specific column, a typical database scans all data and return the result. This is sloooow. </p><p>ClickHouse achieves a magnificent speed boost by using granulated storage. Each ClickHouse table has a primary key defined as a tuple of multiple columns. Data is then sorted by those columns, first by the first entry, then by the second, and onwards. Afterwards, sorted entries are broken into granules, which are fixed length mini-tables, by default 8192 entries long. ClickHouse’s big advancement is that it exclusively saves just the <strong>first</strong> entry to each granule. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-bigquery/granulated-storage.png" alt="Granulated Storage.png"/></p><p>Because data is sorted by primary key columns — and those columns are typically chosen based on what’s used to index data — ClickHouse needs to scan <strong><em>significantly</em></strong> less data for most queries. </p><h3 id="materialized-views">Materialized views</h3><p>Materialized views are pseudo-tables generated by other table data. Materialized views are available in a lot of databases, including industry-favorite, <a href="/blog/clickhouse-vs-postgres">Postgres</a>. However, most databases generate materialized views at a <em>specific</em> point in time. They aren’t updated automatically when new data is available; but in ClickHouse, they are. </p><p>ClickHouse doesn’t accomplish this by using a cron job. Instead, ClickHouse re-engineered how materialized views work. When data is ingested, typically in-bulk, it’s slowly added to a materialized view by merging with an intermediate data representation. </p><p>If you’ve ever implemented a MergeSort, ClickHouse’s underlying operation is similar. It is tuned for specific mathematical operations, like mean or count, and can append to a pre-existing materialized view incrementally.  </p><h3 id="specialized-engines">Specialized engines</h3><p>One of the magic features that powers materialized views is ClickHouse’s specialized engines. Specialized engines are engines that more efficiently utilize the disk for known mathematical patterns. For instance, when a materialized view is aided by ClickHouse’s <code>AggregatingMergeTree</code>, queries execute even faster. </p><p>This is one of the useful features we leverage extensively at PostHog – watch our <strong><a href="https://youtu.be/6IwLWEx_mg4?t=804">video on them</a></strong> if you&#x27;re curious.</p><h3 id="vectorized-query-execution">Vectorized Query Execution</h3><p>While BigQuery doesn’t support vectorized query execution, Google does <a href="https://cloud.google.com/bigquery/docs/bi-engine-query">offer it</a> through BI Engine, a separate GCP product that integrates with BigQuery. </p><h2 id="why-clickhouse-is-often-integrated-with-bigquery">Why ClickHouse is often integrated with BigQuery</h2><p>ClickHouse and BigQuery are often used together, evidenced by ClickHouse’s <a href="https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries">own blog post</a> on the topic. In general, for GCP users, BigQuery offers an easy, consolidated place to analyze data given its easy integration with other GCP data products. </p><p>However, a tuned ClickHouse instance is faster. If analytical queries need to be returned to a customer without noticeable delays, ClickHouse is likely the better solution. It’s also probably cheaper, as BigQuery charges users per scan or requires pre-purchased slots, which quickly grows expensive – it’s exactly why <a href="https://clickhouse.com/blog/hifis-migration-from-bigquery-to-clickhouse">HIFI switched to ClickHouse</a>, for example.  </p><p>With this arrangement, BigQuery can act as a business’s core data warehouse with ClickHouse operating as a tuned execution runtime. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-bigquery/data-flow.png" alt="Data FLow.png"/></p><p>In order to effectively connect ClickHouse and BigQuery, data needs to be streamed from BigQuery to ClickHouse. This can happen through Google Cloud Storage, or using Google DataFlow + Apache Beam. This does take some serious setup work (the ClickHouse + BigQuery connection is hardly “one-click”), but ClickHouse has a well-documented <a href="https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries">process</a> on it. </p><h2 id="who-uses-bigquery-and-clickhouse-and-clickhouse-cloud">Who uses BigQuery and ClickHouse (and ClickHouse Cloud)?</h2><p>The biggest piece of BigQuery’s appeal is that it’s a general-purpose columnar data warehouse that’s tightly integrated with GCP. Data from other databases can easily be streamed to BigQuery, making it ideal for companies that already use GCP. Additionally, because BigQuery charges on a usage basis, it is great for well-financed companies with loads of data (as opposed to smaller companies with loads of data). BigQuery’s customers include P&amp;G, Thomas Cook, 20th Century Fox, Asahi Group, HSBC, Wayfair, and Home Depot. </p><p>Meanwhile, ClickHouse is designed for companies that need to return aggregations <strong><em>quickly.</em></strong> For instance, ClickHouse was a fantastic fit for PostHog because we are an developer platform – we need to return queries like “what is the median time to convert for users who saw a X feature?” in <em>real time</em> and <em>at the speed of click</em>. ClickHouse dramatically leveled-up our data warehouse from our old Postgres setup, enabling us to deliver billion-event insights efficiently.</p><p>Other ClickHouse users include Github, YouTube, Twitter, and Slack, with ClickHouse typically powering <a href="/tutorials/embedded-analytics">user-facing analytics</a> panels in each product. To be clear, these are <strong>ClickHouse</strong> users, not <strong>ClickHouse Cloud</strong>. ClickHouse Cloud is a very early product, and it hasn’t publicized any customers just yet.</p><h2 id="summary">Summary</h2><p>ClickHouse and BigQuery both solve big problems in the big data space. </p><p>ClickHouse is incredibly fast, outpacing BigQuery and making it the ideal solution for “real-time” data needs. BigQuery, meanwhile, is tightly integrated with GCP and is ideal for non-tuned, arbitrary data queries. </p><p>As we’ve outlined, BigQuery and ClickHouse are also often used together, with data first ingested into BigQuery and then streamed into ClickHouse via GCS or a Google Dataflow and Apache Beam mix. </p><p>ClickHouse specifically is an ideal solution for developer platforms like us. Its low-cost, ultra-efficient mechanics delivers analytics at “click of a button” speeds.</p><h2 id="further-resources">Further Resources</h2><p>Consider the following resources if you want to learn more about ClickHouse and BigQuery’s differences.</p><ul><li><a href="https://clickhouse.com/docs/en/home/">ClickHouse Documentation</a></li><li><a href="https://cloud.google.com/bigquery/docs">BigQuery Documentation</a></li><li><a href="https://github.com/tpn/pdfs/blob/master/BigQuery%20Technical%20Whitepaper%20-%20Google.pdf">BigQuery Whitepaper</a></li><li><a href="/blog/how-we-turned-clickhouse-into-our-eventmansion">Why PostHog chose ClickHouse</a></li><li><a href="https://www.youtube.com/watch?v=FrspnYbFSxQ">Andy Pavlo - Vectorized Query Execution</a></li><li><a href="https://clickhouse.com/cloud">ClickHouse Cloud</a></li><li><a href="/blog/clickhouse-vs-druid">Our comparisons of ClickHouse and Druid</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: ClickHouse vs Elasticsearch]]></title><description><![CDATA[Elasticsearch and ClickHouse are both open-source frameworks with advantages over conventional databases like  PostgreSQL  for performing tasks over…]]></description><link>https://posthog.com/blog/clickhouse-vs-elasticsearch</link><guid isPermaLink="false">55a6452d-3bf5-5af7-b902-ba899912b85c</guid><dc:creator><![CDATA[Mathew Pregasen]]></dc:creator><pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Elasticsearch and ClickHouse are both open-source frameworks with advantages over conventional databases like <a href="/blog/clickhouse-vs-postgres">PostgreSQL</a> for performing tasks over <em>lots</em> of data, but they serve very different needs.</p><p>Elasticsearch, as the name implies, was designed to power better search. It can efficiently return search results, such as grocery items on a grocer’s website, accounting for things such as spelling mistakes. It&#x27;s the bedrock product for Elastic, which sells Elastic Cloud – a managed solution that bundles Elasticsearch with other data products. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/elasticsearch-development.png" alt="Elasticsearch Development.png"/></p><p>ClickHouse, meanwhile, excels at aggregating data for uses like business analytics or financial statistics. While the database, ClickHouse, remains open source, it is managed by the for-profit ClickHouse Inc. ClickHouse Inc.’s main offering is ClickHouse Cloud, a managed service similar to Elastic Cloud, just for deploying ClickHouse instead. However, ClickHouse also merges notable contributions by Altinity, a separate company that sells Altinity.Cloud, a managed service for deploying ClickHouse in Kubernetes. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/clickhouse-development.png" alt="ClickHouse Development.png"/></p><p>Elasticsearch and ClickHouse are interesting to compare because of their vastly different architecture, optimized for each of their respective goals. Comparing them is a good meditation on how physical and virtual layouts can improve efficiency toward a specific efficiency goal. </p><h2 id="background">Background</h2><p>Sometimes, the relationship between an open-source tool and its lead developer is complicated. ClickHouse&#x27;s relationship is straightforward, but Elastic has a complex history with open source. </p><h3 id="what-is-elasticsearch">What is Elasticsearch?</h3><p>Elasticsearch was originally released in 2010 under an open-source license. The premise behind Elasticsearch was that Apache Lucene, an open-source product designed to efficiently search JSON documents, needed better infrastructure for scaling. Apache Lucene made it easy to organize and search a series of JSON documents – such as human profiles; Elasticsearch made it easy to distribute those human profiles, which might be in the billions, across multiple locations, indexed both physically and virtually.</p><p>Elasticsearch is considered a NoSQL database because it uses Apache Lucene – and by extension, JSON documents – as a primary store of data. Specifically, it is a Document-Store NoSQL database with a focus on searching and retrieving data. It is never used as the primary store of data. Elasticsearch data stores are often redundantly available in a more traditional database like PostgreSQL as Elasticsearch is only leveraged to improve search results. </p><p>In 2021, Elasticsearch abandoned its traditional Apache Open Source license in favor of a new license known as an Elastic license. It was a controversial move motivated by Elastic’s irritation with <a href="https://www.elastic.co/blog/licensing-change">Amazon profiting off of Elasticsearch</a> by operating a managed service without ever contributing to the codebase. Amazon forked the last version of open-source Elasticsearch into a new open-source project, OpenSearch. Similar to Elastic (and ClickHouse Inc.), Amazon launched a managed version of OpenSearch.</p><p>Elasticsearch’s new license allows developers to implement Elasticsearch themselves, but forbids cloud distributors from running a for-profit, managed Elasticsearch service. Most open-source advocates consider Elastic’s Elastic License not open-source; however, it would be unfair to Elastic to equate their solution’s transparency with a purely closed-source solution like Snowflake.</p><p>Elastic also develops Kibana, a visualization program that plugs into Elasticsearch. It was also developed under an open-source license then shifted to an Elastic License in 2021. Kibana provides an interface for designing a dashboard that showcases Elasticsearch data. </p><h3 id="what-is-clickhouse">What is Clickhouse?</h3><p>ClickHouse is a traditional open-source project, but it started as a proprietary application. ClickHouse was originally built by Yandex for Yandex.Metrica, a massive analytics tool popular in Russia. Eventually, ClickHouse spun out into an independent, open-source project. Today, it is managed by ClickHouse Inc. with notable contributions by a separate organization, Altinity Inc.  </p><p>ClickHouse was designed to return aggregate values of big data at millisecond speeds. ClickHouse accomplishes this through a series of clever techniques, including using a columnar store, dynamic materialized views, and specialized engines that take advantage of multiple cores.</p><p>Similar to Elastic Cloud, ClickHouse can be (optionally) deployed through various managed, closed-source solutions. ClickHouse Inc. offers a managed service known as ClickHouse Cloud. ClickHouse Cloud includes a GUI, similar to Kibana, for querying and visualizing data. Separately, Altinity Inc offers a managed service known as Altinity Cloud that specializes in deploying ClickHouse on Kubernetes.</p><h2 id="data-and-infrastructure">Data and infrastructure</h2><p>The biggest, defining difference between Elasticsearch and ClickHouse is their respective techniques for storing and organizing data. </p><p>ClickHouse is a columnar database; it stores data in a table, just with an inverted structure (in disk) relative to a traditional MySQL or PostgreSQL table. ClickHouse’s columnar data store simplifies aggregating data. </p><p>Elasticsearch isn’t columnar – it isn’t even a table-based database. It stores data as documents, grouping sets of documents into shards, which are part of physical and virtual collections respectively known as nodes and indices. </p><h3 id="elasticsearchs-structure-explained">Elasticsearch’s structure explained</h3><p>Elasticsearch is best understood by separating the <strong>virtual</strong> structures from the <strong>physical</strong> structures. </p><h4 id="documents-virtual">Documents (virtual)</h4><p>A base item in Elasticsearch is known as a <strong>Document</strong>. A Document is akin to a row of table data in MySQL – it has attributes, known as fields, stored in a JSON schema.</p><p>An Elasticsearch document might look something like this: </p><pre><code class="language-json">{
    &quot;_index&quot;: &quot;accounts&quot;,
    &quot;_type&quot;: &quot;_doc&quot;,
    &quot;_id&quot;: &quot;1&quot;,
    &quot;_version&quot;: 1,    &quot;_seq_no&quot;: 1,    &quot;_primary_term&quot;: 1,
    &quot;found&quot;: true,
    &quot;_source&quot;: {
        &quot;accountname&quot;: &quot;Marcus Pollack&quot;,
        &quot;balance&quot;: 34200,
        &quot;email&quot;: &quot;marcus.pollack@gmail.com&quot;
    }
}
</code></pre><h4 id="fields-virtual">Fields (virtual)</h4><p>A field is an attribute of a document. In the previous example, the fields were <code>accountname</code>, <code>balance</code>, and <code>email</code>. Fields make it easy for documents to be indexed and retrieved. Obviously, they also are used to store the data that applications use and present to users. </p><h4 id="indices-virtual-nodes-physical-and-shards-virtual">Indices (virtual), nodes (physical), and shards (virtual)</h4><p>The three major core components of Elasticsearch’s infrastructure are <strong>indices</strong>, <strong>nodes</strong>, and <strong>shards</strong>. A document in Elasticsearch is part of two discrete collections:</p><ol><li><p>A <strong>node</strong>, a physical machine that stores the data. Akin to a physical MySQL server, such as a device sitting in an Idaho data center.</p></li><li><p>An <strong>index</strong>, a virtual collection that defines what type of data it is. Akin to a table in MySQL, like a collection of bank accounts, student profiles, or property listings. </p></li><li><p>A <strong>shard</strong>, meanwhile, is the intersection of a specific <em>node</em> and a specific <strong>index</strong>. A <strong>shard</strong> is also a single instance of Apache Lucene. It is a collection of documents, such as two hundred user profiles of a total set of forty thousand. </p></li></ol><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/elasticsearch-structure.png" alt="Elasticsearch effectively creates a cartesian layout of physical and virtual coordinates. "/></p><p><div>Elasticsearch effectively creates a cartesian layout of physical and virtual coordinates.</div></p><h4 id="inverted-index">Inverted index</h4><p>In each shard (or Apache Lucene instance) is an inverted index. An inverted index is like a glossary – it stores a map of string components (such as words, numbers, or prefixes) for all the documents they are located in. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/inverted-index.png" alt="Inverted indexes dramatically improve search time."/></p><p><div>Inverted indexes dramatically improve search time.</div></p><p>Inverted indexes dramatically speed up most queries. If a user queries for all the <code>Reviews</code> that use the word “outstanding”, Elasticsearch can return that collection extraordinarily fast because each shard in the <code>Reviews</code> index leverages an inverted index to find relevant <code>Reviews</code>, and Elasticsearch bundles <code>Reviews</code> into a single collection for the end user. </p><p>Inverted indices do not only index words and numbers, but derivatives of words. This helps with accounting for human error. For instance, Elasticsearch (or rather, Apache Lucene) will convert each word into its phonetical form and store that in an inverted index as well. That way, users can find documents with “bear” spelled “bare” with a single query. </p><p>Likewise, Elasticsearch stores prefixes, suffixes, and n-grams. And, given each word is also stored in an inverted index, Elasticsearch can leverage simple word-likeness algorithms like Levenshtein Distance to account for typos. </p><p>In short, Elasticsearch extended Apache Lucene’s inverted index into a scalable, distributed system that leverages its benefits via parallelization.   </p><h4 id="distributed-search">Distributed Search</h4><p>This split between a virtual and physical index is what makes Elasticsearch’s ultra-fast search possible. Because Elasticsearch can perform parallel queries across nodes, multiple nodes slice and dice the search time to find a specific document.</p><p>For instance, imagine 100,000 documents stored in a single, consolidated index at 1 node. If Elasticsearch took approximately 1 second to search 10,000 documents, then searching 100,000 documents would take ~10 seconds. </p><p>Now imagine 100,000 Documents sharded across 10 nodes with 10,000 documents each. Because each node would take ~1 second to search all of the documents in its shard, and this process is parallelized, Elasticsearch can cut the search time from ~10 seconds to ~1 second. </p><p>Simply, “divide and conquer” is Elasticsearch’s middle name and trademark feature. </p><h4 id="replica-shards">Replica Shards</h4><p>Elasticsearch nodes and shards aren’t just used to distribute data, but also replicate it. </p><p>Elasticsearch has two types of shards – <strong>primary shards</strong> and <strong>replica shards</strong>. Replica shards are an <strong>exact</strong> copy of a primary shard should a primary shard become unavailable. A primary shard and a respective replica shard reference the same set of data. Therefore, they should never be located on the same node. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/elasticsearch-structure.png" alt="Elasticsearch can replicate data at scale without having to replicate the entire database."/></p><p><div>Elasticsearch can replicate data at scale without having to replicate the entire database.</div></p><p>Replica shards help database operations in two distinct ways: </p><ol><li><p>They protect users against data loss in case a node – which is a physical machine – fails.</p></li><li><p>Replicas are <em>actively</em> used for querying, so if multiple queries are targeting the same data, replica nodes can help distribute the reads, expediting results. </p></li></ol><h4 id="clusters">Clusters</h4><p>A cluster is a group of nodes. Many applications only have one cluster, though some may have multiple clusters spread over different geographies to serve clients with lower latency. Each Elasticsearch cluster has a single master node that helps delegate and manage other nodes.</p><h3 id="clickhouses-structure-explained">Clickhouse’s structure explained</h3><p>ClickHouse is engineered to process data in a massive, consolidated place. Unlike Elasticsearch, ClickHouse’s optimizations don’t happen through distributing data, but by efficiently pre-processing it in anticipation of queries. </p><p>There are three major components that enable ClickHouse to return aggregations, such as averages, sums, and standard deviations, in millisecond times over petabytes of data. </p><h4 id="component-1-columnar-layout">Component 1: Columnar layout</h4><p>ClickHouse’s columnar layout – which flips rows and columns in storage relative to a MySQL database – makes aggregations efficient. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/row-vs-column-database.png" alt="ClickHouse’s biggest magic trick really comes down to swapping rows and columns "/></p><p><div>ClickHouse’s biggest magic trick really comes down to swapping rows and columns</div></p><p>When databases physically access data, they scan data row-by-row. By extension, if an analyst is trying to calculate the average value of bank account balances in a PostgreSQL database, they would need to access <strong>every</strong> bank account row. Alone, that would probably blow out memory. But in ClickHouse, the same analyst would only need to access <strong>one</strong> (physical) row of data – the bank balance one – and collapse it into an average. </p><p>Again, this is a <strong>physical</strong> row of data. As far as ClickHouse’s interface goes, data is still stored in a traditional format. ClickHouse’s syntax still treats individual entries as rows and attributes as columns. But under the hood, ClickHouse stores the data in an inverted arrangement, optimized for merging attribute data into single values. </p><h4 id="component-2-materialized-views">Component 2: Materialized views</h4><p>ClickHouse’s second superpower is <strong>dynamic</strong> materialized views. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/visualizing-materialized-views.png" alt="Visualizing Materialized Views.png"/></p><p>Materialized views are not a new concept – in MySQL or PostgreSQL, a materialized view is a new table that can be queried from, rendered by a SQL query accessing other tables. However, once new data is added to the core tables, that materialized view goes out-of-date. Because creating materialized views is often expensive in traditional databases given their non-columnar layout, refreshing materialized views can only happen occasionally. </p><p>But ClickHouse truly makes materialized views <strong>dynamic</strong>. ClickHouse doesn’t only accomplish this because of the columnar layout of its data. It also leverages incremental data structures that merges data strategically. </p><h4 id="component-3-specialized-engines">Component 3: Specialized engines</h4><p>ClickHouse has a series of specialized engines that enable developers to take advantage of multiple CPUs in parallel on the <strong>same</strong> machine. For instance, there is an engine for summing data (<code>SummingMergeTree</code>) and removing duplicates (<code>ReplacingMergeTree</code>). This technique has some resemblance to Elasticsearch’s parallelization across multiple <strong>machines</strong> to expedite search; ClickHouse does it at a more granular, per-machine level.</p><h4 id="sharding">Sharding</h4><p>ClickHouse has some overlap with Elasticsearch’s sharding features. ClickHouse extends Apache Zookeeper to manage multiple instances of ClickHouse should data need to be split across machines. However, this concept of sharding is closer to Elasticsearch’s support for multiple clusters – it is more a big data distribution problem, not a smaller optimization for speeding up queries. </p><h3 id="architecture-summary">Architecture summary</h3><p>At a high level, ClickHouse and Elasticsearch’s differences showcase how they are designed to fit their own purposes. ClickHouse consolidates data so it can constantly update materialized views to serve number-hungry queries. Meanwhile, Elasticsearch is designed to find <em>specific</em> items, treating search queries as a group project where every node does its part. </p><p>While ClickHouse supports multiple instances, managed by Apache Zookeeper, it does not offer a decentralized solution competitive with Elasticsearch’s model. Likewise, while Elasticsearch offers data frames analytics, which has some overlap with ClickHouse’s materialized views, it is either more expensive or not as dynamic as ClickHouse’s fine-tuned aggregation machine. </p><h2 id="who-uses-clickhouse-and-elasticsearch">Who uses ClickHouse and Elasticsearch?</h2><p>Elasticsearch and ClickHouse both have small, medium, and enterprise customers.</p><p>Elasticsearch’s customers utilize it to return a specific chunk of data quickly to users. For instance, <a href="https://www.elastic.co/elasticon/conf/2017/sf/powering-uber-marketplace-real-time-data-needs-with-elasticsearch">Uber</a> uses Elastic to return data relevant to calculating surge pricing on a minute-by-minute basis. <a href="https://www.elastic.co/elasticon/conf/2017/sf/tinder-using-the-elastic-stack-to-make-connections-around-the-world">Tinder</a> uses Elastic to fetch potential matches that might fit a user’s profile. <a href="https://www.elastic.co/elasticon/tour/2019/seattle/t-mobile">T-Mobile</a> uses Elasticsearch to delivery specific user profiles to customer support reps to promote better NPS scores. </p><p>In all of these examples, Elastic fetches something specific very efficiently. </p><p>Conversely, ClickHouse is used to return aggregations of data. The most obvious example would be <strong>us</strong>. We use ClickHouse to power PostHog, an open-source analytics suite that involves hundreds of aggregate values. Previously, Posthog was powered by PostgreSQL, which quickly spiraled <a href="/blog/clickhouse-vs-postgres">out of control</a> as we grew. </p><p>Others, like us, also use ClickHouse to power user-facing features – <a href="https://clickhouse.com/blog/nyc-meetup-report-real-time-slicing-and-dicing-reporting-with-clickhouse">Rokt</a>, an e-commerce platform, uses ClickHouse to power its analytics panels. However, some companies leverage ClickHouse for internal use cases, such as the Washington Post, which uses ClickHouse to power its in-house analytics suite. </p><h2 id="analytics-performance-comparison">Analytics performance comparison</h2><p>ClickHouse was built to perform aggregations, but it’s naive to say that Elasticsearch doesn’t have the structure to compete with ClickHouse on <em>some</em> aggregations. </p><p>To understand this, remember the primary philosophy behind ClickHouse’s design: pre-calculate aggregations ahead of queries to enable millisecond-level fetches. ClickHouse accomplishes this through materialized views and specialized engines, which are optimized for mathematical queries transversing numeric data. </p><p>Elasticsearch, meanwhile, can accomplish similar performance over certain queries. For instance, if a product needs the number of college alumni that are unemployed, Elasticsearch can add up indices in the inverted index of words that pattern-match to unemployed alumni. In other words, fast search sometimes equates to great analytics by just adding a <code>COUNT()</code> function. </p><p>While both Elasticsearch and ClickHouse are fundamentally backend products, we can compare their respective GUI products – Kibana for Elasticsearch and ClickHouse Cloud for ClickHouse. ClickHouse Cloud is a <em>much</em> younger product; Kibana, conversely, has been around for nearly a decade and has an extensive UI.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-elastic/comparison.png" alt="Comparinson.png"/></p><p>In a nutshell, comparing the analytics efficiency of ClickHouse and Elasticsearch has the same sort-of, not-really awkwardness of other comparisons – they both excel in their respective categories using radically different methods to cater to a different type of need. However, Elastic’s Kibana product is more mature than ClickHouse Cloud’s competitive offering. </p><h2 id="final-thoughts">Final thoughts</h2><p>ClickHouse and Elasticsearch are both fantastic solutions for data aggregation and fast search respectively. </p><p>Elasticsearch grew quickly thanks to fast-paced development by its parent company, Elastic. Elastic has spearheaded the development of Elasticsearch, Kibana, and other accessory products like Beats, a data shipper. For many enterprise customers, Elastic being a pseudo-closed-source solution is balanced by the fact that it can leverage its enterprise revenue to foster a massive engineering effort to improve Elastic.</p><p>Conversely, while the team behind ClickHouse is smaller, ClickHouse has an avid developer community, with contributors existing outside of the two major ClickHouse developers – ClickHouse Inc and Altinity Inc. And one of the reasons that ClickHouse is starting to grow in the last few years is because of its open-source, pro-community brand, and it&#x27;s blistering performance.</p><p>Overall, Elasticsearch remains a good solution if data aggregation involves searching text. It is a more mature project with an entire suite dedicated to interfacing with Elasticsearch data. However, it is no longer a true open-source product like ClickHouse is, and isn&#x27;t designed to support the kind of high-performance use cases ClickHouse excels in.</p><h3 id="further-reading">Further reading</h3><ul><li>Lisa Jung’s <a href="https://www.youtube.com/watch?v=gS_nHTWZEJ8">talk</a> on Elasticsearch</li><li>Robert Hodges’s CMU <a href="https://www.youtube.com/watch?v=fGG9dApIhDU">talk</a> on ClickHouse</li><li>Our <a href="/blog/clickhouse-vs-postgres">comparison of between ClickHouse and Postgres</a> which expands on ClickHouse’s optimizations</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #22: Why do companies over-hire?"]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-22</link><guid isPermaLink="false">dfa8501f-8635-5fbd-ab0d-f810638c9145</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 22 Feb 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><p>I have good news and bad news. The bad news... this is the last ever HogMail. 😢</p><p>The good news? We&#x27;re launching a brand new newsletter that&#x27;s very similar HogMail, but <a href="https://twitter.com/posthog/status/1628432250575458309">more muscular</a>?! 💪</p><p>They&#x27;ll be no gap in service, but your next newsletter will look a little different. </p><p>Here&#x27;s what&#x27;s new on PostHog.com:</p><ul><li>James Hawkins on <a href="https://posthog.com/blog/helping-engineers-to-product">Our simpler goal: Help engineers to be better at product</a></li><li>Ian Vanagas on <a href="https://posthog.com/tutorials/feedback-interviews-site-apps">Using PostHog apps to gather feedback and book user interviews</a></li><li>Charles Cook on <a href="https://posthog.com/blog/dev-marketing-for-startups">What we&#x27;ve learned about developer marketing</a></li><li>Ian Vanagas on <a href="https://posthog.com/tutorials/api-feature-flags">How to evaluate and update feature flags with the PostHog API</a></li></ul><h2 id="why-do-companies-over-hire">Why do companies over-hire?</h2><p>Josephine Conneely <a href="https://waysofworkingcollection.substack.com/p/why-do-companies-over-hire">makes a strong case</a> for the power of small teams. Some takeaways:</p><ul><li>If hiring to drive growth ask yourself: &quot;what would the leanest version of hiring look like? It may be possible to achieve most of your growth goals with a smaller team.&quot;</li><li>Low performance and/or blame cultures encourage over-hiring. It &quot;reduces what any one individual can be accountable for&quot; and &quot;ensures there are enough scapegoats in place to deflect blame to&quot;.</li><li>&quot;Too many generalists can lead companies to over-hiring as they lack the expertise to execute effectively. Too many specialists can lead to over-hiring as roles are broken down into niche subsets.&quot;</li></ul><p><strong>Read:</strong> <a href="https://waysofworkingcollection.substack.com/p/why-do-companies-over-hire">Why do companies over-hire?</a> by Josephine Conneely</p><h2 id="how-you-work-together--how-you-socialize">How you work together &gt; how you socialize</h2><p>Here&#x27;s a <a href="https://async.twist.com/remote-team-culture/">great read on async working</a> by Chase Warrington, Head of Remote at chat app Twist. It can be summed up by this graphic:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hogmail/Team-culture-comparison-with-Twist-colors.png" alt="async"/></p><p>The post includes three useful tips for fostering the social bonds in an async team:</p><ol><li>Make attendance truly optional</li><li>Treat social activities as part of the workday, not extracurricular</li><li>Remember what truly unites us: our work.</li></ol><p><strong>Read:</strong> <a href="https://async.twist.com/remote-team-culture/">How to build human connections in an async workplace</a> by Chase Warrington</p><h2 id="tips-for-challenging-the-status-quo">Tips for challenging the status quo</h2><p>Dissent fuels innovation, but a &quot;challenge everything&quot; culture can &quot;quickly metastasize into a culture of assholes,&quot; <a href="https://workweek.com/2022/11/28/challenging-the-status-quo-at-work/">says Hebba Youseff</a>. How do you find the balance? When challenging ideas, consider:</p><ul><li>&quot;What is your internal dialogue telling you about how you are showing up in this discussion? Are there outside factors that could be impacting you?&quot; (e.g. your emotional state / personal feelings)</li><li>&quot;Do you have all the context? You should understand the situation fully before suggesting a different solution.&quot;</li><li>&quot;Do not speak for others or assume their motivations. It can be easy to project on others but that can be insulting for anyone else in the room.&quot;</li></ul><p><strong>Read:</strong> <a href="https://workweek.com/2022/11/28/challenging-the-status-quo-at-work/">Challenging the status quo at work</a> by Hebba Youseff</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Our simpler goal: Help engineers to be better at product]]></title><description><![CDATA[One of the things I've learned at PostHog is the simpler a strategy, the more likely it's right. We simplified  our strategy  recently. This post…]]></description><link>https://posthog.com/blog/helping-engineers-to-product</link><guid isPermaLink="false">45bf9872-2201-5731-abc5-5226418755a7</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Fri, 17 Feb 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>One of the things I&#x27;ve learned at PostHog is the simpler a strategy, the more likely it&#x27;s right.</p><p>We simplified <a href="../handbook/strategy/overview">our strategy</a> recently. This post explains the context.</p><h2 id="the-change">The change</h2><p>Our mission has always been to increase the number of successful products in the world.</p><p>The change is that we&#x27;ve realized that the simple way PostHog can achieve this is to help engineers be better at product.</p><p>Today, engineers building the products you use are too often treated as a resource. They don&#x27;t get a say in what gets built, they just pick up ticket after ticket. Yet, there&#x27;s a reason they&#x27;re engineers in the first place. They&#x27;re intelligent, hard-working, and have deep skills.</p><p>Our competitors near universally focus on helping non-technical product managers, who write tickets for their developers.</p><p>We think this is backwards. Look at the way most teams work on tickets today:</p><ul><li>Endless alignment</li><li>Endless requirements gathering</li><li>Endless handoffs (design/product/engineering/sales/marketing/support)</li></ul><p>If we reduce the need for PMs and help engineers go further by themselves, we reduce time lost on the above, unproductive activities, and give great engineers the thing they crave most: autonomy.</p><h2 id="whats-the-strategy-then">What&#x27;s the strategy then?</h2><h3 id="provide-every-tool-needed-for-evaluating-feature-success">Provide every tool needed for evaluating feature success</h3><p>The best use of an engineer&#x27;s time is to ship features that have an impact on customers. Currently, this requires a large number of tools and product managers to pull all the insights together. By integrating all these tools we can make this easy – no integration needed, no extra vendors, no extra javascript, and workflows to guide engineers through feature development, from initial idea, to release, measurement, gathering qualitative data, and back to the start.</p><h3 id="get-in-first">Get in first</h3><p>It’s the technical co-founder and early engineers building the MVP and integrating the first product tools, not PMs. By focusing on engineers we can get in first, and later become the default choice for each additional tool they add. </p><p>Additionally, we can ladder our tools – session recording is used much earlier in the life cycle of the product than others, like the <a href="/blog/cdp-vs-data-warehouse">customer data platforms (CDP)</a>, helping us get in earlier than competing products. As a result, we aren&#x27;t heavily focused on enterprise – we even <a href="sunsetting-helm-support-posthog">sunsetted K8s support</a> as part of this change.</p><h3 id="be-the-pipeline-for-product-and-customer-data">Be the pipeline for product and customer data</h3><p>Traditionally, as companies scale their <a href="/blog/data-warehouse-at-posthog">data warehouse</a> becomes the source of truth and non-warehouse native tools (like product analytics) become less relevant. By being their core pipeline from connecting their data to their warehouses we can remain sticky for the life of our customers. And by providing this infra, we ensure the data we have remains comprehensive. We will continue pushing back the need for companies to even set up a warehouse in the first place.</p><h2 id="whats-to-come-this-year">What&#x27;s to come this year?</h2><p>Right now on <a href="/roadmap">our roadmap</a>, we&#x27;re working on a slicker core experience –  we&#x27;ve got many team members working on reliability, scalability, and data load times. We&#x27;re adding power features for more technical users, like <a href="https://github.com/PostHog/meta/issues/81">SQL access</a> inside the product. We&#x27;re also plugging gaps in our product, such as <a href="https://github.com/PostHog/posthog/issues/12344">iOS session recording</a>, <a href="https://github.com/PostHog/posthog/pull/13623">json feature flags</a>, <a href="https://github.com/PostHog/posthog/issues/13601">feature flag resilience</a> and improved SDK coverage for feature flags. Finally, we&#x27;re pushing for <a href="https://github.com/PostHog/posthog/issues/12923">PostHog 3000</a> – a big UI change that will ultimately connect all our tools together better.</p><p>Next quarter, we&#x27;ll be working on our CDP – we want to make that a first class citizen product – like our analytics or session recording. Today, we have 50+ &quot;apps&quot;, largely community-driven, that mainly integrate PostHog with other data sources, but we want to add more integrations, deepen their functionality, improve their reliability, and make them more intuitive to use.</p><p>It&#x27;s not all product: </p><ul><li><p>In our growth team, we made a lot of progress last year on conversion to revenue, which grew 6x, but we&#x27;re now looking at ways to give away as much as we can, for free, to <em>get in first</em>. </p></li><li><p>In our customer success team, we&#x27;re getting more targeted in our approach so we focus on high-growth companies.</p></li><li><p>In marketing, we aim to produce the best content on the internet for each piece that we write. We&#x27;re moving paid ad spend to hire another writer, we&#x27;re producing more tutorials than ever before, and we&#x27;re focusing more of our writing more tightly on how to help engineers learn skills outside of coding.</p></li></ul><h2 id="im-excited">I&#x27;m excited</h2><p>Ali, on our board, told us &quot;when you get bigger, you can see around corners&quot;. That turns out to be true. </p><p>Now we&#x27;ve tried a bunch of stuff and achieved product-market fit – we have 23,000+ companies who have installed PostHog, approaching 70,000 developers in the community and $MM revenue – we can clearly see what we need to do. And, seeing the results we&#x27;ve had so far, increases our confidence we can make it all happen.</p><p>Wish us luck, and feedback (I&#x27;m james @ you can guess it . com) is more than welcome!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: ClickHouse vs Snowflake]]></title><description><![CDATA[Two years ago, Snowflake versus ClickHouse was a straightforward comparison. Back then, Snowflake was fully managed, expensive, and broadly featured…]]></description><link>https://posthog.com/blog/clickhouse-vs-snowflake</link><guid isPermaLink="false">6698e987-10a9-54aa-9eac-184a5b007e3e</guid><dc:creator><![CDATA[Mathew Pregasen]]></dc:creator><pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Two years ago, Snowflake versus ClickHouse was a straightforward comparison. Back then, Snowflake was fully managed, expensive, and broadly featured. ClickHouse was on-prem, open source, and speed-optimized. Two ends of a data warehouse spectrum splitting versatility (Snowflake) and speed (ClickHouse).</p><p>If I was to compare the databases to boats, ClickHouse is a jet ski – ultra-fast, but limited. Snowflake, meanwhile, is a shipyard – a slew of (expensive) tools spanning various functions.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-snowflake/clickhouse-vs-snowflake.png" alt="Clickhouse vs Snowflake.png"/></p><p>But, as I said, that was <em>two years ago</em>. Today, Clickhouse has broken ground on features that compete with Snowflake’s managed solution. Likewise, Snowflake released features that are beginning to tackle ClickHouse’s speed. However, the overlap between ClickHouse and Snowflake remains nascent. Today, they are both still  <em>pretty</em> different, though the gaps are closing.</p><h2 id="background">Background</h2><p>Snowflake and ClickHouse are at wildly different stages of growth.</p><p>Snowflake, founded in 2012, is a well-funded, publicly-traded decacorn with nearly 4,000 employees.</p><p>In contrast, ClickHouse is relatively new as an independent company. While the project originated internally at Yandex around 2012, ClickHouse only spun out independently in 2016 and received funding in 2021. </p><p>Recently, ClickHouse raised a Series B to launch ClickHouse Cloud, its Snowflake-like service.</p><h3 id="what-even-is-snowflake">What even is Snowflake?</h3><p>Every engineer and their cousin has heard about Snowflake. Its massive IPO was one of the most successful public launches in technology history. The title of “Next Snowflake” translates to “Next Incredible Business” in venture-capital land. And with over $1B in revenue, the hype is deserved. However, there’s also a rather curious phenomenon – relatively speaking, few engineers appear to be versed in SnowSQL (Snowflake’s SQL dialect).</p><p>This contradiction between success and adoption is because Snowflake doesn’t behave like a typical database company. Unlike ClickHouse, <a href="/blog/clickhouse-vs-druid">Apache Druid</a>, TimescaleDB, QuestDB, and most other OLAP databases Snowflake is cloud-only. The codebase is neither open source nor locally installable. And sorry, startups, but there is no free tier.</p><p>To some developer evangelists, this business-first scheme is seen as heresy. But it&#x27;s an excellent solution for Snowflake’s customers, each of whom pays an average of ~$170,000 a year. But why? Snowflake isn’t Louis Vuitton – people aren’t clamoring to buy its product merely because it&#x27;s expensive.</p><p>Instead, Snowflake is a jack of all trades. Snowflake has complex, performant architecture, but its cloud-first, fully-managed design makes scaling seamless. Snowflake can handle complex, conditional-heavy queries, but its GUI enables non-technical people to take advantage of stored data.</p><p>Snowflake was built for businesses with complex, ever-changing needs with big budgets. It’s by no means the fastest horse, but it’s the only one that can prance, race, dance, and even sing.</p><h3 id="what-about-clickhouse">What about Clickhouse?</h3><p>An obvious difference between Snowflake and ClickHouse is that ClickHouse is an open-source solution that can be deployed on any arbitrary server – e.g. Metal, Cloud, K8s, etc. ClickHouse doesn’t make money on any of those open source deployments, and this leads their team to be less sales-driven and more product-lead. </p><p>The biggest difference is in Clickhouse’s strength. Let’s return to the analogy of ClickHouse being a jet ski. ClickHouse is fast. Incredibly, unbelievably fast. In particular, ClickHouse can return complex aggregations of terabyte-level data spanning millions of rows in milliseconds. In comparison, Snowflake takes dozens of seconds to query gigabyte-level data. </p><p>ClickHouse accomplishes this by optimizing the database for speed at returning aggregates. ClickHouse isn’t designed to be utilized like a stock PostgreSQL or mySQL database; it’s particularly good at write-heavy, mutation-low, read-and-reduce-heavy operations. It&#x27;s perfect solution for analytics providers, like <a href="https://posthog.com/">PostHog</a>.</p><p>However, normal, on-prem ClickHouse lacks a lot of features that Snowflake likely considers table-stakes: </p><ul><li>A dedicated non-technical-friendly GUI for exploring and visualizing data</li><li>The ability to modify entry data without massive performance burns</li><li>The ability to scale architecture seamlessly with no migrations whatsoever</li></ul><h3 id="hosted-clickhouse">Hosted ClickHouse</h3><p>It is slightly silly to compare Snowflake and ClickHouse without mentioning ClickHouse Cloud, Altinity Cloud, Firebolt, or TinyBird. Each solution simplifies deploying and maintaining a ClickHouse instance. This helps address the final bullet in the previous section; they make scaling architecture seamless without complex data migrations.</p><p>ClickHouse Cloud – a new product launched in 2022 by ClickHouse Inc (ClickHouse’s primary contributor) – is exclusively available on AWS, with plans to support both Google Cloud and Azure like Snowflake. Meanwhile, Altinity Cloud – built by Altinity Inc (also contributors to ClickHouse) – has support for both AWS and Google Cloud. Altinity Cloud is also Kubernetes-compatible. </p><p>The big difference between ClickHouse Cloud and Altinity Cloud is how they store data. ClickHouse Cloud is engineered like Google BigQuery. The data is stored in object storage. Altinity Cloud meanwhile runs ClickHouse similar to how an on-prem or local instance works; virtually anything you can do on a local instance is possible on Altinity Cloud. </p><p>Separately, an advantage of ClickHouse Cloud is that it includes some exclusive features not available in the ClickHouse core distribution. One of these is a SQL GUI explorer which provides similar features to some of Snowflake’s basic data exploration. </p><p>Overall, ClickHouse Cloud or Altinity Cloud are excellent options for companies that want a managed version of ClickHouse on the public cloud. Their emergence closes the gap between ClickHouse and Snowflake.</p><blockquote><p>📖 <strong>Further reading:</strong> ClickHouse also competes with another huge, established product... Google&#x27;s BigQuery. Read our <a href="/blog/clickhouse-vs-bigquery">ClickHouse vs BigQuery comparison</a> to understand how the two solutions differ.</p></blockquote><h2 id="architecture-overview">Architecture overview</h2><p>When Snowflake was released in 2012, there were two major paradigms – <strong>Shared-Disk Architecture</strong> and <strong>Shared-Nothing Architecture</strong>.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-snowflake/shared-disk-architecture.png" alt="Shared Disk Architecture.png"/></p><p>Under Shared-Disk Architecture, CPU and memory were split into nodes, but each connected to a single storage unit – usually a blob store like S3 or GCS these days. The benefit of Shared-Disk Architecture is that you can scale Disk and Compute separately. This is huge when you are thinking about a data warehouse, where your workloads may be very spiky and periodic but your data has to be stored all the time. The cost here is that typically reading from disk is a bit slower, at least in terms of latency, when compared to reading from local storage.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-snowflake/shared-nothing-architecture.png" alt="Shared Nothing Architecture.png"/></p><p>Meanwhile, CPU, memory, and storage are encapsulated under Shared-Nothing Architecture in separate, parallel instances, only syncing via background jobs. The benefit of Shared-Nothing Architecture is speed. There is a risk that storage could go out of sync since usually replication here is eventually consistent, but that was the case with blob stores up until recently too. The easiest way to think about this is consider Postgres. When you install Postgres everything is boxed up nice and neat on a single instance. At smaller scale this is a much simpler setup and enables you to run the architecture pretty much anywhere.</p><p>Part of Snowflake’s initial appeal is its hybrid solution that combines the advantages of Shared-Disk Architecture and Shared-Nothing Architecture. Snowflake achieved this by adding another layer of storage to each node that stored partial data, similar to the cache but more complete.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-snowflake/snowflake-architecture.png" alt="Snowflake Architecture.png"/></p><p>More importantly, Snowflake’s middle layer – virtual warehouses – can be scaled easily, coming in T-shirt sizes (S/M/L/XL). Snowflake makes it easy to add parallel nodes or re-size existing nodes, made possible by Snowflake&#x27;s virtualized architecture.</p><p>ClickHouse utilizes Shared-Nothing Architecture by default. But ClickHouse also <a href="https://clickhouse.com/docs/en/faq/operations/deploy-separate-storage-and-compute/">supports Shared-Disk Architecture</a>. This is useful if you want to scale disk and compute separately, so you can have the best of both worlds depending on your use case and tune it to fit. You can do this by leveraging Zero Copy Replication and <a href="https://clickhouse.com/docs/en/guides/sre/s3-multi-region">S3/GCS Backed MergeTrees</a>, or even HDFS.</p><h3 id="differences-in-query-optimization--speed">Differences in query optimization &amp; speed</h3><p>ClickHouse has three significant optimizations that make querying aggregate computations efficient: (i) materialized views, (ii) specialized engines, and (iii) vectorized query execution.</p><ul><li><p><strong>Materialized views:</strong> Materialized views are independent tables derived from other table data generated at some specific point in time. Unlike databases like Postgres, ClickHouse&#x27;s materialized views are constantly re-generated in the background as new data is inserted. While materialized views are delayed because most of ClickHouse&#x27;s use cases involve aggregate, analytical data, the delay doesn’t pose a problem.</p></li><li><p><strong>Specialized engines:</strong> Materialized views are aided by ClickHouse&#x27;s specialized engines, which can do anything from storing aggregates more efficiently on disk (AggregatingMergeTree) to allowing you to make HTTP calls to fetch data. This is one of the useful features we leverage extensively at PostHog – watch our <a href="https://youtu.be/6IwLWEx_mg4?t=804">video on them</a> if you&#x27;re curious. </p></li></ul><p><strong>Vectorized query execution:</strong> Vectorized execution organizes data in a way that makes it possible to use SIMD (Single Instruction Multiple Data) to process multiple values at once. This is a huge performance boost for aggregate computations – see [ClickHouse&#x27;s documentation] and this <a href="https://www.youtube.com/watch?v=FrspnYbFSxQ">CMU video</a> for more on this.</p><p>Snowflake has some of these features, but the main thing that Snowflake has bet on is the proliferation of JSON and unstructured data:</p><ul><li><p>Snowflake&#x27;s <a href="https://docs.snowflake.com/en/sql-reference/data-types-semistructured">Variant type</a> was built into the service from the beginning and makes querying unstructured data nearly effortless. It decomposes JSON objects into a table of key-value pairs that better leverages the columnar aspect of Snowflake&#x27;s architecture. This is something ClickHouse is actively working on, but for now is a competitive advantage of Snowflake.</p></li><li><p>While Snowflake has support for materialized views, it charges additionally for it since it needs to allocate serious CPU resources to recompute the views. Those re-computations, under the hood, are more resource intensive for Snowflake because it lacks the same partial-update techniques ClickHouse uses to expedite re-calculations.</p></li><li><p><strong>Virtual warehouses instead of specialized engines:</strong> Unlike ClickHouse&#x27;s specialized engines, which utilize hardware to optimize query execution, Snowflake segments its database into virtual warehouses sized from small to large. These warehouses can have larger or lesser compute to handle complex to easy queries and isolate workloads. However, while clever and organized, this approach is computationally and financially expensive when taken full advantage of.</p></li><li><p><strong>Search optimization service:</strong> Introduced in 2021, Snowflake offers a search optimization service at its higher enterprise tiers. Because Snowflake is a closed-source product, not much is known about how the search optimization service works, but it can offer enormous performance gains (4x-100x) relative to un-optimized search for some types of queries. Unfortunately, while Snowflake likely uses similar mechanisms to ClickHouse, direct side-by-side analysis isn’t possible due to Snowflake’s closed-search tier. By extension, the search optimization service’s performance boost is unpredictable.</p></li></ul><p>Overall, ClickHouse&#x27;s close-metal optimizations enable it to return aggregate values over a thousand times faster (and cheaper) than Snowflake. However, Snowflake’s approach is more user-friendly as it requires less SQL-level optimization to take advantage of these organizational features.</p><h3 id="who-uses-snowflake-and-clickhouse">Who uses Snowflake and ClickHouse?</h3><p>Part of Snowflake’s value prop is the broad appeal to both technical and non-technical users. Snowflake’s marketplace makes connecting <a href="/blog/best-open-source-business-intelligence-tools">business intelligence tools</a> with warehouse data easy, which appeals to teams wanting explore their data. ClickHouse Cloud has a growing competitive offering, but the current integrations are less numerous.</p><p>ClickHouse and Snowflake are both used for analytics, but ClickHouse is more focused on analytical queries. </p><p>ClickHouse is a great fit for PostHog because we are an developer platform – we need to be able to answer questions like “what is the average time to convert for users who saw a certain feature?” in <em>real time</em> and <em>at speed of click</em>.</p><p>Traditionally, Snowflake can be considered more of a standard data warehouse or data lake where you can store all your data and then query it. This is a great fit for companies that want to store all their data in one place and then query it.</p><p><strong>Snowflake customers</strong> include AT&amp;T, Jetblue, Anthem, and Capital One. Snowflake customers tend to be enterprise-level and have to deal with a lot of data. </p><p><strong>ClickHouse’s customers</strong> include Github, YouTube, Twitter, and Slack. We, at PostHog, also <a href="/docs/how-posthog-works/clickhouse">use ClickHouse</a>. It dramatically improved our analytics data warehouse from our previous Postgres setup and allows us to deliver billion-event scale insights quickly. </p><h2 id="conclusion">Conclusion</h2><p>While ClickHouse didn&#x27;t start life as a business-first data warehouse like Snowflake, the lines between the two are increasingly blurred. While it has some work to do, ClickHouse is quickly developing features that make it look more and more like a data warehouse.</p><p>ClickHouse is a fantastic solution for teams looking to built data intensive applications, such as analytics or a data-backed CRM. If you grow that business to the point where you need a data warehouse, ClickHouse will grow with you. However, if you are looking for a product that has deep integrations with a long list of tools and the majority of your data is schemaless JSON, Snowflake may be for you.</p><h3 id="further-reading">Further reading</h3><p>Consider the following resources if you want to learn more about ClickHouse and Snowflake’s differences.</p><ul><li><p><a href="https://clickhouse.com/docs/en/home/">ClickHouse Documentation</a></p></li><li><p><a href="https://docs.snowflake.com/en/">Snowflake Documentation</a></p></li><li><p><a href="https://benchmark.clickhouse.com/">Clickbench</a>, a benchmark test comparing ClickHouse, Snowflake, and other databases</p></li><li><p><a href="https://event.cwi.nl/lsde/papers/p215-dageville-snowflake.pdf">Snowflake Whitepaper</a></p></li><li><p><a href="https://youtu.be/6IwLWEx_mg4">Why we chose ClickHouse</a></p></li><li><p><a href="https://www.youtube.com/watch?v=FrspnYbFSxQ">Andy Pavlo - Vectorized Query Execution</a> &lt;--- this is a great video that explains vectorized query execution and you should check out all of Andy&#x27;s videos</p></li><li><p><a href="https://clickhouse.com/docs/en/faq/operations/deploy-separate-storage-and-compute/">ClickHouse Separate Storage &amp; Compute</a></p></li><li><p><a href="https://www.velotio.com/engineering-blog/clickhouse-the-newest-data-store-in-your-big-data-arsenal">Velotio</a>’s Snowflake versus ClickHouse article. Note, this article was published before the ClickHouse Cloud announcement, which impacts the comparison with Snowflake.</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #21: Avoiding the "Product Death Cycle"]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-21</link><guid isPermaLink="false">d3f7175d-4605-59b9-82e3-81e1a8d24bdb</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 13 Feb 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><p>In <a href="https://posthog.com/blog/hogmail-20">HogMail #20</a>, we looked at a failed startup with product-market fit and 500k active users. So, what comes after product-market fit? More on that soon, but first...  </p><p>Here&#x27;s what&#x27;s new on PostHog.com:</p><ul><li>Raquel Smith on <a href="https://posthog.com/blog/why-product-engineering-is-so-fun">Why &#x27;Product Engineer&#x27; is the most fun role I&#x27;ve had in tech</a>  </li><li>Andy Vandervell on <a href="https://posthog.com/blog/customer-churn-analysis-guide">Retention vs Churn Rate: Your guide to churn analysis</a>  </li><li>Ian Vanagas on <a href="https://posthog.com/tutorials/api-get-insights-persons">How to use the PostHog API to get insights and persons</a>  </li><li>Abe Basu on <a href="https://posthog.com/tutorials/laudspeaker-posthog">Automating user journeys with PostHog and Laudspeaker</a></li></ul><p>Words by Andy Vandervell, whose retention is rapidly declining with age. 😢  </p><h2 id="avoiding-the-product-death-cycle">Avoiding the &quot;Product Death Cycle&quot;</h2><p>If <a href="/blog/product-market-fit-game">product-market fit</a> isn&#x27;t enough to succeed, what do you need? In a 2017 article, <a href="https://www.linkedin.com/in/bbalfour/">Brian Balfour</a> says:</p><blockquote><p><em>&quot;The “go-to” answer for almost every question in startups, is “build a great product.” Every time I hear that answer it feels completely unsatisfied. Building a great product is a piece of the puzzle, but it’s far from the full picture.&quot;</em></p></blockquote><p>He goes on to argue this mentality can lead to what he calls the Product Death Cycle:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hogmail/death-cycle.png" alt="product death cycle"/></p><p>In this model, the answer to &quot;how do we grow?&quot; is always launch new feature, but every new launch is slightly less successful than the last, and doesn&#x27;t lead to lasting growth:  </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hogmail/death-cycle-1.png" alt="product death cycle"/></p><p>Instead, he suggests successful startups ($100M+ in his reckoning) should seek four fits:</p><ul><li><p><a href="https://brianbalfour.com/essays/market-product-fit"><strong>Market-Product Fit</strong></a> – A variation on product-market fit.  </p></li><li><p><a href="https://brianbalfour.com/essays/product-channel-fit-for-growth"><strong>Product-Channel Fit</strong></a> – &quot;Products are built to fit with channels. Channels do not mold to products.&quot;  </p></li><li><p><strong><a href="https://brianbalfour.com/essays/channel-model-fit-for-user-acquisition">Channel-Model Fit</a> –</strong> Channels are determined by your model, i.e. how you charge and average annual revenue per user.</p></li><li><p><strong><a href="https://brianbalfour.com/essays/model-market-fit-threshold-for-growth">Model-Market Fit</a></strong> – The concept that your market (and # of customers within your market) influence your model.&quot;</p></li></ul><p>Balfour makes three final points:</p><ol><li><p><strong>You need to find four fits</strong> to grow to $100M+ company in a venture-backed time frame.</p></li><li><p>Each of these <strong>fits influence each other</strong>, so <strong>you can’t think about them in isolation</strong>.  </p></li><li><p><strong>The fits are always evolving</strong>/changing/breaking. When that happens, <strong>you can’t simply change one</strong> element, you have to revisit and potentially change them all.</p></li></ol><p><strong>Full article:</strong> <a href="https://brianbalfour.com/essays/product-market-fit-isnt-enough">Why Product Market Fit Isn&#x27;t Enough</a></p><h2 id="more-good-reads">More good reads</h2><ul><li><p><a href="https://andrewchen.com/power-user-curve/">Andrew Chen on The Power User Curve:</a>A16z partner, Andrew Chen, explains a powerful way to discover &quot;if you have a hardcore, engaged segment that’s coming back every day.&quot; See also: <a href="https://posthog.com/tutorials/power-users">How to identify and analyze power users in PostHog</a>.  </p></li><li><p><a href="https://franciscoraio.substack.com/p/a-detailed-execution-plan-for-building">How to find customers willing to talk to you</a> – A useful guide about talking to users. <a href="https://franciscoraio.substack.com/p/detailed-execution-for-building-products-22-11-19">Part 2</a> covers tactics for running effective user interviews.  </p></li><li><p><a href="https://mdalmijn.com/p/11-laws-of-software-estimation-for-complex-work">11 Laws of Software Estimation for Complex Work</a> – Wrong estimates aren’t your fault, but they are definitely your problem.  </p></li><li><p><a href="https://sparktoro.com/blog/how-to-measure-hard-to-measure-marketing-channels/">How to Measure “Hard-to-Measure” Marketing Channels</a> – Rand Fishkin on how to stop avoiding hard-to-measure marketing channels (e.g. native social, PR, events etc.) by learning how to measure them.</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Sunsetting Kubernetes support for PostHog]]></title><description><![CDATA[We  no longer support paid, open-source deployments  and it is  no longer possible to buy licenses for self-hosted versions  - we instead recommend…]]></description><link>https://posthog.com/blog/sunsetting-helm-support-posthog</link><guid isPermaLink="false">49dcbea0-7c48-5270-8c02-6a2b1e3dd5c8</guid><dc:creator><![CDATA[Tim Glaser]]></dc:creator><pubDate>Wed, 08 Feb 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/k8s-sunset/posthog-bye-kubernetes.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>We <a href="/blog/sunsetting-helm-support-posthog">no longer support paid, open-source deployments</a> and it is <strong>no longer possible to buy licenses for self-hosted versions</strong> - we instead recommend <a href="/docs/migrate/migrate-to-cloud">migrating to PostHog Cloud</a>. We continue to develop for our open source Docker Compose (&quot;Hobby&quot;) deployment, which is still available under an MIT license without guarantee. </p></blockquote><p>We&#x27;re sunsetting support for our Kubernetes deployment for PostHog. Because we&#x27;re an open source company, I want to be transparent about what this change means, and why we&#x27;re making it. </p><p>In this blog post I&#x27;ll explain:</p><ol><li>Why we&#x27;re making this important change</li><li>How this impacts existing self-hosted customers</li><li>The steps we&#x27;re taking to support impacted customers</li></ol><p>Right now, <em>about 3.5% of our users use Kubernetes</em>, so this change only affects a small subsection of our users. This decision <strong>doesn&#x27;t impact open source users on Docker Compose deployments</strong> (also known as the &quot;hobby&quot; deployment). We remain totally committed to being open source and are actively exploring ways to make that experience even better.</p><h2 id="why-are-we-doing-this">Why are we doing this?</h2><p>PostHog has grown incredibly fast over the last three years. 23,000 companies have signed up to PostHog. Last year, <a href="/blog/2022-review">we grew revenue 6x</a>, we&#x27;re default alive and will likely be profitable in 2023.</p><p>One thing that hasn&#x27;t grown much is the number of users using Kubernetes. We started offering our Kubernetes deployment, alongside a paid supported version, about 2 years ago. Over the last 6 months, we&#x27;ve realized that self-hosting a Kubernetes deployment does not serve either free users or our paid customers.</p><p>When we launched our Kubernetes deploy, we were hoping we could get to a stage where we battle tested enough of the components. We hoped that we could automate enough to make self hosting and scaling PostHog seamless, with a minimum amount of effort.</p><p>Hosting PostHog at scale is complex. With our Kubernetes users, we&#x27;ve seen issues crop up in every part of the stack. In event ingestion, Kafka, ClickHouse, Postgres, Redis and within the application itself. Sometimes the fix is simple (&quot;increase disk space&quot;), but often the issue is something a couple of layers deep and very hard to debug, involving long calls with expensive engineers on both sides. Even something as simple as a full disk would cause their instance of PostHog to be down for hours or days.</p><p>We also learned that the tools to do that automation just don&#x27;t exist. We kept finding new failure modes. When onboarding a new customer we would have to vet their engineering team for Kubernetes experience so that we&#x27;d be confident they could help us debug issues in their PostHog deploy. Folks that didn&#x27;t have infra experience would often be able to get something set up, only to get stuck when something went wrong.</p><p>Despite our continued efforts to help customers and improve the experience, our small infrastructure team is spending an outsized amount of time supporting the 3.5% of users who haven&#x27;t moved to PostHog Cloud or our open source Docker deployment.</p><p>By not supporting Kubernetes, we will free up a lot of time to focus on our main infrastructure priorities, which are PostHog Cloud and the open source Docker Compose deployment. Ultimately, this will lead to a better experience for the vast majority of our users.</p><h2 id="whats-next">What&#x27;s next?</h2><p>Regular updates to our Helm chart will cease <strong>after May 31, 2023</strong>. Security updates on the last available version will continue for <strong>at least the next 12 months</strong>.</p><p>We&#x27;ve already written to paying customers on Kubernetes deployments outlining how we&#x27;ll support them in transitioning to PostHog Cloud, or an alternative PostHog deployment.</p><p>To ease any transition to PostHog Cloud, we are:</p><ul><li><p>Deep into the process of acquiring SOC 2 compliance for PostHog Cloud. We expect to have completed our SOC 2 audit by the end of Q2 2023. [<strong>Update 17/04/2023:</strong> PostHog Cloud is now SOC 2 certified.]</p></li><li><p>Making our cloud HIPAA compliant and will provide security updates for the customers requiring HIPAA until then. </p></li></ul><p>If you&#x27;re currently using Kubernetes to deploy PostHog, you have three options.</p><ol><li><p><strong><a href="/docs/migrate/migrate-between-cloud-and-self-hosted">Migrate to PostHog Cloud</a></strong> – PostHog Cloud means you always have the latest features and it usually works out much cheaper, too. We now offer <a href="/eu">PostHog EU Cloud</a> for folks who need to keep their data in the EU.</p></li><li><p><strong><a href="/docs/self-host/open-source/deployment">Migrate to our Docker Compose deployment</a></strong> – Our Docker Compose deployment is suitable for smaller event volumes and it&#x27;s much simpler to set up and manage than Kubernetes. Self-hosted open-source deployment is provided under MIT license without guarantee.</p></li><li><p><strong>Continue on Kubernetes</strong> – You can also continue using PostHog on Kubernetes. As noted already, we&#x27;ll still provide security updates for at least the next 12 months, but you won&#x27;t benefit from new features or technical support after May 31.</p></li></ol><p>Finally, there will no longer be numbered releases of PostHog. Instead, we&#x27;ll build a Docker image for each commit that happens in our GitHub repo. This means folks using our Docker Compose deployment will benefit immediately from new features and bugfixes, just like those on PostHog Cloud. You&#x27;ll also be able to pin a version or roll back where necessary.</p><p>Thank you to everyone who continues to support and contribute to PostHog. We&#x27;ll continue to build in public and work transparently, and I highly recommend you check out <a href="/roadmap">our public roadmap</a> to see and give feedback on the exciting things we&#x27;re building right now.</p><p>– Tim Glaser, Co-founder and CTO</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why 'Product Engineer' is the most fun role I've had in tech]]></title><description><![CDATA[In my career so far (admittedly not  that  long, though no one mistakes me for a college kid any longer, womp womp) I've done a little bit of a  lot…]]></description><link>https://posthog.com/blog/why-product-engineering-is-so-fun</link><guid isPermaLink="false">058da7e0-1ad9-54bd-b97e-188ea7e26c2b</guid><dc:creator><![CDATA[Raquel M Smith]]></dc:creator><pubDate>Thu, 02 Feb 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/happy-hog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>In my career so far (admittedly not <em>that</em> long, though no one mistakes me for a college kid any longer, womp womp) I&#x27;ve done a little bit of a <em>lot</em> of different things. In some rough order I&#x27;ve moderated forums, led customer success, created marketing plans and SEO strategies, built websites and apps, led product at a seed-to-series-A co, coded + ran my own startup, and more. I&#x27;m currently a product engineer here at PostHog working on the Growth Team. </p><p>Maybe it&#x27;s just me, but I&#x27;ve had more fun as a product engineer than in <em>any</em> other role, hands down. I&#x27;ll tell you why.</p><h2 id="why-optimize-for-fun">Why optimize for fun?</h2><p>But first... why does optimizing for fun matter? </p><p>For me, it&#x27;s simple. Having fun while working is highly correlated with my job satisfaction. It sounds obvious, but I&#x27;ve seen many people sacrifice the fun they have for some <em>thing</em> that gives them more money, status, or just the feeling of progressing up the ladder, even if they have no idea where that ladder leads.</p><p>When we find activities we enjoy, our brains want us to do them again and again. This has a couple interesting ramifications in a work context:</p><ol><li><p>If we&#x27;re having fun doing our work, we will actively look forward to and pursue it more than normal.</p></li><li><p>When we do things again and again, we tend to get better at them, and thus better at our jobs.</p></li></ol><p>And when you put these two things together, you&#x27;ll likely find that optimizing for fun in your work results in you wanting to work more and being better at it. This <em>should</em> (hopefully, theoretically) result in the salary increases and promotions that you&#x27;ve been dreaming about all along.</p><h2 id="what-makes-a-job-fun">What makes a job fun?</h2><p>This will, admittedly, be different for everyone. But I will say that I&#x27;m specifically <em>not</em> talking about an office that has a ping pong table or that organizes amazing off-sites for its remote workforce. While those things are great, what I&#x27;m talking about is <em>the actual work</em>. The things you do for your job that, hopefully, move the company in some direction.</p><p>I have found that the critical ingredients for a fun job, for me, boil down to the following:</p><ol><li>Challenging problems to solve</li><li>Support from other highly motivated colleagues</li><li>The autonomy to make <em>important</em> decisions</li><li>Complete transparency into why my work matters</li></ol><p>Many companies and roles assume that challenging problems to solve (#1) is the only requirement for a satisfying (aka fun) job. But, when you look into the <a href="https://hub.jhu.edu/magazine/2016/summer/neuroscience-of-fun/">neuroscience of fun</a>, it&#x27;s clear that being with others (#2) and defining direction (#3) with help and context from superiors (#4) are critical aspects of any fun activity. </p><h2 id="so-what-makes-product-engineering-so-fun">So what makes product engineering so fun?</h2><p>We&#x27;ve written before about <a href="/product-engineer/what-is-a-product-engineer">what product engineering is</a>, so I won&#x27;t bore you with the details here. TL;DR: A product engineer is someone who works with customers and data to decide what should be built, and then goes and builds it themselves. </p><p>Critically, you can&#x27;t do the work of a product engineer without the four essential ingredients mentioned above. But interestingly, you can <em>also</em> find those ingredients for fun in other roles. </p><p>So what makes product engineering more fun than those other roles? In my opinion, it comes down to the <em>intensity</em> of each ingredient.</p><p>Let&#x27;s look at two other roles, specifically two that have been combined to create the product engineer: <a href="/blog/product-engineer-vs-software-engineer">product management and software engineering</a>.</p><h3 id="how-fun-is-product-management">How fun is product management?</h3><p>From first-hand experience, pretty darn fun. </p><p>We can use our ingredients above and rate the intensity of each to come up with a proxy for fun-ness. Since company culture is so important to #4 (complete transparency into why my work matters), we&#x27;ll leave it out of our ranking system as it has more to do with the company and less to do with the role. </p><p>The others are obviously very impacted by culture as well, but we&#x27;ll assume our roles here are at a company that doesn&#x27;t completely suck.</p><ol><li><strong>Challenging problems to solve</strong> – 4/5<ul><li>PMs often need to solve challenging problems around UX, customer needs, scheduling, and politics. The cycle can be slow and frustrating at times, though.</li></ul></li><li><strong>Support from other highly motivated colleagues</strong> – 3/5<ul><li>Product management is often cited as being an extremely lonely role (and in my experience this is true). You&#x27;re often the only one in your role on your team, you are constantly fighting battles for budget and prioritization by yourself, and if anything goes wrong with your product launch, the buck stops with you. </li></ul></li><li><strong>The autonomy to make <em>important</em> decisions</strong> – 5/5<ul><li>This is simply what PMs are there for. Take the given context, decide what to do with it.</li></ul></li></ol><p>Adding this up we get a score of 12/15. Not bad!</p><h3 id="how-fun-is-software-engineering">How fun is software engineering?</h3><ol><li><strong>Challenging problems to solve</strong> – 5/5<ul><li>There is nothing like the dopamine rush you get when you&#x27;ve been working through a problem and you finally get it to work. As a software engineer, this happens usually multiple times per day. </li></ul></li><li><strong>Support from other highly motivated colleagues</strong> – 5/5<ul><li>Software engineers typically work on a team with at least one other engineer. This team aspect is critical to feeling supported.</li></ul></li><li><strong>The autonomy to make <em>important</em> decisions</strong> – 3/5 (or even 2/5)<ul><li>While engineers can make important decisions about how something is implemented, they&#x27;re often completely out of touch with making important decisions about the business. Oftentimes this is because they don&#x27;t have the context, and they are simply told what to build. </li></ul></li></ol><p>For Software Engineering we get a score of 12 or 13/15. Also not bad.</p><h3 id="how-fun-is-product-engineering">How fun is product engineering?</h3><ol><li><strong>Challenging problems to solve</strong> – 5/5<ul><li>You get the dopamine rush associated with coding, plus the UX problems to solve.</li></ul></li><li><strong>Support from other highly motivated colleagues</strong> – 5/5<ul><li>Similar to software engineering, you often work on a team with other product engineers.</li></ul></li><li><strong>The autonomy to make <em>important</em> decisions</strong> – 5/5<ul><li>Because you&#x27;re responsible for working with customers and data to decide what gets built, you&#x27;re inherently making important decisions, similar to product management.</li></ul></li></ol><p>For product engineering we get a score of 15/15. Yes, I made this scale up, and yes I&#x27;ve given product engineering a perfect score. But you did read the title of this blog post, didn&#x27;t you? I&#x27;m <em>obviously</em> biased.</p><h2 id="so-whats-the-catch">So what&#x27;s the catch?</h2><p>Ah, there is a catch. There is no perfect score for fun without any downsides. One is the concept of a &quot;fun hangover&quot; in children – where they have <em>such</em> a fun day that you know the next day is going to be a complete terror. While slightly different in adults, I&#x27;m convinced this concept still applies.</p><p>But here&#x27;s the big one: </p><p>It&#x27;s <strong>really hard</strong> to operate in a product <strong>and</strong> an engineering mindset <strong>simultaneously</strong>. </p><p>The former is an external mindset; the latter, an internal one. Switching takes effort, so you need to be conscious about which mindset you&#x27;re in, and whether it&#x27;s the right mindset for your active task. Progress becomes slow when you get stuck in the wrong one.</p><p>Regardless, I&#x27;ll take the need to context switch. Because after all, I&#x27;m optimizing for <em>fun</em>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #20: Why do startups fail?]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-20</link><guid isPermaLink="false">c3704459-134c-5e6c-86c8-71fdc349b18e</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Fri, 27 Jan 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><p>This week&#x27;s theme is why startup&#x27;s fail. It&#x27;s a simple question to answer... not enough hedgehogs, obviously.</p><p>Seriously, though, there are too many ways to count, but bad hiring is one obvious failure point. Charles (PostHog&#x27;s VP of Ops &amp; Marketing) shares some of his hiring tips on the blog this week. </p><p>Here&#x27;s what&#x27;s new on PostHog.com:</p><ul><li><a href="https://posthog.com/blog/early-stage-startup-hiring-strategy">Myths (and truths) I&#x27;ve learned from 10 years of startup hiring</a> by Charles Cook</li><li><a href="https://posthog.com/blog/product-engineer-vs-product-manager">Should startups hire product engineers, product managers, or both?</a> by Ian Vanagas</li><li><a href="https://posthog.com/tutorials/regex-basics">The basics of using regex in PostHog</a> by Ian Vanagas</li></ul><p>Words by Andy Vandervell, who just trains AIs to write now.</p><h2 id="why-do-startups-fail-or-why-product-market-fit-doesnt-guarantee-success">Why do startups fail? (or why &quot;product-market fit&quot; doesn&#x27;t guarantee success)</h2><p>In November, Adam Smith, the founder of AI-assisted programming startup Kite, <a href="https://www.kite.com/blog/product/kite-is-saying-farewell/">announced they were closing</a> despite having reached <a href="/blog/product-market-fit-game">product-market fit</a> and 500k monthly-active developers.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hogmail/kit-farewell.png" alt="kite"/></p><p>How does a product with <strong>500k active users</strong> fail? In Adam&#x27;s opinion:</p><ol><li>They were 10+ years too early to the market. The tech wasn&#x27;t ready for primetime, citing the launch of GitHub Copilot, which he feels still has a long way to go.</li><li>As a consequence, while Kite made its users more productive, the change wasn&#x27;t significant enough for engineering managers to pay for their teams to use it.</li><li>They were trying to solve an engineering intensive problem: &quot;It may cost over $100 million to build a production-quality tool capable of synthesizing code reliably&quot;.</li></ol><p>But, here&#x27;s the kicker, he also says:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hogmail/kite-blog-excerpt.png" alt="kite blog"/></p><p>Adam goes onto explain how it took five years to reach product-market fit and, having done so, they focused on growing users rather than working out monetization simultaneously.</p><p>By the time they realized their 500k users would not pay to use it and found a viable pivot, the team was too tired from seven years of grind to pursue it. The launch of Copilot (for free) can&#x27;t have helped morale.</p><p>Kite&#x27;s source code is <a href="https://github.com/kiteco">now open source</a>.</p><h3 id="some-takeaways">Some takeaways:</h3><ol><li>Achieving product-market fit is a landmark, not the final destination. Having it won&#x27;t guarantee your company is successful.</li><li>Once you have it, don&#x27;t delay figuring out revenue. It won&#x27;t just happen. Kite managed to grow to 500k users with &quot;almost zero&quot; marketing spend, but it feels like they didn&#x27;t see the problem until too late.</li><li>Don&#x27;t give away too much for free too long – your users will get used to it being free and converting them will be hard.</li></ol><h3 id="further-reading-on-this-topic">Further reading on this topic:</h3><ul><li>In contrast to Kite, read <a href="https://sacra.com/p/docker-plg-pivot/">how Docker 2.0 went from $11M to $135M in 2 years</a>. After pivoting and cutting headcount from ~420 to just 60 in 2019, Docker&#x27;s revenue is growing by 150% per year.</li><li>Tracy Young, once co-founder/CEO of PlanGrid, on <a href="https://tracy.posthaven.com/part-ii-the-failure-points-from-$5m-to-$100m-in-arr">the failure points from $5m to $100m in ARR</a>. She outlines where startups who have solved PMF and monetization can still fail.</li><li>Kyle Poyar on nailing <a href="https://kylepoyar.substack.com/p/free-to-paid-conversion-at-scale">free-to-paid conversion at scale</a> for product-led companies, and finding &quot;concrete ways to grow faster and do more with less&quot;. </li><li>First Round Review: <a href="https://review.firstround.com/how-product-strategy-fails-in-the-real-world-what-to-avoid-when-building-highly-technical-products">How Product Strategy Fails in the Real World</a> and what to avoid when building highly-technical products</li></ul><h2 id="more-good-reads">More good reads</h2><ul><li><a href="https://staysaasy.com/management/2023/01/12/management-debt.html">Stay SaaSy on Management Debt</a> – Whether it&#x27;s excessively junior teams, title inflation, or compensation inflation, management debt is a real problem. A great post on identifying and dealing with it.</li><li><a href="https://alexwrites.substack.com/p/if-you-like-startups-you-should-love">If you like startups you should love anti-trust</a> – Not a traditionally popular topic in startup circles, but Alex Wilhelm makes the case for why it&#x27;s good for startups. Agree or disagree?</li><li><a href="https://www.cobloom.com/blog/churn-rate-how-high-is-too-high">What is a good SaaS churn rate? A meta-analysis of 6 studies</a> – Is it 5% per month or 5% per year!? It&#x27;s a huge difference with a lot of conflicting data and opinions. This is a good dig into the numbers.</li><li><a href="https://twitter.com/coreyhainesco/status/1612943630997819394">Corey Haines on SaaS metrics that lie</a> – Former Head of Growth at Baremetrics shares some insightful points on popular metrics that might mislead you.</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The best Google Optimize alternatives for apps and websites]]></title><description><![CDATA[Google recently confirmed the sunsetting Google Optimize, its A/B testing platform. In a  statement  on its website, Google said: "Google Optimize and…]]></description><link>https://posthog.com/blog/google-optimize-alternatives</link><guid isPermaLink="false">618b7d7d-17e5-592e-949d-56db078cefd4</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 23 Jan 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-company-culture-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Google recently confirmed the sunsetting Google Optimize, its A/B testing platform. In a <a href="https://support.google.com/optimize/answer/12979939">statement</a> on its website, Google said:</p><blockquote><p>&quot;Google Optimize and Optimize 360 will no longer be available after <strong>September 30, 2023</strong>. Your experiments and personalizations can continue to run until that date. Any experiments and personalizations still active on that date will end.&quot;</p></blockquote><p>The statement went on to say Google is working on adding A/B testing functionality to Google Analytics 4, its somewhat divisive replacement for Google Analytics 360 (Universal Analytics). But Google <strong>didn&#x27;t commit to a launch date</strong> for this A/B testing functionality, which suggests it may not arrive before Optimize is closed.</p><p>If this sounds like bad news to you, consider one of following six Google Optimize alternatives instead. </p><blockquote><p><strong>How did we choose these tools?</strong> There are dozens of A/B testing platforms, so we tried to include a cross-section of tools designed for engineers, marketing teams, and different use cases. We prioritized tools that are self-serve (i.e. no demo or quote needed to open an account) and/or have transparent pricing.</p></blockquote><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/google-optimize-alternatives/posthog.png" alt="google optimize alternatives"/></p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Transparent pricing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Unlimited experiments:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Best for:</strong> Product and engineering teams</li></ul><p><a href="https://posthog.com/">PostHog</a> is a comprehensive <a href="/blog/optimize-to-posthog">Google Optimize</a> and <a href="/blog/ga4-alternatives">GA4 alternative</a> that integrates A/B and <a href="/product-engineers/what-is-multivariate-testing-examples">multivariate testing</a> with event-based analytics, session recording, and feature flags.</p><p>PostHog supports A/B and multivariate experiments that target by geography, device, source, cohort, or limitless other person properties. It tracks metric improvement goals for success, secondary goals, and estimates how long it takes to get a statistically significant result. PostHog&#x27;s experimentation suite is built on its feature flag functionality, making it easy to rollout winning variants.</p><p>As an all-in-one platform, PostHog simplifies your data and analytics stack by replacing multiple tools. This makes it easy to quickly create experiments using existing data and cohorts in your product analytics, rather than connecting an external data source.</p><p>PostHog has a range of <a href="/docs/integrate">libraries and SDKs</a>, from <a href="/docs/integrate/client/js">JavaScript</a> to <a href="/docs/integrate/server/python">Python</a> to <a href="/docs/integrate/client/ios">iOS</a>, to help integrate into your website or apps&#x27; codebase. It has an HTML snippet for easy setup with basic sites, <a href="/docs/libraries/shopify">Shopify</a>, <a href="/docs/libraries/wordpress">Wordpress</a>, <a href="/tutorials/webflow">Webflow</a>, <a href="/tutorials/carrd-analytics">Carrd</a>, and more.</p><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog offers <strong>unlimited experiments</strong> on PostHog Cloud, which includes 1 million events and 5,000 session recordings for free every month. You can calculate your price upfront using <a href="/pricing">PostHog&#x27;s pricing calculator</a> and set <strong>billing limits</strong> to avoid surprise bills.</p><h3 id="companies-that-use-posthog">Companies that use PostHog</h3><ul><li><strong>Y Combinator:</strong> Startup accelerator – <a href="/customers/ycombinator">read how they increased engagement by 40%</a></li><li><strong>Pry:</strong> Financial planning software – <a href="/customers/pry">read how they boosted registrations by 30%</a></li><li><strong>Lovable:</strong> AI web app builder – <a href="/customers/lovable">read their customer story</a></li><li><strong>Joybird:</strong> Furniture e-commerce store</li></ul><h2 id="2-unbounce">2. Unbounce</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/google-optimize-alternatives/unbounce.png" alt="google optimize alternatives"/></p><ul><li><strong>Free tier:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Unlimited experiments:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Best for:</strong> Marketing teams</li></ul><p><a href="https://unbounce.com">Unbounce</a> is a popular content marketing platform among small and medium-size businesses. It allows marketers to quickly create landing pages using its page builder and AI copy writing tools, then use its &#x27;Smart Traffic&#x27; system to automatically direct users to the best-performing variant. It supports traditional A/B tests, too.</p><p>This &#x27;Smart Traffic&#x27; system is what&#x27;s known as &#x27;multi-armed bandit&#x27; testing, where machine learning is used to dynamically allocate traffic to the best performing variant. This is especially effective in marketing scenarios as Unbounce says it can direct visitors to their ideal variant after just 50 visits. Conversion rates should improve the longer a test is run as the algorithm learns.</p><p>The downside is Unbounce is only suitable for use on marketing websites – it can&#x27;t be used on products or mobile apps.</p><h3 id="how-much-does-unbounce-cost">How much does Unbounce cost?</h3><p>Unbounce offers a pleasing range of transparently-priced plans. Its entry-level &#x27;Launch&#x27; plan is $99 per month and supports &quot;up to 500 conversions&quot;, 20k visitors, and one website domain – &quot;conversions&quot; being any time a user completes a conversion goal. Additional plans increase these limits and there&#x27;s a 25% discount for paying annually. </p><h3 id="companies-that-use-unbounce">Companies that use Unbounce</h3><ul><li><strong>Packlane:</strong> Custom packaging and boxes for retailers</li><li><strong>Uberflip:</strong> Sales engagement and lead-gen platform</li><li><strong>PitchBook:</strong> M&amp;A database and marketing intelligence</li></ul><h2 id="3-growthbook">3. GrowthBook</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-testing-tools/growthbook.png" alt="google optimize alternatives"/></p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Transparent pricing:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Unlimited experiments:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Best for:</strong> Product and engineering teams</li></ul><p><a href="/blog/posthog-vs-growthbook">GrowthBook</a> is a popular open-source feature flagging and experimentation platform. It supports A/B and multivariate tests, and integrates with a range of popular analytics tools, such as Google Analytics (UA), Mixpanel, Matomo, and most popular data warehouses.</p><p>It offers a basic visual editor so non-technical users can create experiments without writing code. GrowthBook&#x27;s &#x27;Guardrail&#x27; feature monitors for unintended second order effects of your change which you&#x27;re not actively testing for.</p><h3 id="how-much-does-growthbook-cost">How much does GrowthBook cost?</h3><p><a href="/blog/best-growthbook-alternatives">GrowthBook</a> offers unlimited traffic (subject to a fair use policy), feature flags, and experiments. It charges only on the number of user accounts. Its Starter plan includes three GrowthBook users. Its Pro plan adds advanced permissions, custom fields, and its visual A/B test editor, for just $20 per user, per month.</p><h3 id="companies-that-use-growthbook">Companies that use GrowthBook</h3><ul><li><strong>Deezer:</strong> Music app</li><li><strong>Brilliant:</strong> Learning platform</li><li><strong>Typeform:</strong> Form and survey platform for businesses</li></ul><h2 id="4-instapage">4. Instapage</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/google-optimize-alternatives/instapage.png" alt="google optimize alternatives"/></p><ul><li><strong>Free tier:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Transparent pricing:</strong> Partial</li><li><strong>Unlimited experiments:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Best for:</strong> Marketing teams</li></ul><p><a href="https://instapage.com/">Instapage</a> is a marketing optimization platform built around a landing page builder and experimentation suite. It doesn&#x27;t support multi-armed bandit testing like Unbounce, but it does include a range of useful features for marketing teams, such as personalized landing pages based on ad creative, AMP page support, loading speed optimizations, and dynamic text replacement for PPC campaigns.</p><h3 id="how-much-does-instapage-cost">How much does Instapage cost?</h3><p>Instapage&#x27;s self-serve plan costs $299 per month ($199 if billed annually) and includes most of its core features with no usage limits. It doesn&#x27;t publish pricing on its upgrade plans, which add numerous value-add features, such as heatmaps, custom font support, and consulting services.</p><h3 id="companies-that-use-instapage">Companies that use Instapage</h3><ul><li><strong>HelloFresh:</strong> Recipe box delivery</li><li><strong>Honey:</strong> Coupon and shopping browser extension</li><li><strong>Skyscanner:</strong> Airline price comparison</li></ul><h2 id="5-vwo-testing">5. VWO Testing</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/google-optimize-alternatives/vwo-testing.png" alt="google optimize alternatives"/></p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Transparent pricing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Unlimited experiments:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Best for:</strong> Marketing teams</li></ul><p><a href="/blog/best-vwo-alternatives">VWO</a> is a testing platform that primarily targets large enterprises. Its experimentation platform includes support for A/B and multivariate tests, and a visual editor, though some features are locked behind its numerous product tiers. Geo-targeting, for example, is only available on the &#x27;Pro&#x27; tier of VWO Testing, while feature flags are only available as part of its VWO FullStack product.</p><h3 id="how-much-does-vwo-cost">How much does VWO cost?</h3><p>Outside of its new Starter plan, VWO is largely a &#x27;price on application&#x27; product. Its Starter plan is free up to 50k visitors per month, and $199 per month up to 100k visitors per month, but it&#x27;s quite limited. It only supports basic A/B tests and split URL testing, and you can only target based on device.</p><h3 id="companies-that-use-vwo">Companies that use VWO</h3><ul><li><strong>Chargebee:</strong> Payments and subscription platform  </li><li><strong>Amway:</strong> Mutli-level marketing</li><li><strong>TMZ:</strong> Celebrity and entertainment news</li></ul><h2 id="6-launchdarkly">6. LaunchDarkly</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/google-optimize-alternatives/launch-darkly-experiment.png" alt="google optimize alternatives"/></p><ul><li><strong>Free tier:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Transparent pricing:</strong> Partial</li><li><strong>Unlimited experiments:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Best for:</strong> Engineering and product teams</li></ul><p><a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> is a leading platform for feature management (feature flags) that also enables experimentation. Like all the products in this list, it supports A/B and multivariate testing. In contrast to Unbounce, however, LaunchDarkly is designed for product and engineering teams, so it lacks marketing-friendly features like a visual editor. </p><p>LaunchDarkly is a good option if you require a fully-featured feature flagging tool in addition to experimentation features, and it&#x27;s particularly popular among enterprises with complex feature control needs.</p><h3 id="how-much-does-launchdarkly-cost">How much does LaunchDarkly cost?</h3><p>Experimentation is available on LaunchDarkly&#x27;s Pro plan, which costs $20 per seat, per month, but experiments are priced separately to this. As per LaunchDarkly&#x27;s docs:</p><blockquote><p>&quot;Experiments are billed monthly based on the number of unique user keys in each experiment. To estimate your Experimentation billing costs, multiply the number of experiments you run each month by the number of unique users in your experiment audience.&quot; </p></blockquote><h3 id="companies-that-use-launchdarkly">Companies that use LaunchDarkly</h3><ul><li><strong>Square:</strong> Mobile payments</li><li><strong>Ryanair:</strong> Affordable airline</li><li><strong>HashiCorp:</strong> Infrastructure automation and security</li></ul><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.43.0: Massive performance improvements!]]></title><description><![CDATA[Want to know more about what we're up to?  Subscribe to our new newsletter , which we send once every two weeks! Need to update a self-hosted instance…]]></description><link>https://posthog.com/blog/the-posthog-array-1-43-0</link><guid isPermaLink="false">a99cff12-e3f4-5980-b9c5-bb55679d077b</guid><pubDate>Mon, 16 Jan 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</p><blockquote><p><strong>Need to update a self-hosted instance?</strong> <a href="/docs/runbook/upgrading-posthog">Check the runbook docs for instructions</a>!</p></blockquote><h2 id="posthog-1430-release-notes">PostHog 1.43.0 release notes</h2><h3 id="new-performance-improvements">New: Performance improvements</h3><p>Nobody likes waiting for results, so we&#x27;ve put a renewed focus into performance recently and shipped a huge number of improvements. Here are just some of the highlights: </p><ul><li>Added ClickHouse 22.8 support and optimized expensive queries to be up to 30% faster</li><li>Updated trends queries to reduce cross-shard traffic significantly and speed up queries</li><li>Reworked dashboard cache refresh logic so dashboards are more up-to-date</li><li>Reduced dashboard API response size and deprecated the <code>items</code> field</li><li>Updated dashboard filters to use cached data instead of refreshing immediately</li><li>We no longer load dashboard data from redis twice and tiles are loaded in visual order</li><li>Improved query cancellation logic when navigating away from trends or dashboards</li><li>Improved Celery housekeeping tasks to require less ClickHouse resources </li><li>Prevented home dashboards from loading twice </li><li>Sped up the property filters modal</li></ul><blockquote><p>To unlock the full benefits of Celery updates on a self-hosted instance of PostHog, please <a href="/docs/runbook/async-migrations">run async migration 0008</a>.</p></blockquote><p>Last but not least, we now also have a <a href="/handbook/engineering/clickhouse">ClickHouse manual</a> where we gather information about the database powering PostHog.</p><h3 id="new-feature-flag-variant-overrides">New: Feature flag variant overrides</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-43-0-feature-override.gif" alt="flag overrides"/></p><p>Ever created a multivariate feature flag, and wanted to show the control variant to specific users? Or, maybe you found a new cohort you&#x27;d like to add to the test variant? Now you can!</p><p>1.43.0 adds the ability to manually override variants via the flag edit screen. It&#x27;s great for ensuring users get the intended experience, but is also useful for testing as it enables you to deterministically choose a variant, and test across client-side and server-side feature flags.</p><h3 id="new-export-recordings-to-file">New: Export recordings to file</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-43-0-export.gif" alt="export recordings"/></p><p>Sometimes a recording can be so insightful, so important, that you think - &quot;I want to keep a record of this forever.&quot; Well, now you can export any recording to a file and load it back into PostHog for playback in the future. Whether it is to commemorate your first sale or for compliance reasons, the tools are now in your hands.</p><h3 id="new-role-based-access-for-feature-flags">New: Role-based access for feature flags</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-43-0-ff-roles.gif" alt="ff-roles"/></p><p>You can now create roles and group team members together, along with customizing feature flags access for team members! Having access control helps reduce accidental changes and ensures confidence when shipping a new feature.</p><h3 id="new-better-insight-searching">New: Better insight searching</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-43-0-search.gif" alt="insight searching"/></p><p>We don&#x27;t want searching for insights to be just functional. We want it to be a world-class, joy-sparking event! So, we&#x27;ve updated search to include the description field and any tags which have been applied.</p><p>This sounds like a small change, but it makes a massive difference for teams that organize data well and generate a lot of insights!</p><h3 id="new-show-eventproperty-counts-in-persons-modal">New: Show event/property counts in persons modal</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-43-0-modal.gif" alt="persons modal"/></p><p>We&#x27;ve updated the persons modal that appears when you select a data point on a query to show event and property counts on that person. This is especially helpful for finding out who your power users are, as you can quickly scan to see which users have completed an event the most!</p><h3 id="improved-more-experiment-variants-and-improved-flow">Improved: More experiment variants and improved flow</h3><p>A regular complaint used to be that, if you made a mistake while making an experiment, you couldn&#x27;t go back to fix it. Well, we fixed that so you can now:</p><ol><li>Restart a running experiment while keeping everything the same and using the same feature flag key.</li><li>Change the main metric on a running experiment.</li><li>Change the secondary metrics on a running experiment.</li></ol><p>Finally, as a bonus, you can now have up to nine variants in an experiment, instead of the usual three!</p><h3 id="improved-browsing-recordings-and-creating-playlists">Improved: Browsing recordings and creating playlists</h3><p>Following up on our new playlists feature, we&#x27;ve improve the recordings UX to make browsing and pinning recordings as quick and intuitive as possible. You can now scroll the list of recordings independently of the player and creating a playlists of pinned recordings is much faster too!</p><h3 id="improved-recording-playback-controls">Improved: Recording playback controls</h3><p>We&#x27;ve revamped the recording seekbar to make it easier to find user activity at a glance, to show where tracked events occur and display what time you&#x27;re scrubbing to.</p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>You think that&#x27;s it? Not by a long shot! Version 1.43 also adds hundreds of other improvements and fixes, including...</p><ul><li><strong>Improvement:</strong> We made <a href="https://github.com/PostHog/posthog/pull/13529">a simpler, faster process for querying the recently viewed insights on your home page</a></li><li><strong>Fix:</strong> Webhooks for actions with null checks weren&#x27;t firing correctly. <a href="https://github.com/PostHog/posthog/issues/12893">This is now fixed.</a></li><li><strong>Fix:</strong> Trends &quot;Weekly active users&quot; and &quot;Monthly active users&quot; aggregation options used to return &quot;Total count&quot; results for non-time-series chart types, such as pie chart or world map. <a href="https://github.com/PostHog/posthog/issues/13131">Now proper results – the actual count of weekly/monthly active users – are returned.</a> The reference point for this calculation is the last day of the insight&#x27;s time range (so for an insight with a range Aug 1-Sep 30, pie chart &quot;Weekly active users&quot; is the count of users between Sep 24 and 30, inclusive.)</li><li><strong>Improvement:</strong> <a href="https://github.com/PostHog/posthog/pull/13543">We&#x27;ve consolidated container build workflows and made changes to build and push multi-arch images</a>.</li><li><strong>Improvement:</strong> We&#x27;ve switched to use <code>pnpm</code> instead of <code>yarn</code> to <a href="https://github.com/PostHog/posthog/pull/13190">manage dependencies</a>.</li></ul><p>View the full commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.42.0...release-1.43.0"><code>release-1.42.4...release-1.43.0</code></a>.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="https://calendly.com/posthog-feedback">Schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people this month...</p><ul><li>@Ismaaa for <a href="https://github.com/PostHog/posthog.com/pull/1840">correcting some mistakes in our onboarding documentation</a></li><li>@Johanholmerin for <a href="https://github.com/PostHog/posthog-js/pull/478">fixing an issue when copying non-extensible objects</a></li></ul><p>Want to build with us? Check out our <a href="/docs/contribute">contributing resources</a> to get started. We have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>We&#x27;re currently hiring for remote candidates in the following role:</p><ul><li><a href="/careers/full-stack-engineer-experimentation">Full Stack Engineer - Experimentation Team</a></li><li><a href="/careers/site-reliability-engineer">Site Reliability Engineer</a></li></ul><p>Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. <a href="mailto:careers@posthog.com">You can also send a speculative application!</a></p><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog goodness!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: ClickHouse vs Druid]]></title><description><![CDATA[Contrary to what the names might suggest, ClickHouse isn’t an TikTok influencer house and Druid isn’t (just) a D&D character class – they're both…]]></description><link>https://posthog.com/blog/clickhouse-vs-druid</link><guid isPermaLink="false">d4e7019f-5702-5431-90a0-7076c25930eb</guid><dc:creator><![CDATA[Mathew Pregasen]]></dc:creator><pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Contrary to what the names might suggest, ClickHouse isn’t an TikTok influencer house and Druid isn’t (just) a D&amp;D character class – they&#x27;re both modern online analytical processing (OLAP) databases designed to store and retrieve lots of data fast. </p><p>OLAP databases store data in a columnar format that is primed for aggregations, unlike online <em>transaction</em> processing (OLTP) ones like mySQL (see below). But, while ClickHouse and Druid solve a fundamentally similar problem, they do so via dramatically different approaches. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/rows-vs-columns.png" alt="OLAP vs OLTP"/>  </p><p>Products with massive volumes of data, like <a href="/blog/best-open-source-business-intelligence-tools">business intelligence tools</a>, stock market trading books, and apps with lots of charts and graphs, can benefit from using  OLAP databases. </p><p>At PostHog, we use ClickHouse to power our analytics warehouse – lovingly dubbed our Events Mansion. ClickHouse was a saving grace when our Postgres setup was grinding to a halt due to our growth. </p><p>But what about Apache Druid? An accomplished database in its own right, Druid approaches common analytical problems very differently. </p><p>In this article, we’ll explore those differences, including how they work, who uses which, and why.</p><blockquote><p>Want to know more about OLAP (column-based) vs OLTP (row-based) databases? Read our guide <a href="/blog/clickhouse-vs-postgres">comparing ClickHouse (OLAP) and PostgreSQL</a>, the most popular open-source OLTP database.</p></blockquote><h2 id="architecture">Architecture</h2><p>Have you ever been asked if you&#x27;d prefer to fight a hundred duck-sized horses or one horse-sized duck? </p><p>Well, Druid is the former and ClickHouse is the latter. If that analogy doesn&#x27;t work, consider this instead:</p><ul><li><p>ClickHouse is like a lakefront mansion. You keep the house, polish the interior, and extend it with extra wings when the need arises. </p></li><li><p>Druid is a master-plan suburban community where each house is interconnected by roads and (in some cases) a shared canal because... canals are nice?</p></li></ul><p>ClickHouse is about keeping every component of the database tightly woven via a single binary executable; Druid’s architecture is modular, configurable, and consequently more complicated. </p><h3 id="how-clickhouse-works">How ClickHouse works</h3><p>ClickHouse&#x27;s cornerstone principle is that ClickHouse should do the work for you. ClickHouse automatically ingests, compresses, and creates <a href="/blog/clickhouse-materialized-columns">materialized views of data</a> with minimal set-up required from the user.</p><p>Here&#x27;s what that looks like in practice:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-druid/clickhouse-architecture.png" alt="ClickHouse architecture diagram"/>  </p><p>What is a materialized view? A materialized view, unlike a normal view, is a separate table of data generated at a specific time from the base tables. This makes running queries on data in materialized views more efficient (if set up correctly). Materialized views don&#x27;t need to be re-queried before being queried from, unlike normal views.</p><p>While Postgres, a row-based OLTP database, supports materialized views, they aren’t good for dynamic data since refreshing them is expensive. ClickHouse uniquely can efficiently update materialized views upon new data within a delay threshold. </p><p>Most databases achieve speed by caching calculated results after an initial slow query. ClickHouse’s materialized views do the heavy-lifting ahead of time, and are constantly updating so that they’re never <strong><em>too</em></strong> out-of-date. This is a happy medium for a lot of data-driven applications, and contributes to ClickHouse&#x27;s reputation for extremely fast query performance on large datasets.</p><ul><li><p><strong>Apache Zookeeper:</strong> ClickHouse does admit a flaw in its single executable promise. If the database is expected to have replicas, it requires Apache Zookeeper to manage the redundancies. However, this is a rather thin layer atop of a ClickHouse cluster, and a problem addressed by the introduction of <a href="https://clickhouse.com/docs/en/operations/clickhouse-keeper/">ClickHouse Keeper</a>. </p></li><li><p><strong>Caches:</strong> ClickHouse boasts <a href="https://clickhouse.com/docs/zh/operations/caches/">different types of caches</a> for discrete optimizations. ClickHouse’s MergeTree table family has unique caches that improve data fetches.</p></li><li><p><strong>Dedicated Engines:</strong> ClickHouse boasts a number of dedicated engines that utilize parallel calculations to expedite data crunching. For instance, the SummingMergeTree Engine is able to sum values throughout a database significantly faster than a linear analog. This makes Clickhouse apt for analytics products that need to do a lot of algebraic math across vast datasets.</p></li></ul><h3 id="how-druid-works">How Druid works</h3><p>Druid is all about modularity. Druid separates the query, data, and storage nodes into three separate machines. Does that mean there is extra latency? By the Druid’s team’s own concession, an unapologetic yes. Druid’s argument is that intra-database latency is justifiable for the customizable and precision benefits of its approach. </p><p>Let’s take a look at a Druid setup: </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-druid/druid-architecture.png" alt="Druid architecture diagram"/>  </p><p>Druid is built for massive applications with unique data streaming needs. For instance, imagine an application that needs to take the last stock trade into account before returning a value. </p><p>ClickHouse would stumble with this – ClickHouse doesn’t guarantee newly ingested data is included in the next query result. Druid, meanwhile, does – efficiently, too, by storing the newly streamed data temporarily in the data nodes whilst simultaneously packing and shipping it off to deep storage. </p><p>Remember that analogy between the mansion and master-plan community? For Druid, the query nodes are the roads, the data nodes are the houses, and storage is the sprawling, shared lake.</p><h4 id="cattle-vs-pets">Cattle vs Pets</h4><p>Druid expects you to treat its nodes like cattle, constantly removing and adding nodes on a whim. You would never do that with ClickHouse instances since each ClickHouse instance likely plays a critical role in your application’s stability. </p><p>You have to treat ClickHouse more like your pet, caring about it individually and making sure it stays alive. Druid, meanwhile, expects you to utilize up to ten thousand data nodes, each which could be taken offline and maintained without impacting the application.</p><p>Of course, this means that Druid requires more maintenance work. <strong>Much</strong> more maintenance work. Not just that, but server costs, too. Druid is built for large enterprise clients with complex needs and massive financial backing to support the architecture. ClickHouse, meanwhile, is a one-size-fits-most solution; scalable, just not in the same multidimensional, multi-structural way as Druid is.  </p><h4 id="stream-data-over-batch-data">Stream data over batch data</h4><p>ClickHouse, expects data to be batched – this is because ClickHouse re-renders materialized views, and prefers to do that for a collection of data, not for every arbitrary insert. But Druid has different priorities. </p><p>When stream data is ingested into Druid, it stores the stream data ephemerally in the data node while in parallel storing the same data in the storage node. This is similar to a cache, but notably makes data available in-memory before it was even fetched once. </p><p>You can consider this approach somewhat similar to the philosophy behind ClickHouse’s dynamic materialized views, however, the end deliverable is different. ClickHouse is able to calculate results that utilize the entire database minus recent data (such as an all-time average) without buffering the entire database into memory. Druid, meanwhile, is able to return the <strong>recent</strong> data extremely fast. </p><ul><li><p><strong>Caching:</strong> Druid, like ClickHouse, enables you to cache query results. Druid users can cache results of an entire query or a segment of a query.</p></li><li><p><strong>Prioritization (Tiering):</strong> One of Druid’s hallmark features is prioritization. While Clickhouse strives to make every query hypothetically efficient, Druid allows users to prioritize queries. Mission-critical queries can force low-priority queries to pause / get delayed. This is an ideal feature for applications where the most expensive queries are the least required to be fast.</p></li></ul><h2 id="use-cases">Use cases</h2><p>ClickHouse and Druid strive to solve the same problem, but they have unique strengths and weaknesses that make them ideal for different use cases.</p><p>Let’s explore these factors for both. </p><h3 id="when-to-use-clickhouse">When to use ClickHouse</h3><p>As with any technical comparison, you should default to the simpler tool if you can. ClickHouse is easy to setup, doesn’t involve multi-piece architecture to maintain, and has a chest of tools for a majority of needs. </p><p>In fact, it’s less about when you should use ClickHouse and more about when you shouldn’t. Here are some reasons for why ClickHouse may <strong>not</strong> be the right solution for you: </p><ul><li>You cannot batch data</li><li>You need to accurately retrieve data that was just inserted</li><li>You need to prioritize queries <strong>and</strong> believe a certain query will be slow in ClickHouse</li></ul><p>Of course, you can utilize ClickHouse even with these constraints if you utilize additional scaffolding architecture such as caches. While that detracts from ClickHouse’s single-monolith value prop, they are valid techniques to still use ClickHouse, especially if ClickHouse is ideal because of its: </p><ul><li>Specialized engines</li><li>Simplified internal architecture</li><li>Materialized views</li></ul><p>Speaking from experience, if you run a billion-event <a href="/product">developer platform</a> like ours, you should use ClickHouse 😉. </p><h3 id="when-to-use-druid">When to use Druid</h3><p>Druid is an ideal solution for teams that require a modular design with precision. If you need to fetch data immediately after the data was streamed, Druid is great. However, there are some key caveats that you need to be aware of: </p><ul><li>Druid is more complex to set up and maintain</li><li>Druid is more expensive as it requires more machines and systems</li></ul><p>Additionally, Druid is the best solution for applications that need real-time data reporting with precision. For instance, a stock market order-book app may utilize Druid because users expect accurate and aggregate financial data in real-time. </p><h3 id="which-companies-use-clickhouse-and-why">Which companies use ClickHouse and why?</h3><ul><li><p><strong>PostHog:</strong> We <a href="/blog/how-we-turned-clickhouse-into-our-eventmansion">switched from Postgres to Clickhouse</a> as we scaled and never looked back. By utilizing ClickHouse’s dedicated engines and materialized views, we are able to efficiently return event data to our users with minimal overhead and support billion-event scale companies.</p></li><li><p><strong>Ebay:</strong> Ebay <a href="https://www.youtube.com/watch?v=KI0AqpmcSOk">switched</a> from Druid to ClickHouse with Apache Zookeeper to dramatically reduce its server costs and simplify its backend. Originally, Ebay’s Druid setup was sprawling and complicated to maintain, racking up serious engineering costs. After switching to ClickHouse, Ebay’s overall infrastructure was reduced by a whopping 90%.</p></li><li><p><strong>Uber:</strong> Uber <a href="https://www.uber.com/blog/logging/">moved</a> its logging platform to ClickHouse, improving data compression and halving its infrastructure costs. Given that Uber needs to log a lot of geographical information during car rides, ClickHouse was the apt solution for streaming data.</p></li></ul><h3 id="which-companies-use-druid-and-why">Which companies use Druid and why?</h3><ul><li><p><strong>Airbnb:*</strong> Druid enables Airbnb to analyze both historical and real-time metrics, returning data for Airbnb hosts quickly and interactively. Because Airbnb processes hundreds of transactions every minute, Druid enables them to return accurate pricing shifts efficiently.</p></li><li><p><strong>Lyft:</strong> Probably the best example on how Druid and ClickHouse <strong>could</strong> be used interchangeably with additional architecture is Uber’s cousin’s choice in Druid. Lyft utilizes Druid, with some <a href="https://www.youtube.com/watch?v=ovZ9iAkQllo">additional setup</a>, to achieve similar results as Uber has.</p></li><li><p><strong>Rovio:</strong> The makers of everyone’s favorite angry ducklings game, Rovio uses Druid to chop and pivot time-series dashboards filled with data from their millions of players.</p></li></ul><h2 id="summary">Summary</h2><p>Druid and ClickHouse both seek to handle large volumes of data at speed, but they do so in completely different ways. ClickHouse champions simplicity and a unified instance; Druid is complex but highly configurable. </p><p>While both offer enormous advantages over traditional databases for columnar data, companies should strongly consider their needs when making choice between the two. </p><h3 id="clickhouse-pros-and-cons">ClickHouse pros and cons</h3><blockquote><p><strong>Pros</strong></p><ul><li>Low latency</li><li>Simple to set up, can operate out of a single instance</li><li>Materialized Views expedite aggregations at the data level</li><li>Extremely fast query performance on large datasets</li></ul></blockquote><blockquote><p><strong>Cons</strong></p><ul><li>Expects users to batch data</li><li>Cannot return data immediately after insert</li></ul></blockquote><h3 id="druid-pros-and-cons">Druid pros and cons</h3><blockquote><p><strong>Pros</strong></p><ul><li>Highly configurable and scalable</li><li>Can return data immediately after insert</li><li>Has prioritization of queries built natively</li></ul></blockquote><blockquote><p><strong>Cons</strong></p><ul><li>Expensive setup</li><li>Harder to maintain</li><li>More latency due to multiple layers</li></ul></blockquote><h3 id="further-reading">Further reading</h3><ul><li><p><a href="https://altinity.com/blog/clickhouse-nails-cost-efficiency-challenge-against-druid-rockset">Altinity&#x27;s 2021 analysis</a> comparing the performance and cost efficiency of ClickHouse, Druid and Rockset. Altinity, maintains a useful <a href="https://altinity.com/blog/tag/benchmark/">database of ClickHouse benchmarks</a> in a variety of use cases. </p></li><li><p>ClickHouse&#x27;s CTO, Alexey Milovidov, <a href="https://www.youtube.com/watch?v=CAS2otEoerM">2022 talk &quot;Building for Fast&quot;</a>.</p></li><li><p><a href="/blog/how-we-turned-clickhouse-into-our-eventmansion">How we turned ClickHouse into our event mansion</a> by our own James Greenhill explores in more depth why we chose ClickHouse for PostHog. We also maintain an internal <a href="/handbook/engineering/clickhouse">ClickHouse manual</a>.</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #19: Which meetings should you kill?]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-19</link><guid isPermaLink="false">e79a8757-732a-5995-9e1f-1f385566fbe6</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Thu, 12 Jan 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><p>One week later than originally promised... welcome to the first HogMail of 2023. In this issue:</p><ul><li>Why Shopify is (maybe) killing the wrong meetings</li><li>What co-founder James learned in 2022</li><li>Why we shouldn&#x27;t send humans to Mars</li></ul><p>– Andy Vandervell, Word Typer-in-Chief</p><h2 id="new-from-posthog">#new-from-posthog</h2><ul><li><p><a href="https://posthog.com/blog/2022-review">CEO diary: Things I learned in 2022</a>: Reflections on 2022 and what&#x27;s to come this year</p></li><li><p><a href="https://posthog.com/blog/feature-flag-best-practices">Master Feature Flags: Best practice, tips and examples</a>: Ian shares some practical tips for deploying PostHog feature flags (and feature flag usage generally).</p></li><li><p><a href="https://posthog.com/tutorials/performance-marketing">How to track performance marketing in PostHog</a>: How to set up UTM tracking for your campaigns and attribution. See also: <a href="https://posthog.com/blog/posthog-marketing">how our marketing team uses PostHog</a>.</p></li><li><p><a href="/tutorials/canary-release">How to do a canary release using PostHog</a>: Step-by-step guide to gradually rolling out a new feature release.</p></li></ul><h2 id="talking-points">#talking-points</h2><h3 id="which-meetings-should-you-kill-">Which meetings should you kill? 📢</h3><p>Shopify made the news recently with a <a href="https://www.forbes.com/sites/jenamcgregor/2023/01/03/shopify-is-canceling-all-meetings-with-more-than-two-people-from-workers-calendars-and-urging-few-to-be-added-back/">new year edict</a> to cancel all meetings with more than two people and &quot;re-instate&quot; meeting-free Wednesdays. But Camille Fournier, author of The Manager&#x27;s Path, suggests that <a href="https://skamille.medium.com/which-meetings-should-you-kill-7430467c005b">one-to-one meetings are the real time waster</a>:</p><blockquote><p>&quot;I truly cannot imagine the mental model of someone who believes that the solution to too many meetings is to cancel group meetings while leaving 1:1 meetings untouched, unless their goal is creating a kind of hyper-political anti-transparency culture.&quot;</p></blockquote><p>Camille&#x27;s advice? Yes, pointless status update meetings are bad, but the answer is to invest the time and effort into running better group meetings. If you don&#x27;t, inefficient and opaque 1:1 catchups will proliferate in their place.</p><p>What we do: We&#x27;re big believers in fewer meetings and the maker&#x27;s schedule – we have meeting-free days on Tuesdays and Thursday, for example.</p><p>But the real game changer is defaulting to asynchronous communication and writing everything down. <a href="https://posthog.com/blog/how-to-run-a-transparent-company">Transparency wins</a>. See <a href="https://posthog.com/handbook/company/culture">our handbook</a> for more on how we work.</p><h3 id="product-market-fit-is-a-moving-target-">Product-market fit is a moving target 🎯</h3><p>We often get asked how to achieve the fabled product-market fit (PMF), mainly because <a href="/blog/product-market-fit-game">there is no universal standard</a> and, as Run the Business points out in <a href="https://runthebusiness.substack.com/p/product-market-flex">Product Market Flex</a>, it&#x27;s not a stationary target:</p><blockquote><p>&quot;At any given moment in time, even if you have PMF, you still need to be working towards a future state where the market has evolved, and your product has kept up.&quot;</p></blockquote><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/product-market-flex.jpeg" alt="product market fit"/></p><p>The author goes on to argue teams can flex two dimensions to achieve PMF: (i) reduce the effort by the user to get value (product); and (ii) increase user literacy (go-to-market).</p><p>John Cutler explores this idea further in <a href="https://cutlefish.substack.com/p/tbm-4152-product-gtm-fitness">Product GTM Fitness</a>, discussing how to identify the warning signs of atrophy, and how to change course when you do.</p><h2 id="misc-good-reads">#misc-good-reads</h2><ul><li><a href="https://readmorebooks.substack.com/p/how-to-read-more-books-in-2023">How to Read More Books in 2023</a> – Tip 1... &quot;there are no right or wrong books. Read what you want&quot;. Mills &amp; Boon it is then! Seriously, though, these are useful tips if you have this on your resolutions list.</li><li><a href="https://twitter.com/fchollet/status/1612142423425138688">Google AI researcher makes the bear case for AI in 2023</a> – Is that the hype train leaving the station? Best call it back. Francois Chollet argues the current climate in AI has many parallels to web3 in 2021.</li><li><a href="https://idlewords.com/2023/1/why_not_mars.htm">Why Not Mars</a> – I&#x27;m a big fan of Apple TV&#x27;s For All Mankind, but this long read makes a cogent argument for why we shouldn&#x27;t send humans to Mars. AFAIK, Elon hasn&#x27;t sub-tweeted the author yet.</li><li><a href="https://alexw.substack.com/p/optimism-shapes-reality">Optimism Shapes Reality</a> – To balance out all this pessimism, here&#x27;s Alexandr Wang (CEO at Scale AI), on the importance of optimism. &quot;When we say things will take a short amount of time, they will take less time.&quot;</li><li><a href="https://www.mostlymetrics.com/p/questions-to-ask-before-taking-a">How employees can think like shareholders</a> – Or, to use the post&#x27;s original title, &quot;the REAL questions you should ask before taking a job&quot;, though the questions here are still relevant outside of that context. CEO James has written about this in the past, too.</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[CEO diary: The things I learned in 2022]]></title><description><![CDATA[It's always helpful to look back on the year just gone, and 2022 was an exceptionally good year for PostHog. Here's my personal perspective on how it…]]></description><link>https://posthog.com/blog/2022-review</link><guid isPermaLink="false">c1530f8c-a261-5c3f-a2ee-e1918aeebe4d</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Wed, 11 Jan 2023 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>It&#x27;s always helpful to look back on the year just gone, and 2022 was an exceptionally good year for PostHog. Here&#x27;s my personal perspective on how it went.</p><h2 id="how-it-went">How it went</h2><h3 id="we-grew-very-fast-and-are-much-more-durable">We grew very fast <em>and</em> are much more durable</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/revenue-end-2022.jpg" alt="Our 2022 revenue growth over time, which increases by 6 times"/></p><ul><li><p>Revenue grew nearly 6x without any outbound sales team.</p></li><li><p>We hit a 2 month <a href="https://www.thesaascfo.com/cac-payback-period/">CAC payback period</a>, salaries included. Around <a href="https://www.geckoboard.com/best-practice/kpi-examples/cac-payback-period/#:~:text=The%20general%20benchmark%20for%20startups,have%20greater%20access%20to%20capital.">12 months</a> is seen as exceptional.</p></li><li><p>We are comfortably default alive and will likely be profitable in 2023.</p></li></ul><p>We still have work to do. We&#x27;re working on gross margin – we&#x27;ve done close to zero cost optimization on our hosting so far - and we want to hit a higher absolute level of revenue (around $10M ARR) without spending significantly more before we fundraise again.</p><h3 id="we-let-people-go-when-we-needed-to">We let people go when we needed to</h3><p>We remained disciplined and let people go when we needed to. This helps us retain an ambitious and performance-oriented culture. While these moments are painful, we received positive feedback from our team when we explained why we made these decisions, transparently. </p><p>We are compassionate, but reasonable – we pay 4 months severance because our attitude is letting people go earlier is better for everyone and a big payout for them is kinder in return, so having the latter means the former condition is met.</p><h3 id="tim-and-i-wound-up-in-the-wrong-roles-but-we-spotted-this-and-fixed-them">Tim and I wound up in the wrong roles, but we spotted this and fixed them</h3><p>Tim (my co-founder) and I realized we were managing the wrong teams because the game had changed. I was good at early sales, but we&#x27;ve moved on from that and now he&#x27;s the right person to help us scale things there.</p><p>Likewise in product, we want to go from good to great and that&#x27;ll take more design attention, which I can help with.</p><p>Tim and I therefore swapped a bunch of priorities around with each other, and (so far) it feels much better.</p><p>There are two reasons we spotted this: the combination of (1) feedback from our teams and (2) a love / tradition of going for &quot;salt of the earth curries&quot;.</p><p>We regularly do <a href="../handbook/people/feedback">360 feedback dinners</a> at offsites, but this feedback came from asking these questions about each other on the exec team in our 1:1s, randomly:</p><ul><li><p>What do I do that you experience as world-class?</p></li><li><p>What do I do where I appear to be experiencing fun, peace or joy (if different from above)</p></li><li><p>What do I do that I am good at but that I don&#x27;t appear to enjoy?</p></li><li><p>What do I do that I am not better at than others?</p></li><li><p>What do I do that I am actually worse than others?</p></li></ul><p>Secondly, Tim and I love going for a curry every couple of weeks when we work together in person (we&#x27;re all remote, but we do make an effort to hang out). This means specifically an unpretentious but tasty curry somewhere. </p><p>My wife isn&#x27;t a huge fan of them so, nearly every time we meet, I jump at the chance and I <em>think</em> I&#x27;ve converted Tim. During one of these, we talked through the feedback we&#x27;d received. It&#x27;s a good reminder to hang out and not make every interaction &#x27;zoomformulaic&#x27;.</p><h3 id="i-was-prioritizing-badly-but-tim-held-me-accountable-and-we-fixed-that-too">I was prioritizing badly, but Tim held me accountable and we fixed that too</h3><p>At one point, I was getting the individual contributor (IC) work done, but not prioritizing things like company vision/OKRs. Knowing when to do this is a real skill. Too much of it and you&#x27;re setting a silly culture of planning over trying stuff out; too little, and you don&#x27;t have a clear direction. </p><p>Tim suggested I hire <a href="/kendal">Kendal</a> (Exec Assistant) to help solve this. I felt really silly hiring someone to manage my time and to keep me organized, but the reality is that I can now give more value to the company, which helps everyone. Having a nudge from someone else was what I needed to commit.</p><h3 id="a-crappy-family-situation-got-much-better">A crappy family situation got much better</h3><p>My (then) one-year-old daughter got diagnosed with bilateral retinoblastoma (a type of cancer) in 2021. She lost an eye as a result, has her vision permanently damaged in the other, and had to go through chemo. We were delighted to wrap up treatment in the Spring 2022. We were lucky that it went perfectly... she was &quot;cured&quot; (as far as you can be of cancer), and now we&#x27;re in regular monitoring mode. When she got diagnosed, I chose to focus on revenue over fundraising (instead of trying to do both while taking care of her), and now a year and a half on, I&#x27;m very glad that&#x27;s what we picked.</p><h3 id="we-are-shipping-stuff">We are shipping stuff</h3><p>We made too many improvements to list on user-facing functionality, and infra / ingestion-based functionality. It feels like we can make new things appear, although Q1 will be a big test – it&#x27;ll be one of our most ambitious quarters.</p><p>Other teams also get their work out the door quickly, unimpeded by bureaucracy / excessive planning. We&#x27;ve had a ton of marketing content appearing, a smooth time with our <div slug="people"></div>, and a <div slug="growth"></div> that can&#x27;t stop producing winning variants!</p><h3 id="im-really-glad-were-not-doing-outbound--went-for-a-growth-team-instead">I&#x27;m really glad we&#x27;re not doing outbound / went for a growth team instead</h3><p>It is always tempting to hire an outbound sales team. After all, we can sell the product and retain users, to a tightly defined audience.</p><p>However, it just feels like <a href="../handbook/growth/sales/overview#strategy">it&#x27;d be very hard to do outbound sales</a> to developers. I can&#x27;t think of a worse group to target this way (this is coming from a place of experience as <a href="https://www.linkedin.com/in/j-hawkins/">I&#x27;ve run outbound sales teams</a> before).</p><p>Instead, we set up a growth team. We&#x27;ve had dramatic results from doing this – such as 25% improvements in our activation flow from single experiments. Yep, one experiment has led to a 25% increase in our monthly growth, forever. That&#x27;s why we have such a low CAC payback period...</p><p>If we <em>had</em> hired a sales team, I guarantee we&#x27;d be focusing on how to send more cold emails more effectively versus the more leveraged work of improving our onboarding, activation and billing flows.</p><h3 id="we-can-take-pride-in-not-focusing-on-number-of-staff--investors">We can take pride in not focusing on number of staff / investors</h3><p>Lots of companies raised very hyped funding rounds in 2021 – we had demand, but ultimately chose not to move forward. We are confident we made the right call not to do this, but we felt at the time that we were going against the grain. It was really cool to talk about this stuff openly with our team, and to see how quickly we started taking pride in building a real company.</p><h3 id="doing-more-of-what-works-in-many-parts-of-the-company-has-been-great">Doing more of what works in many parts of the company has been great</h3><p>In go-to-market, it&#x27;s always tempting to explore new channels. However, in 2022, we really benefited from understanding where our growth was <em>actually</em> coming from, and doing more of those things. This meant content marketing and word of mouth growth.</p><h3 id="our-free-support-quality-has-been-a-bit-variable">Our free support quality has been a bit variable</h3><p>We get around twice as many community support questions now as we did last year. We&#x27;ve not tracked it, but it feels like we&#x27;re a lot more rushed as a result when trying to get to everything.</p><p>We&#x27;ve implemented multiple things to try to improve this – <a href="https://github.com/PostHog/squeak">Squeak!</a>, a backup infra hero, generally prioritizing cloud (since it&#x27;s a better experience if possible), launching <a href="posthog-cloud-eu">Cloud EU</a> to help with GDPR compliance, and hiring Paul Hultgren to work on our docs full time. </p><p>These improvements caused a 75% drop in the likelihood of each user to need support, but that was outweighed by how much growth we had. There are therefore more things to come here as this is an ongoing challenge as we keep scaling. </p><h3 id="staying-on-top-of-ic-work-as-a-cofounder-with-40-people-is-hard">Staying on top of IC work as a cofounder with 40 people is hard</h3><p>Tim and I have both felt this at different times. We think it&#x27;s very important we both do individual work – simply, it&#x27;s more fun to work <em>alongside</em> someone, and that&#x27;s only the case if we do some actual work. Longer term, we want a culture that values individual contribution, so we should do this ourselves.</p><p>However, it is tough pulling this off while making sure the entire company runs in a manner that we&#x27;re proud of – we&#x27;ve both felt frustrated when we see our individual work slip as a result. That&#x27;s no reason not to do it, though.</p><h2 id="things-to-watch-in-2023">Things to watch in 2023</h2><ul><li><p><strong>Looking after hobbyist users as our revenue is accelerating.</strong> Most users of PostHog pay us nothing, and they&#x27;re often the ones talking about us as part of our word of mouth growth. This can conflict with short-run revenue goals at times, but is fundamentally in line with long term targets (if we have a big fanbase, then that&#x27;ll bring more fans both free <em>and</em> paid) - and that&#x27;s ultimately more important, since we&#x27;re default alive.</p></li><li><p><strong>Our margins!</strong> It&#x27;ll be the first year we put real effort into hosting costs specifically. Alongside increasing our overall revenue figure, which will happen naturally with time, this is the other metric that&#x27;ll make a series C easier to raise if we improve it (all the others we need are already in a great place).</p></li><li><p><strong>Scaling execution.</strong> We want to build a real machine around certain things that are working (like content and customer success), so we can get more done and/or to a higher standard without more people.</p></li><li><p><strong>New UI.</strong> We&#x27;ve a <a href="https://github.com/PostHog/posthog/issues/12923">PostHog 3000 project</a> to pull off. It&#x27;ll affect multiple teams, so managing to do that without a coordination mess happening will prevent us from being slow at shipping features.</p></li><li><p><strong>Keeping on top of our infra/ingestion.</strong> We have a ridiculous number of events coming in - we must stay up and reliable. We&#x27;ve hired a lot here so far, but we&#x27;ve a huge surface area to manage.</p></li><li><p><strong>New feature buzz.</strong> We should get more marketing benefit from all the cool stuff we ship. Lots of ideas about doing more with our <a href="/roadmap">public roadmap</a> here.</p></li></ul><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The essential tools used by product engineers]]></title><description><![CDATA[Like every role,  product engineers  have a set of essential tools for their work. Their need to gather insights, ideate, and deploy solutions…]]></description><link>https://posthog.com/blog/product-engineer-tools</link><guid isPermaLink="false">c085cd28-e527-52db-bf13-f79adbc7e156</guid><dc:creator><![CDATA[Ian Vanagas]]></dc:creator><pubDate>Fri, 23 Dec 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Like every role, <a href="/product-engineer/what-is-a-product-engineer/">product engineers</a> have a set of essential tools for their work. Their need to gather insights, ideate, and deploy solutions independently makes creating an efficient stack all the more important. Here we explore the popular engineering, product, and automation tools that will help you gather insights and deploy product improvements fast.</p><h2 id="tools-for-talking-to-users">Tools for talking to users</h2><p>Product engineers focus on users, which means you <strong>must</strong> talk to them. The tools for doing this aren’t groundbreaking, but they are useful for accomplishing the goal of building a product users&#x27; value.</p><p>Tools like Zoom, Google Meet, and Slack (especially shared channels) are obvious starting points, but consider <a href="https://superhuman.com/">Superhuman</a> for streamlining email, and tools like <a href="https://cron.com/">Cron</a>, Calendly, and <a href="https://savvycal.com/">SavvyCal</a> for improving your calendar workflow. Automation tools like <a href="https://customer.io/">customer.io</a>, aha.io, <a href="https://n8n.io/">n8n.io</a>, and Zapier are also useful.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/product-engineer-tools/user-interview.jpeg" alt="User interview"/></p><p><div>We use a combination of Zapier, customer.io, Calendy, feature flags, and our <a href="https://github.com/PostHog/user-interview-app">interview app</a> to automate scheduling user interviews.</div></p><p>We recommend avoiding survey tools, though. While general user information is valuable to product and marketing teams, product engineers need direct feedback on what you are building.</p><h2 id="tools-for-understanding-user-behavior">Tools for understanding user behavior</h2><p>Product engineers supplement talking to users with product analytics and usage data. This data measures the impact of features and changes to the product. It also helps to discover areas for improvement. Usage data is useful for setting goals, measuring results, and prioritizing future work.</p><p>For example, you set an OKR to increase feature usage by paid users. To measure and improve this, you need data on the usage of the feature and the areas surrounding the feature. With that data, you can analyze the feature usage conversion, retention, correlated behavior, and more.</p><p><a href="/product#top-features">PostHog</a> has a suite of developer tools built for this. Product engineers (like <a href="/customers/ycombinator">Y Combinator’s</a>) use PostHog to capture, organize, analyze, and visualize product usage data. PostHog also has session recordings for going into the details of an individual’s experience with the product.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/product-engineer-tools/session-recordings.png" alt="Session recordings"/></p><p><div>PostHog&#x27;s <a href="/product/session-recording">session recordings</a> visualize what users are actually doing in your product</div></p><p>On top of PostHog, customer data platform or ETL tools like <a href="/docs/libraries/segment">Segment</a>, <a href="/blog/hightouch-posthog-reverse-etl-integration">Hightouch</a>, <a href="/docs/apps/airbyte-export">Airbyte</a>, Integrate.io, and Fivetran are useful for moving and combining data between sources and storage locations. This enables you to have the data you need for analysis, where you need it.</p><h2 id="tools-for-organizing-knowledge-and-priorities">Tools for organizing knowledge and priorities</h2><p>Insights from users and data help product engineers develop high-impact ideas to build, but you&#x27;ll need a way to organize all these ideas. Note-taking and task management tools help with this, but many can also weigh down individuals and teams by introducing unnecessary work that gets in the way of shipping products (<strong>cough</strong> Jira). The ones for product engineers ideally don’t do this.</p><p>An example specifically built for product engineers is <a href="https://linear.app/">Linear</a>. Linear is a task management app focused on helping teams build great products. It does this by having engineer-focused design and functionality, while still being a product tool. In practice, this means being keyboard first, streamlined for technical use cases, engineering-focused automations and integrations, and quick loading speeds.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/product-engineer-tools/linear.png" alt="Linear"/></p><p><div>The benefits of Linear built specifically for product engineers.</div></p><p>Like the “talking to users” tools, many of these tools won’t shock you. Other note-taking and task management tools product engineers rely on include GitHub, Google Docs, Trello, Notion, Asana, and Coda. Use what you&#x27;re comfortable with, but we recommend trying Linear if you haven&#x27;t already.</p><h2 id="tools-for-going-fast-with-cicd-and-testing">Tools for going fast with CI/CD and testing</h2><p>Successful product engineers ship new features to users fast. This means writing new code, integrating it with existing code, and deploying it, all as fast as possible. The best product engineers are often shipping multiple updates per day. You need a strong continuous integration and deployment pipeline (CI/CD) to ensure a smooth transition from local development to production.</p><p>Tools used for this include GitHub, GitLab, CircleCI, Jenkins, Docker, <a href="https://depot.dev/">Depot</a>, <a href="https://codefresh.io/">codefresh</a>, and more. These tools automate development tasks such as builds, testing, and deployment to help you ship fast.</p><p>Because product engineers ship fast, you also must make sure you aren’t breaking things. You likely don’t have the time or resources for a dedicated QA team so you rely heavily on automated testing in its place. Implementing test frameworks like <a href="https://jestjs.io/">Jest</a>, <a href="https://www.cypress.io/">Cypress</a>, and <a href="https://playwright.dev/">Playwright</a> are all critical for product engineers to continue moving fast without ruining the existing user experience.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/product-engineer-tools/actions.png" alt="Tests"/></p><p><div>We use GitHub Actions to run our Cypress, Jest, Django, and Storybook tests to ship fast while maintaining quality.</div></p><p>Even with all this preventative work, breaking changes can still happen. Feature flags help prevent this. Luckily, if you’re using PostHog for analytics, you can also use it for <a href="/product/feature-flags">feature flags</a> to help roll out and roll back changes quickly.</p><h2 id="tools-for-automating-away-infrastructure-work">Tools for automating away infrastructure work</h2><p>Along with CI/CD is the automation of infrastructure work. Product engineers want to ship fast, and dealing with optimizing infrastructure prevents this. You care about spinning up new infrastructure quickly more than optimizing it.</p><p>Many infrastructure-as-a-service companies exist, including the big ones like Google Cloud, AWS, Cloudflare, Heroku, and Azure. There are many alternatives to these that product engineers might prefer because of their deployment speed and tailored use cases (such as serverless or edge computing). These include <a href="https://www.netlify.com/">Netlify</a>, <a href="https://render.com/">Render</a>, <a href="http://fly.io">fly.io</a>, <a href="https://www.vultr.com/">Vultr</a>, and <a href="https://railway.app/">Railway</a>.</p><p>A trend popular among product engineers is bringing the code framework and infrastructure closer together, optimizing both for each other. The best example of this is <a href="https://vercel.com/">Vercel</a>, which also develops the <a href="https://nextjs.org/">Next.js</a> framework popular with product engineers. Vercel helps deploy highly performant frontend code fast and is tightly integrated with Next.js to maximize benefits from the framework&#x27;s design.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/product-engineer-tools/vercel.png" alt="Vercel and Next.js"/></p><p><div>The benefits of integrating infrastructure and code from Vercel and Next.js.</div></p><p>Other examples of these code and infrastructure combos include <a href="/tutorials/supabase-query">Supabase</a>, <a href="https://planetscale.com/">PlanetScale</a>, and <a href="/customers/hasura">Hasura</a>. They abstract away infrastructure work while providing speed and tailored offerings. Software engineers and large teams might find their limited customization and options constraining, but product engineers love them.</p><h2 id="tools-for-owning-bugs-and-incidents">Tools for owning bugs and incidents</h2><p>As Uncle Ben from Spiderman once said “with great product power, comes great product responsibility” (I’m paraphrasing). Ownership over the complete product experience is important for product engineers. This means being responsible for bugs, issues, and incidents in your product.</p><p>Good tools for this include:</p><ul><li><a href="https://grafana.com/">Grafana</a>, <a href="https://betterstack.com/">Better Stack</a>, <a href="https://www.metabase.com/">Metabase</a>, and more to provide observability into issues in your code. </li><li><a href="/blog/posthog-vs-sentry">Sentry</a> and <a href="/blog/posthog-vs-logrocket">LogRocket</a> to monitor errors. </li><li><a href="http://Incident.io">Incident.io</a> and <a href="https://www.pagerduty.com/">PagerDuty</a> to help teams respond to incidents when they happen.</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/product-engineer-tools/sentry.png" alt="Sentry"/></p><p><div>Sentry provides multiple tools (including stack traces) for monitoring errors and problems in your code.</div></p><p>Product engineers are reliant on these because you are responsible for the products you ship. You can&#x27;t pawn maintenance off on other team members. Making sure you keep track of performance and deal with issues effectively is vital. It also ensures you remain focused on shipping high-quality code the first time.</p><h2 id="what-is-the-point-of-all-these-tools">What is the point of all these tools?</h2><p>The point of all of these tools is to help product engineers ship better products that solve users’ problems and provides them value faster. If the tools aren’t helping you do this, they aren’t doing their jobs.</p><p>Using all the tools we listed here is overkill. Product engineers are not product managers, and limiting the amount of time in these tools ensures that. You must always dedicate the majority of your time to writing and shipping code.</p><p>Many of these tools trade customizability (and money) for speed and specificity. Software engineers, especially in large organizations, don&#x27;t want this trade, but product engineers do. The process of shipping fast, iterating, breaking (and fixing) code along the way is core to what product engineers do. It is core to how successful products get built.</p><h2 id="further-reading">Further reading</h2><ul><li><a href="/product-engineer/what-is-a-product-engineer/">What is a product engineer (and why they matter)</a></li><li><a href="/blog/stop-treating-engineers-differently">Startups, stop treating engineers like a different species</a></li><li><a href="/blog/product-engineer-vs-software-engineer">Product engineer vs software engineer: what&#x27;s the difference?</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #18: What can SaaS learn from the New York Times?]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-18</link><guid isPermaLink="false">1d8a37e8-400d-5384-bf03-dee11abd48d2</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Thu, 08 Dec 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><p>Sad news, newsletter friends, this is the last HogMail of 2022! Normal service will resume on Jan 4, 2023.</p><p>Here are some HogMail stats to commemorate our first year:</p><ul><li>Average open rate of 47.9%. This is 🔥, as the cool kids say.</li><li>We have 974 subscribers, a 47.5% increase since HogMail #1.</li></ul><p>Yes, I know those two numbers are weirdly similar. Sue me.</p><p>The most popular articles this year:</p><ul><li><a href="/newsletter/ideal-customer-profile-framework">How we found our Ideal Customer Profile</a> – 56 clicks</li><li><a href="/blog/posthog-marketing">How (and why) our marketing team uses PostHog</a> – 50 clicks</li><li><a href="/blog/how-to-run-a-transparent-company">How to run a transparent startup</a> – 48 clicks</li><li><a href="/blog/making-something-people-want">How we made something people want</a> – 45 clicks</li><li><a href="/blog/rome-hackathon">All the cool things we built at our Rome hackathon</a> – 45 clicks</li></ul><p>Mental note: y&#x27;all love articles with &#x27;how&#x27; in the title, eh? Thanks for your support.</p><p>– Andy Vandervell, Word Typer-in-Chief</p><h2 id="new-from-posthog">#new-from-posthog</h2><ul><li><p><a href="https://posthog.com/blog/vc-or-bootstrap">Why raising money is less stressful than bootstrapping</a>: CEO James explodes 🤯 some preconceptions about raising startup capital. Agree, disagree? Hit him up on Twitter.</p></li><li><p><a href="https://posthog.com/product-engineer/what-is-a-product-engineer">What is a product engineer (and why they&#x27;re awesome)</a>: What happens when a full-stack engineer and a product manager have a baby? They produce the ultimate startup employee.*</p></li><li><p><a href="https://posthog.com/tutorials/filter-session-recordings">How to use filters + session recordings to understand user friction</a>: Funnels may tell you <em>where</em> users are experiencing friction within your product, but only session recordings can show you <em>why</em>.</p></li><li><p><a href="https://posthog.com/tutorials/non-technical-guide-to-data">A non-technical guide to understanding data in PostHog</a>: You don&#x27;t need to be a data scientist to understand &quot;the data&quot;. Use these hacks to learn. </p></li></ul><h2 id="very-good-reads">#very-good-reads</h2><p><a href="https://kylepoyar.substack.com/p/the-gist-a-simple-way-to-boost-conversion">Kyle Poyar on what SaaS companies can learn from the New York Times</a> it&#x27;s all about usage paywalls:</p><ul><li>Kyle highlights how usage limits like The Times&#x27; original 20 article per month limit are increasingly effective for PLG companies. He cites Zoom (40 min limit) and Miro (3 editable boards) as examples of effective &quot;free-to-paid&quot; models.</li><li>Usage paywalls can also be used to increase revenue among heavy users, or incentivize changes in behavior. Users who pay SurveyMonkey monthly have a monthly cap; annual plans have an annual cap, giving those users more flexibility and making annual plans more attractive.</li><li>Key point: usage limits allow companies to make their product &quot;affordable for new customers while still expanding existing customers with high switching costs.&quot;</li></ul><p><a href="https://emilywebber.co.uk/why-cant-we-all-just-get-along/">Why can’t we all just get along?</a> is a thoughtful challenge on how silos develop through a bias to specific specializations:</p><ul><li>Companies that call themselves engineering, data, or product-led tend to generate their own unique anti-patterns, such as building things &quot;at the expense of why&quot; or silos where product managers make all the decisions.</li><li>An important way to avoid this is to recognize &quot;disciplines and specialisms are not the same as roles&quot;. Roles overlap and this makes for better collaboration and outcomes.</li><li>Go beyond T-shaped people and look for <a href="https://spin.atomicobject.com/2013/06/27/broken-comb-people/">broken comb people</a> – i.e. people who go deep in two or three areas, but also have shallow skills in a few others. </li></ul><h2 id="also-good-reads">#also-good-reads</h2><ul><li><a href="https://www.mostlymetrics.com/p/whats-the-difference-between-my-renewal">Renewal vs Retention: Getting our ducks in a row</a> – a practical guide to measuring renewal and retention and the important ways they&#x27;re different.</li><li><a href="https://zephoria.medium.com/what-if-failure-is-the-plan-2f219ea1cd62">What if failure is the plan?</a> – an exploration of how social networks (imperceptibly) collapse. Cites examples from MySpace and an amusing anecdote about a dating website with a fake profile problem.</li><li><a href="https://ryxcommar.com/2022/11/27/goodbye-data-science/">Goodbye, Data Science</a> – a revealing blog post about how &quot;insane management&quot; ruins the lives of data science people everywhere. We&#x27;ve all been here.</li><li><a href="https://jackiebavaro.substack.com/p/hot-take-google-has-a-company-strategy">Google has a company strategy, not a product strategy</a> – an ex-Google and Microsoft PM on two fundamentally different working cultures. Side note: it&#x27;s 2022 and we&#x27;re still talking about Google Reader. RIP.</li><li><a href="https://open.nytimes.com/how-the-new-york-times-uses-machine-learning-to-make-its-paywall-smarter-e5771d5f46f8">How The New York Times Uses Machine Learning To Make Its Paywall Smarter</a> – one for the data science and ML fans out there.</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What is a product engineer (and why they're awesome)]]></title><description><![CDATA[Startups see their path to success as building a product many people want and pay for. Out of this need came the role of product engineer. They are a…]]></description><link>https://posthog.com/blog/what-is-a-product-engineer</link><guid isPermaLink="false">aed2a200-5a79-54b0-9eda-9df0ee58585e</guid><dc:creator><![CDATA[Ian Vanagas]]></dc:creator><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Startups see their path to success as building a product many people want and pay for. Out of this need came the role of product engineer. They are a core part of many teams building the next generation of great products. More startups are hiring product engineers, and more people are building the skills needed to be one.</p><p>In this post, we define the role of a product engineer, break down the characteristics of the role, go over their skills, and finally figure out why they matter. We base this information on industry research, and job posts from top startups hiring product engineers, which we quote throughout.</p><h2 id="what-is-a-product-engineer">What is a product engineer?</h2><p>A product engineer, at its most basic, is a <a href="/blog/product-engineer-vs-software-engineer">software engineer building products</a>. They do similar work to software engineers: writing code and shipping features. Usually, they write fullstack code with a focus on the frontend.</p><p>What makes them unique is their focus on creating a product for users. They care about building a solution to problems that provides value to users. They must be empathetic to users, and this means caring about user feedback and usage data.</p><p>Product engineers also have responsibility for the overall product they are working on. This means they are:</p><ul><li>responsible for improving it and building new features</li><li>opinionated on the roadmap and future of the product; making decisions on priorities and what to work on</li><li>able to make design decisions to create great experiences</li><li>responsible for fixing the parts of their product that break or have bugs</li><li>more willing to build a product from scratch for users, less loyal to features they’ve added in the past</li></ul><p><a href="http://incident.io">incident.io</a> sums this up as:</p><blockquote><p>“Care more about outcomes and impact than the exact implementation, or the tools used to solve the problem.”</p></blockquote><p>A product engineer’s connection and responsibility to specific parts of the product cause them to pay attention to the details of their product as well as the larger picture of how their product fits into the company and competitive landscape.</p><p>The goal of a product engineer is creating a great product for users. Their product must solve user problems and provides them value. They succeed based on doing this. Jean-Michel Lemieux, former VP of Engineering at Shopify, defines them nicely as:</p><blockquote><p>“Engineers who have a thirst for using technologies to leapfrog human/user problems. Those with empathy to reach for magical experiences.”</p></blockquote><h2 id="what-are-the-characteristics-of-product-engineers">What are the characteristics of product engineers?</h2><p>With a basic idea of what a product engineer is, we can dive deeper into the characteristics they share. </p><h3 id="customer-obsession">Customer obsession</h3><p>One characteristic that distinguishes product engineers is their “customer obsession.” They care a lot about the people and organizations using their product and want to build a better solution for them.</p><p>Customer obsession manifests in a couple of ways. First is that they <a href="/newsletter/talk-to-users">talk to users</a>. Talking to users isn’t only a job for product managers and salespeople. Product engineers must do this too. They must understand the real problems users are having and figure out solutions for them. This might entail working with a product manager or designer, but it is the ultimate responsibility of the product engineer to make it happen. <a href="http://incident.io">incident.io</a> is looking for this in their job post:</p><blockquote><p>&quot;Enjoy speaking directly with customers and understanding their problems”</p></blockquote><p>Second, customer obsession means shipping features users wants and benefit from. Features without a direct connection to users are less important to product engineers. They focus less of their time here. Quickly shipping these features to improve the user’s experience is important for a product engineer. <a href="http://fly.io">Fly.io</a> states this by saying:</p><blockquote><p>“We&#x27;re ruthless about working on stuff that our users will see and care about. We are not ruthless about shaping and polishing our code into a radiant-cut gem of perfection.”</p></blockquote><p>Shipping fast and being customer-obsessed lets them get feedback on their product earlier. This enables them to get to a better solution faster. They are in touch with the real needs and uses of end users.</p><p>By being customer-obsessed, product engineers become less principled and dogmatic. They don’t ship features that they believe are “right” but users don’t want. They are less loyal to best practices and don’t do something just because it is commonly done.</p><h3 id="analysts-of-usage-data-and-the-competitive-landscape">Analysts of usage data and the competitive landscape</h3><p>Because product engineers own their product, they also often own the data and roadmap for that product. This means doing analysis of usage data and the competitive landscape. They combine this analysis with user feedback and <a href="/newsletter/what-does-a-product-manager-do">figure out what to do next</a>.</p><p>Product engineers can use tools like PostHog to gain insights about their product. They know what is working and what needs improvement. They are comfortable digging into the data, watching session recordings, and once they’ve gathered insights, communicating future work. <a href="https://www.ashbyhq.com/">Ashby</a> includes this in the way they work:</p><blockquote><p>“We combine this with research, prototyping, and written proposals to see around corners and get feedback from the team across time zones”</p></blockquote><p>Product engineers also understand how their product fits in the business landscape. They know the businesses using their product, and the competitors working on similar products. They know what makes them special, and can continue to build to expand this gap.</p><p>All of this helps them create insights that help them build better products. Product engineers back up their opinion with data and knowledge of the competitive landscape. This helps them and their teams ensure they are working on the right features.</p><h3 id="always-prototyping-and-experimenting">Always prototyping and experimenting</h3><p>The end goal of a product engineer is to ship a great product. Briefs, mockups, written reports, and presentations are not a great product. Prototyping, shipping, and experimenting are closer, and that is what product engineers focus on.</p><p>Product engineers ideate new ways to make the product better. They then iterate on these ideas for improving the product and do it fast. This means a lot of experiments and tests. Tools like <a href="/product-engineers/how-to-do-ab-testing">A/B tests</a> and feature flags help with this.</p><blockquote><p><strong>Product engineers vs growth engineers:</strong> Product engineers experiment to improve a specific product they own. Growth engineers experiment at a higher level, focusing on increasing growth metrics like signups, subscriptions, and revenue across products. Read our <a href="/blog/what-is-a-growth-engineer">guide to growth engineers</a> and why they&#x27;re awesome to learn more.</p></blockquote><p>Because they build prototypes and are self-reliant, product engineers often have a history of doing just that. They are more likely to have side projects they’ve built themselves. Some might be former founders or have unorthodox, self-taught backgrounds. They make great teammates in hackathons. <a href="https://ghost.org/">Ghost</a> looks for these people:</p><blockquote><p>“The majority of our team is made up of former founders, freelancers and self-starters who are confident and comfortable working independently and getting things done.”</p></blockquote><h3 id="reliant-on-automation-and-cicd-systems">Reliant on automation and CI/CD systems.</h3><p>Shipping fast and talking to customers requires time on top of engineering. Product engineers get this time by relying on devtools and automation. Ideally, they are spending little of their time on testing, infrastructure, and deployment. Companies might have separate teams for this or rely on the growing number of product enabling product engineers (like some of the ones we’ve quoted here). Developer tooling is a key part of <a href="https://www.ashbyhq.com/">Ashby’s</a> team:</p><blockquote><p>“Great developer tooling. Our CI/CD takes ~10m, and we deploy at least 5x a day. Everyone on the team has contributed to developer experience 💪🏾”</p></blockquote><p>A great developer experience enables product engineers to ship fast and focus on the other parts of the work. Having to deal with integration, deployment, and infrastructure prevents them from focusing on shipping features, talking to customers, doing research, and other important tasks. A company like <a href="http://incident.io">incident.io</a> invests heavily in developer experience to enable this:</p><blockquote><p>“Investing heavily in the developer experience: whether it’s metrics, logging, tracing and error tracking, or development workflow. Build times are blazing fast: our CI to deploy time is ~5m. Everyone uses a M1 Pro Macbook, and you have budget for other equipment should you need it.”</p></blockquote><h2 id="product-engineering-skills">Product engineering skills</h2><p>From these characteristics, we can define the skills product engineers have, here’s a list:</p><ul><li><p>Ship features that users care about, wherever they are on the stack. Ship rapidly and iterate.</p></li><li><p>Develop opinions, be able to communicate them, and turn them into features. Be able to explain why a feature matters to customers as well as its importance in the competitive landscape.</p></li><li><p>Create prototypes and test them with users. Run experiments and understand their results. Be able to design for yourself and use design systems.</p></li><li><p>Talk with customers, analyze data, and be aware of the competitive landscape to understand what to build.</p></li><li><p>Use tools that automate non-product work like infrastructure, integration, deployment, and testing.</p></li></ul><h2 id="why-do-product-engineers-matter">Why do product engineers matter?</h2><blockquote><p>&quot;As a product engineer, writing code is just one part of your job. You&#x27;ll also talk to users, get involved with design, and develop an opinion on what needs to exist in the world. Then you&#x27;ll move with urgency to make it happen.&quot; - <a href="https://twitter.com/josephpalbanese/status/1349669814046900227">Kushal Byatnal via Joe Albanese</a></p></blockquote><p>Product engineers write code, talk to users, ship products for those users, and own them. This helps them achieve their ultimate goal of building great products. Building a great product that solves important problems for users was the pathway to success for many companies.</p><p>What product engineers do now is what is thought to be the path to startup success, but never combined into one role. Now, a growing number of people are developing the skills needed to become successful as product engineers. On the other side, a growing number of companies are looking for people with these skills, as well as building products for these people. This combination is creating the product engineering wave we are seeing now.</p><p>As long as building great products is an important goal for many companies, product engineers will continue to be important.</p><h2 id="further-reading">Further reading</h2><ul><li><a href="/blog/product-engineer-vs-software-engineer">Product engineer vs software engineer: what&#x27;s the difference?</a></li><li><a href="/product-engineers/growth-loops">How to harness the awesome power of growth loops</a></li><li><a href="/blog/using-posthog">22 ways PostHog makes it easier to build great products</a></li><li><a href="/blog/forward-deployed-engineer">WTF is a forward-deployed engineer? (and why everyone is hiring them)</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.42.0: Get beta features via our roadmap!]]></title><description><![CDATA[Want to know more about what we're up to?  Subscribe to our new newsletter , which we send once every two weeks! 1.42.0 update guide for self-hosted…]]></description><link>https://posthog.com/blog/the-posthog-array-1-42-0</link><guid isPermaLink="false">b4dc05d4-e251-5338-b1e3-8596004f74c2</guid><pubDate>Wed, 30 Nov 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</p><h2 id="1420-update-guide-for-self-hosted-users">1.42.0 update guide for self-hosted users</h2><p>Self-hosted users must run async migrations 0005-0007 before updating to 1.42.0. </p><p>If you haven&#x27;t run async migrations 0005-0007 yet, or if they aren&#x27;t available on your current version,  we recommend upgrading to 1.41.4 first, <em>then</em> running the async migrations, then upgrading to 1.42.0.</p><h2 id="posthog-1420-release-notes">PostHog 1.42.0 release notes</h2><p><strong>Release highlights:</strong></p><ul><li><a href="#new-area-chart-visualization">New: Area chart visualization</a></li><li><a href="#new-url-breakdown-normalisations">New: URL breakdown normalisations</a></li><li><a href="#new-share-recordings-more-easily">New: Share recordings more easily</a></li><li><a href="#new-get-beta-features-via-our-roadmap">New: Get beta features via our roadmap</a></li><li><a href="#boring-legal-bit-policy-updates">Boring legal bit: Policy updates</a></li></ul><h3 id="new-area-chart-visualization">New: Area chart visualization</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-42-0-area-charts.gif" alt="area chart visualization in posthog"/></p><p>New team member Thomas Obermueller has got off to a great start by delivering the much-requested area chart visualization for PostHog insights. Now, if a normal line chart isn&#x27;t  enough and a regular bar chart won&#x27;t satisfy then you have an exciting third option.</p><p>To <a href="https://github.com/PostHog/posthog/pull/12869">quote Thomas</a> himself: &quot;<em>The main use case for this is when you want to see the composition of a metric, while also having the total value as a reference e.g. breakdown of revenue by customer over time.</em>&quot;</p><h3 id="new-url-breakdown-normalisations">New: URL breakdown normalisations</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-42-0-url-breakdown.gif" alt="URL breakdown normalization"/></p><p>Are you frustrated when you breakdown trends and funnels by URLs and see four different URLs that look like: <code>/home/</code>, <code>/home</code>, <code>/home?</code>, and <code>/home/#</code>? Well, not anymore! </p><p>Now, whenever we&#x27;re dealing with breakdowns by &quot;Current URL&quot; or &quot;Pathname&quot;, we normalise URLs to count the same, so you&#x27;ll see there&#x27;s only one place like <code>/home</code>. </p><h3 id="new-share-recordings-easily">New: Share recordings easily</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-42-0-share-recordings.gif" alt="share recordings in posthog"/></p><p>When you find an interesting session recording, you probably want to share it with your team. So, we&#x27;ve improved sharing options to make it easier. You can now share specific recordings easily, and even send teammates to an exact time in any recording!</p><h3 id="new-get-beta-features-via-our-roadmap">New: Get beta features via our roadmap</h3><p><video autoplay="" loop="" muted="" playsinline="" src="https://res.cloudinary.com/dmukukwp6/video/upload/v1711093816/posthog.com/contents/images/blog/array/1-42-0-roadmap.mp4"></video></p><p>Even though we&#x27;re open source, we know it&#x27;s not always very easy to tell what we&#x27;re working on or planning for the future - there are just so many repos, issues and PRs!</p><p>So, <a href="/roadmap">we built a public roadmap of our major projects</a>. You can use it to vote on upcoming projects, subscribe for updates and give feedback on our wildest ideas. Best of all, it&#x27;s <a href="https://squeak.posthog.com/">powered by Squeak!</a></p><h3 id="boring-legal-bit-policy-updates">Boring legal bit: Policy updates</h3><p>Despite being described by our VP of Marketing and Ops as &quot;<em>the least interesting thing ever</em>&quot;, we nevertheless need to tell you that there have been some changes to our terms and privacy policies. Don&#x27;t worry, it&#x27;s all good news:</p><ul><li>We&#x27;ve added a CCPA addendum to <a href="/privacy">our privacy policy</a></li><li>We&#x27;ve updated various policies for the release of <a href="/eu">PostHog Cloud EU</a></li><li>We&#x27;ve updated <a href="/handbook/company/security">our SCCs</a> to the latest versions</li><li>We&#x27;ve <a href="https://www.ashbyhq.com/customers/posthog-customer-story">changed from Workable to Ashby for applicant data processing</a></li></ul><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>You think that&#x27;s it? Not by a long shot! Version 1.42 also adds hundreds of other improvements and fixes, including...</p><ul><li><strong>Improvement:</strong> Recordings no longer show windows anymore if only 1 window was tracked.</li><li><strong>Improvement:</strong> We added a next-up button for recordings (just like Netflix&#x27;s next episodes) to better signal recordings to autoplay.</li><li><strong>Improvement:</strong> You now see a free trial banner if you&#x27;re on the free trial.</li><li><strong>Improvement:</strong> You can now choose if deleting a dashboard should also delete insights.</li><li><strong>Improvement:</strong> We don&#x27;t skip showing labels for alternate bars when breaking down insights.</li><li><strong>Improvement:</strong> We now disable heatmap clicks when holding down shift.</li><li><strong>Fix:</strong> Secondary metrics in experiments now don&#x27;t depend on the flag values being present for all steps, just like the primary metric.</li><li><strong>Fix:</strong> Group pages were 404ing when they had a dot in the name. They don&#x27;t anymore.</li></ul><p>View the commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.41.4...release-1.42.0"><code>release-1.41.4...release-1.42.0</code></a>.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li>@gpetrioli for <a href="https://github.com/PostHog/meta/pull/73">fixing broken handbook links</a></li><li>@MoSattler for <a href="https://github.com/PostHog/posthog-js-lite/pull/36">fixing some FF hook issues</a></li><li>@GrowthFYI for <a href="https://github.com/PostHog/feedback-app/pull/9">fixing some scaling issues</a></li><li>@BTruer for <a href="https://github.com/PostHog/posthog.com/pull/4698">correcting some docs issues</a></li><li>@Chuloo for <a href="https://github.com/PostHog/posthog.com/pull/4661">fixing a URL on the roadmap</a></li><li>@talenodigital for <a href="https://github.com/PostHog/posthog.com/pull/4651">becoming a PostHog partner</a></li><li>@NitzanBallerine for <a href="https://github.com/PostHog/posthog/pull/12586">fixing some contributor attribution issues</a></li><li>@Pblither8 for <a href="https://github.com/PostHog/posthog.com/pull/4401">fixing some &#x27;raise issue&#x27;, um, issues</a></li><li>@Mmmoussa for <a href="https://github.com/PostHog/posthog-js-lite/pull/28">fixing some storage issues</a></li><li>@JustinJones for <a href="https://github.com/PostHog/posthog.com/pull/4506">fixing a LOT of typos</a></li><li>@danielthedifficult for <a href="https://github.com/PostHog/posthog.com/pull/4691">fixing some typos</a></li><li>@Demivan for <a href="https://github.com/PostHog/posthog.com/pull/4682">fixing a broken URL</a></li><li>@DavidODonovan for <a href="https://github.com/PostHog/posthog.com/issues/4669">fixing social sharing</a></li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in the following role:</p><ul><li><a href="/careers/full-stack-engineer-experimentation">Full Stack Engineer - Experimentation Team</a></li></ul><p>Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. <a href="mailto:careers@posthog.com">You can also send a speculative application!</a></p><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog goodness!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #17: The personal traits that can't be taught]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-17</link><guid isPermaLink="false">80cde287-5d7d-5400-adcf-8161845804f8</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 23 Nov 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><p>Welcome insight seekers, very British ContentHog here. Some quick updates for you:</p><ul><li>We now have a <a href="https://status.posthog.com/">public PostHog status page</a></li><li>You can vote on what we do on the <a href="https://posthog.com/roadmap">new roadmap page</a></li><li><a href="https://github.com/PostHog/posthog/issues/12923">The future of PostHog?</a> 🤔 🤯</li></ul><p>Coming up: how we made revenue go up and to the right, the important traits you can&#x27;t coach, and more.</p><p>– Andy Vandervell, ContentHog</p><h2 id="posthog-blog">#posthog-blog</h2><p>🚀 <a href="/newsletter/ideal-customer-profile-framework">How we found our Ideal Customer Profile</a>: Creating an Ideal Customer Profile (ICP) is one of the most important things we&#x27;ve ever done. Why? Look at that graph.</p><p>📲 <a href="https://posthog.com/blog/how-we-built-an-app-server">How we built an app server (MVP to billions of events)</a>: Marius dives deep into how PostHog apps went from three-day MVP to a service handling billions of events.</p><p>💰 <a href="https://posthog.com/blog/startup-finance-without-finance">How to run finance at your startup without hiring a finance person</a>
Charles shares his practical guide to how we run finance without a dedicated finance role – essential read for startups.</p><h2 id="tutorials-and-guides">#tutorials-and-guides</h2><p>🧰 <a href="https://posthog.com/tutorials/cross-domain-tracking">How to set up cross-domain tracking in PostHog</a>: Do you use multiple domains or subdomains? This guide explains how to track users across them.</p><p>👯‍♀️ <a href="https://posthog.com/tutorials/frontend-vs-backend-group-analytics">Understanding group analytics: frontend vs backend implementations</a>: The two different ways to implement group analytics, so you can understand how companies use your product.</p><p>📈 <a href="https://posthog.com/customers/brainboard">How Brainboard raised conversion rates by 350% with PostHog</a>: Learn how DevOps platform Brainboard uses PostHog as their single source of truth.</p><h2 id="good-reads">#good-reads</h2><p><a href="https://www.howtheygrow.co/p/how-intercom-grows">How Intercom Grows</a> explores how Intercom grew from $1m to $100m ARR in just five years. Some takeaways:</p><ul><li><p>Growth really exploded when they unbundled their product and embraced a <a href="https://medium.com/make-us-proud/jobs-to-be-done-framework-748c761797a8">Jobs To Be Done</a> model to marketing their product.</p></li><li><p>Avoid inflexible pricing models. Intercom employs different pricing strategies to address different ends of the market – self-service for small and mid-market companies, and complex sales for high-value enterprises.</p></li><li><p>An effective content strategy + paid retargeting is a great way to keep potential customers warm and convince them to try your product.</p></li></ul><p><a href="https://www.karlsutt.com/articles/communicating-effectively-as-a-developer/">How to communicate effectively as a developer</a> by Karl Sutt provides some useful tactical advice for developers:</p><ul><li><p>Slack et al. can drive people toward what Karl calls &quot;low-resolution writing&quot; – i.e. messages like &quot;this [thing] isn&#x27;t working&quot; that don&#x27;t communicate context. Even in Slack, it&#x27;s worth taking time to craft useful messages with proper context.</p></li><li><p>Good communication starts from taking an &quot;unselfish perspective&quot; – do what&#x27;s easy for the reader, not for you, and don&#x27;t expect readers to put up with your quirks.</p></li><li><p>Bad writing compounds – all readers have to expend energy to digest and understand it, leading to frustration and inaction.</p></li></ul><p><a href="https://staysaasy.com/leadership/2022/11/06/traits-you-can-change-and-traits-you-cant.html">Traits You Can Change, and Traits You Can&#x27;t</a> via StaySaaSy:</p><ul><li><p>It&#x27;s important to understand what traits can be coached and which can&#x27;t when hiring or developing talent. Not doing so leads to missed opportunities or wasted time investing in the wrong people.</p></li><li><p><strong>Traits you can change:</strong> seeing the big picture; industry and technical knowledge; confidence; cultural norms; working with leadership. <strong>Traits you can&#x27;t change:</strong> raw intelligence; emotional reactivity / intelligence; natural working speed.</p></li><li><p>&quot;Inexperienced but sharp team members who have all of the raw skills that you can’t coach can make great leaders. Don’t let them leave your company.&quot;</p></li></ul><h2 id="random">#random</h2><ul><li><p><a href="https://randsinrepose.com/archives/the-seven-levels-of-busy/">The Seven Levels of Busy</a> (2 min read)</p></li><li><p><a href="https://www.youtube.com/watch?v=oL0umpPPe-8">Samsung’s Dangerous Dominance of South Korea</a> (21 min watch)</p></li><li><p><a href="https://slate.com/human-interest/2022/11/pr-publicist-emails-journalism-oof.html">A journalist says yes to every PR pitch for a da</a> (17 min read)</p></li><li><p><a href="https://spectrum.ieee.org/neurotech-workplace-innereye-emotiv">Are you ready for workplace brain scanning?</a> (12 min read)</p></li><li><p><a href="https://github.com/readme/featured/open-source-minimalism">Marie Kondo your software stack with open source</a> (17 min read)</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How PostHog built an app server (from MVP to billions of events)]]></title><description><![CDATA[PostHog's mission is to increase the number of successful products in the world. To achieve it, we're building a comprehensive  suite of dev tools…]]></description><link>https://posthog.com/blog/how-we-built-an-app-server</link><guid isPermaLink="false">58f57fb4-2402-568b-9317-e90d12f02a26</guid><dc:creator><![CDATA[Marius Andra]]></dc:creator><pubDate>Mon, 21 Nov 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog&#x27;s mission is to increase the number of successful products in the world. To achieve it, we&#x27;re building a comprehensive <a href="/product">suite of dev tools</a> (see <a href="/roadmap">our roadmap</a> for what we&#x27;re working on now). </p><p>Earlier in our history, users frequently asked us for ways to enrich and do more with their data. They wanted to add geographic data to events, get events from CRMs, export and import data from other sources, and more. </p><p>We couldn&#x27;t build every solution ourselves, so we needed to enable users to customize their data flows, and create solutions to their endless use cases. We found the answer at our Tuscany offsite: an app platform that enabled users to build apps integrated into our data pipeline.</p><p>This is the story of how <a href="/apps">PostHog apps</a> went from three-day MVP into a service that handles billions of events – and all the lessons we learned along the way.</p><h2 id="️-part-1-building-an-mvp-in-three-days">✏️ Part 1: Building an MVP in three days</h2><p>PostHog apps were an idea of mine (Marius). I wanted a Google Analytics-style world map view and that required location data from IP addresses. While there were many services to do this, connecting them to event data was difficult. I decided to work on solving this during our Tuscany offsite hackathon.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/how-we-built-an-app-server/map.png" alt="Map"/></p><p>My solution was to build an app platform and the first-ever PostHog app, <a href="/apps/geoip-enrichment">GeoIP</a>, but the project vision expanded to enable more modification of the events pipeline, such as backing up data to S3, <a href="/tutorials/github-star-tracker">syncing GitHub stars</a>, or getting customer feedback.</p><h3 id="arbitrary-app-code-in-python">Arbitrary app code in Python</h3><p>The three-day Tuscany hackathon led to the ability to write and run arbitrary Python code on events in our pipeline. The app code got downloaded from GitHub, extracted, and integrated into PostHog. It specifically required Python 3.9, because Python 3.8’s <code>zipimport</code> didn’t support the zip archives GitHub provides.</p><p>An app, named &quot;plugin&quot; at this point, looked like this:</p><pre><code class="language-python"># exampleplugin/__init__.py
from posthog.plugins import PluginBaseClass, PosthogEvent, TeamPlugin
class ExamplePlugin(PluginBaseClass):   
    def __init__(self, team_plugin_config: TeamPlugin):
        super().__init__(team_plugin_config)
        # other per-team init code
    def process_event(self, event: PosthogEvent):
        event.properties[&quot;hello&quot;] = &quot;world&quot;
        return event
    def process_identify(self, event: PosthogEvent):
        pass
</code></pre><p>Other features added included a plugin repository, an interface to configure the apps, and a CLI to preconfigure apps for custom installations. I built two sample apps with it, including the coveted GeoIP app.</p><p>This was a promising start, but it didn’t take long for cracks to appear. </p><p>First, it’s nearly impossible to manage Python dependencies via multiple <code>requirements.txt</code> files. There&#x27;s no way to tell which dependencies your plugin&#x27;s dependencies will install, without first installing them. There is <a href="https://github.com/pypa/pip/issues/53">nothing like <code>pip --dry-run</code></a>. You need to install the <code>pip</code> package and run an <code>__init__.py</code> script inside the package to get its dependency tree.</p><p>Second, all the dependencies are installed together. This made it just a matter of time before a plugin overrode an app dependency (e.g. <code>django</code>), and brought everything crashing down. This wasn’t going to work for us, so we needed to rebuild. </p><h2 id="-part-2-rebuilding-in-javascript">🛠 Part 2: Rebuilding in JavaScript</h2><p>After deciding to rebuild, my first attempt was using <a href="https://github.com/sqreen/PyMiniRacer">PyMiniRacer</a> to generate JavaScript. PyMiniRacer is great for simple functions, but lacks support for async/promises and importing modules like <code>fetch</code> because it was raw v8, not Node. It also had a limited standard library. It wasn’t going to work. </p><p>Next, I tried to develop and subsequently scratched a <a href="https://grpc.io/docs/languages/node/basics/">gRPC</a> implementation in Node. I could call JavaScript code from Python (which we wrote our pipeline in) and get a response, but this approach created too much manual work. It raised questions such as &quot;how many workers should respond to the gRPC calls?&quot; and &quot;how do we make sure we lose no events if the node gRPC server is down?” Apps needed to scale, so this also wasn’t going to work either.</p><h3 id="finding-the-solution-with-celery">Finding the solution with Celery</h3><p>After these false starts, I found a solution in something we already used: Celery.</p><p>In our main PostHog app, we used <a href="https://docs.celeryproject.org/">Celery</a> to process events asynchronously (we don&#x27;t anymore). When an event hits <code>/i/v0/e/</code>, our API parsed the request and queued the event into a job queue. I realized I could build a new server with the <a href="https://celery-node.js.org/">Node port of Celery</a> and plug that in as another step in the existing pipeline.</p><p>The combination of Celery and Node solved all pending issues: we wouldn&#x27;t have to worry about Python dependencies, could potentially run untrusted code in a fast sandbox, there would be no process management for a gRPC link, and could eventually rewrite the entire ingestion pipeline in Node to get a speed boost over Python (which we eventually did).</p><p>Using Celery required us to build a Node app that:</p><ul><li>Gets a stream of events from Python through a Redis queue (via <a href="https://celery-node.js.org/">celery.node</a>)</li><li>Runs user-defined JavaScript on that stream of events.</li><li>Sends them back to Python through the same queue for ingestion.</li></ul><p>The first and last steps were easy enough with our app structure and Celery, but we needed to make sure the arbitrary, user-defined JavaScript code was securely run. </p><h3 id="virtual-machines-vms-to-the-rescue">Virtual machines (VMs) to the rescue</h3><p>The solution to the second step was to use virtual machines (VMs). Turns out Node v14 has a <a href="https://nodejs.org/docs/latest-v17.x/api/vm.html">built-in VM module</a> that enables running custom JavaScript in a separate context.</p><p>Using the VM module let us run custom JavaScript code during event ingestion. The downside was that the docs stated “the VM module is not a security mechanism. Do not use it to run untrusted code.” This wasn’t unexpected. <a href="https://en.wikipedia.org/wiki/Privilege_escalation">Privilege escalation</a> and <a href="https://en.wikipedia.org/wiki/Resource_exhaustion_attack">resource exhaustion</a> attacks are real. We couldn’t avoid them, but we could build strategies to mitigate them.</p><p>Node&#x27;s VM module puts your code in an isolated context that has <del>limited</del> no support for secure communications with the host, and has holes like this:</p><pre><code class="language-js">const vm = require(&#x27;vm&#x27;);
vm.runInNewContext(&#x27;this.constructor.constructor(&quot;return process&quot;)().exit()&#x27;);
console.log(&#x27;Never gets executed.&#x27;);
</code></pre><p>Thus we needed an abstraction. The two most popular are <code>isolated-vm</code> and <code>vm2</code> :</p><ul><li><p><a href="https://github.com/laverdet/isolated-vm"><code>isolated-vm</code></a> claims to be secure and various big companies use it. Each &quot;isolate&quot; runs in a new thread, with controllable CPU and memory limits. There are methods to copy data between the main thread and an isolate, and we can share objects and functions between the host and the isolate. It&#x27;s not a perfect sandbox, but it&#x27;s as close as we can get.</p></li><li><p><a href="https://github.com/patriksimek/vm2"><code>vm2</code></a> has a different isolation model. Each &quot;VM&quot; runs in an isolated NodeVM context, in the same thread as the rest of the app. There are no memory or CPU limits we can enforce. You run the code locally, but don’t share any variables with the host app.</p></li></ul><p>While <code>isolated-vm</code> felt like a great fit because of its emphasis on security, its implementation <a href="https://github.com/PostHog/posthog/issues/6855#issuecomment-853879421">wasn&#x27;t a success</a>. I would have had to implement proxying similar to <code>vm2</code> just to get fetch working, and that wasn&#x27;t worth the effort.</p><p><code>vm2</code> had its own system of proxies that make sharing code between the host and the VM seamless.</p><p>Because of this, we decided to change our security model. On PostHog Cloud, we would vet the apps ourselves, before allowing everyone to use them. Self-hosted users were free to write and use as many <a href="https://github.com/PostHog/posthog/issues/6855">arbitrary apps</a> as they please.</p><p>This maintained self-hosted users’ freedom, while still enabling Cloud users to benefit from community apps. Apps are all developed and tested in the open. We just need to do a final manual check before installing them. After launch, we found many of <a href="/blog/the-state-of-plugins">our most used apps</a> came from our community, proving this decision’s success.</p><h3 id="what-did-we-learn-from-all-this">What did we learn from all this?</h3><ul><li><p>Python, which we wrote our ingestion pipeline in, wasn’t going to work for apps. Dependency management for arbitrary code was too difficult.</p></li><li><p>Apps needed to scale while having access to some key JavaScript libraries. Using Node and Celery enabled us to integrate into our ingestion pipeline while providing the functionality we needed.</p></li><li><p>We needed to make sure the code apps were running was secure and sandboxed. VMs were the answer to this, and Node had support for VMs.</p></li><li><p>The default NodeVM wasn’t secure and couldn’t communicate with a host. <code>isolated-vm</code> was secure but needed proxying. <code>vm2</code> had the ability to proxy code, but was less secure. <code>vm2</code> and a review process for Cloud apps was the ultimate decision.</p></li></ul><p>These learnings led to our current app structure.</p><h2 id="-part-3-building-a-mature-app-platform-that-scales">📈 Part 3: Building a mature app platform that scales</h2><p>After creating a basic MVP, and seeing the benefits of its usage, work continued to add functionality and support greater scale. </p><p>Before we get any deeper, it&#x27;s worth recapping the structure and features of apps as they are now. </p><h3 id="app-structure">App structure</h3><p>The basic structure of an app has stayed the same since the JavaScript rebuild. Each app contains two key files:</p><ul><li><p><code>index.js</code> (or <code>index.ts</code>) which contains key application logic, modifies events, connects with external services, and interacts with PostHog. It has an allowlist of libraries to use for utilities or interacting with other services. It also has access (through the VM) to meta information, storage, and logging.</p></li><li><p><code>plugin.json</code> contains configuration data for the app, what shows up in PostHog, and variables for end users to modify. The file contains the name, description, and other details that show up on the front end.</p></li></ul><p>Here’s what a basic <code>index.js</code> looks like:</p><pre><code class="language-js">// Some internal library function
async function getRandomNumber() {
    return 4
}

// Plugin method that runs on plugin load
export async function setupPlugin({ config }) {
    console.log(config.greeting)
}

// Plugin method that processes event
export async function processEvent(event, { config, cache }) {
    const counterValue = (await cache.get(&#x27;greeting_counter&#x27;, 0))
    cache.set(&#x27;greeting_counter&#x27;, counterValue + 1)
    if (!event.properties) event.properties = {}
    event.properties[&#x27;greeting&#x27;] = config.greeting
    event.properties[&#x27;greeting_counter&#x27;] = counterValue
    event.properties[&#x27;random_number&#x27;] = await getRandomNumber()
    return event
}

And here’s a basic `plugin.json` that goes along with it:

```js
{
    &quot;name&quot;: &quot;Hello World&quot;,
    &quot;url&quot;: &quot;https://github.com/PostHog/posthog-hello-world-plugin&quot;,
    &quot;description&quot;: &quot;Greet the world with every PostHog event. An example plugin.&quot;,
    &quot;main&quot;: &quot;index.js&quot;,
    &quot;config&quot;: [
        {
            &quot;key&quot;: &quot;greeting&quot;,
            &quot;name&quot;: &quot;What greeting would you like to use?&quot;,
            &quot;type&quot;: &quot;string&quot;,
            &quot;default&quot;: &quot;Hello world!&quot;,
            &quot;required&quot;: false
        }
    ]
}
</code></pre><h3 id="app-functions-and-processes">App functions and processes</h3><p>As you can see by reading the above examples, the index file exports functions that take objects PostHog provides (like configuration and event data). Specifically, PostHog apps export predefined functions that run on conditions like:</p><ul><li><p>event ingestion (<code>processEvent</code>)</p><ul><li>useful for modifying incoming data, such as adding geographic data properties or dropping events matching a property filter.</li></ul></li><li><p>every minute, hour, day (<code>runEveryMinute</code>, <code>runEveryHour</code>, <code>runEveryDay</code>)</p><ul><li>useful for triggering events based on updates to external services such as Stripe, HubSpot, or GitHub.</li></ul></li><li><p>once processing is complete (<code>exportEvents</code>, <code>onEvent</code>)</p><ul><li>useful for exporting data to external services such as BigQuery, Snowflake, or Databricks.</li></ul></li></ul><p>When users upload apps to PostHog, we import these functions from the files and run them through <a href="https://github.com/PostHog/posthog/tree/master/plugin-server/src/worker/vm/transforms">custom babel transforms</a> for extra security. From there they run as callable functions on VMs as part of our ingestion pipeline and also have access to extensions like storage, caching, and logging. Overall, it looks like this:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/how-we-built-an-app-server/vm.png" alt="VM"/></p><p>Structuring apps this way provides flexibility to users while maintaining scalability and security. We continued to improve each of these aspects as apps developed:</p><ul><li><strong>Flexibility:</strong> features like scheduling and exporting added new functionality that solve more use cases.</li><li><strong>Scalability:</strong> caching and improving the config object (enabling statelessness) helped apps scale effectively and use fewer resources.</li><li><strong>Security:</strong> running apps in VMs with babel transforms helped ensure they were secure and isolated. </li></ul><p>The next step is putting these apps into production.</p><h3 id="serving-apps-and-managing-data-at-scale">Serving apps and managing data at scale</h3><p>An app is no good if it doesn&#x27;t integrate into PostHog. Apps needed to integrate with our event ingestion pipeline. They needed to handle an inflow of data, scale, manage tasks, and update themselves. There are many pieces needed to make this happen.</p><p>The initial ingestion pipeline used Python, Celery to manage the job queue, and a Node &quot;plugin server&quot; that ran the functions from the apps on incoming events.</p><p>It has evolved significantly. A high-level version of the ingestion pipeline now looks like this:</p><pre><code class="language-mermaid">graph TD
    CLIENT[Client Library]
    FLAGS[&quot;/flags API&quot;]
    CAPTURE[Capture API]
    PLUGINS[Plugin server]
    PERSONS[&quot;PostgreSQL (persons table)&quot;]
    Kafka2[Kafka]

    CLIENT -..-&gt; FLAGS

    CLIENT -..-&gt; CAPTURE
    CAPTURE --&gt; Kafka

    Kafka &lt;-..- PLUGINS

    PLUGINS &lt;--&gt; PERSONS
    PLUGINS --&gt; Kafka2

    Kafka2 &lt;-..- ClickHouse
</code></pre><p>The plugin server is now a core service that processes all events, updates related, models, and runs all plugins (including apps). Apps are only a small part of what the plugin server does now. </p><p>The entire pipeline is now written in TypeScript and runs on Node. This saves sending processed data back to Python for writing to databases. We can just write it directly to ClickHouse or Postgres. We also now use Kafka to manage data flows and Redis for caching.</p><h3 id="using-kafka-and-redis">Using Kafka and Redis</h3><p>Kafka manages our data flows. It helps us batch, split, and manage parallel work for our apps. For example, Kafka helps us batch and retry events when apps call <code>processEvent</code>. We use a Kafka topic (fancy name for &quot;queue&quot;) to continue the flow of data.</p><p>Another service we use is Redis to cache data for apps. Parts of the app are reusable and don’t need to be recomputed each time we run the app. For example, apps can cache details about the organization events belong to, instead of looking for those details for each processed event. Over billions of events, this saves a lot of compute.</p><p>We use a couple of Redis patterns. First, we use <a href="https://redis.io/docs/manual/patterns/distributed-locks/">Redlock</a> for the scheduler and job queue consumer. Redlock ensures these processes are only run on one machine because we only want them to run once. If they ran more than once, we’d have duplication and issues. For example, we only need one scheduler to do the basic work of saying what to do at what time. Second, we use <a href="https://redis.io/docs/manual/pubsub/">Pub/Sub</a> to check for updates to apps.</p><p>We chose these because we used them elsewhere and they have a proven track record of working well at scale. They help apps integrate with our existing infrastructure.</p><h3 id="how-the-plugin-server-works-apps-and-beyond">How the plugin server works (apps and beyond)</h3><p>As mentioned earlier, our plugin server expanded to encompass much more than apps. It now handles all plugins, including apps that validate, process, format, and write event data to databases. The plugin server looks like this: </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/how-we-built-an-app-server/plugin-server.png" alt="Plugin server"/></p><p>The main thread routes incoming tasks to the right location. It receives data and starts threads to complete them. We use <a href="https://github.com/piscinajs/piscina">Piscina</a> (a node.js worker pool) to create and manage the threads. Piscina abstracts away a lot of the management of threads we would need to do to scale. The main thread also handles the functionality of scheduling and job queuing. The result creates tasks and sends them to worker threads to complete.</p><h3 id="doing-the-work-in-worker-threads">Doing the work (in worker threads)</h3><p>Worker threads receive tasks from the main thread and execute them. Some of the tasks, like <code>processEvent</code> or <code>runEveryMinute</code>, use the callable functions (app code) we detailed above. Worker threads contain the VMs, as well as the ingestion logic and connections to extensions and libraries. Each worker thread can run up to 10 tasks at the same time.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/how-we-built-an-app-server/worker-thread.png" alt="Worker thread"/></p><p>When the worker thread finishes its task, it gets another new event, process, or other scheduled task from the main thread. The main thread handles getting and rerouting events for further processing. A final <code>onEvent</code> task runs once all the processing completes, which is useful for functions like exporting or alerting.</p><p>This structure enables modularity, allowing us to run different types of workers and apps. On the small scale, workers can run individual app tasks can together. On a larger scale, we are working on decoupling types of tasks to improve efficiency.</p><h3 id="making-sure-arbitrary-code-doesnt-break-everything">Making sure arbitrary code doesn’t break everything</h3><p>The final piece of the story of apps to worry about is that they are arbitrary code. When left unchecked, they can run whatever code they want, including code that tries to exploit or crash our servers. </p><p>Allowing users to run arbitrary code can cause many security, infrastructure, and usability issues. We use Node VMs because they provide some solutions, but they don&#x27;t offer total protection. We&#x27;ve done a bunch more work to prevent potential issues and make sure apps are secure and reliable.</p><p>First, there are endless libraries for JavaScript, but we only <a href="/docs/apps/build/reference#available-imports">allow a small number of them</a>. Users can’t install and use whatever npm package they like. We include basic packages such as Node’s standard <code>crypto</code>, <code>url</code>, <code>node-fetch</code>, and <code>zlib</code> libraries. We also include libraries like <code>snowflake-sdk</code>, <code>@google-cloud/bigquery</code>, and <code>pg</code> to connect external services. This ensures that the code run by our users and servers uses libraries we trust.</p><p>Second, users can write a loop that loops forever and causes resource exhaustion. To prevent this, we set up a babel plugin that injects code into <code>for</code>, <code>while</code>, and <code>do while</code> loops (as described in <a href="https://medium.com/@bvjebin/js-infinite-loops-killing-em-e1c2f5f2db7f">this article</a>). Whenever there is a loop, we set up a timer before we start it. If the loop runs for more than 30 seconds, the program errors.</p><p>Third, to prevent data loss, we added the ability to retry logic to our <code>processEvent</code> function. Kafka handles retries for us by batching events and adding failed ones into the dead letter queue. We added the ability to run functions on <code>RetryError</code> to improve consistency. App developers can also run fetches with retry. Here’s an example of what it looks like:</p><pre><code class="language-js">import { RetryError } from &#x27;@posthog/plugin-scaffold&#x27;

export function setupPlugin() {
    try {
        // Some network connection
    } catch {
        throw new RetryError(&#x27;Service is unavailable, but it might be back up in a moment&#x27;)
    }
}
</code></pre><p>Fourth, we made it easier to write high-quality apps. We improved the <a href="/docs/apps/build">docs</a> and added <a href="/docs/apps/build/tutorial">tutorials</a>. Apps were rewritten to use Typescript (we provide <a href="/docs/apps/build/types">types</a>) and tested in <a href="/docs/apps/build/testing">Jest</a>. Many more minor improvements added up to higher-quality apps getting created.</p><p>Finally, as mentioned before, although our self-hosted instances can run whatever arbitrary code they want, we still review apps before adding them for everyone to use on Cloud. This ensures a final quality and security standard for users.</p><p>All this work helped us create more secure and reliable apps. This allowed us to be more confident in allowing users to build apps and users to be more confident using them.</p><h2 id="-conclusion-the-present-and-future-of-posthog-apps">🏆 Conclusion: The present and future of PostHog apps</h2><p>Building and scaling PostHog apps fundamentally changed the way we think about our product and infrastructure. We started life as an open source product analytics tool. Now, we&#x27;re a platform. </p><p>Since launch, we&#x27;ve seen companies and solo devs create many useful, clever apps to solve problems or connect new services. There are <a href="/apps">over 50 PostHog apps</a>, including:</p><ul><li><p>&quot;Data-in&quot; apps connecting PostHog to <a href="/apps/hubspot-connector">Hubspot</a>, <a href="/apps/salesforce-connector">Salesforce</a> (community built), <a href="https://github.com/PostHog/stripe-plugin">Stripe</a>, and <a href="/apps/shopify">Shopify</a>.</p></li><li><p>&quot;Data-out&quot; apps for exporting PostHog data to <a href="/apps/bigquery-export">BigQuery</a>, <a href="/apps/s3-export">S3</a>, <a href="/apps/rudderstack-export">Rudderstack</a> (community built), and <a href="/apps/intercom">Intercom</a>.</p></li><li><p>Ingestion-filtering apps like <a href="/apps/property-filter">Property Filter</a> (community built) and First Time Event Tracker that give users, even more, control over events and properties sent to PostHog.</p></li></ul><p>Our vision for apps is to continue to enable more customizability for data flows. We want users to have access to the data they need to create better products, and apps are key to doing this. </p><p>We also want to allow for more customization of the PostHog experience. As an example of this, see the release of <a href="/tutorials/build-site-app">site apps</a>, which provides similar customizable functionality in the frontend. Like how apps allow users to customize their data flows, site apps enable them to customize their products with frontend components. Users can add surveys, feedback requests, banners, and more through PostHog site apps.</p><p>The ability to leverage PostHog to customize, control, and fully utilize your data to improve your product will continue to progress. Apps, and many other features of PostHog, help with this. In the end, PostHog aims to help you understand your product and gives you the tools to build a better one.</p><h2 id="further-reading">Further reading</h2><ul><li>Feeling inspired? <a href="/tutorials/build-your-own-posthog-app">Learn how to make your own app</a>.</li><li>More of a frontend person? Check out our tutorial on <a href="/tutorials/build-site-app">building site apps</a>.</li><li>Want to dive deeper into apps? <a href="/docs/apps">Check out our app docs</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #16]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-16</link><guid isPermaLink="false">dca4a54e-9eed-5dc0-8dc5-72146be7c34a</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Tue, 08 Nov 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><h2 id="posthog-blog">#posthog-blog</h2><p>🚀 <a href="/blog/equity-share-options-explained">Creating an employee-friendly share option scheme</a>
We set out to build the best possible scheme for our team – this is how we did it and how you can do the same. </p><p>✅ <a href="/blog/features-sell">Tell me about features, not benefits</a>
&quot;Marketing lore tells you that you must focus on the why, not the what&quot;, says CEO James Hawkins. But &quot;this approach has become so popular that it feels tired and out-of-touch.&quot;</p><p>🔁 <a href="/blog/growth-loops">How to harness the awesome power of growth loops</a>
Nearly every successful company utilizes growth loops in some way, consciously or not. Here we look at how to choose and measure your growth loop.</p><p>💽 <a href="/blog/clickhouse-vs-postgres">In-depth: ClickHouse vs PostgreSQL</a>
ClickHouse and Postgres are as similar as grapes and grapefruits, but understanding how they compare is still vital when choosing how to house your data.</p><h2 id="tutorials-and-guides">#tutorials-and-guides</h2><p>💪 <a href="/tutorials/power-users">How to identify and analyze power users</a>
Power users are your best and most important customers. Use PostHog to find them, analyze them, and build for them.</p><p>🧰 <a href="/tutorials/build-site-app">How to build a site app</a>
Site apps make it quick and easy to add features such as forms and banners to your site through our JavaScript library. These apps can then capture data for analysis in PostHog.</p><p>📹 <a href="/tutorials/filter-session-recordings">How to find relevant session recordings quickly</a>
All the ways you can use filters to find useful session recordings.</p><h2 id="good-reads">#good-reads</h2><p><a href="https://www.reforge.com/blog/racecar-growth-framework">The Racecar Growth Framework</a> by Dan Hockenmaier and Lenny Rachitsky – yes, that Lenny. An essential read that suggests thinking about your business like a race car, featuring:</p><ul><li><p><strong>The (Growth) Engine:</strong> Growth loops (e.g. virality, performance marketing, content) that drive most of your growth.</p></li><li><p><strong>Turbo Boosts:</strong> One-off events (e.g. PR, events) that create a temporary spike in growth.</p></li><li><p><strong>Lubricants:</strong> Optimizations to improve the growth engine, such as improved onboarding or conversion rate.</p></li><li><p><strong>Fuel:</strong> The stuff that powers your engine, such as content, new users or capital.</p></li></ul><p><a href="https://abinoda.substack.com/p/unhappiness">What Makes Developers Unhappy?</a>, a summary of a large-scale study of over 2,000 developers. Takeaways:</p><ul><li><p>Reducing negative experiences is a more cost-effective way to improve happiness, and productivity, than &quot;maximising positive experiences&quot;.</p></li><li><p>The top cause of unhappiness among developers was &quot;being stuck in problem solving&quot;, but the majority of the top 10 causes were external factors that managers can impact.</p></li><li><p>The top external factors were, in order: time pressure, bad code quality / practice, underperforming colleagues, mundane / repetitive tasks, unexplained broken code, bad decision making, and imposed limitations on development.</p></li></ul><p><a href="http://paulgraham.com/users.html">What I&#x27;ve learned from users</a> by Paul Graham. For Graham, &quot;users&quot; means founders of YC companies:</p><ul><li><p>Founders frequently don&#x27;t listen to <a href="/newsletter/how-i-get-good-advice">the advice</a> of YC partners and live to regret it. Graham posits this is because &quot;so much about startups is counterintuitive. And when you tell someone something counterintuitive, what it sounds to them is wrong.&quot;</p></li><li><p>&quot;The educational system in most countries trains you to win by hacking the test instead of actually doing whatever it&#x27;s supposed to measure. But that stops working when you start a startup.&quot;</p></li><li><p>&quot;Focus is doubly important for early stage startups... If the founders focus on things that don&#x27;t matter, there&#x27;s no one focusing on the things that do.&quot;</p></li></ul><h2 id="random">#random</h2><ul><li><a href="https://pixelparmesan.com/ai-and-the-future-of-pixel-art/">AI and the Future of Pixel Art</a></li><li><a href="https://untappedcities.com/2021/07/09/new-york-city-steam-system">How the New York City Steam System Works</a></li><li><a href="https://ckochis.com/building-a-vector-map-from-scratch">Building a Vector Map from Scratch</a></li><li><a href="https://discord.com/blog/how-discord-supercharges-network-disks-for-extreme-low-latency">How Discord supercharges network disks for extreme low latency</a></li><li><a href="https://clickhouse.com/blog/real-world-data-noaa-climate-data">Exploring massive, real-world data sets: 100+ Years of Weather Records in ClickHouse</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we’re improving performance by combining persons and events]]></title><description><![CDATA[In  a previous product update  we announced a beta for a substantial change to the way we handle persons and events on PostHog. Today, after gathering…]]></description><link>https://posthog.com/blog/persons-on-events</link><guid isPermaLink="false">1677c298-96db-5d93-9053-5be12dffc2f0</guid><pubDate>Wed, 02 Nov 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>In <a href="/blog/the-posthog-array-1-39-0">a previous product update</a> we announced a beta for a substantial change to the way we handle persons and events on PostHog. Today, after gathering your feedback and seeing the improvements to query performance, we’re rolling this change out as part of the 1.41.0 update. It is available now for self-hosted users and PostHog Cloud users can expect to see the benefits soon as we roll it out.</p><blockquote><p><strong>Need to upgrade a self-hosted instance?</strong> We&#x27;ve explained how to upgrade to 1.41.0 and run the necessary async migrations in <a href="/blog/the-posthog-array-1-41-0">our 1.41.0 release highlights</a>. </p></blockquote><p>This change combines <a href="/manual/persons">persons</a> and <a href="/manual/events">events</a> into a single <a href="/blog/clickhouse-vs-postgres#olap-vs-oltp-aka-columns-vs-rows">ClickHouse table</a>, adding person IDs and properties <em>onto</em> events.</p><p>You won’t see any UI changes — persons will still have their own Persons &amp; Groups section on the sidebar, for example — and there’ll be no loss of functionality, but here are some changes you may see:</p><ul><li><p><strong>Faster results for queries involving person properties and events</strong>. Putting persons and events into a single ClickHouse table means we no longer have to join tables to get results on queries involving these data. As a result, query performance will improve by up to 400%.</p></li><li><p><strong>Faster filtering of events with person properties</strong>. Similarly, filtering events by person properties is much faster when joining the tables is no longer necessary. Anywhere where you’re working with persons and events, PostHog will be faster. </p></li><li><p><strong>Users will no longer be merged retroactively in some situations</strong>. When an identified user logs in from a different browser (thus becoming anonymous) we end up with separate records for their unidentified and identified behavior. We used to do database joins at query time, so that all events were tied to the same person. Now, we simply look at the events which have the data from the event processing time - meaning that in some situations anonymous events are shown as separate, unique persons in insights. Further <a href="/docs/how-posthog-works/ingestion-pipeline#merging-two-persons">information is available in the docs</a> </p></li><li><p><strong>You can create insights based on person properties at the time of an event.</strong> This wasn’t previously feasible and was often requested. Now, with this change, it&#x27;s possible!</p></li><li><p><strong>Self-hosting users will see a storage increase</strong>. This is due to extra information being stored in your self-hosted ClickHouse. It&#x27;s difficult to give an estimate on this as the impact will vary a lot depending on configuration and usage per organization. </p></li></ul><p>While improving performance has been a major motivation for this change, this is also a crucial step in ensuring PostHog can continue to scale effectively. </p><p>Since launching in 2020, PostHog has been adopted by over 15,000 companies and has tracked over 50 billion events. In order to ensure that current and future users have the best possible experience, we need our systems to work as efficiently as possible. Adding persons on to events is an important part of this, along with supporting work such as <a href="/blog/clickhouse-materialized-columns">using materialized columns in ClickHouse</a> to speed up queries even further.</p><p>This said, even though the change is now being fully deployed, we’re still eager to hear <a href="https://app.posthog.com/home#supportModal">your feedback</a> and understand how we can keep making PostHog better. If you’d like more information about any of the changes above then we’re happy to <a href="/questions">answer your questions</a>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.41.0: Improving performance by up to 400%]]></title><description><![CDATA[Want to know more about what we're up to?  Subscribe to our new newsletter , which we send once every two weeks! 1.41.0 update guide for self-hosted…]]></description><link>https://posthog.com/blog/the-posthog-array-1-41-0</link><guid isPermaLink="false">4684f01a-0494-54a2-bb3d-73b23f4ef2a0</guid><pubDate>Wed, 02 Nov 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</p><h2 id="1410-update-guide-for-self-hosted-users">1.41.0 update guide for self-hosted users</h2><p>Due to changes in this update, it is important check <code>alias</code> usage before <a href="/docs/runbook/upgrading-posthog">upgrading PostHog</a> to 1.41.0 on a self-hosted instance. Further <a href="/docs/integrate/identifying-users#considerations">information is available in the docs</a>, but for example, assuming <code>email</code> is used as the identified user id, then: </p><pre><code>identify(email)                     # in the frontend
alias(email, backend_unique_id)     # in the backend - this works
alias(backend_unique_id, email)     # in the backend - THIS WILL NOT WORK
</code></pre><blockquote><p><strong>If you haven&#x27;t run async migration 0007 before:</strong> Upgrade to 1.41 and then check <a href="#new-ingestion-warnings">ingestion warnings</a> and solve any outstanding issues. After that run async migration 0007 at <code>&lt;your-posthog-site&gt;/instance/async_migrations</code> (if you haven&#x27;t ran 0005 yet start with that, then 0006 and finally 0007).</p></blockquote><blockquote><p><strong>If you have completed async migration 0007 before:</strong> If you have changed anything regarding <code>alias</code> or based on ingestion warnings, you must re-run async migration 0007 on top of 1.41 by <a href="/docs/self-host/deploy/troubleshooting#how-do-i-connect-to-postgres">connecting to Postgres</a>, running <code>UPDATE posthog_asyncmigration SET status = 0 WHERE name = &#x27;0007_persons_and_groups_on_events_backfill&#x27; AND status = 2;</code> and re-running 0007 at <code>&lt;your-posthog-site&gt;/instance/async_migrations</code>.</p></blockquote><h2 id="posthog-1410-release-notes">PostHog 1.41.0 release notes</h2><p><strong>Release highlights:</strong></p><ul><li><a href="#new-persons-on-events-on-by-default">New: Persons on events on by default</a></li><li><a href="#new-counts-of-events-per-user">New: Count of events per user</a></li><li><a href="#new-text-cards-on-dashboards">New: Text cards on dashboards</a></li><li><a href="#new-ingestion-warnings">New: Ingestion warnings</a></li><li><a href="#new-app-metrics">New: App metrics</a></li><li><a href="#new-view-recordings-from-anywhere">New: View recordings from anywhere</a></li><li><a href="#new-change-your-own-email">New: Change your own email</a></li><li><a href="#new-hedgehog-mode">New: Hedgehog mode</a></li><li><a href="#improved-recordings-interface">Improved: Recordings interface</a></li><li><a href="#one-more-thing-site-apps">One more thing: Site apps</a></li></ul><h3 id="new-persons-on-events-on-by-default">New: Persons on events on by default</h3><p>We used to store events in one table and persons in another table. That meant that, once you reached billion event scale, any query which touched person properties would time out. But, no longer! After running <a href="/blog/the-posthog-array-1-39-0#beta-improving-query-performance-by-combining-persons-and-events">an extensive beta since update 1.39.0</a>, we&#x27;ve now added person data onto the events themselves.</p><p>You won’t see any UI changes as a result of this change — persons will still have their own Persons &amp; Groups section on the sidebar, for example — but you will notice results are a lot (up to 400%!) faster for any queries involving persons and events. This is a massive change, so be sure to <a href="/blog/persons-on-events">read the full announcement for more info</a>.</p><blockquote><p><strong>Note:</strong> As a result of adding persons on events and changing how queries work we now have to be more strict about merging users. Because of that, we recommend double checking your <code>alias</code> calls, and following advice above <a href="/blog/the-posthog-array-1-41-0">how to upgrade a self-hosted instance to 1.41.0</a>. </p></blockquote><h3 id="new-count-of-events-per-user">New: Count of events per user</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-count-events-per-user.png" alt="count events per user"/></p><p>Have you ever asked yourself &#x27;<em>What&#x27;s the average number of purchases per user?</em>&#x27; or &#x27;<em>What&#x27;s the maximum number of forms submitted per user?&#x27;</em> </p><p>Questions like these used to be hard to answer with PostHog, but no more! Use the new &quot;Count per user&quot; aggregation mode available in Trends to analyze <em>how intensely</em> your users use the product and its features. &quot;Count per user&quot; supports common statistical functions for crunching the per-user numbers: average, median, minimum, maximum, 90th/95th/99th percentile.</p><p><strong>Bonus:</strong> While working on this feature, we also took the opportunity to improve our aggregation selector UI: aggregation by property value is now presented with more clarity.</p><h3 id="improved-recordings-interface">Improved: Recordings interface</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-recordings-interface.png" alt="recordings interface"/></p><p>We&#x27;ve heard feedback recently that session recording was incredibly useful, but didn&#x27;t spark much joy for those who used it. So, we&#x27;ve overhauled the entire interface for session recordings to make it easier to use and to help you find relevant recordings faster. </p><p>We think session recording feels like an entirely new experience now, so check it out. Now&#x27;s the perfect time to explore <a href="/manual/recordings#console-logs-recording">the console log too</a>!</p><h3 id="new-text-cards-on-dashboards">New: Text cards on dashboards</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-text-card-on-dashboard.png" alt="text cards on dashboards"/></p><p>Previously there was no easy way to add context or links to a dashboard, meaning you may have to send long explanations when sharing a dashboard with teammates. That&#x27;s why we&#x27;ve added the option for users on paid plans to add text cards where they can add any information they want, including metadata, images or gifs!</p><h3 id="new-ingestion-warnings">New: Ingestion warnings</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-ingestion.png" alt="ingestion warnings"/></p><p>We&#x27;ve added a new page to the Data Management section which lists warnings related to data ingestion from the past 30 days. If you still try to merge identified users into others, the Ingestion Warning page is where we&#x27;ll remind you that the merge got blocked.</p><blockquote><p><strong>Note:</strong> Self-hosted users managing kafka separately should create a new topic <code>clickhouse_ingestion_warnings</code> manually.</p></blockquote><h3 id="new-app-metrics">New: App metrics</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-app-metrics-insight.png" alt="app metrics"/></p><p>Curious how well your apps are doing? Previously, you may have had to pour over the AWS logs, but now you can head to the new app metrics page to find out how many events an app has processed, how many retries were attempted and what errors may have occurred. Very handy. Want to take a look? Head to the apps page in your instance and click the chart symbol for any installed app.  </p><p>App metrics are only available for users on Scale or Enterprise plans. </p><blockquote><p><strong>Note:</strong> Self-hosted users managing kafka separately should create a new topic <code>clickhouse_app_metrics</code> manually.</p></blockquote><h3 id="new-view-recordings-from-anywhere">New: View recordings from anywhere</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-view-recordings-anywhere1.png" alt="view recordings from anywhere1"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-view-recordings-anywhere2.png" alt="view recordings from anywhere2"/></p><p>You can now view session recordings from lots of different places within PostHog, making it easier to find relevant recordings.</p><p>Curious about how a specific person is interacting with your app? Navigate to a person detail page and check out their recordings. Want to see recordings for a specific event or action you&#x27;ve created? Check out the new view recordings button you can find in the event&#x27;s detail page or from the events table.</p><h3 id="new-change-your-own-email">New: Change your own email</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-password.png" alt="change your password"/></p><p>Finally, we can release one of our most requested features: the ability to change the email address attached to your account, without contacting support. All you have to do is select your profile picture in the top right and access your account settings. </p><h3 id="new-hedgehog-mode">New: Hedgehog mode</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-hedgehog-mode.png" alt="hedgehog mode"/></p><p>For a while now, we&#x27;ve been having a hard time explaining to our families what we do for a living. This makes it even harder.</p><h3 id="improved-formula-mode-in-trends">Improved: Formula mode in Trends</h3><p><img src="https://user-images.githubusercontent.com/4550621/194917357-81f0f06d-2994-420b-b566-ef67d1e7d010.png" alt="Trends query editor with the formula mode tooltip"/></p><p>We&#x27;ve seen that the relationship between Trends series and formula was a bit unintuitive at times. To alleviate this, we&#x27;ve reworked the experience of our formula feature. Instead of an &quot;Add formula&quot; button, click &quot;Enable formula mode&quot; – &quot;Series&quot; then become &quot;Variables&quot;, and the formula itself is presented right below them.</p><h3 id="one-more-thing-site-apps">One more thing: Site apps</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-41-0-site-apps.gif" alt="site-apps"/></p><p>We&#x27;re testing a new big (beta) thing: site apps. You need to <strong>manually opt in</strong> to enable this feature by configuring your <code>posthog-js</code> initialization to include <code>opt_in_site_apps: true</code>. Once you do, PostHog will be able to inject code onto your website through <code>posthog-js</code>. We&#x27;ve put together <a href="/tutorials/build-site-app">a tutorial that explains how to make a site app</a> if you&#x27;re interested. </p><p>Site apps can be useful for a number of potential tasks, such as displaying feedback forms, posting service update banners, or making it rain pineapples. No, we&#x27;re not really sure why we made the last one either. </p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>You think that&#x27;s it? Not by a long shot! Version 1.41 also adds hundreds of other improvements and fixes, including...</p><ul><li><p><strong>Improvement:</strong>  You can now <a href="https://github.com/PostHog/posthog-github-action">send analytics events from GitHub actions, to PostHog</a></p></li><li><p><strong>Improvement:</strong>  We have revamped our timezone system! We&#x27;ve squashed various bugs and improved the interval grouping to be more in line with expectations when filtering on dates.</p></li><li><p><strong>Fix:</strong> WAU/MAU aggregation in Trends was quietly always grouped by day, even if a different interval (hour/week/month) was selected. Additionally, those modes showed zero users for periods with no relevant events, even if the real count should have been non-zero due to WAU/MAU being a trailing count. Both issues are now fixed, and we&#x27;ve expanded our test coverage of those aggregation modes to ensure their results are accurate going forward.</p></li><li><p><strong>Fix</strong>: Experiment results will appear immediately after the first exposure to a user</p></li><li><p><strong>Improvement</strong>: The experiments table is now sortable</p></li><li><p><strong>Improvement</strong>: Hold down &quot;shift&quot; when using the toolbar to click on elements below the heatmap.</p></li></ul><p>View the commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.40.0...release-1.41.0"><code>release-1.40.0...release-1.41.0</code></a>.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li><p><a href="https://github.com/ShaneMaglangit">@ShaneMaglangit</a> for fixing <a href="https://github.com/PostHog/posthog/pull/12332">a bug when buttons could be disabled on some insights</a>.</p></li><li><p><a href="https://github.com/rcmarron">@RCMarron</a>, a former team member who still helped <a href="https://github.com/PostHog/posthog/pull/12006">meter some rate limits</a>. We miss you, Rick!</p></li><li><p><a href="https://github.com/codepitbull">@Codepitbull</a> who helped us with <a href="https://github.com/PostHog/posthog-java/pull/23">shading transitive dependencies</a>.</p></li><li><p><a href="https://github.com/gma">@GMA</a> for clarifying that <a href="https://github.com/PostHog/posthog.com/pull/3925"><code>brotli</code> is required on all architectures</a>.</p></li><li><p><a href="https://github.com/bytemerger">@ByteMerger</a> for <a href="https://github.com/PostHog/posthog-engage-so-plugin/pull/3">updating an app logo</a> for <a href="/apps/engage-connector">our Engage connector</a>.</p></li><li><p><a href="https://github.com/balajivenkatesh">@Balajivenkatesh</a> for <a href="https://github.com/PostHog/posthog-patterns-app/pull/1">improving the way we send data to a webhook</a> in <a href="/apps/patterns-connector">our Patterns connector</a>.</p></li><li><p><a href="https://github.com/msmans">@msmans</a> for <a href="https://github.com/PostHog/charts-clickhouse/pull/582">adding ClickHouse pod distribution</a>.</p></li><li><p><a href="https://github.com/krzd">@krzd</a> for <a href="https://github.com/PostHog/posthog.com/pull/4307">updating some Debian-specific documentation</a>.</p></li><li><p>[@jacobwgillespie], co-founder of <a href="https://depot.dev/">Depot</a>, for <a href="https://github.com/PostHog/posthog/pull/12520">moving us from Yarn 1 to Yarn 3</a>. A great PR!</p></li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="/careers/full-stack-engineer-experimentation">Full Stack Engineer - Experimentation Team</a></li><li><a href="/careers/full-stack-engineer-product-analytics">Full Stack Engineer - Analytics Team</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. Don’t see a specific role listed? That doesn&#x27;t mean we won&#x27;t have a spot for you. <a href="mailto:careers@posthog.com">Send us a speculative application!</a></p><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog goodness!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What is SSO and why you should enable it for PostHog]]></title><description><![CDATA[Existing at an intersection of convenience and security, single sign-on (SSO) authentication is used and appreciated by both IT teams  and  everyday…]]></description><link>https://posthog.com/blog/what-is-sso-and-saml</link><guid isPermaLink="false">3a48699d-8731-56f8-93a6-19d8a47c1a06</guid><pubDate>Mon, 31 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-blog-image.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Existing at an intersection of convenience and security, single sign-on (SSO) authentication is used and appreciated by both IT teams <em>and</em> everyday users — which is why we strongly recommend setting it up on new PostHog instances. In this article we’ll explain what SSO and SAML are, and why you should use it.</p><blockquote><p><strong>Ready to get started?</strong> Check <a href="/manual/sso">PostHog’s authentication docs</a> for instructions on setting up SSO and SAML. </p></blockquote><h2 id="what-is-sso">What is SSO?</h2><p>SSO stands for Single Sign-On. It enables users to login to services without entering a service-specific password — instead, access is validated by their access to a secondary system or domain. Ever logged into a website using your Google or Facebook account? <em>That’s</em> SSO. </p><p>Administrators and IT teams often encourage SSO for security purposes, as it ensures only authorized users can access an account. A simple username and password often isn&#x27;t secure enough. We use SSO at PostHog for this reason and offer support for it via authorized email domains and certain third-party providers — namely Google, GitLab, and GitHub.</p><p>PostHog also offers <a href="/manual/sso#just-in-time-user-provisioning">just-in-time provisioning</a>, which automatically creates a new account whenever new users access PostHog — provided that they have a valid email address and SSO provider, of course.</p><h2 id="what-is-saml">What is SAML?</h2><p>SAML, on the other hand, stands for Security Assertion Markup Language. It’s one of the underlying technologies which makes SSO possible and enables team members to use a single set of login credentials across multiple systems. In PostHog, you can use multi-tenant SAML to support many authentication servers at once and integrate Identity Providers, such as OneLogin or Okta. </p><blockquote><p>Some SSO and SAML features are intended for use in large organizations and are only available on Enterprise or paid PostHog plans. For a comprehensive explanation of which features are available on each plan, refer to the <a href="/manual/sso">authentication docs</a>.</p></blockquote><h2 id="why-is-sso-useful-for-teams">Why is SSO useful for teams??</h2><p>SSO and SAML are typically useful for three main reasons… </p><ul><li>They make logging in to services easier for users (fewer passwords to remember)</li><li>They make managing accounts easier for IT teams (fewer passwords to reset)</li><li>They make it harder to engage in bad practices (fewer shared passwords)</li></ul><p>Additionally, SSO and SAML may be required in some organizations which need to comply with regulations that govern how users are provisioned and access is tracked. For this reason, some SSO and SAML features are limited to users on paid or Enterprise plans. </p><h2 id="how-to-set-up-sso-and-saml-on-posthog">How to set up SSO and SAML on PostHog</h2><p>SSO is available for all versions of PostHog, including self-hosted deployments — however some SSO features, such as Google SSO, are limited to paid or Enterprise plans because they are intended for use in large organizations. </p><p>Likewise, SAML features are intended for use in large teams and therefore only available on Enterprise plans. </p><p>For more information about which SSO and SAML features are available for which PostHog plans, and instructions on how to set up third-party SSO providers, check <a href="/manual/sso">the PostHog SSO docs</a>. </p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[In-depth: ClickHouse vs PostgreSQL]]></title><description><![CDATA[Honestly, it is a bit ridiculous to compare Postgres and ClickHouse. The two database solutions are as similar as grapes and grapefruit. ClickHouse…]]></description><link>https://posthog.com/blog/clickhouse-vs-postgres</link><guid isPermaLink="false">450e88fd-7da7-5ed9-8a9b-6ef90a6c04d7</guid><dc:creator><![CDATA[Mathew Pregasen]]></dc:creator><pubDate>Fri, 28 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/clickhouse-vs-postgres/postgres-vs-clickhouse.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Honestly, it is a bit ridiculous to compare Postgres and ClickHouse. The two database solutions are as similar as grapes and grapefruit. ClickHouse was created for a specific purpose; PostgreSQL (aka Postgres) was designed to be flexible and all-purpose. </p><p>So why even compare them? Because most companies that invest in an online analytical processing (OLAP) database like ClickHouse originally used an online transaction processing (OLTP) stack like MySQL or Postgres. PostHog&#x27;s database journey was no different. </p><p>In 2020, PostHog used Postgres to store client data. In the beginning, it worked. But usage grew very, very fast. Eventually, that all-purpose Postgres database was tasked to store millions of rows of data. It was obvious Postgres couldn&#x27;t handle the scale necessary for a developer platform like PostHog.</p><p>At first, the team tried a ton of hack-y and wacky solutions in attempts to get Postgres to work. Turns out, that wasn’t sustainable (who would’ve thought!). Eventually, PostHog <a href="/blog/how-we-turned-clickhouse-into-our-eventmansion">migrated client data to ClickHouse</a>. Boom! </p><p>This is what that felt like...</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/thanos-meme.png" alt="thanos meme"/>  </p><p>Suddenly, all those data problems were solved, Thanos-snapped from existence. Here, we’re diving deep into how and why ClickHouse saved the day. </p><h2 id="olap-vs-oltp-aka-columns-vs-rows">OLAP vs OLTP (aka columns vs rows)</h2><p>If you’ve ever taken a databases 101 course, you’ve likely heard lectures on row-based relational databases. Good chance, the professor referred to them as simply <em>relational databases</em> or even <em>normal databases</em>. </p><p>The majority of popular solutions — MySQL, Postgres, SQLite — are all row-based. In each of these, data / objects are stored as rows, like a phone book. </p><p>In contrast, ClickHouse is a <em>columnar</em> database. ClickHouse tables in memory are inverted — data is ingested as a column, meaning you’ve a large number of columns and a sizable set of rows.</p><p>Here&#x27;s what that looks like...</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/rows-vs-columns.png" alt="clickhouse vs postgres rows and columns"/>  </p><p>The difference – to be clear – is how the data is <em>stored</em>; to the user, no mental-inversion is needed. You still deal with tables with entries. You continue to utilize SQL to interface with ClickHouse. The big difference is that those queries perform differently from the analog queries in Postgres or other row-based relational database. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/rows-vs-columns-user.png" alt="clickhouse vs postgres rows and columns"/> </p><p>ClickHouse was designed for products that require fetched aggregate data, such as analytics, financial real-time products, ad-bidding technology, content delivery networks, or log management. Basically, it’s for data that doesn’t need to be <em>changed</em>; ClickHouse is downright terrible at mutations.</p><p>It’s important to realize that ClickHouse is rarely used alone. Because ClickHouse is bad at update-heavy data, it’s not a great database to run the day-to-day usage of an app. If ClickHouse powered Tinder, the only match users would have is with a loading modal. Anyone who uses ClickHouse is also using Postgres or another rows-based relational database for the non-specialized bits of their product.</p><p>One previously-used <a href="https://www.youtube.com/watch?v=aRT8E0nD_LE">analogy</a> to compare OLTP databases (Postgres) with OLAP databases (ClickHouse) is Teachers vs Principals. A teacher (akin to Postgres) would be able to efficiently answer the question “How is Johnny, the 4th grader, doing in Math?”. A principal (akin to Clickhouse) wouldn’t know who Johnny is, but would be able to quickly provide the student body’s national exam pass rate.</p><blockquote><p>📖 <strong>Further reading:</strong> ClickHouse is just one of many OLAP databases on the market. Read our <a href="/blog/clickhouse-vs-druid">ClickHouse and Druid comparison</a> for an in-depth look at how they solve the same problem in two contrasting ways.</p></blockquote><h3 id="simple-cases">Simple Cases</h3><p>Let’s start with some obvious uses cases that sharply lean towards Postgres or ClickHouse. </p><p><strong>A Simple Case where Postgres is used over ClickHouse:</strong> <em>You operate a dating app and need to change Employer in a John Doe’s row.</em></p><p>Postgres would do this seamlessly: access John Doe’s row (including his other attributes), alter the Employer value and write. What about ClickHouse? Well, it would need to load every Employer value for every entry, go to John Doe’s index, alter it, and write the entire “column” back into data. </p><p>Let’s analyze Postgres vs ClickHouse with a (very simplified) hedgehog database. Crudely, we can visualize why Postgres crushes ClickHouse when fetching a single hog’s data:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/rows-vs-columns-fetching-data.png" alt="clickhouse vs postgres fetching data"/> </p><p><strong>A Simple Case where ClickHouse crushes Postgres:</strong> <em>You operate a financial transaction startup and need to calculate the average transaction price across billions of entries.</em> </p><p>Postgres would need to incrementally retrieve every entry, grab the transaction price, add it to a running total, and return the value. ClickHouse meanwhile could calculate this, without any additional caches or optimized engines, with a single read. </p><p>If we were to extend the previous hedgehog database, this query looks a little like this:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/rows-vs-columns-summing-data.png" alt="clickhouse vs postgres fetching data"/>  </p><p>This is, again, a crude comparison. It ignores caches on both ends, and more interestingly, PostHog’s optimizations under-the-hood, such as:</p><ol><li><p>Fetching data in a single read because of the columnar format.</p></li><li><p>Parallelizing requests maximizing CPU efficiency by grouping, then merging data via vectorized query execution.</p></li><li><p>Utilizing specialized merge-tree engines with significant optimizations.</p></li><li><p>No transaction-locking overhead.</p></li></ol><p>Robert Hodges, CEO of Altinity, <a href="https://www.youtube.com/watch?v=fGG9dApIhDU">once compared</a> ClickHouse to a drag-racer — it might not have doors, but it is incredibly, incredibly fast when used correctly. </p><p>These optimizations are made possible by ClickHouse’s insert-and-optimize-later philosophy. ClickHouse is constantly merging data in the background to collapse series of data into single values to expedite future queries. </p><p>Because ClickHouse doesn’t expect mutation requests, it can depend on merges because the individual data won’t be changed; by extension, aggregate values won’t need to be recalculated.</p><blockquote><p>📖 <strong>Further reader:</strong> ClickHouse is just one of many column-based databases, others include Google&#x27;s BigQuery, and Snowflake. Read our comparisons between <a href="/blog/clickhouse-vs-bigquery">ClickHouse and BigQuery</a>, and <a href="/blog/clickhouse-vs-snowflake">ClickHouse vs Snowflake</a> to learn more about different OLAP database solutions.</p></blockquote><h2 id="comparing-clickhouse-and-postgres">Comparing ClickHouse and Postgres</h2><p>Because ClickHouse is the more opinionated solution, comparisons between Postgres and ClickHouse tend to go: </p><blockquote><p><em>ClickHouse does X really well, but Postgres can achieve it with Y, Z, and D modifications with A &amp; B set-backs.</em> </p></blockquote><p>Conversely, you will also see: </p><blockquote><p><em>Postgres can do X just fine, and ClickHouse could X as well if you’re okay with melting your server.</em> </p></blockquote><p>It’s like comparing a MacBook (Postgres) with a music synthesizer (ClickHouse) — you can make decent music on your Macbook, but you explicitly can’t run Microsoft Excel on a synthesizer. </p><p>Likewise, it should be no surprise that most of this section will focus on the former scenario (hacking Postgres to operate like ClickHouse). The converse is simply ridiculous. </p><p>There are other projects that have hacked Postgres into an OLAP database that may serve as more apt comparisons to Clickhouse—notably <a href="http://citrusdb.org">Citrus DB</a>, <a href="https://www.timescale.com">TimescaleDB</a>, <a href="https://aws.amazon.com/redshift/">AWS Redshift</a>, and <a href="https://greenplum.org">Greenplum</a>. However, those projects are databases in their own right, and my goal is to explain the differences between the generalized Postgres and a single specialized OLAP solution. </p><h3 id="clearing-some-clickhouse-confusion">Clearing some ClickHouse confusion</h3><p>ClickHouse’s documentation is a tad confusing to readers unfamiliar with OLAP databases. This is because ClickHouse makes usage recommendations based on the reader’s expected goals. </p><p>Let’s take a look at ClickHouse’s self-stated key properties: </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/clickhouse-guidelines.png" alt="clickhouse vs postgres rows and columns"/> </p><p>ClickHouse states that a vast majority of requests should be for read access, but this is a bit misleading — it’s more that read-heavy requests should greatly outnumber update/mutation requests, not inserts. </p><p>ClickHouse states that inserts should happen in batches. This is not because ClickHouse is bad at write-access; rather, batched inserts take advantage of ClickHouse’s core tenet of “insert fast, optimize later” philosophy. Non-batched requests are inherently slower than batched counterparts, and relatively the same when the database doesn’t support transactions. </p><h3 id="clickhouse-scales-better-than-postgres">ClickHouse scales better than Postgres</h3><p>When evaluating infrastructure resources, we typically think about CPUs, RAM, and Attached Storage. This is a great place where ClickHouse and Postgres differ. </p><p>For Postgres, RAM and Attached Storage obviously matter, but the CPU count has limited benefits. Since 2016, Postgres can parallelize certain computations (<a href="https://swarm64.com/post/increase-postgresql-parallelism/">rather inconsistently</a>), but is primarily a single-process product, as the below shows:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/postgres-scaling.png" alt="postgres resource use"/> </p><p>ClickHouse, meanwhile, is all about silently optimizing data and optimizing data in parallel. You can scale the power of your ClickHouse instance’s performance by improving any three of those dimensions, including CPU.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/clickhouse-scaling.png" alt="clickhouse resource use"/> </p><p>An optimized ClickHouse instance can function so fast that a bulk of a query’s wait-time from a frontend perspective is a function of network speed, not data retrieval. </p><h3 id="clickhouses-not-so-secret-weapon-materialized-views">ClickHouse&#x27;s not so secret weapon... Materialized Views</h3><p>Materialized Views compose arguably the biggest area where ClickHouse differentiates from Postgres. </p><p>What is a Materialized View? Unlike a normal view, which is basically a saved SQL query that re-executes at runtime to expose an ephemeral table to query from, a materialized view is a derived independent table that is generated at some <em>specific</em> point of time.</p><p>Imagine you’ve abandoned your dating app and banking businesses; now, you run a lovely education non-profit. You need to constantly query the median test score from your database — you could construct a Materialized View that stores median test scores by grade level. Then, when you need to access those test scores, you can query the Materialized View and access the results without re-calculating the median scores. </p><p>Here’s a version using our previous simple hedgehog database:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/visualizing-materialized-views.png" alt="clickhouse resource use"/> </p><h4 id="materialized-view-averaging-age">Materialized View averaging age</h4><p>Both Postgres <em>and</em> ClickHouse have functionality to build Materialized Views; the fundamental difference is that Postgres’s Materialized Views need to be manually re-updated, whereas ClickHouse automatically updates them. For some cases, like test scores, this can be done once, after all the tests are uploaded; for others, like website analytics, an auto-update materialized view like ClickHouse’s is necessary. </p><p>ClickHouse can only accomplish auto-updates efficiently because of its insert-and-optimize-later philosophy. ClickHouse never sleeps — it uses its idle time to compress data in Materialized Views so that future data look-ups are fast and efficient. </p><p>But it’s more than just time-allocation. For instance, if you need to add numbers to produce aggregate results, ClickHouse’s <a href="https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/summingmergetree/">SummingMergeTree</a> engine will dramatically parallelize the process. Alternatively, if you need to average data, the <a href="https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/aggregatingmergetree/">AggregatingMergeTree</a> is your dear friend. </p><p>Ironically, the more interesting topic in Materialized Views is not how ClickHouse efficiently updates them — that is the bread and butter of its purpose — but if Postgres can be hacked to achieve something similar. </p><p>Here are some strategies on how Postgres can emulate automatic Materialized View updates alongside their downsides: </p><ul><li><strong>Fast Refresh Module.</strong> By blending a static Materialized View and a running log of changes, Postgres’s Fast Refresh Module can simulate an automatically-updated Materialized View. The downsides are that utilizing a log is incompatible with certain fetch requirements (e.g. count), high-write databases could overwhelm the log, and that logs slow down a fetch query.</li><li><strong>Triggers.</strong> You could set a Postgres trigger to refresh a Materialized View on page load. This solution will rarely work unless you have seldom write operations; refreshing the Materialized View completely wipes the original result and will likely bludgeon the CPU. </li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/clickhouse-vs-postgres/hacking-postgres-meme.png" alt="hacking postgres"/> </p><p>In a nutshell, Postgres can be bandaged up to achieve some efficiency that ClickHouse boasts around Materialized Views, but fundamentally, ClickHouse treats Materialized Views as an out-of-the-box benefit with efficiency <em>and</em> simplicity as cornerstone value props. </p><h3 id="specialized-engines-vs-one-size-fits-all">Specialized engines vs one-size-fits-all</h3><p>Technically, database engines are nothing new. MySQL has plenty of engines, although it is typically used with just InnoDB. Postgres technically only operates using a single engine, though the Postgres team is building a new engine called <a href="https://www.percona.com/live/19/sessions/zheap-the-next-generation-storage-engine-for-postgres">zheap</a>, specifically designed to optimize the <code>UPDATE</code> function. </p><p>For ClickHouse, engines are a core feature. ClickHouse should be instructed to utilize a specialized engine depending on your data needs, and that engine could dramatically optimize results. Notably, different materialized views could have different engines, such as <code>AggregatingMergeTree()</code> or <code>SummingMergeTree()</code>, form-fitted to that materialized view’s purpose.  </p><p>ClickHouse also has specialized engines — <code>MaterializedView</code>, <code>Merge</code>, <code>Dictionary</code> etc. — that are used ephemerally to move, merge, or export data. For instance, the MaterializedView engine is able to create a new materialized view much faster than a generalized engine (not to operate it, however; the materialized view will utilize its own engine). </p><p>Clickhouse&#x27;s engines utilize vectorized execution, originally championed by the <a href="https://www.monetdb.org/">MonetDB</a> team. Vectorized query execution batches data to achieve bulk processing. While there are some third party <a href="https://github.com/citusdata/postgres_vectorization_test">Postgres extensions</a> to achieve a similar effect, ClickHouse is built around it, processing data on every CPU while better utilizing the CPU cache and SIMD CPU instructions.</p><h3 id="postgres-and-its-sharding-problem">Postgres and its sharding problem</h3><p>One of the biggest constraints of Postgres for the longest time was sharding. Even now, Postgres’s most-used sharding solution — declarative table partitioning — isn’t exactly a sharding solution as the splitting operates at a table-by-table level. </p><p>If you want to truly shard a table in Postgres, you must utilize <a href="https://wiki.postgresql.org/wiki/WIP_PostgreSQL_Sharding">Postgres’s Foreign Data Wrapper (FDW)</a> to achieve it. But this adds considerable overhead and is argued to be a lackluster sharding solution. Notion notably took <a href="https://www.notion.so/blog/sharding-postgres-at-notion">months</a> to implement a robust sharding solution for Postgres.  </p><p>ClickHouse’s approach to sharding is a bit different and more fleshed out. Upon sharding, ClickHouse creates an umbrella table that knows the locations of the shards and replicas, which will be utilized to do a federated query across an entire data set. Do note that ClickHouse does break its single-binary C++ commitment once sharding goes into effect because it utilizes Apache Zookeeper to manage the shards. </p><p>Sharding can be done prematurely to optimize performance. When multiple ClickHouse shards exist, in true ClickHouse fashion, each shard can parallelize queries expediting end results. However, for faster queries, network latency may trump the parallelization benefits. </p><h2 id="closing-thoughts">Closing thoughts</h2><p>ClickHouse was made to handle lots and lots of aggregate data. While starting with Postgres may be acceptable for the early days of a data-heavy business, platforms like ClickHouse are the better investment when aggregate fetches come into play. </p><p>ClickHouse optimizes data aggregating at every layer — inception, storage, caching, and returning — and will boast 1000x advancements over tools like Postgres. However, ClickHouse can rarely be used in isolation, as many day-to-day needs of an application are too update / single-line-read heavy to utilize a columnar database.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #15]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-15</link><guid isPermaLink="false">b87bed22-5f6b-5b51-a995-549c176e1ba7</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Thu, 27 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><h2 id="posthog-blog">#posthog-blog</h2><p>🙌 <a href="https://posthog.com/blog/making-something-people-want">CEO diary: How we made something people want</a>: It&#x27;s one thing to build something, it&#x27;s another to build something that people want. CEO James Hawkins shares his and Tim&#x27;s journey to building PostHog.</p><p>🛠 <a href="https://posthog.com/blog/open-source-stack-for-engineers">Building an open source data stack</a>: You really can replace Segment, Looker, Zapier and more with open source data tools. Did we mention PostHog is open source?</p><p>🦔 <a href="https://posthog.com/blog/essential-posthog-apps">5 essential PostHog apps for new users</a>: An introduction to the world of PostHog apps. They&#x27;re small and powerful, just like... hedgehogs? It&#x27;s a power-to-weight ratio thing.</p><h2 id="tutorials-and-guides">#tutorials-and-guides</h2><p>🔎 <a href="https://posthog.com/tutorials/spa">Tracking pageviews in single-page apps</a>: All the ways to track pageviews in single-page apps (SPA) using PostHog.</p><p>📉 <a href="https://posthog.com/tutorials/churn-rate">How to calculate and lower churn rate with PostHog</a>: Master using session recordings, cohorts, and actions to lower churn.</p><h2 id="good-reads">#good-reads</h2><p><a href="https://paulitaylor.com/2022/05/06/the-case-against-collaboration/">The Case Against Collaboration</a> by Paul Taylor, makes some interesting points about the limits of collaboration on creativity:</p><ul><li><p>Research by MIT found that brainstorming sessions &quot;reduced creativity&quot; because they lead to incremental modifications, rather than radical and potentially superior solutions.</p></li><li><p>&quot;A meta-analytic review of over 800 teams indicated that individuals are more likely to generate a higher number of original ideas when they don’t interact with others.&quot;</p></li><li><p>Collaboration is best used to solve complex problems that require diverse expert opinions.</p></li><li><p>At PostHog, we find <a href="https://posthog.com/blog/planning-a-company-offsite">successful offsites</a> and hackathons are built on preparation. Plan ahead. Set expectations early. Ask people to come up with ideas before the offsite so they have time to think.</p></li></ul><p><a href="https://wix-ux.com/when-life-gives-you-lemons-write-better-error-messages-46c5223e1a2f">Writing better error messages</a> by Jenni Nadler, on how Wix changed the way they wrote error messages. Takeaways:</p><ul><li><p>&quot;Oops! Something went wrong&quot; and similar jovial messages are just annoying and aggravate users. Be clear about exactly what went wrong.</p></li><li><p>Offer solutions. If there&#x27;s a potential way to fix the problem, suggest it. If there isn&#x27;t, make it easy to get help.</p></li><li><p>Fixing bad error messages requires shared responsibility across teams and roles. Wix created a cross-function team just to tackle error handling, and reviews them constantly.</p></li></ul><p><a href="https://aakashgupta.substack.com/p/how-has-tesla-generated-unparalleled">How has Tesla generated unparalleled operating leverage?</a> by Aakash Gupta, which looks at how Tesla&#x27;s success is supported by controlling costs:</p><ul><li><p>&quot;Most companies spend too much on R&amp;D + SG&amp;A [sales, general &amp; admin]. Tesla doesn’t. As a result, it has unparalleled operating leverage.&quot;</p></li><li><p>Tesla increased R&amp;D spend in 2021 by 71% by funding R&amp;D through revenue increases alone, holding its total R&amp;D spend at just 5% of revenue. Meta, by comparison, spends 21% of revenue on R&amp;D.</p></li><li><p>Thanks in large part to Elon&#x27;s fame, Tesla doesn&#x27;t spend much on paid advertising. Most startups don&#x27;t have an Elon, but focusing on the most cost-effective marketing channels, such as SEO and word-of-mouth, prevents overspending. Tesla is a product-led growth company.</p></li><li><p>Tesla went from making 100k cars in 2017 to nearly 1 million in 2021 (a 9x increase), but only increased headcount from 37k to 99k (a 3x increase). Keeping headcount under control lead to a huge increase in margins. This is vital for startups to achieve <a href="http://www.paulgraham.com/aord.html">default alive status</a> .</p></li></ul><h2 id="random">#random</h2><ul><li><p><a href="https://betterprogramming.pub/determining-soccer-player-jersey-colors-from-video-footage-31365e12e39c">Determine Soccer Player Jersey Colors From Video Footage Using Python</a></p></li><li><p><a href="https://uxdesign.cc/how-apple-makes-you-think-green-bubbles-gross-e03b52b12fed">One trick Apple uses to make you think green bubbles are “gross”</a></p></li><li><p><a href="https://www.youtube.com/watch?v=mMMFUKibW-c">Are San Marzano Tomatoes actually worth it?</a>  (Video)</p></li><li><p><a href="https://www.quantamagazine.org/how-to-prove-you-know-a-secret-without-giving-it-away-20221011/">How Do You Prove a Secret?</a></p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Building an open source data stack]]></title><description><![CDATA[At PostHog, we believe an open source approach doesn’t just lead to greater growth; it also leads to better products. That’s what inspired us to make…]]></description><link>https://posthog.com/blog/open-source-stack-for-engineers</link><guid isPermaLink="false">41150aa1-a9b4-539f-88ed-58bb5f3d7b9a</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Wed, 19 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-company-culture-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>At PostHog, we believe an open source approach doesn’t just lead to greater growth; it also leads to better products. That’s what inspired us to make our platform open source, to adopt <a href="/careers">a transparent company culture</a>, and also why we try to use open source software wherever we can in our stack. </p><p>We think the open source approach is best because it forces teams to be transparent, both in their decision making and also in their implementation. Then, because other teams have full visibility of the code, they can build on it and make it even better, faster and <em>stronger</em>. Often, they can do this for free.  </p><p>Of course, PostHog isn’t the only <a href="/blog/best-open-source-analytics-tools">open-source analytics platform</a> out there. In fact, there’s such variety that it’s possible to build an entirely open-source stack — and here are some of our favorite open source alternatives for engineers.</p><blockquote><p>Not an engineer? Find other <a href="/blog/categories/open-source">open source alternatives on the PostHog blog</a>!</p></blockquote><h2 id="posthog">PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/gdpr-compliant-analytics/posthog-gdpr-compliant.png" alt="PostHog - best open source analytics for engineers"/></p><ul><li><strong>Useful for:</strong> Product analytics, session recording, feature flags<br/></li><li><strong>Alternative to:</strong> <a href="/blog/best-amplitude-alternatives">Amplitude</a>, <a href="/blog/why-i-ditched-google-analytics-for-posthog">Mixpanel</a>, <a href="/blog/posthog-vs-matomo">Matomo</a><br/></li><li><strong>License:</strong> <a href="https://en.wikipedia.org/wiki/MIT_License">MIT</a><br/></li></ul><p>Of course, <a href="https://posthog.com">PostHog</a> may not be the <em>only</em> open source software useful to engineers, but it’s our (completely biased) favorite. </p><p>PostHog’s all-in-one suite of dev tools that is direct alternative to expensive, proprietary tools such as Amplitude, Mixpanel or Heap. It’s entirely self-serve, can be self-hosted or deployed in the cloud, and offers everything from funnel analytics and path analysis to cohort creation and user tracking. Best of all, because PostHog can be deployed on-prem, it’s more suitable for teams worried about <a href="/docs/privacy/gdpr-compliance">GDPR compliance</a> and <a href="/docs/privacy/hipaa-compliance">HIPAA compliance</a>.</p><p>Unlike proprietary platforms such as Amplitude however, PostHog offers far more than just core analytics. Features such as session recording, feature flags and experimentation mean it can also act as an <a href="/blog/best-open-source-feature-flag-tools">open-source alternative to LaunchDarkly</a>, <a href="/blog/best-open-source-session-replay-tools">HotJar</a>, <a href="/blog/best-open-source-ab-testing-tools">VWO</a> and more. This means PostHog isn’t just useful to engineers, but also to product managers and other teams which work closely with engineering.</p><h3 id="strengths">Strengths</h3><ul><li>All-in-one product analytics</li><li>Individual and group analytics</li><li>Deploy to the cloud, or on-prem</li><li>Unlimited feature flags</li><li>Built-in session recording</li><li>Multivariate experimentation suite</li><li>Third-party apps to enrich and move data</li></ul><h2 id="metabase">Metabase</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-engineers/metabase-open-source.png" alt="Metabase - open source data visualization for engineers"/></p><ul><li><strong>Useful for:</strong> Data visualization, business intelligence<br/></li><li><strong>Alternative to:</strong> Looker, Tableau, PowerBI<br/></li><li><strong>License:</strong> <a href="https://en.wikipedia.org/wiki/Affero_General_Public_License">AGPL</a><br/></li></ul><p>We use Metabase for visualizing data in different ways and running complex business intelligence – it&#x27;s powerful alternative to Looker, Tableua and PowerBI.</p><p>What makes Metabase so essential is that, like PostHog, you can accomplish a huge amount without needing to resort to SQL. Instead, you can create BI dashboards in just a few minutes without ever needing to write a line of code. Afterwards, these dashboards can be shared anywhere — internally, or externally. </p><h3 id="strengths-1">Strengths</h3><ul><li>Easy to use, no SQL required</li><li>Interactive, drag and drop dashboards</li><li>Deploy to the cloud, or on-prem</li><li>Integrate with 20+ data sources</li></ul><h2 id="rudderstack">RudderStack</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-engineers/rudderstack-open-source.png" alt="Rudderstack - open source data pipeline for engineers"/></p><ul><li><strong>Useful for:</strong> CDP, Data pipeline<br/></li><li><strong>Alternative to:</strong> Segment, Tealium <br/></li><li><strong>License:</strong> <a href="https://en.wikipedia.org/wiki/Affero_General_Public_License">AGPLv3</a><br/></li></ul><p><a href="https://www.rudderstack.com/">RudderStack</a> has two things in common with PostHog. Firstly, it can act as a data pipeline to funnel ingested events to other sources, such as a data warehouse or third-party platform. Secondly, you need <em>two</em> capital letters to spell it correctly. </p><p>Unlike PostHog however, RudderStack is completely focused on acting as a data pipeline. It can ingest data from more than 20 different sources, perform transformations in real-time and even perform version control operations via GitHub actions. </p><p>RudderStack is perfect for teams which are concerned with regulatory compliance, as it can mask <a href="/blog/what-is-personal-data-pii">PII</a> and filter out sensitive events with ease. This has helped it become wildly popular with users such as Stripe, Hinge and Allbirds to name a few. </p><h3 id="strengths-2">Strengths</h3><ul><li>Transport data to anywhere</li><li>Transform data in real-time</li><li>Pre-defined schemas for data warehouses</li><li>SDKs track anonymous users and update downstream tools</li></ul><h2 id="nocodb">NocoDB</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-engineers/nocodb-open-source.png" alt="NocoDB - open source database collaboration for engineers"/></p><ul><li><strong>Useful for:</strong> Database collaboration<br/></li><li><strong>Alternative to:</strong> Airtable, Postgres <br/></li><li><strong>License:</strong> <a href="https://en.wikipedia.org/wiki/Affero_General_Public_License">AGPLv3</a><br/></li></ul><p><a href="https://www.nocodb.com/">NocoDB</a> isn’t just an alternative to database tools like Airtable — it can also act as a tool which sits on top of platforms like Airtable, converting complex databases into ‘smart spreadsheets’. </p><p>Why would you want databases transformed into spreadsheets? Because that makes it easier to collaborate with others, especially if you’re collaborating with non-engineers. That’s why NocoDB is a no-code platform, with tools which make it easy to share spreadsheets with others (or not, via password protection).</p><p>If you are comfortable with code however, NocoDB has a few advanced features up its sleeve. Like other open-source solutions, NocoDB can be self-hosted easily, or extended further through REST APIs or an SDK. </p><h3 id="strengths-3">Strengths</h3><ul><li>No-code, built for collaboration</li><li>Strong permissioning options</li><li>Free and self-hostable</li></ul><h2 id="n8n">n8n</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-engineers/n8n-open-source.png" alt="n8n - open source automation for engineers"/></p><ul><li><strong>Useful for:</strong> Workflow automation, connecting services<br/></li><li><strong>Alternative to:</strong> Zapier, node-red <br/></li><li><strong>License:</strong> <a href="https://github.com/n8n-io/n8n/blob/master/LICENSE.md">Sustainable use license</a><br/></li></ul><p>When you need to automate work, move data between platforms, or create basic bots there are generally two options: you can create a custom solution which you’ll then need to maintain and manage… or you can use <a href="https://n8n.io/">n8n</a>. </p><p>With over 200 different integrations — or ‘nodes’, as n8n calls them — to choose from, n8n offers the best of both worlds. It’s simple enough that stakeholders can maintain workflows on a casual basis using a drag and drop UI, but powerful enough that it lets you delve into the code for more complex work. </p><p>As with most open-source solutions, n8n can be self-hosted if you need to keep sensitive workflows or data off the cloud. Best of all, <a href="/docs/apps/n8n">n8n even integrates directly with PostHog</a>!</p><h3 id="strengths-4">Strengths</h3><ul><li>200+ integrations with other platforms</li><li>Deploy in the cloud, or on your own infrastructure</li><li>Integrates with PostHog
-Simple UI for casual users; code editor for engineers</li></ul><h2 id="netdata">Netdata</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-engineers/netdata-open-source.png" alt="Netdata - open source monitoring service for engineers"/></p><ul><li><strong>Useful for:</strong> System monitoring <br/></li><li><strong>Alternative to:</strong> Datadog, Newrelic <br/></li><li><strong>License:</strong> <a href="https://github.com/netdata/netdata">GPL 3.0</a> <br/></li></ul><p>Compatible with almost any physical or virtual server, <a href="https://www.netdata.cloud/">Netdata’s</a> open-source agent enables you to collect and visualize any available metric in real time. This means you can effortlessly track over 2,000+ metrics in graphs, as well as configure 200+ alerts to notify you when something goes awry. </p><p>Going beyond this, Netdata also offers more advanced anomaly detection issues for when you really need to get into the weeds, all while making a minimal resource footprint. It’s just one of the reasons why we’re big fans of Netdata — and not just because <a href="https://learn.netdata.cloud/docs/agent/anonymous-statistics/">they use PostHog themselves</a>!</p><h3 id="strengths-5">Strengths</h3><ul><li>1ms collection-to-visualization latency</li><li>Single-line auto-deployment</li><li>Anomaly detection powered by machine learning</li></ul><h2 id="clickhouse">ClickHouse</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-engineers/clickhouse-open-source.png" alt="ClickHouse - open source database for engineers"/></p><ul><li><strong>Useful for:</strong> Database management, powering PostHog<br/></li><li><strong>Alternative to:</strong> Redshift, Bigquery, Snowflake<br/></li><li><strong>License:</strong> <a href="https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE">Apache 2.0</a><br/></li></ul><p>We’re such big fans of ClickHouse that we not only partner with the team through <a href="/marketplace">the PostHog Marketplace</a>, we also <a href="/blog/clickhouse-announcement">use it to power our own product</a>!</p><p>ClickHouse is a database system which is so quick that it’s an order of magnitude faster than other systems, such as Postgres, while also featuring a columnar structure which offers easy scaling (as long as you’re managing your tables correctly). It’s also popular with early-stage projects because of how efficient it is in terms of system resources, meaning that you can use less costly hardware and avoid more expensive software options. </p><h3 id="strengths-6">Strengths</h3><ul><li>Much faster than most other databases</li><li>Efficient use of hardware; scales horizontally</li><li>Columnar database structure; easily scales</li><li>Deployed with a single binary; no need for multiple layers</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HogMail #14]]></title><description><![CDATA[Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products…]]></description><link>https://posthog.com/blog/hogmail-14</link><guid isPermaLink="false">9d450e18-836f-55f1-b7eb-4035bfe4eefc</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 17 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hogmail.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>Welcome to HogMail, our newsletter featuring the best of the PostHog blog, tutorials, product guides, and curated articles on building great products and companies. We send it every two weeks. <a href="https://newsletter.posthog.com/subscribe">Signup here</a> so you don&#x27;t miss it.</p></blockquote><h2 id="posthog-blog">#posthog-blog</h2><p>👩‍💻 <a href="https://posthog.com/blog/rome-hackathon">All the cool things we built at our Rome hackathon</a>: Behind the scenes of the Team Product Analytics offsite in Rome, where they completed a 24-hour hackathon. Must read.</p><p>🚴‍♂️ <a href="https://posthog.com/blog/what-motivates-me">What motivates me as a CEO</a>: James shares what motivates him and how that&#x27;s changed as PostHog evolves.</p><p>🇪🇺 <a href="https://posthog.com/blog/posthog-cloud-eu">Introducing PostHog Cloud EU</a>: Big news. You can now enjoy all the awesome features of PostHog and keep your data in the EU – perfect for GDPR.</p><h2 id="tutorials-and-guides">#tutorials-and-guides</h2><p>🍪 <a href="https://posthog.com/tutorials/react-cookie-banner">Building a tracking cookies opt out banner in React</a>: How to build a cookie permission banner and handle permissions using PostHog.</p><p>⏳ <a href="https://posthog.com/tutorials/session-metrics">How to calculate session-based metrics in PostHog</a>: How to calculate average session duration, time on page, pages per session, and similar metrics in PostHog. </p><h2 id="good-reads">#good-reads</h2><p><a href="https://www.svpg.com/product-sense-demystified/">Product Sense Demystified</a> by Marty Cargan, where he argues:</p><ul><li><p>&quot;Product sense&quot; isn&#x27;t some mythical, innate talent – it comes from deep product knowledge.</p></li><li><p>You need to spend serious quality time with customers, immerse yourself in data (and your chosen industry) to acquire it.</p></li><li><p>You don&#x27;t need years in an industry to develop product sense – innovation comes from people who don&#x27;t have baggage.</p></li></ul><p><a href="https://review.firstround.com/give-away-your-legos-and-other-commandments-for-scaling-startups">Molly Graham on Scaling Startups</a> and &quot;The Phases of Scale&quot;. Takeaways:</p><ul><li><p>Companies change a lot as they scale from 30 to 50 employees (things start to get harder here) through 50 to 200 (small enough to change big things) and so on. Plan for this.</p></li><li><p>&quot;Hiring is a network effect. The first 100 people you hire will define the next 200&quot; – we believe a lot in this one. See our first five employees.</p></li><li><p>Don&#x27;t copy processes from FAANG – early startups need &quot;design principles that tell them who they are, what they like, what they want to select for, and who they want to be.&quot;</p></li></ul><p><a href="https://experimentalhistory.substack.com/p/good-conversations-have-lots-of-doorknobs">Good conversations have lots of doorknobs</a>, which makes some thought provoking points about communication:</p><ul><li><p>People (broadly) are givers or takers – &quot;Givers think that conversations unfold as a series of invitations; takers think conversations unfold as a series of declarations.&quot;</p></li><li><p>Givers tend to resent takers in conversation, but that doesn&#x27;t mean takers are villains – this is giver propaganda! Takers are vital for successful multi-person conversations (e.g. team meetings, brainstorming).</p></li><li><p>&quot;Neither givers nor takers have it 100% correct, and their conflicts often come from both sides’ insistence that the other side must convert or die.&quot;</p></li></ul><h2 id="random">#random</h2><ul><li><a href="https://h4ck1ng.google/">H4CK1NG G00GL3</a></li><li><a href="https://www.bbc.com/future/article/20221011-how-space-weather-causes-computer-errors">The computer errors from outer space</a></li><li><a href="https://github.com/dekuNukem/RGBeeb/blob/master/README.md">Pimp My Beeb (a BBC Micro inside a PC case)</a></li><li><a href="https://planetofthepaul.com/wikipedia-download-usb-flash/">How To Download All of Wikipedia onto a USB Flash Drive</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing PostHog Cloud EU]]></title><description><![CDATA[It's no secret that some popular analytics tools, such as Google Analytics, have fallen foul of GDPR regulations in the EU. That's one reason why we…]]></description><link>https://posthog.com/blog/posthog-cloud-eu</link><guid isPermaLink="false">8b8deb9d-2ad5-5522-8562-f5f7a307edd2</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Tue, 11 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-eu-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>It&#x27;s no secret that some popular analytics tools, such as Google Analytics, have fallen foul of GDPR regulations in the EU. That&#x27;s one reason why we&#x27;ve enabled users to self-host PostHog, or to anonymize user data in a way which complies with GDPR. </p><p>Today, we&#x27;re making a third option available: hosting PostHog Cloud in Europe so that user data never has to leave the EU. Now, any business which needs to comply with GDPR regulations can get up and running in a few minutes, and without the ongoing upkeep required for a self-hosted deployment. </p><p>Oh, and PostHog Cloud EU also happens to be faster for users located in Europe, which is nice. </p><p>PostHog Cloud EU offers everything you&#x27;d expect of PostHog – analytics, session recording, experiments and more. The only difference is that you can now choose to host in a different region, at no extra cost. </p><p><div></div></p><h2 id="faq">FAQ</h2><h3 id="where-are-posthog-cloud-eus-servers-based">Where are PostHog Cloud EU&#x27;s servers based?</h3><p>PostHog Cloud EU is hosted in the AWS <code>eu-central-1</code> region based in Frankfurt, Germany.</p><h3 id="what-data-is-transferred-from-the-eu-to-the-us">What data is transferred from the EU to the US?</h3><p>None. PostHog Cloud EU is an entirely independent instance of PostHog. All event data, user data, and the product itself, is hosted on our EU-based infrastructure.</p><h3 id="how-do-i-use-posthog-cloud-eu-in-compliance-with-gdpr">How do I use PostHog Cloud EU in compliance with GDPR?</h3><p>Just deploying PostHog Cloud EU isn&#x27;t enough – you still need to <a href="/tutorials/react-cookie-banner">acquire consent</a> from your users and comply with all other provisions of the GDPR, such as the right to be forgotten. Please see our <a href="/docs/privacy/gdpr-compliance">GDPR guidance</a> for more information.</p><h3 id="what-does-posthog-cloud-eu-cost">What does PostHog Cloud EU cost?</h3><p>For now, we&#x27;re charging <a href="../pricing">the same as &quot;regular&quot; PostHog Cloud</a>. The first 1 million events/month are free, then we charge monthly per event after that. <a href="https://eu.posthog.com/signup">Get started here</a>.</p><h3 id="im-an-existing-posthog-customer-can-i-migrate-to-posthog-cloud-eu">I&#x27;m an existing PostHog customer, can I migrate to PostHog Cloud EU?</h3><p>It is possible to migrate event data from another PostHog instance to EU Cloud, but it is a time-consuming process likely to take several days or weeks. There is currently no way to migrate other information, including insights, dashboards, user accounts, feature flags or API keys. </p><p>We strongly recommend that users with large volumes of data begin by setting up and connect a new EU cloud instance and only attempt to migrate data later, if needed, by following <a href="/tutorials/migrate-eu-cloud">this migration tutorial</a>. </p><h2 id="gdpr-compliance-checklist">GDPR compliance checklist</h2><p>We recommend completing the following steps to ensure GDPR compliance when using PostHog Cloud EU, but please seek out expert advice. Further GDPR advice can be found on the <a href="https://gdpr.eu/checklist/">official GDPR.eu website</a></p><ol><li><p><strong>Deploy PostHog Cloud EU:</strong> Deploying PostHog Cloud EU is easy – simply follow the steps in the onboarding process. More information is available <a href="/docs/getting-started/cloud">via our docs</a>.</p></li><li><p><strong>Review what data you&#x27;re collecting:</strong> It&#x27;s important to understand what data you&#x27;re collecting using PostHog, or any other tools you use. Please read our <a href="/docs/privacy">privacy documentation</a> and <a href="/privacy">privacy policy</a> for more information on what data PostHog collects.</p></li><li><p><strong>Update your privacy policy and terms:</strong> You must identify PostHog as a tool in your terms. When using PostHog Cloud EU, PostHog is the Data Processor and you are the Data Controller.</p></li><li><p><strong>Acquire consent from users:</strong> You must give users the option to opt out of cookies. If you don&#x27;t already do this, we&#x27;ve created a tutorial for <a href="/tutorials/react-cookie-banner">creating a simple GDPR banner using React</a>. It is also possible to run PostHog Cloud EU without cookies – see our <a href="/tutorials/cookieless-tracking">cookieless tracking guide</a>.</p></li><li><p><strong>Create &quot;right to be forgotten&quot; process:</strong> A user must be able to request that their data be removed from PostHog. How you facilitate that request is up to you. Information on how to delete user data is <a href="/docs/privacy/data-deletion">available in our docs</a>.</p></li></ol><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[5 essential tips for Customer Success teams on PostHog]]></title><description><![CDATA[While PostHog is obviously useful for product managers, engineers and analysts, there’s a lot it can do for other teams too — including customer…]]></description><link>https://posthog.com/blog/analytics-tips-for-customer-success-teams</link><guid isPermaLink="false">aa0bc208-242f-5946-a886-56500b22fc1e</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 10 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/green-blog-image.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>While PostHog is obviously useful for product managers, engineers and analysts, there’s a lot it can do for other teams too — including customer success. Internally, for example, our CS team uses PostHog to track a variety of relevant metrics and to preemptively identify organizations that would benefit from their support.</p><p>You can find out more about <a href="/handbook/people/team-structure/customer-success">how our customer success team works</a> in the PostHog docs, but in the meantime here are five tips to help <em>your</em> CS team get started with PostHog…</p><h2 id="1-use-funnels-to-find-out-where-customers-get-stuck">1. Use funnels to find out where customers get stuck</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/top-down-funnel.png" alt="Top to bottom funnels in PostHog"/></p><p>Using a combination of <a href="/docs/data/autocapture">autocapture</a> and <a href="/tutorials/event-tracking-guide#using-custom-events-to-track-advanced-behaviors">custom or calculated events</a>, PostHog makes it possible to track every part of your product experience. This makes it trivial to track where users are getting stuck by using <a href="/manual/funnels">funnel insights</a> to visualize the user journey.</p><p>At PostHog, for example, new users have to go through several common steps to be successful — they must create an account, login, ingest events and then make a discovery through an insight. Using funnels, we’re able to identify which stage users get stuck on and then monitor how successful we are in our attempts to fix the problem.</p><blockquote><p>💡<strong>PostHog Tip:</strong> Want to delve deeper into the root causes behind a drop off? Use <a href="/manual/funnels#identify-possible-causes-of-failure-and-success">breakdowns</a> to explore what groups of users have in common. </p></blockquote><h2 id="2-use-trends-to-find-out-which-features-are-popular">2. Use trends to find out which features are popular</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/posthog-trend-insight.png" alt="graph of an insight broken down by a property"/></p><p>If you, like PostHog, charge based on usage then you’ll want to keep a close eye on your usage metrics. This will both help you spot trends in declining usage so that you can react early, and also proactively reach out to customers with increasing usage too. </p><p>The simplest way to monitor usage is via a <a href="/manual/trends">trends insight</a>. Just create an insight which tracks your usage events on a reasonable timeline and you’ll be able to see how it changes over time. At PostHog, we actually monitor usage for each tool on the platform, as well as the overall events ingested — this helps us not only understand usage trends but also see which features are most popular. </p><blockquote><p>💡<strong>PostHog Tip:</strong> If you’ve only got a small number of users, your results may get swayed by internal users or test accounts. <a href="/tutorials/filter-internal-users">Here’s how to filter them out</a>.</p></blockquote><h2 id="3-use-lifecycle-charts-to-find-users-about-to-churn">3. Use lifecycle charts to find users about to churn</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/lifecycle-chart-posthog.png" alt="lifecycle chart in posthog"/></p><p>Regardless of whether or not your overall usage is growing, it’s a good idea to monitor your overall retention and identify which customers are falling dormant and are at risk of churning. The <a href="/manual/lifecycle">lifecycle insight</a> exists exactly for this purpose.</p><p>Lifecycle insights categorize users based on whether they have completed any event within a specified period of time, then compare those results to the previous interval to tell you whether they’re falling dormant, returning, resurrecting, or active. Dormant users are the ones to watch out for, as they’re showing poor engagement and are at risk of churning — just click the relevant bar on the insight to get a list of them. </p><blockquote><p>💡<strong>PostHog Tip:</strong> Curious about the difference between returning and resurrecting users? Check <a href="/manual/lifecycle#interpreting-your-lifecycle">the lifecycle docs</a> for a full explanation. </p></blockquote><h2 id="4-install-apps-to-integrate-posthog-with-your-stack">4. Install apps to integrate PostHog with your stack</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/apps-for-cs-teams.png" alt="apps for cs teams"/></p><p>We like to think PostHog works brilliantly on its own, but to get the most out of the platform you may want to connect it with other software in your stack. We have a library of over 50 apps to help you do this, so you can connect PostHog with tools such as <a href="/apps/hubspot-connector">Hubspot</a> or <a href="/apps/salesforce-connector">Salesforce</a>. </p><p>Best of all, because PostHog is entirely open source, you can build your own apps to enhance your data even further — all you need is a little Javascript or Typescript knowledge and you’re good to go!</p><h2 id="5-build-and-share-a-customer-success-dashboard">5. Build and share a customer success dashboard</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/subscribe-in-posthog.png" alt="subscriptions in posthog"/></p><p>Once you’ve built the insights you need, an essential step is adding them all to a PostHog dashboard so that you don’t need to check them one-by-one. Once you’ve pinned all your insights to a dashboard, you can easily check everything in one place and export it as an image if you need to include it in reports. </p><p>At PostHog, we’re not big fans of lengthy meetings and reports — instead, we’ve set up a subscription which sends the insights to a thread in a shared Slack channel every week. Don’t use Slack? You can subscribe by email too.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[5 analytics ideas for marketing teams using PostHog]]></title><description><![CDATA[One of the great things about PostHog is that it democratizes your product strategy by making analytics accessible to more than just analysts. There’s…]]></description><link>https://posthog.com/blog/analytics-tips-for-marketing-teams</link><guid isPermaLink="false">49972c94-36bb-57a0-9406-e5a94509d1bb</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 10 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-marketing/marketing-hog.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the great things about PostHog is that it democratizes your product strategy by making analytics accessible to more than just analysts. There’s no need for old-fashioned SQL queries or <a href="/blog/best-open-source-business-intelligence-tools">complex business intelligence tools</a> — marketing teams are empowered to get all the information they need by themselves. </p><p>Internally, <a href="/handbook/people/team-structure/marketing">our marketing team</a> uses PostHog for <a href="/blog/posthog-marketing">all their reporting</a>, as well as for running ad-hoc analysis and testing new ideas. Here are some of the tips and tricks we recommend based on their experience...</p><h2 id="1-set-up-an-aarrr-pirate-funnel">1. Set up an AARRR pirate funnel</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/aarrr.png" alt="AARRR pirate metrics"/></p><p>AARRR funnels are a framework for understanding how users engage with your product at different stages of their journey — Acquisition, Activation, Retention, Revenue, and Referral. It’s especially useful for marketers, growth teams and product marketers because it enables you to see where your biggest drop-offs are at a glance. </p><p>The AARRR framework needs to be adapted slightly for each product — acquisition in your product, for example, may be a sign-up, a pageview, or something else entirely — but all stages can be tracked in PostHog using the <a href="/manual/funnels">funnels</a> insight. We recommend creating a dashboard to help you track every stage in one place. </p><blockquote><p>💡<strong>PostHog Tip:</strong> Want to know more? Check our <a href="/blog/aarrr-pirate-funnel">complete guide to AARRR pirate funnels</a>!</p></blockquote><h2 id="2-track-campaigns-with-trend-insights">2. Track campaigns with trend insights</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/utm-tracking-in-posthog.png" alt="how to track utms in posthog"/></p><p>UTMs are an indispensable tool in the modern marketing arsenal, enabling you to track clicks by adding a customizable parameter after a URL. The URL <code>posthog.com/?utm_campaign=opensource</code> could be used in social media posts to track visits to the PostHog website via an open source campaign, for example. But how do you track these campaigns in PostHog?</p><p>The simplest way is to use a <a href="/manual/trends">trends insight</a> in PostHog that filters pageviews by a matching event property. Alternatively, you can filter pageviews by the <code>Current URL</code> event property and specify the UTM as contained in the URL. Either result gives you an effortless way to track the performance of campaigns and correlate the results with other analytics data. </p><blockquote><p>💡<strong>PostHog Tip:</strong> Trends aren’t the only way to visualize UTM performance. You can also use <a href="/manual/funnels">the funnels insight</a> to explore how users move between two events - such as viewing a landing page, and signing up. </p></blockquote><h2 id="3-watch-how-users-sign-up-with-session-recordings">3. Watch how users sign-up with session recordings</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/session-recording-posthog.png" alt="session recordings in posthog"/></p><p>You may think your sign-up flow is easy to navigate, but what really matters is what your users think. If only there was some way to watch how they use your site, so you can identify where they’re experiencing friction? Enter: <a href="/manual/recordings">session recordings</a>.</p><p>Session recordings are like a DVR of people using your product and enable you to see every mouse movement, rageclick and pause that users make on your site — all without surfacing sensitive information. Design and marketing teams at organizations such as <a href="/customers/hasura">Hasura</a> use session recordings to find ways to optimize their sites. </p><blockquote><p>💡<strong>PostHog Tip:</strong> Watching lots of recordings can be time consuming. We recommend filtering recordings to focus on key events, such as new sign-ups, to make it easier to find valuable insights. </p></blockquote><h2 id="4-understand-how-users-explore-your-site-with-paths">4. Understand how users explore your site with paths</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/paths-in-posthog.png" alt="session recordings in posthog"/></p><p>So, you know how to track performance of marketing campaigns and how to see how individual users engage with your content, but how can you get a view of the entire user journey? That’s where <a href="/manual/paths">path analysis</a> comes in. </p><p>Paths enable you to see the route every user takes between two points, as well as where they drop off or get lost. If you’ve ever wondered the route visitors take between a landing page and a successful sign-up, PostHog’s path analysis tool can give you the answer in seconds. Then, you can find ways to optimize or improve the route!</p><blockquote><p>💡<strong>PostHog Tip:</strong> Path insights in PostHog don’t have to specify both the start and endpoint. If you’re curious how users get to a specific page, for example, you can just set an endpoint to see every path users took to reach that page. </p></blockquote><h2 id="5-use-dashboards-subscriptions-to-keep-up-to-date">5. Use dashboards subscriptions to keep up to date</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/subscribe-in-posthog.png" alt="dashboard subscriptions in posthog"/></p><p>Maybe you want to share PostHog reports with the whole company, or maybe you’re just trying to cut down on time spent looking for credentials in 1Password. Either way, subscriptions are the solution. </p><p>Subscriptions are currently available via email, or Slack. In both cases, you’ll get regular updates from PostHog about each query on a dashboard so that you can see how results have changed since the last interval. Subscriptions work best for metrics you want to monitor closely over time, such as new customers or overall website traffic. </p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[5 essential PostHog apps for new users]]></title><description><![CDATA[PostHog apps are a powerful, but hard to explain part of the platform. They’re powerful because they can do almost anything — and they’re hard to…]]></description><link>https://posthog.com/blog/essential-posthog-apps</link><guid isPermaLink="false">38a34624-b196-54b7-bffb-e4360840d5ac</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 10 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog apps are a powerful, but hard to explain part of the platform. They’re powerful because they can do almost anything — and they’re hard to explain because they do almost anything.</p><p>Want to import or export data into or out of PostHog? <a href="/apps">There are apps for that</a>.
Want to enhance data by adding or removing info? <a href="/apps">There are apps for that too</a>.<br/>
Want to insert the word <code>hedgehog</code> into your personIDs randomly? There... well, there isn’t an app for that yet. <a href="/docs/apps/build">But you could build one</a>!</p><p>Not sure where to get started with apps? One easy tip is to look for connectors which enable you to sync PostHog with other tools in your stack — but otherwise here are some essential apps we recommend new PostHog users consider.</p><h2 id="1-geoip-enricher">1. <a href="/apps/geoip-enrichment">GeoIP enricher</a></h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/geo-ip.png" alt="PostHog geoip enricher"/></p><p>The GeoIP enrichment app is so useful we actually enable it by default for all new PostHog instances, meaning you won’t even need to set it up if you like the sound of it. </p><p>The GeoIP enricher does exactly what it says; adding geographic information to your PostHog data based on the user IP. This enables you to create insights which, for example, tell you where your new users are located or to correlate location with other events, such as bug reports.</p><blockquote><p>💡<strong>PostHog Tip:</strong> Don’t want to capture so much geographic information about your users? <a href="/tutorials/property-filter">You can filter out unneeded information using the property filter app too</a>.</p></blockquote><h2 id="2-zapier">2. <a href="/apps/zapier-connector">Zapier</a></h2><p>One of the advantages of PostHog’s open source approach is that, if you can’t find an app that does what you want, you can always build your own. One of the downsides though is that not everybody wants to jump in and start coding — and that’s why we built the Zapier integration.</p><p>Zapier enables you to easily and codelessly connect PostHog to over 4,000 other tools, including popular tools such as Google Sheets, Hubspot or Slack.</p><blockquote><p>💡<strong>PostHog Tip:</strong> Looking for inspiration on what to do with Zapier? Check out these tutorials on how to use Zapier to <a href="/tutorials/how-to-connect-discord-to-posthog-with-zapier">connect PostHog with Discord</a> or <a href="/tutorials/how-to-connect-posthog-and-notion-with-zapier">Notion</a>!</p></blockquote><h2 id="3-url-normalizer">3. <a href="/apps/url-normalizer">URL normalizer</a></h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/url-normalizer.png" alt="PostHog url normalizer"/></p><p>OK, so this app isn’t truly essential for all teams — but if you’re fussy about trailing slashes (or if other tools in your stack are case sensitive), the URL normalizer is a lifesaver. It enables you to customize how URLs are formatted, converting them all to lower case and stripping all trailing slashes by default. </p><p>Another reason to love the URL normalizer is that it wasn’t built by the PostHog team, but by a member of the community who was inspired by our open source approach. Big thanks to Mark Bennet for his hard work on this!</p><blockquote><p>💡<strong>PostHog Tip:</strong> Interested in seeing how this app was made? Check <a href="https://github.com/PostHog/posthog-url-normalizer-plugin">the source code</a> to get ideas about building your own apps!</p></blockquote><h2 id="4-bigquery">4. <a href="/apps/bigquery-export">BigQuery</a></h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/bigquery-export.png" alt="PostHog bigquery export"/></p><p>Exporting information from PostHog into your data warehouse (or data lake) is a common use-case for apps, which is why we have a small library of data-out apps for such platforms. Of these, BigQuery is the most popular. </p><p>The BigQuery Export sends batches of events from PostHog every 30 seconds, automatically retrying any failed exports to ensure that your data warehouse is as up-to-date as possible.</p><blockquote><p>💡<strong>PostHog Tip:</strong> Don’t store data on BigQuery? We also have export apps for platforms such as <a href="/apps/s3-export">Amazon S3</a>, <a href="/apps/google-cloud-export">Google Cloud Storage</a>, <a href="/apps/redshift-export">Redshift</a>, <a href="/apps/snowflake-export">Snowflake</a> and more!</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[5 events all teams should track with PostHog]]></title><description><![CDATA[It can be tricky to know which events you should start tracking first if you haven’t used product analytics before. That’s why we recommend using…]]></description><link>https://posthog.com/blog/events-you-should-track-with-posthog</link><guid isPermaLink="false">28a41225-2034-54d0-8c0d-7c83425ca77d</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 10 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>It can be tricky to know which events you should start tracking first if you haven’t used product analytics before. That’s why we recommend using PostHog’s <a href="/docs/data/autocapture">autocapture</a>. It&#x27;s also why we give everyone their first million events for free, every month – so you can track many of the events you need out of the box and without worrying about cost. </p><p>But what if you don’t want to use autocapture, or you’re struggling to separate the signal from the noise when it comes to which events to focus on? </p><p>This guide outlines five of the most essential events we recommend tracking with PostHog. You may need to adjust them slightly so they map to your product – a free product won’t need to track purchases, for example – but these events should be common to most organizations. </p><blockquote><p>Not sure how to start tracking a new event? Find out in our <a href="/tutorials/event-tracking-guide">complete guide to event tracking</a>. Or skip right to our guide on <a href="/tutorials/how-to-capture-events-the-easy-way">how to create new events the easy way!</a></p></blockquote><h2 id="1-pageviews">1. Pageviews</h2><p>Pageviews are the most basic, essential event you should be tracking — essentially, how many people look at an individual page. </p><p>Pageviews are foundational for a number of important queries and discoveries. You can filter by UTM, for example, to measure the performance of a marketing campaign. Or, you can look at pageviews across your documentation to see where users may need more help. You can even use the <code>initial referring domain</code> property to get a sense for where your overall traffic comes from. Either way, pageviews are an essential event to track and play nicely with other events on this list. </p><blockquote><p>💡 <strong>PostHog Tip:</strong> Pageviews are part of the Acquisition step in a traditional AARRR funnel. We recommend <a href="/blog/aarrr-pirate-funnel">creating an AARRR funnel in PostHog</a>, so you can track the whole user experience. </p></blockquote><h2 id="2-sign-ups">2. Sign-ups</h2><p>If your product includes an account creation or sign-up flow then it’s an essential event to track. If not, it’s still worth tracking whatever you’d count as an acquisition event, whether that’s an anonymous comment on your site, a new email subscription or something else entirely. </p><p>Ideally, we recommend tracking each step of the sign-up flow separately, so you can measure the flow using a funnel insight. At PostHog, for example, we track account creation and event ingestion as two distinct events even though they’re closely linked — this helps us see where drop-offs are and if we need to make improvements. </p><blockquote><p>💡 <strong>PostHog Tip:</strong> Comparing pageviews on your site with sign-ups can help you measure your overall conversion rate. Using <a href="/manual/funnels">a funnel insight</a>, for example, you can measure how people progress from your homepage, to your pricing page, to a sign-up. </p></blockquote><h2 id="3-feature-adoption">3. Feature adoption</h2><p>So, your customers have signed up. What do they do next? Answering this question is why it’s important to track feature usage, whether that constitutes a specific feature in a B2B platform or a product-discovery feature in a B2C marketplace. </p><p>Tracking feature usage enables you to see what is catching a customers’ attention and how users find value in your platform. Armed with this information you can decide where to focus your engineering efforts, what to prioritize on your roadmap and how to give users a better experience. </p><blockquote><p>💡 <strong>PostHog Tip:</strong> Want to explore which features in a B2B product are driving user retention? Use a <a href="/manual/retention">retention insight</a> to visualize which features get return users.</p></blockquote><h2 id="4-payments">4. Payments</h2><p>If your payment events are separate from your sign-up flow, you’ll need a separate event to track purchases. This can give you a clear view of revenue trends and is vital if you offer a free product tier, so you don’t get misled by surging sign-ups which don’t bring actual revenue.</p><p>Tracking payments in PostHog also enables you to calculate several important business metrics using other events on this list, including your average basket value (ABV) and average revenue per user (ARPU). For the best results, we suggest tracking each of these on a dedicated dashboard. </p><blockquote><p>💡 <strong>PostHog Tip:</strong> Curious how users behave in the lead-up to a purchase? Use your purchase event as a filter in <a href="/manual/recordings">session recordings</a> to watch videos of successful purchases (minus the payment information).</p></blockquote><h2 id="5-invitations-or-shares">5. Invitations or shares</h2><p>Most modern software products will enable users to share some part of it with their network, whether it’s by sharing content to social media or by inviting teammates to collaborate on a platform. Tracking this event in PostHog enables you to understand your word-of-mouth growth, which is one of the best ways to grow your product.</p><p>Referral events aren’t limited to just invitations and shares, however. Depending on your product you could consider product reviews as a replacement, or sharing content from your blog. If you have an incentivised referral program you can track referrals and acceptance separately in order to see if you need a better incentive.</p><blockquote><p>💡 <strong>PostHog Tip:</strong> Does this feel like a lot of events to track? Here&#x27;s <a href="/tutorials/how-to-capture-events-the-easy-way">how to create new events the easy way!</a></p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Permissions and projects in PostHog, explained]]></title><description><![CDATA[So, you’ve installed your snippet and started tracking data in PostHog. What’s next?  Before forging ahead into the heady world of  insights…]]></description><link>https://posthog.com/blog/posthog-explained-permissions-and-projects</link><guid isPermaLink="false">9407707d-a98f-5b0e-bf13-0e1da8e0cd25</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 10 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-blog-image.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>So, you’ve installed your snippet and started tracking data in PostHog. What’s next? </p><p>Before forging ahead into the heady world of <a href="/manual/funnels">insights</a>, <a href="/manual/recordings">session recordings</a>, <a href="/manual/experimentation">experimentation</a> and <a href="/manual/feature-flags">feature flags</a>, we suggest taking a second to invite your teammates to join you. After all, PostHog is better with friends and the more collaborators you have, the more value you can get from your data!</p><p><a href="/docs/settings/organizations#adding-new-members">Inviting teammates to join you</a> is easy, but because the data you’re dealing with may be sensitive it’s worth taking a second to learn about organizations, projects and user permissions first…</p><h2 id="organizations">Organizations</h2><p>Starting at the top, organizations are the highest level of abstraction within PostHog — most commonly consisting of an entire company. Everyone who uses PostHog is part of an organization, even if the organization only has one person in it. </p><p>Apart from the FOSS version, all versions of PostHog enable you to belong to and create multiple organizations. To collaborate with someone on PostHog, it’s best to invite them to join your organization. If you’ve joined multiple organizations, you can switch between them using the user setting menu accessed by clicking your profile picture in the top right corner of your PostHog instance.</p><h3 id="how-to-invite-a-colleague-to-your-organization-in-posthog">How to invite a colleague to your organization in PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/posthog-invite.png" alt="how to invite someone to posthog"/></p><p>Everyone in an organization has the ability to add new members to that organization by sending them an invitation. To send an invitation to a colleague, simply log into your PostHog instance, select your user settings by clicking your profile picture in the top right and select ‘<em>+ Invite members</em>’. We’ll send them an email automatically.</p><blockquote><p>If you haven’t configured email on your PostHog instance, you’ll need to share invite links yourself.</p></blockquote><h2 id="projects">Projects</h2><p>A step down from organizations, projects are where the real magic happens and is best defined as where PostHog groups data and queries. Any information in a project is limited to that project and can’t be accessed in another project. </p><p>Projects are also nested within organizations and, while there are several <a href="/docs/settings/projects">ways to organize projects</a>, the most common approach is to have one project per unlinked project within an organization. One exception to this however would be if you only have one product and one marketing website — in which case <a href="/blog/track-your-website-with-posthog">we recommend compiling both into a single project</a>.</p><h3 id="how-to-create-private-projects">How to create private projects</h3><p>Normally, when a user joins an organization they get access to all projects within it. But what if you want to keep some things a secret? That’s when private projects are useful. </p><p>Users with Administrator or Owner permissions can make any existing project private via the <em>’Access Control</em>’ section of ‘<em>Project Settings</em>’. </p><h2 id="user-permissions">User permissions</h2><p>In PostHog, because of the sensitive data available, not all user permissions are created equally — and when you add a new user it’s important to consider how much power you want them to have. Every user is either a <em>Member</em>, <em>Administrator</em>, or <em>Owner</em>. </p><p>Each organization can only have one owner, and new users are added as members by default.</p><table><thead><tr><th>Permission</th><th>Member (base level)</th><th>Administrator</th><th>Owner</th></tr></thead><tbody><tr><td>Viewing and querying project data</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td>Inviting new members</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td>Billing management</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td>Project creation and deletion</td><td>❌</td><td>✅</td><td>✅</td></tr><tr><td>Project settings management (incl. <a href="#private-projects">project-specific memberships</a>)</td><td>❌</td><td>✅</td><td>✅</td></tr><tr><td>Organization settings management (incl. memberships)</td><td>❌</td><td>✅</td><td>✅</td></tr><tr><td>Leaving the organization</td><td>✅</td><td>✅</td><td>❌</td></tr><tr><td>Transferring ownership</td><td>❌</td><td>❌</td><td>✅</td></tr><tr><td>Organization deletion</td><td>❌</td><td>❌</td><td>✅</td></tr></tbody></table><h3 id="how-to-alter-permissions-and-remove-users-in-posthog">How to alter permissions and remove users in PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/how-to-remove-users.png" alt="how to remove users posthog"/></p><p>Whether someone has left your (actual) organization or joined your (PostHog) organization, sometimes you’ll undoubtedly need to change access rights — or remove a user entirely. In such cases, just head to the <em>Project settings</em> page of your PostHog instance, via the main menu. </p><p>It’s worth noting that users with member-level access cannot make changes to other users and can only choose to leave an organization themselves. Deleting users entirely can only be done by those with administrator privileges, or above. </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How (and why) to track your website with PostHog]]></title><description><![CDATA[PostHog may have been built for product analytics, but that doesn’t mean you can only deploy it on your core product — you can also use it to gather…]]></description><link>https://posthog.com/blog/track-your-website-with-posthog</link><guid isPermaLink="false">f0751390-6f88-5d29-a286-478cf29cd092</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 10 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/orange-blog-image.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog may have been built for product analytics, but that doesn’t mean you can only deploy it on your core product — you can also use it to gather analytics from your marketing website too. Internally at PostHog this is exactly what we do, tracking analytics from both the product and this very website within a single project. </p><p>Using PostHog to gather analytics in this way isn’t just an excuse for us to <a href="/product-engineers/dogfooding">‘dogfood’ our own product</a>. It’s also a best practice that we strongly recommend to other organizations for several reasons...</p><blockquote><p>Want to track your website with PostHog? Check out <a href="/web-analytics">our web analytics tool</a>, or get started straight away by <a href="/docs/getting-started/install">integrating PostHog immediately</a>!</p></blockquote><h3 id="1-get-better-data">1. Get better data</h3><p>Web analytics tools, such as Google Analytics, are all well and good — but if your tracking stops as soon as a user logs in to your platform then can you really track their entire user journey? </p><p>Deploying PostHog across both your website and product enables you not only to track their entire journey, but also to unlock important insights into how your marketing site is performing. You can compare pageviews to purchases, for example, to understand your conversion rate with a <a href="/manual/funnels">funnel insight</a> — and you can use a <a href="/manual/paths">path insight</a> to visualize that journey completely.</p><p>Ultimately, PostHog can do almost everything that Google Analytics can do and more. And, speaking of Google Analytics…</p><h3 id="2-simplify-your-stack-and-get-rid-of-google-analytics">2. Simplify your stack (and get rid of Google Analytics)</h3><p>Reducing your stack can have a few overlooked benefits, including greater data consistency. No two analytics tools are the same and each can be impacted by adblockers differently – so if you’re using Google Analytics on your website and PostHog on your product then it can be tough to get comparable results.</p><p>Even if data consistency isn’t a concern, there are still plenty of reasons to consider moving away from Google Analytics. Recent GDPR rulings within the EU have bought <a href="https://isgoogleanalyticsillegal.com/">the legality of Google Analytics</a> into question, for example, and prompted many organizations to look for a self-hosted alternative. </p><p>Worried about GDPR but don’t want to self-host? We recently, we offer <a href="https://posthog.com/eu">PostHog Cloud EU</a> where all your data (and the product itself) is hosted in the EU, making it the <a href="/blog/ga4-alternatives">perfect alternative to GA4</a>.  </p><p><div></div></p><h3 id="3-session-recording-and-more">3. Session recording and more!</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/activation-checklist-images/session-recording-posthog.png" alt="session recording on posthog"/></p><p>We’ve built PostHog to be an all-in-one developer platform that, unlike tools such as Amplitude or Mixpanel, doesn’t force you to use other tools to plug feature gaps. Using PostHog across your marketing site therefore enables you to benefit from these tools, including <a href="/manual/recordings">session recording</a>, <a href="/manual/toolbar">heatmaps</a> and <a href="/apps">apps</a>.</p><p>Session recording in particular is useful on a marketing website, as it lets you filter by events to find actual recordings of users who complete certain actions. Want to literally watch how a successful lead differs from an unsuccessful one, or how users navigate your documentation? Now you can. </p><p>Apps too are an important part of the PostHog-for-websites toolkit, enabling you to shape, filter and enhance user data as it is ingested before exporting to other platforms. Marketing teams in particular can benefit from the ability to sync PostHog with other tools in their marketing stack!</p><h2 id="how-to-track-website-traffic-with-posthog">How to track website traffic with PostHog</h2><p>If you’re on board and want to move ahead with tracking your marketing site with PostHog, it couldn’t be easier. All you need to do is copy the snippet below (which is also available in the ‘<em>Project settings</em>’ of your PostHog instance) into your website’s HTML. Ideally, put it just above the <code>&lt;/head&gt;</code> tag to get the best results. </p><pre><code class="language-html">&lt;script&gt;
  !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(&quot;.&quot;);2==o.length&amp;&amp;(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(&quot;script&quot;)).type=&quot;text/javascript&quot;,p.crossOrigin=&quot;anonymous&quot;,p.async=!0,p.src=s.api_host+&quot;/static/array.js&quot;,(r=t.getElementsByTagName(&quot;script&quot;)[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=&quot;posthog&quot;,u.people=u.people||[],u.toString=function(t){var e=&quot;posthog&quot;;return&quot;posthog&quot;!==a&amp;&amp;(e+=&quot;.&quot;+a),t||(e+=&quot; (stub)&quot;),e},u.people.toString=function(){return u.toString(1)+&quot;.people (stub)&quot;},o=&quot;capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep&quot;.split(&quot; &quot;),n=0;n&lt;o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
  posthog.init(&#x27;&lt;ph_project_token&gt;&#x27;, { api_host: &#x27;&lt;ph_client_api_host&gt;&#x27;, defaults: &#x27;&lt;ph_posthog_js_defaults&gt;&#x27; })
&lt;/script&gt;
</code></pre><p>It’s worth noting that you’ll need to add this snippet to all pages you want to track, and that the snippet above uses Javascript. Don’t want to use Javascript? <a href="/docs/integrate">There are plenty of other options</a>!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[All the cool things we built at our Rome hackathon]]></title><description><![CDATA[As an all-remote team, we know how important getting together in person is (we’ve  written about this before ). Our   (plus Luke, Annika, Cory, and…]]></description><link>https://posthog.com/blog/rome-hackathon</link><guid isPermaLink="false">44408570-8ebb-5b53-8c87-3db4ef6e3610</guid><dc:creator><![CDATA[Ian Vanagas]]></dc:creator><pubDate>Thu, 06 Oct 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/planning-a-company-offsite/planning-offsite.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As an all-remote team, we know how important getting together in person is (we’ve <a href="/blog/asynchronous-remote-companies">written about this before</a>). Our <div slug="product-analytics"></div> (plus Luke, Annika, Cory, and Lottie) recently got back from an offsite in Rome – see also <a href="/blog/planning-a-company-offsite">how we plan a killer offsite in 8 weeks</a>. </p><p>The team ate a lot of pizza and gelato, refocused and aligned current work, ran 360 feedback sessions, and more (see our engineer Paul&#x27;s <a href="https://twitter.com/pauldambra/status/1576257069766037506">summary thread here</a>). On top of all of this, they had a hackathon and built a bunch of new things.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/rome-hackathon/team-rome.jpeg" alt="Team Rome"/></p><p>We are showcasing them here. Some are sneak previews, others are works-in-progress, and they’ll likely change. We wanted to give you an idea of what our team actually does at an offsite hackathon, so here&#x27;s what they built.</p><h2 id="frontend-injected-apps">Frontend injected apps</h2><p>Have you ever wanted to add floating pineapples to every page on your site? Marius worked on a way to make this dream a reality. More specifically, he built the ability to inject code into your page through <a href="/docs/integrate/client/js">posthog-js</a>.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/rome-hackathon/pineapple-mode.gif" alt="Pineapple mode"/></p><p>To do so, PostHog app developers add a <code>web.ts</code> file with the code they want to inject through PostHog into their app. This enables them to add features like notification banners and custom forms (or pineapples). </p><p>Read more details in the <a href="https://github.com/PostHog/posthog/pull/12003">PR here</a>.</p><h2 id="feedback-app">Feedback app</h2><p>As a more serious example of what the frontend injected apps look like, Marius and Luke built a feedback app.</p><p>The feedback app is injected into your site through PostHog. It can be modified quickly by changing the <code>web.ts</code> file, without having to ship changes to your site. On your site, it takes input from users and delivers responses to their own tab in PostHog.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/rome-hackathon/feedback-app.png" alt="Feedback app"/></p><p>You can find the first PR for the feedback app in <a href="https://github.com/PostHog/feedback-app/pull/1">PostHog/feedback-app pull request #1</a>.</p><h2 id="facehog-hogbook-hoggr-notifications">FaceHog (HogBook? Hoggr?) notifications</h2><p>A problem some PostHog users face is others changing their carefully crafted insights and feature flags. They can mess these up or completely ruin them, and the original creator wouldn’t have any idea. Worse still, users could delete them without notice.</p><p>To limit this happening, Paul worked on “FaceHog”, a notification log of changes to insights, dashboards, feature flags, and experiments you have created.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/rome-hackathon/facehog.gif" alt="Facehog"/></p><p>Now if your evil twin decides to change or delete your insights or roll out your feature to more people, you’ll get a notification.</p><p>You can find more of the details in the <a href="https://github.com/PostHog/posthog/pull/12037">PR here</a>. </p><h2 id="person-feed">Person feed</h2><p>The person page currently shows properties, events, session recordings, and more all in separate tabs. Michael and Cory felt it would be better to see all of that data at a glance. They designed and built the person feed to help achieve this.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/rome-hackathon/persons-feed.png" alt="Person feed"/></p><p>The person feed is a chronological feed of a person’s behavior. It amalgamates sessions, recordings, events, and properties onto one page. PostHog users can see the events that constitute a session along with a session recording if it exists. They can see the properties of the person in the sidebar as they go, giving them context on that person&#x27;s events.</p><p>Potential future improvements include pinning the most relevant property fields. This feature is still a work in progress, but you can see the <a href="https://github.com/PostHog/posthog/pull/12053">draft PR here</a>.</p><h2 id="hedgehog-mode">Hedgehog mode</h2><p>To increase the amount of fun in PostHog, Ben and Lottie worked on Hedgehog mode. Hedgehog mode spawns a hedgehog to hang out and walk around on your page. Internal testing shows it helps meet important team KPIs like increased joy, lower stress, and more hedgehog thoughts.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/rome-hackathon/hedgehog-mode.gif" alt="Hedgehog mode"/></p><p>Some day the hedgehog might help you identify popular areas and potential areas for creating actions, but for now they are just hanging out. See the <a href="https://github.com/PostHog/posthog/pull/12059">PR here</a>. </p><h2 id="takeaways">Takeaways</h2><p>One outcome of the offsite was a new focus on <a href="/teams/product-analytics#objective-1-nail-data-exploration">nailing data exploration</a>. The team felt they had good data visualization tools, but not enough for data exploration. For example, it is difficult to move quickly between different types of data (events, persons, groups), often requiring recreating the same filters for multiple queries.</p><p>Many of the projects related to this objective (on top of being fun and sparking joy).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/rome-hackathon/rome-hackathon.jpeg" alt="Rome offsite team"/></p><p>We like to be transparent with what we build. The details are found in the linked PRs as well as more expansively on the teams page in <a href="/handbook/team-structure">our handbook</a>. We do this because we value feedback a lot. For example, users have been asking for better data exploration tools, which helped it become a priority. </p><p>If you have more feedback about your use cases or what we&#x27;re planning to build, let us know on <a href="https://app.posthog.com/home#supportModal">get in touch</a> or <a href="https://github.com/PostHog/posthog/issues">raise an issue</a> on our repo.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How (and why) our marketing team uses PostHog]]></title><description><![CDATA[We learned an interesting fact recently: only 20% of our users track their marketing website  and  their product using PostHog. This is our fault. We…]]></description><link>https://posthog.com/blog/posthog-marketing</link><guid isPermaLink="false">4b3ea9c1-1e71-58be-adfc-87731af58e0a</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 28 Sep 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-marketing/marketing-hog.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We learned an interesting fact recently: only 20% of our users track their marketing website <strong>and</strong> their product using PostHog. This is our fault. We market to engineers at PostHog, so it&#x27;s not a surprise we&#x27;re less used for marketing.</p><p>But here&#x27;s another fact: all the things that make PostHog great for understanding your product also apply to your marketing website. To demonstrate, we&#x27;re sharing how we use PostHog for marketing.</p><h2 id="the-goals-of-our-marketing-team">The goals of our marketing team</h2><p>To start, let&#x27;s talk about our goals as a marketing team. In Q3 2022, these were:</p><ul><li><p>Average 420 weekly &#x27;new organization signups&#x27;</p></li><li><p>Increase Organic SEO traffic to 5,000 unique users per week</p></li><li><p>Acquire 20 new reviews on our G2 profile</p></li></ul><p>Of course, these are just top-level goals. We use PostHog to track them, but they&#x27;re the output of dozens of others. To do so, we built dashboards... lots of dashboards. </p><p>In fact, &#x27;how we use PostHog for marketing&#x27; is really a story about all the dashboards we use. Let&#x27;s start at the top.</p><h2 id="marketing-dashboard">Marketing dashboard</h2><p>Our top-level dashboard tracks our most important metrics, like &#x27;new org signups&#x27;, as well as other important top-level ones, such as &#x27;validated credit cards&#x27;. It also features a handful of circuit breaker metrics.</p><h3 id="core-kpis">Core KPIs</h3><p>This dashboard is setup in a grid with two insights per KPI – that&#x27;s key performance indicator if you don&#x27;t speak &quot;marketing&quot;. One is the total number with &#x27;compare to previous period&#x27; enabled; the second is the same metric as a weekly trend. This gives us an at-a-glance view of the top-level number, and context around peaks and troughs.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/marketing-dashboard.png" alt="marketing-dashboard"/></p><p>We look at the last 90 days by default, but you can change the date range of the whole dashboard whenever you like. We add annotations to denote important events – e.g. changes to landing page designs, or a blog article going viral.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/annotation.png" alt="annotation"/></p><p>(Seriously, people, <strong>use <a href="https://posthog.com/manual/annotations">annotations!</a></strong> It&#x27;s way easier than trying to remember the date you redesigned your pricing page six months ago.)</p><h3 id="circuit-breakers">Circuit breakers</h3><p>We like to iterate our website quickly, which often means pushing new designs live without testing. As a fallback, we track various &quot;circuit breaker&quot; metrics on our marketing dashboard, such as the conversion rate on key landing pages.</p><p>In July, for example, we discovered a tracking bug between &#x27;posthog.com&#x27; and &#x27;app.posthog.com&#x27; which caused an obvious drop in conversions. Then, in August, we introduced a new pricing page experience. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/pricing-trend.png" alt="pricing trend"/></p><p>As you can see (above), our first iteration was a pretty dramatic failure. Users visiting the pricing page and &quot;showing intent&quot; (we&#x27;ll get into what this means later) declined from ~25% down to ~10%. It was also obvious from watching session recordings that our new pricing wizard was simply confusing people.</p><p>This lead our Website &amp; Docs team to iterate several new versions, which they then tested using feature flags and experiments. Conversions have since returned to normal and we&#x27;ve simplified our pricing as a result.</p><blockquote><p>💡 <strong>PostHog Tip:</strong> Try using filters on dashboards! You can apply global filters to any dashboard based on event properties, person properties, feature flags, and cohorts. This is a great way to drill down into specific audiences (e.g. users by country, city, continent).</p></blockquote><h2 id="website-dashboard">Website dashboard</h2><p>One level below we have our main website dashboard. This is less focused on conversion metrics and more on general traffic trends across posthog.com. Here, we&#x27;re looking at things like:</p><ul><li>Total website users</li><li>Organic SEO users</li><li>Unique users reading the blog</li><li>The most read pages in each website section</li><li>A map view showing website users by country</li></ul><p>This is all straightforward stuff, but it&#x27;s still useful to us as a marketing team. Recently, for example, we identified a tutorial that was getting loads of SEO traffic but was in serious need of updating. We&#x27;ve built a <a href="/templates/website-dashboard">template for this dashboard</a> for you to use too.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/website-dashboard.png" alt="website dashboard"/></p><p>Again, we use a lot of <code># Number</code> views here combined with weekly breakdowns to add further context. The top two rows of the dashboard (pictured above) combine both to provide a quick overview of website traffic.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/section-breakdown.png" alt="section breakdown"/></p><p>Drilling further down, we breakdown the unique sessions by website section (above). Given we&#x27;re a developer tool first, our Docs pages are generally the most popular. You can do this by creating a trends insight with multiple graph series where <code>Current URL</code> contains your desired URL path.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/pages-per-session.png" alt="pages per session"/></p><p>We also track <code>sessions per user</code> and <code>pages per session</code> here using trends insights. We&#x27;re not looking to optimize these metrics, but they can be useful for comparative purposes. Here&#x27;s how to track these metrics in PostHog:</p><ol><li><p>Create a trends insight with two graph series – e.g. series &#x27;A&#x27; as unique users and series &#x27;B&#x27; as unique sessions. </p></li><li><p>Use &#x27;Formula&#x27; box under &#x27;Filters&#x27; to calculate your desired metric. In this case, <code>B/A</code> would give you &#x27;sessions per user&#x27;. </p></li></ol><p>Formulas are a great way to track all sorts of metrics, including conversion rates.</p><blockquote><p>💡 <strong>PostHog Tip:</strong> You can resize and re-arrange your dashboard by clicking on the &#x27;...&#x27; menu and clicking on &#x27;Edit layout&#x27; – you can also use the shortcut (E). We tend to use grids of smaller of insights, mainly because Charles (VP of Ops &amp; Marketing) likes it when they fit easily onto a laptop screen!</p></blockquote><h3 id="seo-performance-tracking">SEO performance tracking</h3><p>SEO is an important channel for us – it&#x27;s a signal of word of mouth growth and high intent traffic to SEO content.</p><p>As the below graphic from Google Trends shows, we&#x27;ve seen a consistent increase in brand searches (i.e. people searching for &#x27;posthog&#x27;) in 2022.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/brand-trend.png" alt="brand trend"/></p><p>(For those interested, the trend line is generated using the <a href="https://chrome.google.com/webstore/detail/google-trends-supercharge/ocmojhiloccgbpjnkeiooioedaklapap">Glimpse Chrome extension</a>. I highly recommend it!)</p><p>We use insights to help isolate the impact of our SEO content efforts from this organic word of mouth growth. For example, the insight below shows the weekly cumulative growth of all our SEO content since the beginning of the year.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/seo-article-trend.png" alt="seo article trend"/></p><p>You can get this view by selecting the &#x27;Time&#x27; option in the &#x27;Chart type&#x27; dropdown. This, combined with multiple graph series, will stack the results so you can view the cumulative trend. The &#x27;Value&#x27; chart type does the opposite.</p><p>This insight also helps identify when traffic to our SEO content is dropping off. This is normally a prompt to investigate further in SEMRush, where we track Google rankings for a few hundred different keywords. That said, a degree of fluctuation is normal, so it&#x27;s best not to overreact to a couple of down weeks, or over-celebrate a really good one.</p><h3 id="things-we-dont-measure">Things we don&#x27;t measure.</h3><p>As much as possible, we like to measure outcomes, not activity. That&#x27;s why we don&#x27;t track bounce rate, for example – it&#x27;s not a useful metric! Neither, to a lesser extent, are popular web metrics like &#x27;time on page&#x27; or &#x27;session duration&#x27;. Unless you&#x27;re a social network or publisher, what does the time someone spends on your website actually tell you? Nothing, so we don&#x27;t measure it. Instead, we measure outcomes, which is what our next dashboard is all about.</p><p><div></div></p><h2 id="content-marketing-effectiveness">Content marketing effectiveness</h2><p>This dashboard dives deeper into the impact of specific pages. It&#x27;s built around a metric we call &#x27;Showed Intent&#x27;, though you could rename this &#x27;Engaged Users&#x27; or something you prefer. </p><p>Let&#x27;s dig into it a little more.</p><h3 id="what-is-showed-intent">What is &#x27;Showed Intent&#x27;?</h3><p>In a nutshell, &#x27;Showed Intent&#x27; applies to any user who triggers an event we know indicates genuine interest in the product. These are things like:</p><ul><li>Visiting the <a href="https://app.posthog.com/signup">PostHog Cloud signup page</a></li><li>Visiting the <a href="https://license.posthog.com/">self-host license page</a></li><li>Visiting the <a href="/docs/self-host">self-host section</a> of our docs</li><li>Booking a demo.</li></ul><p>We track these by using an &#x27;action&#x27; – a way of combining similar events into single event you can use in insights. You can create actions <a href="/tutorials/toolbar">using the PostHog Toolbar</a> or via the Data Management tab in PostHog – it&#x27;s dead easy.</p><p>Why do we use this and not just signed up users? There are a few good reasons:</p><ol><li><p>Open source users don&#x27;t trigger a sign-up event.</p></li><li><p>Signups are a much smaller number compared to total website visitors, making it hard to generate useful insights.</p></li><li><p>A user&#x27;s consideration period can be several weeks or months, so the actual conversion event often falls outside the tracked period, or isn&#x27;t easily attributed.</p></li><li><p>Even a user who doesn&#x27;t end up signing up to PostHog might suggest it to a friend or colleague.</p></li></ol><h3 id="content--intent--effectiveness">Content + intent = effectiveness</h3><p>The &#x27;Showed Intent&#x27; action allows us to create funnel insights like the one below. It shows the percentage of all blog readers who &#x27;Showed Intent&#x27;.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/blog-funnel.png" alt="blog funnel"/></p><p>But... hold-up-a-minute, 3.5% seems like a very low number doesn&#x27;t it? Fret not, this is why we also have a second insight on our dashboard showing the historical trend, see below.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/historical-trend.png" alt="historical trend"/></p><p>That massive dip? It&#x27;s when &#x27;<a href="/blog/what-to-ask-in-interviews">The really important job interview questions engineers should ask (but don&#x27;t)</a>&#x27; went massively viral, generating upwards of 100k users to the blog. Few of those 100k users came to consider PostHog as a product (which is fine), but it&#x27;s a good reminder of why you should always check these things.</p><p>Beyond this top-level metric, the Content Marketing Effectiveness dashboard (yes, it is a long-winded name!) allows us to compare the influence of different articles and content formats. Let&#x27;s look at some examples.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-marketing/os-session-recording.png" alt="session funnel"/></p><p>Above is a funnel analysis for one of our most successful blog posts, a guide to <a href="/blog/best-open-source-session-replay-tools">open-source session recording tools</a>. It converts to intent at nearly 23%, which is awesome.</p><p>At other end of the spectrum, we have our guide to <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR-compliant analytics tools</a>. It only converts 6.3% of the time – perhaps the launch of <a href="https://eu.posthog.com/signup">PostHog Cloud EU</a> will increase that figure? 🤔</p><p>Comparison articles, such as <a href="/blog/posthog-vs-amplitude">PostHog vs Amplitude</a> convert very well – in the region of 25%. This makes sense given people coming into these articles are already in a consideration phase, but the confirmation is useful. We also use these insights to compare similar articles.</p><p>Overall, these are the kinds of insights that help us inform our content and SEO priorities, which is hugely important given we&#x27;re a small team. We have a nearly identical dashboard for tracking the impact of <a href="/customers">customer stories</a>, too.</p><blockquote><p>💡 <strong>PostHog Tip:</strong> Try experimenting with funnels insights. In addition to the default conversion steps graph, funnels can also be viewed as an historical trend graph and by &#x27;time to convert&#x27;.</p></blockquote><h2 id="how-did-we-do-in-q3">How did we do in Q3?</h2><p>So that&#x27;s how we use PostHog in our marketing team, but how did we do in Q3? </p><p>Overall, pretty well. Most pleasingly, we smashed our target 420 weekly new org. signups – we consistently hit over 450 per week in August and had our first 500+ week in September.</p><p>Progress on our organic SEO target (5,000 weekly users) has been steady rather than spectacular. We were at ~4,000 per week in July and have been hovering around the 4,700 mark until recently, where we hit 5,200 in a week. Time will tell if this trend will hold.</p><p>We achieved 14 of the 20 G2 profile reviews we aimed for in Q3 with an average score of 4.4. Not bad.</p><h2 id="whats-next">What&#x27;s next?</h2><p>We&#x27;re currently reviewing our objectives for Q4, but we&#x27;re also looking to make improvements to what and how we track our marketing efforts.</p><h3 id="quality-signals-for-new-users">Quality signals for new users</h3><p>We&#x27;re currently working on a process for &quot;quality scoring&quot; signups. </p><p>Our favored solution is based on <a href="/newsletter/ideal-customer-profile-framework">an Ideal Customer Profile</a> (ICP) score created by our customer success team. Once we&#x27;ve got the process nailed, it&#x27;ll give us a much better picture of which channels are most valuable to us. </p><p>We&#x27;re also considering several other supporting signals, such as new users who ingest events or invite colleagues. We&#x27;re still debating the best approach here.</p><h3 id="improving-how-we-track-attribution">Improving how we track attribution</h3><p>Until recently, we weren&#x27;t focused on attribution outside of UTM parameters on our paid marketing activities. Marketing attribution is notoriously hard, so we felt our time and energy was better spent elsewhere. That said, it&#x27;s becoming more important as we scale.</p><p>We recently started collecting more information from users at signup – we&#x27;ve added an optional text field where people can tell us where they heard about us. We collect this data in PostHog, and manually export it for analysis. It&#x27;s not the most automated process ever, but it&#x27;s a start and something we&#x27;ll evolve over time. </p><h3 id="marketing-experiments">Marketing experiments</h3><p>Thus far, we&#x27;ve focused on content and developing marketing channels that work. Eventually, we&#x27;ll need to spend more time on website optimization and experimentation. We&#x27;re not there yet, and we&#x27;re wary of over optimization, but we have all the tools we need when we need them. </p><h2 id="final-thoughts">Final thoughts</h2><p>In summary, there are a few important reasons why we use PostHog instead of traditional marketing tools:</p><ol><li><p><strong>It does (almost) everything already:</strong> Outside of a few edge cases, PostHog already does 95% of what we need. If (and when) we need more, we&#x27;ll make the case for building that functionality, rather than resorting to some other tool.</p></li><li><p><strong>We&#x27;re interested in outcomes, not activity:</strong> We want to know &quot;how does x impact y&quot; and why, not just &quot;how many people did x or y&quot;. This is where traditional marketing tools fall short. No marketing platform lets you go from viewing a funnel to watching session recordings of real users on your website.</p></li><li><p><strong>It eliminates guesswork:</strong> Intuition and speculation have their place, but there&#x27;s nothing more satisfying than knowing exactly why something is happening <strong>and</strong> having the tools to rectify the problem.</p></li></ol><p>We hope this look at how we use PostHog will inspire you (and your marketing teams) to experiment with what&#x27;s possible in PostHog. If you found this useful, here&#x27;s some suggested further reading:</p><ul><li><p><a href="/newsletter/seo-for-startups">Non-obvious SEO advice for startups</a>: Some more in-depth SEO advice based on our experience growing PostHog.</p></li><li><p><a href="/tutorials/toolbar">Using the PostHog Toolbar to visualize behavior and create actions</a>: The PostHog Toolbar is a useful way to understand how users interact with your website. You can also use it to create actions.</p></li><li><p><a href="/tutorials/performance-marketing">How to track performance marketing</a>: An in-depth guide to tracking signups and conversions from different marketing channels.</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.40.0: Interface improvements and more!]]></title><description><![CDATA[Want to know more about what we're up to?  Subscribe to our new newsletter , which we send once every two weeks! Running a self-hosted instance? Check…]]></description><link>https://posthog.com/blog/the-posthog-array-1-40-0</link><guid isPermaLink="false">d3e0e511-0b11-5475-8db0-6c3628c49526</guid><pubDate>Mon, 26 Sep 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</p><blockquote><p>Running a self-hosted instance? Check out our <a href="/docs/runbook/upgrading-posthog">guide to upgrading PostHog</a>.</p></blockquote><h2 id="posthog-1400-release-notes">PostHog 1.40.0 release notes</h2><p><strong>Release highlights:</strong></p><ul><li>New: <a href="#new-redesigned-calendar-and-date-components">Redesigned calendar and date components</a></li><li>New: <a href="#new-overhauled-annotations">Overhauled annotations</a></li><li>New: <a href="#new-revamped-persons-modal">Revamped persons modals</a></li><li>New: <a href="#new-recordings-domain-settings">Recordings domain settings</a></li><li>Improved: <a href="#improved-retention-insight-update">Retention insight update</a></li></ul><h3 id="new-redesigned-calendar-and-date-components">New: Redesigned calendar and date components</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-40-0-lemon-calendar.png" alt="lemon calendar"/></p><p>The 1.40.0 update is all about visual polish, and we&#x27;re starting with new calendar and date components. These are some of the most used modals in PostHog, so we&#x27;ve given careful attention to providing an improved and more unified experience.</p><h3 id="new-overhauled-annotations">New: Overhauled annotations</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-40-0-annotation-modal.png" alt="annotation"/></p><p>We&#x27;ve overhauled <a href="/manual/annotations">annotations</a> with a new look and interface. This change resolves several layout and interaction issues that had previously been impacting annotations. We&#x27;ve also touched up the annotations page to highlight important information better!</p><h3 id="new-revamped-persons-modals">New: Revamped persons modals</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-40-0-person-modal.png" alt="person modal"/></p><p>Clicking datapoints in an insight is one of our favorite ways to analyze the users behind the numbers. The new person modal now looks and feels like the rest of the app. We&#x27;ve made it easier for you to search and perform actions on those lists of users, too.</p><h3 id="new-recordings-domain-settings">New: Recordings domain settings</h3><p>Struggling with keeping toolbar and recordings settings separate? Us too... That&#x27;s why the settings for managing valid domains for recordings and toolbar are now split, so that they can be adjusted independently!</p><h3 id="improved-retention-insight-update">Improved: Retention insight update</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1-40-0-retention.png" alt="retention insight"/></p><p>Once again, we&#x27;ve cleaned up the UI on the retention insight to keep up with all the styling updates we&#x27;ve had across the board. The end result is more consistent with the rest of our product, with lots of little touches which add visual flair and create an improved experience.</p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>Version 1.40 also adds hundreds of other improvements and fixes, including...</p><ul><li><strong>Improvement:</strong> Filters for test and internal users can now be set to apply on all new insights (<a href="https://github.com/PostHog/posthog/pull/11589">#11589</a>)</li><li><strong>Improvement:</strong> Event volume and query counts are now emphasized in data management (<a href="https://github.com/PostHog/posthog/pull/11806">#11806</a>)</li><li><strong>Improvement:</strong> Profile pictures now will show more information on hover (<a href="https://github.com/PostHog/posthog/pull/11849">#11849</a>)</li><li><strong>Fix</strong>: Fixed an issue where group properties weren&#x27;t showing up on search previously (<a href="https://github.com/PostHog/posthog/pull/11813">#11813</a>)</li><li><strong>Fix</strong>: Fixed an issue that was causing property statistics to be calculated infrequently (<a href="https://github.com/PostHog/posthog/pull/11815">#11815</a>)</li></ul><p>View the commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.39.0...release-1.40.0"><code>release-1.39.0...release-1.40.0</code></a>.</p><h2 id="give-us-your-feedback">Give us your feedback</h2><p>We’re always working on improving PostHog and would love to talk to you! Please <a href="https://calendly.com/posthog-feedback">schedule a 30 minute call</a> with one of our Product, Engineering, or Marketing team members to help us understand how to improve. As a thank you for your time, we&#x27;ll be giving away awesome <a href="https://merch.posthog.com">PostHog merch</a>!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li><a href="https://github.com/bobeagan">bobeagan</a> for correcting a documentation typo.</li><li><a href="https://github.com/iamwacko">iamwacko</a> for fixing an OpenSSL dependency issue. </li><li><a href="https://github.com/Thebigbignooby">Thebigbignooby</a> for correcting an error in our documentation.</li><li><a href="https://github.com/klamas1">Klamas1</a> for adding nodeSelector and tolerations to hooks. </li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="https://posthog.com/careers/product-designer">Product Designer</a></li><li><a href="https://posthog.com/careers/senior-data-engineer">Senior Data Engineer</a></li><li><a href="https://posthog.com/careers/site-reliability-engineer-kubernetes">Site Reliability Engineer - Kubernetes</a></li><li><a href="https://posthog.com/careers/full-stack-engineer">Full Stack Engineer</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. Don’t see a specific role listed? That doesn&#x27;t mean we won&#x27;t have a spot for you. <a href="mailto:careers@posthog.com">Send us a speculative application!</a></p><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog goodness!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Benchmarking the impact of session recording on performance]]></title><description><![CDATA[The 2010s were marked by an explosion of tools focused on data. One of the biggest was session recording – a screen-recording-like service that…]]></description><link>https://posthog.com/blog/session-recording-performance</link><guid isPermaLink="false">2ea133a1-1e06-5f49-aa5d-53fa4b9ca346</guid><dc:creator><![CDATA[Mathew Pregasen]]></dc:creator><pubDate>Wed, 31 Aug 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/session-recording-performance/session-recording.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The 2010s were marked by an explosion of tools focused on data. One of the biggest was session recording – a screen-recording-like service that tracked a user’s activity. Typically, session recording (SR) was popular with marketers and product managers as a tool to learn more about a user’s experience. </p><p>Today, SR is implemented across the internet, prompting various <a href="https://blog.count.ly/the-dark-truth-behind-session-recording-339da48b0cae">privacy and ethical questions</a> alongside some tricky <a href="https://www.techrepublic.com/article/session-replay-scripts-are-disrupting-online-privacy-in-a-big-way/">technical problems</a>. </p><p>One issue that’s been elusive is performance. Most SR providers will pledge that their products do not impact page performance whatsoever! But, I bet your gut says it does, even if your (hopefully) seamless online experiences contradict that. </p><p>Today, we are going to scientifically explore if session recording impacts browser performance.</p><blockquote><p>Mathew Pregasen is an author and coder who works with early-stage startups. He was formerly CEO &amp; Co-Founder of Quickcard (YC W20).</p></blockquote><h3 id="a-grounding-rule-there-is-no-such-thing-as-no-impact">A grounding rule: there is no such thing as no impact.</h3><p>Some products in the SR space will boast that their platform incurs no performance impact. While these claims are presumably without malicious intent, it’s important to differentiate between <strong>no performance impact</strong> and <strong>trivial performance impact</strong>. </p><p>Any script, no matter how lightweight, incurs <em>some</em> performance hit. The browser has to expend some (i) CPU and some (ii) Memory. And in the case of analytics software, some (iii) Network Bandwidth. </p><p>What matters is if the user can <em>notice</em> the performance hit. Paul Buchheit, the inventor of Gmail, famously <a href="https://matthieuoger.com/2020/05/the-100ms-rule/">claimed</a> that interactions under 100ms are magic, while anything slower are sluggish. It’s an imperfect law, but serves as a decent heuristic. If a third-party script turns 90ms interactions into 110ms interactions, that’s noticeable. But 90ms to 92ms? That’s nothing.  </p><h3 id="a-little-history-lesson">A little history lesson</h3><p>How does SR work? One might initially guess that the browser’s screen-share APIs play a role. Now, if you’ve ever shared your screen on a conference call, you’re likely familiar that screen-share compels your computer’s fan to purr like a turbine. Why? Because the screen-share API is trying to capture the <em>visual</em> pixels. Expensive work. </p><p>Instead, SR uses DOM mutations – deltas at the HTML-level, instructions the browser needs to render, not the render itself. Specifically, SR was made possible in 2012 when the MutationObserver API was added to modern browsers, starting with Chrome 18.</p><p>Prior to the Mutation API, modern browsers had MutationEvents. When a button changed color, that was a MutationEvent. When a node was removed, that was a MutationEvent. Unfortunately, MutationEvents were slow – every single tiny, itsy-bitsy change fired a MutationEvent at every parent node. In the 2000s, SR would’ve been impossibly slow. </p><p>The <a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver">MutationObserver API</a> has a different approach. It batches node changes and dispatches a joint notification whenever it has capacity to. </p><p>After Chrome 18 was released, commercial products such as <a href="https://fullstory.com">FullStory</a> (2014), <a href="https://heap.io">Heap</a> (2013), and <a href="https://hotjar.com">Hotjar</a> (2014) flooded the market, offering a solution that boasted crisper granularity over old analytics software like Google Analytics. </p><p>Platforms like <a href="https://posthog.com">PostHog</a>, which champion open-source, community driven software, are the latest evolution in this vertical. </p><h3 id="how-session-recording-works-in-posthog">How session recording works in PostHog</h3><p>PostHog is open source and is therefore transparent on its session recording implementation. PostHog’s frontend client, <a href="https://github.com/PostHog/posthog-js">posthog.js</a>, checks if session recording is enabled by the user; if so, it calls <strong>recorder.js</strong> from the PostHog host, which is a minified script of <a href="https://github.com/rrweb-io/rrweb">rrweb</a>, an open source SR library.</p><p>According to PostHog’s <a href="https://github.com/rcmarron">Rick Marron</a>, rrweb takes a DOM snapshot after initialization, then relies on the MutationObserver API to track future events. It only resorts to taking another DOM snapshot if there has been inactivity for over 30 minutes or the tab changes. </p><p>In this setup, there are <em>three</em> possible impacts of SR: (i) CPU performance, (ii) memory bandwidth, and (iii) network bandwidth. For SR, (ii) and (iii) are far more relevant – CPU is hardly impacted by JS-level subroutines and more user interactions; however, SR is a data product that’s relayed over the internet. </p><h2 id="testing-session-recording-performance">Testing session recording performance</h2><p>Candidly, there is no perfect way to measure this. </p><p>Websites with deep DOM trees may incur a bigger performance hit from SR than others; performance hits on the Google homepage will dramatically differ from Neopet’s GUI mania. Given the popularity of session recording in SaaS products, we’ll investigate SR’s impact on various components of a typical SaaS website. </p><p>To simulate and measure the performance impact in the real world, I partnered with <a href="https://brevy.com">Brevy</a>, <a href="https://commandbar.com">CommandBar</a>, and <a href="https://explo.co">Explo</a>. Specifically, we implemented PostHog in Brevy’s internal app codebase, CommandBar’s Ghost/NextJS-powered <a href="https://commandbar.com/blog">blog</a>, and Explo’s React-engineered <a href="https://app.explo.co/home">auth page</a>.</p><h3 id="memory-short-term">Memory: Short Term</h3><p>Given SR begins with an initial snapshot of the DOM tree, I first wanted to judge if SR impacts memory at the beginning of a user’s journey. Using Chrome’s built-in developer-tools, I examined on Posthog’s SR impacted the memory heap. </p><p>For each tool, the beginning of a user’s journey was slightly different: </p><ul><li>For Brevy, a platform to manage corporate blogs, that meant starting a new post.</li><li>For CommandBar’s blog, that meant opening a new post.</li><li>For Explo’s auth page, that meant focusing on the first-name field.</li></ul><p>In all three cases, MutationObserver, Mutation ObserverRegistration, and all relevant subroutines <em>reportedly</em> had... <em>drumroll</em> 0% impact on memory. Of course, that’s Chrome’s rounding. We can see the exact byte usage below: </p><p><strong>Simple Load: Brevy</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-30_at_10.30.24_PM.png" alt="simple load brevy"/></p><p><strong>Simple Load: Commandbar</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-30_at_11.07.36_PM.png" alt="simple load commandbar"/></p><p><strong>Simple Load: Explo</strong> </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-31_at_12.11.19_AM.png" alt="simple load explo"/></p><blockquote><p><strong>Shallow Side</strong> is an object’s size. </p><p><strong>Retained Size</strong> measures the cumulative size of an object and all objects it actively references and is more relevant when measuring an object’s heap impact.</p></blockquote><p>Quite obviously, MutationObserver made near-zero impact. For reference, Commandbar’s total heap was over 60,000,000 bytes (60MB) large. That makes MutationRecord’s footprint a … <strong>+0.00043%</strong> addition to memory. <strong>Nothing</strong>. </p><h3 id="memory-long-term">Memory: Long Term</h3><p>Now, let’s examine rolling use. Remember, session recordings grow with time. I re-ran each trial but with 120 seconds of active use per product. The results were … <em>drumroll</em> … the same. Roughly, at least. </p><p><strong>Long Trial: Brevy</strong> </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-30_at_10.32.07_PM.png" alt="long trial brevy"/></p><p><strong>Long Trial: Commandbar</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-30_at_11.11.28_PM.png" alt="long trial commandbar"/></p><p><strong>Long Trial: Explo</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-31_at_12.12.29_AM.png" alt="long trial explo"/></p><p>If you dig into the numbers, you’ll notice that there was a slight increase across the board. But just <em>slight</em>. Why? The deltas for MutationObserver are small, compressed representations of changes in the DOM tree. Even with heavy use, the allotted space barely moves. MutationObserver remains in zero-point-zero-zero territory. </p><blockquote><p><strong>Verdict:</strong> MutationObserver has <strong>no</strong> discernible impact to page memory.</p></blockquote><h3 id="network-transmission">Network: Transmission</h3><p>Network is the bigger metric to interrogate. After all, computers are faster, memory is cheaper, but bad internet is still… pretty damn common. How badly does session recording impact your internet speed? </p><p>Let’s take a look at the Network tab on all three apps. </p><p><strong>Network Tab: Brevy</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-31_at_1.45.10_AM.png" alt="Average Packet Size: 310 bytes"/></p><p>Note, the package size (~310 Bytes) is mapping to the response, not the initial payload. </p><p><strong>Network Tab: Commandbar:</strong> </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-30_at_11.14.03_PM.png" alt="Average Packet Size: 309 bytes"/></p><p><strong>Network Tab: Explo:</strong> </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-31_at_12.12.48_AM.png" alt="Average Packet Size: 309 bytes"/></p><p>All of the gzip-compressed transmissions? That’s <strong>rrweb</strong> / <strong>PostHog</strong> relaying the mutation data to a PostHog host for storage.</p><p>You will notice two things:</p><ol><li><p>These packets receive only a tiny acknowledgment response.</p></li><li><p>These packets are transmitted often. Very, very often.</p></li></ol><p>The bigger question is the packet’s <strong>payload</strong>. While there wasn’t too much deviation, Brevy’s SR featured the largest packets over Explo and Commandbar’s. Let’s dig into them: </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-31_at_1.43.49_PM.png" alt="Screen Shot 2022-08-31 at 1.43.49 PM.png"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-31_at_1.46.43_PM.png" alt="Screen Shot 2022-08-31 at 1.46.43 PM.png"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-31_at_1.46.52_PM.png" alt="Screen Shot 2022-08-31 at 1.46.52 PM.png"/></p><p>I sampled 10 requests, which featured an average payload size of 2,799 bytes, the range spanning 457 bytes to 12,772 bytes. Predictably, the larger requests correlate to bigger changes in the DOM; smaller packets relay tiny things like a button’s changed state. </p><p>There was <strong>one</strong> notable exception – the 2nd packet, which transfers the initial snapshot of the page’s DOM. It transferred <strong>269,358 bytes</strong>, which is... tiny, in the realm of the media-rich internet. </p><p>Let’s dig into the actual timing around one of these requests. All featured a similar breakdown to the CommandBar below:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/session-recording-performance/Screen_Shot_2022-08-30_at_11.14.35_PM.png" alt="One of the packets from a CommandBar trial. "/></p><blockquote><p><strong>Queuing:</strong> How long it took to add the request to the request queue.</p><p><strong>Stalled:</strong> How long the request waited in the queue before being dispatched, either due to other higher priority requests or the CPU being idle. </p><p><strong>Request sent:</strong> How long it took to send the request </p><p><strong>Waiting for server response:</strong> How long it took for the server, in this case <a href="http://app.posthog.com">app.posthog.com</a>, to reply over the internet. </p><p><strong>Content Download:</strong> How long after the initial packet did it take to download the response, in this case, an acknowledgement of receipt.</p></blockquote><p>Remember that these requests are dispatched asynchronously, so the leading contributor to the request speed – the ~40ms wait from <a href="http://app.posthog.com">app.posthog.com</a> – isn’t blocking the page from operating. For the <em>most part</em>. </p><p>Technically, <a href="https://blog.bluetriangle.com/blocking-web-performance-villain">Chrome only permits 10 parallel connections</a> at once. Imagine <strong>three</strong> SR requests were dispatched in parallel (which appears to happen on rare occasion). By extension, only <strong>seven</strong> other requests can be made during that (very short) period. </p><p>So, hypothetically, there <em>is</em> a performance impact. A ~44ms wait is long enough to break Paul Buchheit’s earlier UI/UX test. But why aren’t I fretting over this? Because this performance hit only happens if the following conditions are met:</p><ul><li>Multiple SR requests were made in parallel</li><li>The page needed to make 8+ additional requests at the same time</li><li>The request(s) that were delayed actually impact the user’s interactions.</li></ul><p>Practically... this (almost) never happens. A lot of coincidence has to happen for SR to actually clog the pipes. More often, you’ll attribute a slow load or sluggish action to your mediocre WiFi router, and you would be likely right. </p><blockquote><p><strong>Verdict:</strong> Session Recording <strong>might rarely</strong> impact browser network performance. But for all practical purposes, <strong>it does not</strong>.</p></blockquote><h2 id="conclusion">Conclusion</h2><p>Session Recording – despite the perceived intensity of the data captured – has no discernible impact on your browser’s performance. This is entirely thanks to the MutationObserver API, introduced in 2012 underneath Anne van Kesteren, Aryeh Gregor, Ms2ger, Alex Russell, and Robin Berjon. </p><p>Marketers and product managers can continue to enjoy the benefits of Session Recording while remaining confident that their app’s performance isn’t suffering.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.39.0: Betas, persons, events and libraries]]></title><description><![CDATA[PostHog 1.39.0 introduces a new beta for you to try, a new display chart and big improvements to our client libraries.]]></description><link>https://posthog.com/blog/the-posthog-array-1-39-0</link><guid isPermaLink="false">e95ea322-aa25-5ab0-9793-bdacabafa468</guid><pubDate>Mon, 29 Aug 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</p><blockquote><p>Running a self-hosted instance? Check out our <a href="/docs/runbook/upgrading-posthog">guide to upgrading PostHog</a>.</p></blockquote><h2 id="posthog-1390-release-notes">PostHog 1.39.0 release notes</h2><p><strong>Release highlights:</strong></p><ul><li><a href="#Beta-improving-query-performance-by-combining-persons-and-events">Beta: Improving query performance by combining persons and events</a></li><li><a href="#new-added-features-for-client-and-server-side-libraries">New: Added features for client and server-side libraries</a></li><li><a href="#new-expo-compatible-react-native-library">New: Expo-compatible React Native library</a></li><li><a href="#new-format-your-insights-to-show-durations">New: Format your insights to show durations</a></li><li><a href="#new-big-bold-number-chart-type">New: Big, bold number chart type</a></li><li><a href="#new-choose-attribution-touchpoint-when-breaking-down-funnels">New: Choose attribution touchpoint when breaking down funnels</a></li><li><a href="#improved-turbo-properties">Improved: Turbo properties</a></li><li><a href="#improved-history-log-now-shows-changes-to-insights">Improved: History log now shows changes to insights</a></li><li><a href="#apps-census-integration">Apps: Census integration</a></li></ul><h3 id="beta-improving-query-performance-by-combining-persons-and-events">Beta: Improving query performance by combining persons and events</h3><p>We&#x27;re getting ready to make a substantial change to the way <a href="/manual/persons">persons</a> and <a href="/manual/events">events</a> work by essentially combining them and adding person ids and properties <em>onto</em> events. 1.39.0 gives you the chance to try the feature ahead of the full release. Here&#x27;s how:</p><ul><li><strong>PostHog Cloud:</strong> No action is needed, as we&#x27;re rolling this test out steadily behind a feature flag. If you&#x27;re eager to be included from the start, <a href="https://app.posthog.com/home#supportModal">let us know</a> to see about joining our beta group.</li><li><strong>Self-hosted users:</strong> First, you need to <a href="/docs/runbook/async-migrations">run async migration number 0006</a>. Afterwards, change your <code>PERSON_ON_EVENTS_ENABLED</code> <a href="/docs/self-host/configure/instance-settings">instance setting</a> to <code>true</code>. As with other instance settings, you&#x27;ll need to be <a href="/docs/self-host/configure/instance-settings#staff-users">a Staff user</a> to make changes.</li></ul><p>Why are we doing this? Firstly, it makes queries significantly faster because we no longer have to join tables to get a result; we can just look up everything in the events table instead. One query in our internal tests showed a 400x increase in speed...but this beta will help us understand the improvement in real-world conditions. </p><p>Secondly, feedback showed that users weren&#x27;t able to create queries based on person properties at the time of an event. By putting person properties on events, this becomes the new default, while still enabling you to filter insights based on the latest properties using cohorts. </p><p>There&#x27;ll be some slight changes to how filtering by unique users or person properties work as a result of this change. For more information on this and to find out how we&#x27;ve implemented the change behind the scenes, check out our <a href="/docs/architecture/ingestion-pipeline">overview of the ingestion pipeline</a>.</p><h2 id="new-added-features-for-client-and-server-side-libraries">New: Added features for client and server-side libraries</h2><p>While we continue to recommend using Javascript if possible, we&#x27;ve made significant updates to our other client libraries so that Android, iOS, Flutter and React Native now all support feature flags. </p><p>We&#x27;ve also updated our server-side libraries with local feature flag evaluation. This is huge because you can now use feature flags in your backend without worrying about latency. Evaluating locally reduces the computation time from an average of 400ms to 10ms!</p><p>Check <a href="/docs/integrate/libraries">our library docs</a> to find out more about what each library supports and how to deploy.</p><blockquote><p>Want to upgrade your libraries? The minimum version requirement is <a href="/blog/the-posthog-array-1-38-0">PostHog 1.38.0</a></p></blockquote><h3 id="new-expo-compatible-react-native-library">New: Expo-compatible React Native library</h3><p>We&#x27;ve rewritten the React Native library completely, in Typescript. That brings it up to a 2.0 which has no external iOS or Android library dependencies and is fully <a href="https://expo.dev/">expo-compatible</a>. The upgraded library now support PostHog <a href="/docs/integrate/client/react-native">autocapture</a>, as well as the <a href="/manual/feature-flags">feature flags</a> and <a href="/manual/group-analytics">group analytics</a> upgrades mentioned above.</p><blockquote><p>Want to upgrade your library? The minimum version requirement is <a href="/blog/the-posthog-array-1-38-0">PostHog 1.38.0</a>. Check the <a href="/docs/integrate/client/react-native">React Native library docs</a> for more info.</p></blockquote><h3 id="new-format-your-insights-to-show-durations">New: Format your insights to show durations</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array-1.39.0/duration-formatting.gif" alt="formatting an insight as a duration"/></p><p>Do your event properties contain milliseconds or seconds? Then you can now make things easier by changing your Y-axis unit to show durations instead of the default <code>none</code>. It&#x27;s a small addition, but one which makes insights much easier to read and share with others.</p><h3 id="new-big-bold-number-chart-type">New: Big, bold number chart type</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array-1.39.0/big-number.png" alt="the big bold number insight formatted as a duration"/></p><p>This new, much requested and <em>very</em> exciting big bold number insight type does exactly what it says: simplifies a query result down to a single number. And it works great with durations too!</p><h3 id="new-choose-attribution-touchpoint-when-breaking-down-funnels">New: Choose attribution touchpoint when breaking down funnels</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array-1.39.0/attribution-touchpoint.png" alt="the attribution touchpoint selection menu"/></p><p>When adding breakdown by property to a funnel you can now choose where the property can appear in the funnel of events. Before this the property had to appear on the first event. <a href="https://posthog.com/manual/funnels#choosing-breakdown-property-behavior">Learn more in our docs</a>.</p><h2 id="improved-new-person-deletion-flow">Improved: New person deletion flow</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array-1.39.0/person-deletion.png" alt="delete karl oh no"/></p><p>Deleting persons from PostHog just got a lot easier, thanks to a new person deletion flow which also enables you to delete event data at the same time.</p><p>This is especially handy for those times when you need to delete an individual for GDPR reasons - though, if you need to, you can choose to keep the events and just delete the person.</p><h3 id="improved-turbo-properties">Improved: Turbo properties</h3><p>Frustrated that it was taking a few seconds to load properties? You weren&#x27;t the only one. </p><p>Thankfully, version 1.39.0 addresses this by adding a limit so that PostHog doesn&#x27;t always search through hundreds of thousands of properties for each query. The result? <a href="https://github.com/PostHog/posthog/pull/11037">Properties now load much faster</a>. On PostHog Cloud we saw a 75% reduction in API call time. </p><h3 id="improved-history-log-now-shows-changes-to-insights">Improved: History log now shows changes to insights</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array-1.39.0/insights-activity.png" alt="a view of the insights activity tab"/></p><p>We&#x27;ve had feedback from several users that they enjoy tracking changes to their feature flags in the history logs. So, we added the same functionality to insights too! Now you can snoop on who has been changing your insights and giving them funny names. </p><h3 id="apps-census-integration">Apps: Census integration</h3><p>Census, a reverse ETL platform which syncs your data warehouse with your operational tools, has created a new PostHog integration. Now you can easily sync events data such as sales or marketing activity into PostHog. Check <a href="https://docs.getcensus.com/destinations/posthog">the Census docs</a> to find out more!</p><p>Interested in building your own app? <a href="/docs/apps">Here&#x27;s how to get started</a>!</p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>Version 1.39 also adds hundreds of other improvements and fixes, including...</p><ul><li><strong>Improvement:</strong> We&#x27;ve added <a href="https://google.github.io/sqlcommenter/python/django/#0">a new SQL commenter dependency</a> which automatically comments all SQL queries generated by PostHog with tags. <a href="https://github.com/PostHog/posthog/pull/10433#issuecomment-1164125629">Again</a>.</li><li><strong>Improvement</strong>: Async migrations that aren&#x27;t available yet will show up in a separate tab and migrations in Starting state can now be stopped in the UI. This solves <a href="https://github.com/PostHog/posthog/pull/10912">a few problems</a>.</li><li><strong>Improvement</strong>: We&#x27;ve removed some axe violations on Home, to improve accessibility. And added accessibility testing to our workflow. Bonus: Check the PR for <a href="https://github.com/PostHog/posthog/pull/11211#discussion_r941651022">a <em>fantastic</em> Dad joke</a>. </li><li><strong>Improvement</strong>: For users self-hosting PostHog, you can now set-up <a href="/docs/self-host/configure/monitoring-with-grafana">monitoring and logging through Grafana</a> out of the box, which makes it much easier to monitor and troubleshoot your deployment.</li><li><strong>Improvement</strong>: <a href="https://github.com/PostHog/posthog/pull/10668">We&#x27;ve separated the list of feature flags on an event from its event properties in the taxonomic filter</a>. This makes it (approximately) 1,000,000% easier to find things when there are lots of feature flags.</li><li><strong>Improvement</strong>: We&#x27;ve introduced <a href="https://google.github.io/snappy/">the snappy compression codec</a> for compressing in-flight messages, which reduces some kafka topic sizes by up to 4x. No more &#x27;message too large&#x27; errors!</li><li><strong>Fix</strong>: In a few unexpected cases we used to return a successful response to some invalid API requests to the capture endpoint. <a href="https://github.com/PostHog/posthog/pull/10999">Now we correctly return a <code>400 BAD REQUEST</code></a> which will help people with useful feedback during development</li></ul><p>View the commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.38.0...release-1.39.0"><code>release-1.38.0...release-1.39.0</code></a>.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li><a href="https://github.com/MrKevinOConnell">@MrKevinOConnel</a> for several PRs, including <a href="https://github.com/MrKevinOConnell/SupportHeroJr">a new Support Hero bot</a>.</li><li><a href="https://github.com/peterdemin">@petedemin</a> for some copy fixes.</li><li><a href="https://github.com/Nishant-Sagar">@Nishant-Sagar</a> for improving the docs for Linux users.</li><li><a href="https://github.com/recklessop">@recklessop</a> for fixing some broken URLs on <a href="https://isgoogleanalyticsillegal.com/">our GA site</a>.</li><li><a href="https://github.com/MarkBennett">@MarkBennett</a> for fixing his URL normalizer app.</li><li><a href="https://github.com/danielthedifficult">@danielthedifficult</a> for fixing some issues with our open source version. </li><li><a href="https://github.com/nemobis">@nemobsis</a> for adding to our GA site.</li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="https://apply.workable.com/posthog/j/7910AE1F46/">Head of Product</a></li><li><a href="https://apply.workable.com/posthog/j/F01772B948/">Senior Data Engineer</a></li><li><a href="https://apply.workable.com/posthog/j/A9CF0800AA/">Senior Backend Engineer</a></li><li><a href="https://apply.workable.com/posthog/j/071DD5C05A/">Site Reliability Engineer - Kubernetes</a></li><li><a href="https://apply.workable.com/posthog/j/2682B00B76/">Full Stack Engineer - App</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. Don’t see a specific role listed? That doesn&#x27;t mean we won&#x27;t have a spot for you. <a href="mailto:careers@posthog.com">Send us a speculative application!</a></p><hr/><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog goodness!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Speeding up PostHog builds with Depot]]></title><description><![CDATA[PostHog recently swapped out Docker for Depot in their container image builds within GitHub Actions. The results are outstanding, taking the average…]]></description><link>https://posthog.com/blog/speeding-up-posthog-builds-with-depot</link><guid isPermaLink="false">2e29095c-0a61-59a8-aba7-0455e5479dcc</guid><dc:creator><![CDATA[Kyle Galbraith]]></dc:creator><pubDate>Fri, 05 Aug 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog recently swapped out Docker for Depot in their container image builds within GitHub Actions. The results are outstanding, taking the average build time from 16 minutes to 3 minutes. Building the PostHog images via <code>depot build</code> instead of <code>docker build</code> is over five times faster, so PostHog invited us — the founders of Depot — to share more about how Depot works and will benefit the PostHog community.</p><h2 id="how-does-depot-work">How does Depot work?</h2><p><a href="https://depot.dev">Depot</a> is a managed container build service which runs both Intel and Arm builder machines so you can build native container images for both architectures. Each instance runs <a href="https://github.com/moby/buildkit">BuildKit</a>, the modern engine that backs <code>docker build</code> with four CPUs, 8GB of RAM, and a persistent 50GB NVMe cache disk. Depot fully manages the lifecycle of project builder instances; today, Depot launches builder machines in AWS and Fly.io.</p><p>The <code>depot build</code> CLI implements the same options as <code>docker build</code> for easy adoption. By offloading the build to a remote Depot builder, the build can make use of the centralized persistent cache, so build steps that are unchanged can be instantly reused. Remote builds also are not limited by local resource constraints like CPU, RAM, or network.</p><p>One of the most common use-cases for Depot is accelerating Docker image builds in CI providers like GitHub Actions. We often see a 2-3x speedup when using Depot, compared to the standard <code>docker/build-push-action</code> action.</p><p>Builds in GitHub Actions can be slow for a few primary reasons:</p><ol><li>Not making use of the layer cache to skip unnecessary steps.</li><li>Using the layer cache requires saving and loading the cache before and after the build, which can be slow as cache sizes increase.</li><li>Resources like total cache size and available CPUs are constrained in the Actions environment.</li></ol><p>Assuming that a build uses <code>cache-from</code> and <code>cache-to</code> to cache layers, the biggest bottlenecks afterwards are the last two reasons. Saving and loading the cache to tarballs is slow, and the time taken to restore the cache can often outweigh the potential speedups of having the cache at all. And GitHub Actions only provides two CPUs today for the build to use.</p><h2 id="depot-and-posthog">Depot and PostHog</h2><p>At Depot, we use PostHog to track our core product metrics; builds started and completed per week, build time in minutes, what versions of our <code>depot</code> CLI are running in the wild, etc. It&#x27;s quite the universal tool, and we would recommend it to just about anyone.</p><p>We also maintain several <a href="https://depot.dev/#benchmarks">benchmarks of popular open-source projects</a>, including PostHog, to help us gauge the performance of Depot. The benchmarks compare the speed of container builds on GitHub Actions with and without Depot, for each new commit to the upstream project. We generally see a 2-3x speedup with Depot.</p><p>PostHog was one of the projects we <a href="https://depot.dev/benchmark/posthog">selected to benchmark</a>, and we observed average build times of only three minutes with Depot&#x27;s remote builders. At the time, PostHog&#x27;s own build workflows took around 16 minutes for the same build.</p><p>So, we reached out to Tim at PostHog to show him the benchmark results and suggest that we use Depot for PostHog. Tim suggested we open a pull request implementing the switch.</p><h2 id="switching-posthog-builds-from-docker-to-depot">Switching PostHog builds from Docker to Depot</h2><p>We created a new PostHog Depot organization and opened a <a href="https://github.com/PostHog/posthog/pull/10002">pull request</a> to begin building the PostHog Docker image with Depot. There&#x27;s some interesting details in the pull request discussion, but the basic implementation was:</p><ol><li><p>Install the Depot CLI with the <a href="https://github.com/depot/setup-action"><code>depot/setup-action</code></a>.</p></li><li><p>Replace <code>docker/build-push-action</code> with <a href="https://github.com/depot/build-push-action"><code>depot/build-push-action</code></a>, which implements the same inputs but uses <code>depot build</code> for the build:</p><pre><code class="language-diff">name: Build and push latest
id: docker-latest
-uses: docker/build-push-action@v2
+uses: depot/build-push-action@v1
with:
    context: .
    push: true
    tags: posthog/posthog:latest
</code></pre></li></ol><p>At the time, we supported authentication via a personal access token, provided in a <code>DEPOT_TOKEN</code> environment variable. However we <a href="https://github.com/PostHog/posthog/pull/10002#issuecomment-1138399413">discovered a workflow problem</a> that needed to be solved; workflows triggered by a <code>pull_request</code> event from a forked repository don&#x27;t have access to repository secrets, as they are considered untrusted.</p><p>Initially we thought that we could use <a href="https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect">GitHub&#x27;s OIDC tokens</a> instead. This would allow our <code>depot/build-push-action</code> to exchange a temporary token provided by GitHub for a temporary Depot token, and then use that token to authenticate with Depot. We implemented this authentication mechanism then discovered that, unfortunately, GitHub will not issue OIDC tokens for <code>pull_request</code> events from forked repositories (only pull requests from within the same repository).</p><p>In the end, we opted to use Depot for all builds for <code>push</code> events but continue using <code>docker</code> for <code>pull_request</code> events. This isn&#x27;t the most performant option, but it appears to be what&#x27;s possible today with GitHub&#x27;s limitations.</p><p>However, we could still use OIDC token authentication for all the <code>push</code> builds and avoid the static <code>DEPOT_TOKEN</code> environment variable entirely. Securely authenticating the build request with an OIDC token required adding the repository as a trust relationship in the Depot project, then adjusting the workflow permissions to allow retrieving the token:</p><pre><code class="language-diff">name: Docker FOSS release image
on:
    push:
        tags:
            - &#x27;*.**&#x27;

jobs:
    build-push:
        name: Build &amp; push Docker release image
        runs-on: ubuntu-20.04
+       permissions:
+           contents: read
+           id-token: write
        steps:
            - ...
</code></pre><p>The <code>depot/build-push-action</code> action handles exchanging the temporary token provided by GitHub for a temporary Depot token and providing that token to the build.</p><h2 id="the-results">The results</h2><p>Before switching to Depot, builds using <code>docker build</code> took over <a href="https://github.com/PostHog/posthog/runs/7139660078?check_suite_focus=true">16 minutes to complete</a>:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/speeding-up-posthog-builds-with-depot/posthog-docker-build.png" alt="GitHub Actions Docker Build"/></p><p>After switching to <code>depot build</code>, those same builds took only <a href="https://github.com/PostHog/posthog/runs/7545904011?check_suite_focus=true">three minutes on average</a>:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/speeding-up-posthog-builds-with-depot/posthog-depot-build.png" alt="GitHub Actions Depot Build"/></p><p>A 5x speed up with very little change to the existing workflow, just one line if we don&#x27;t include the OIDC improvement.</p><p>The improvement here is deceptively huge. A 16-minute build that is run 20 times a day can account for over 5 hours of build time, slowing down progress. Faster builds mean less time waiting, fewer interruptions, and faster feedback and deploys. By switching to <a href="https://depot.dev">Depot</a>, PostHog can get more done, iterate faster and fix bugs without interruptions.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.38.0: Exports, subscriptions and session analysis]]></title><description><![CDATA[PostHog 1.38.0 introduces exports and subscriptions for dashboards and insights, plus improved feature flag persistence and much more!]]></description><link>https://posthog.com/blog/the-posthog-array-1-38-0</link><guid isPermaLink="false">8b461b6c-4134-5257-b6a7-281e6fe5e901</guid><pubDate>Mon, 01 Aug 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to HogMail, our new newsletter</a>, which we send once every two weeks!</p><blockquote><p>Running a self-hosted instance? Check out our <a href="/docs/runbook/upgrading-posthog">Upgrading PostHog guide</a>.</p></blockquote><h2 id="posthog-1380-release-notes">PostHog 1.38.0 release notes</h2><p><strong>Release highlights:</strong></p><ul><li>New: <a href="#subscriptions--exports-for-dashboards-and-insights">Subscriptions &amp; exports for dashboards and insights</a></li><li>New: <a href="#session-analysis-returns">Session analysis returns</a></li><li>New: <a href="#async-migration-0005">Async migration 0005</a></li><li>New: <a href="#feature-flag-persistence-across-authentication-steps">Feature flag persistence across authentication steps</a></li><li>New: <a href="#breakdown-bins">Breakdown bins</a></li><li>Improved: <a href="#universal-search">Universal search</a></li><li>Improved: <a href="#funnel-breakdown-attribution">Funnel breakdown attribution</a></li><li>Improved: <a href="#library-support-for-multivariate-feature-flags-and-experiments">Library support for multivariate feature flags and experiments</a></li><li>New: <a href="#four-new-apps-released">Four new apps released</a></li></ul><h3 id="new-subscriptions--exports-for-dashboards-and-insights">New: Subscriptions &amp; exports for dashboards and insights</h3><p>We&#x27;ve added multiple ways to get insights and dashboards out of PostHog and into your other daily tools, such as Slack. You can now:</p><ul><li>Export dashboards or insights as an image, to share anywhere you need</li><li>Setup email subscriptions to have updates sent to you and your team regularly</li><li>Setup Slack subscriptions to get scheduled updates into any channel you choose</li></ul><p>We&#x27;ve already found subscriptions to be incredibly useful for our team, so go ahead and <a href="/docs/user-guides/subscriptions">get started</a>!</p><h3 id="new-session-analysis-returns">New: Session analysis returns</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-38-0-session-analysis.png" alt="Session Analysis" style="width:800px"/><p>After previously <a href="/blog/sessions-removal">deprecating the Sessions page</a>, we&#x27;ve now bought sessions back in a new and improved form. As of 1.38.0, we&#x27;ve added support for tracking and analyzing sessions within the insights feature.</p><p>This will enable you to get answers to questions such as:</p><ul><li>What&#x27;s the average number of sessions/user/day?</li><li>How many users visit a page and have a session length greater than 30 seconds?</li><li>What&#x27;s the distribution of session lengths for users who perform an event?</li><li>How many unique sessions happen per day where a specific event is performed?</li></ul><p>To learn more about session analysis, check out the <a href="/docs/user-guides/sessions">sessions documentation</a>.</p><p><strong>Note:</strong> Sessions are currently only supported in <code>posthog-js</code>. </p><h3 id="new-async-migration-0005">New: Async migration 0005</h3><p>There is a new async migration available which changes the persons table in ClickHouse to use <code>version</code> instead of <code>_timestamp</code> for collapsing entries. This helps avoid various data integrity issues due to race conditions and batching of Kafka messages within the plugin-server. </p><p>Curious about async migrations? Find out more in <a href="/docs/self-host/configure/async-migrations/overview">the self-host docs</a>, or examine this <a href="https://github.com/PostHog/posthog/blob/master/posthog/async_migrations/migrations/0005_person_replacing_by_version.py">new migration specficially on GitHub</a>.</p><h3 id="new-feature-flag-persistence-across-authentication-steps">New: Feature flag persistence across authentication steps</h3><p>Want to ensure users get a consistent experience across login steps? 1.38.0 improves feature flag persistence for such cases, which is great for experiments where you want the same user to be shown the same variant, no matter how their userID changes. Find out more in the <a href="/docs/feature-flags/manual#persisting-feature-flags-across-authentication-steps">feature flag persistence docs</a>.</p><p><strong>Note:</strong> This is currently only supported in <code>posthog-js</code>.</p><h3 id="new-breakdown-bins">New: Breakdown bins</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-38-0-breakdown.png" alt="Breakdown Bins" style="width:800px"/><p>Now, when using the trends breakdown feature, if the property that you&#x27;re breaking down by is a numerical value, it will be binned into a group.</p><p>For example, if you breakdown by a <code>price</code> property, instead of seeing the counts of discrete values like <code>10.99</code>, <code>11.00</code>, <code>12.50</code>, you&#x27;ll now see the counts of binned values, such as <code>10.00-13.00</code>,<code>13.01-15.00</code>.</p><p>Prefer it the old way? Using the menu on the breakdown table, you can adjust the number of bins used or simply revert to using the discrete values.</p><h3 id="improved-universal-search">Improved: Universal search</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-38-0-session-analysis.png" alt="Session Analysis" style="width:800px"/><p>Universal search got a massive upgrade in this update and now enables you to search for specific users with ease. This is especially useful if you want to find specific organizations or users quickly, such as if you&#x27;re looking for more context on a bug report. </p><p>Universal search wasn&#x27;t the only search-based update this time, either. We also made searching on the Persons page <em>much</em> faster and more reliable than it was before. </p><h3 id="improved-funnel-breakdown-attribution">Improved: Funnel breakdown attribution</h3><p>You can now choose which specific funnel step a breakdown property should come from, and whether the same value should be copied over to other funnel steps for analysis. This is very handy for getting even more value from funnels, and further information is included in the <a href="/docs/user-guides/funnels#choosing-breakdown-property-behavior">funnel documentation</a>.</p><h3 id="improved-library-support-for-multivariate-feature-flags-and-experiments">Improved: Library support for multivariate feature flags and experiments</h3><p>Our Node, Ruby, Go, and PHP libraries have been updated to support experiments! We are also trialling support for feature flags, groups, and session analytics in our mobile libraries. Interested in giving it a go? <a href="https://app.posthog.com/home#supportModal!">Let us know</a> </p><h3 id="new-four-new-apps-released">New: Four new apps released</h3><p>The community has been busy building many new apps for the <a href="/apps">PostHog App Store</a> and we&#x27;re excited to announce the following apps have been released for users on PostHog Cloud...</p><ul><li><a href="/apps/unduplicator">Unduplicator</a>, for cleaning duplicate events during data imports</li><li><a href="/apps/url-normalizer">URL Normalizer</a>, for introducing consistent casing across PostHog </li><li><a href="/apps/engage-connector">Engage</a>, for sending data to <a href="https://engage.so/">Engage</a> for marketing automation</li><li><a href="/apps/variance-connector">Variance</a>, for sending data to <a href="https://www.variance.com/">Variance</a> so you can define PQLs</li></ul><p>Interested in building your own app? <a href="/docs/apps">Here&#x27;s how to get started</a>!</p><h3 id="improved-optimized-clickhouse-space-and-speeding-up-queries">Improved: Optimized ClickHouse space and speeding up queries</h3><p>The <code>properties</code> column takes up most of the space in any PostHog ClickHouse setup. <a href="https://github.com/PostHog/posthog/issues/10616">This release</a> changes out the default compression scheme for ZSTD(3), reducing space by around 2.4x and speeding up uncached queries by up to 2.4x.</p><p>After running this migration only new data will use the updated compression scheme. To get the full benefit of compression on existing data, run <code>OPTIMIZE TABLE sharded_events FINAL</code> on your clickhouse cluster which will rewrite existing data.</p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>Version 1.38 also adds hundreds of other improvements and fixes, including...</p><ul><li><strong>Fixed</strong>: Update to posthog-js and Hubspot app making sure we don&#x27;t override <code>initial_referrer</code> and <code>initial_referring_domain</code>. If you ever saw these change and not reflect the true initial values update your posthog-js version (&amp; Hubspot app on self-hosted) to make sure we don&#x27;t override them in the future.</li><li><strong>Improvement</strong>:  Toolbar won&#x27;t show up automatically anymore, but you can still launch it from the app. This made calls to feature flags faster too :)</li><li><strong>Improvement</strong>: We now automatically comment all SQL queries generated by PostHog with tags. This helps track down performance issues on self-hosted instances. </li><li><strong>Breaking change</strong>: <code>onAction</code> plugin server function is removed. Improving the efficiency of the plugin-server.</li><li><strong>Improvement</strong>: CSV and Image exports now use <a href="/docs/self-host/deploy/configuration#minio">Object Storage when it is enabled</a></li></ul><p>View the commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.37.0...release-1.38.0"><code>release-1.37.0...release-1.38.0</code></a>.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li><a href="https://github.com/sepal">@Sepal</a>, for adding <a href="/docs/user-guides/utm-segmentation">UTM segmentation docs</a></li><li><a href="https://github.com/zevisert">@Zeviset</a>, for correcting some GitLab Auth secrets</li><li><a href="https://github.com/klink">@Klink</a>, for correcting some typos on the site </li><li><a href="https://github.com/rahul3v">@Rahul3v</a>, for correcting yet more typos on the site</li><li><a href="https://github.com/gitstart">@Gitstart</a>, for changing how apps are tagged</li><li><a href="https://github.com/rafalmierzwiak">@rafalmierzwiak</a>, for adding some missing packages</li><li><a href="https://github.com/hakubo">@hakubo</a>, for fixing the seemingly endless typos on the site</li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="https://apply.workable.com/posthog/j/7910AE1F46/">Senior Product Manager</a></li><li><a href="https://apply.workable.com/posthog/j/071DD5C05A/">Site Reliability Engineer - Kubernetes</a></li><li><a href="https://apply.workable.com/posthog/j/F01772B948/">Senior Data Engineer</a></li><li><a href="https://apply.workable.com/posthog/j/2D2AC2E78F/">Developer Advocate</a></li><li><a href="https://apply.workable.com/posthog/j/2682B00B76/">Full Stack Engineer - App</a></li><li><a href="https://apply.workable.com/posthog/j/A9CF0800AA/">Senior Backend Engineer</a></li><li><a href="https://apply.workable.com/posthog/j/B0BD4E5115">Technical Content Marketer</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. Don’t see a specific role listed? That doesn&#x27;t mean we won&#x27;t have a spot for you. <a href="mailto:careers@posthog.com">Send us a speculative application!</a></p><hr/><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog goodness!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Is autocapture ‘still’ bad?]]></title><description><![CDATA[Is autocapture bad? Has it ever been good? Earlier this year Amplitude posed these questions in a blogpost by Product Evangelist Adam Greco. Yes, he…]]></description><link>https://posthog.com/blog/is-autocapture-still-bad</link><guid isPermaLink="false">49a9c96e-802d-5df3-bc12-81cdfdecf476</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 25 Jul 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Is autocapture bad? Has it ever been good? Earlier this year Amplitude posed these questions in a blogpost by Product Evangelist Adam Greco. Yes, he said, ‘<a href="https://amplitude.com/blog/autotrack-is-bad">Auto-track is still bad</a>’ – and he went on to explain the four main reasons why.</p><p>Unlike Amplitude (which requires manual instrumentation), PostHog offers both. You can <a href="/tutorials/event-tracking-guide">track custom events manually</a>, you can use autocapture, or you can use a mixture. We’ve long thought this approach is best because it offers teams more flexibility and choice, so we were naturally curious about the arguments against this approach.</p><p>So, why does Amplitude think it’s better to give users a more limited product? In the article there are four main arguments against autocapture:</p><ol><li><p>Autocapture means you capture more data. Too much data, in Amplitude’s opinion.</p></li><li><p>Changes to your product will cause autocapture to track bad data, creating a lack of trust in your analytics.</p></li><li><p>Autocapture doesn’t save time, because it creates more work for analysts and product managers.</p></li><li><p>Autocapture may accidentally capture sensitive or private data. </p></li></ol><p>Let&#x27;s tackle these arguments one by one. </p><h2 id="1-autocapture-creates-information-overload">1. Autocapture creates information overload</h2><p>To quote Tony Stark: “An intelligence agency which fears intelligence is, historically, not awesome.” </p><p>Yes, too much data can make it hard to separate the signal from the noise, but that’s why it’s important to have the correct tools at your disposal. Too much data is only an issue if you’re unable to interrogate data effectively, or don’t know what you’re looking for. </p><p>A well-designed product analytics tool that is shaped by user feedback will enable you to sort the wheat from the data chaff easily. Especially when the <a href="https://posthog.com/blog/clickhouse-announcement">infrastructure is designed to function at scale</a>.</p><p>Also, what&#x27;s the alternative here? Having less data because you can only track the handful of data points you&#x27;ve planned for in advance? That sounds far less appealing.</p><h2 id="2-autocapture-creates-bad-data">2. Autocapture creates bad data</h2><p>Amplitude argues autocapture means you need someone to police and clean the data. This may have been an issue for teams in the past, but with modern tools it’s possible to simply give users the information they need instead. </p><p>At PostHog, we do this through our <a href="/docs/user-guides/data-management">Data Management suite</a>, which lets you to add tags, descriptions and more to every event you track — whether autocaptured or not. At a glance you can see when an event has been created,  modified, deleted or gone ‘stale’.</p><p>The article also raises the point that someone may make changes to your product which throw off your data without your knowledge. However this isn’t a risk that’s exclusive to autocapture, as it can happen with manual instrumentation as well. Ultimately, no analytics tool can protect your codebase from rogue engineers!</p><h2 id="3-autocapture-takes-the-samemore-time">3. Autocapture takes the same/more time</h2><p>Amplitude suggests that autocapture saves time for product managers because they don’t need to plan which events to track in advance, but it creates more work for analysts who need to deal with the extra information. </p><p>But the article neglects to mention the opposite is also true: manual instrumentation saves time for data quality teams, but creates more work for product managers and engineers. </p><p>Manual instrumentation also takes longer to implement initially and can have an opportunity cost when you realize, three months in, that you’re not tracking all the data you need. </p><p>In either case, the optimum approach isn&#x27;t one or the other – it&#x27;s both. Autocapture to get you started quickly with a minimum overhead, but with manual instrumentation for the nitty gritty where you need to invest more time.</p><h2 id="4-autocapture-isnt-secure-enough">4. Autocapture isn’t secure enough</h2><p>At last, something we agree on. Sort of. </p><p>In theory, autocapture definitely creates a risk of accidentally capturing private data — so it’s something we take incredibly seriously. It’s why we made PostHog’s autocapture very selective about the data it captures from any user inputs, only collecting the <code>name</code>, <code>id</code>, and <code>class</code> attributes from <code>input</code> tags. Nothing more. </p><p>It&#x27;s also why PostHog offers the option to self-host your analytics so that user data never leaves your control, offers information about <a href="/docs/privacy/hipaa-compliance">how to remain HIPAA compliant</a>, and enables you to automatically filter unwanted information before it is ingested. </p><p>If security and user privacy are concerns, whether because of HIPAA regulations or personal principle, PostHog offers a number of ways to protect your users.</p><h2 id="so-is-autocapture-still-bad">So, is autocapture ‘still’ bad?</h2><p>Amplitude repeatedly argues that autocapture is bad and that the correct approach is to create an exhaustive list of data to track in advance, then manually tracking those events only.</p><p>But how many of us have perfect foresight and can accurately predict the needs of so many, so far in advance, for example? What opportunities are lost in the meantime? What happens when circumstances change, or someone asks a question you didn’t anticipate? What about fast-moving businesses where the needs of teams are likely to change regularly?</p><p>As <a href="https://github.com/PostHog/posthog.com/issues/3593#issuecomment-1160197161">one of my colleagues puts it</a>: “Manual instrumentation is for the world we wish existed; autocapture is for the world that actually exists.”</p><p>Again, this is why PostHog offers both — because different teams need different solutions. Autocapture is best for some, manual is best for others and, for most, a mixture of both is preferable. Ultimately, it’s only by understanding and adapting to these needs that anyone, including PostHog, can build the best product. </p><p>It’s ironic that Amplitude doesn’t realize that. </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[22 ways PostHog makes it easier to build great products]]></title><description><![CDATA[PostHog is a growing platform. We used to call ourselves a product analytics platform, but product analytics is just one feature  among many  these…]]></description><link>https://posthog.com/blog/using-posthog</link><guid isPermaLink="false">c6429d56-39e1-5d11-a685-001549dd94cf</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 20 Jul 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/using-posthog/posthog-features.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog is a growing platform.</p><p>We used to call ourselves a product analytics platform, but product analytics is just one feature <a href="/product">among many</a> these days.</p><p>And that got us wondering... what are some of the most useful things you can you do with PostHog?</p><p>The answer? A lot.</p><h2 id="1-replace-multiple-services-with-just-posthog">1. Replace multiple services with just PostHog</h2><p>Let&#x27;s start with a big one.</p><p>You could use <a href="/blog/best-amplitude-alternatives">Amplitude</a> for product analytics, Hotjar for session recording, Flagsmith for feature control, Segment as your customer data platform, <a href="/blog/best-optimizely-alternatives">Optimizely</a> for testing, and Redshift for your data warehouse – these are sensible choices.</p><p>But you can replace some (or even all) of them with just PostHog.</p><p>We&#x27;ve built PostHog so companies don&#x27;t have to run multiple services to get the insights they need. </p><p><a href="/pricing">PostHog Cloud</a> delivers a complete set a tools to help you build better products, while our integration with numerous data platforms means many of our customers end up ditching products like Segment for organizing and syncing customer data. </p><p>And if you <a href="/docs/self-host">self-host PostHog</a>, you get a built-in data warehouse based on ClickHouse into the bargain. </p><h2 id="2-build-an-aarrr-pirate-metrics-dashboard">2. Build an AARRR pirate metrics dashboard</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/aarrr.png" alt="AARRR pirate metrics"/></p><p>AARRR (Acquisition, Activation, Retention, Revenue, Referral) is a classic framework for driving product-led growth, and it&#x27;s a great place to start when building your first dashboard in PostHog.</p><p>What metrics you choose will depend on the business and it&#x27;s fine to have more than one metric for each category. What&#x27;s vital, however, is that they&#x27;re easy to understand, actionable and comparable.</p><p>Read our complete guide to <a href="/blog/aarrr-pirate-funnel">building a pirate metrics funnel</a> for more on this.</p><h2 id="3-discover-who-your-power-users-are">3. Discover who your power users are</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/cohorts.png" alt="discovering power users"/></p><p>You can learn a huge amount by discovering who your most active users are, and what they&#x27;re doing.</p><p>What are the features they use the most? How often do they perform specific tasks? What job title or role do these people have in their company? </p><p>These are the kinds of insights that inform your marketing efforts, your product roadmap, and help you find product market fit.</p><p>Find yours by using the &quot;completed event regularly&quot; or &quot;completed an event multiple times&quot; Cohort conditions. </p><p>An e-commerce platform might ask for &quot;users who bought an item in 5 out of the last 7 weeks&quot; – we track many things, including users who view dashboards frequently.</p><h2 id="4-gather-user-feedback">4. Gather user feedback</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/pinepapple.png" alt="pineapple on pizza"/></p><p>Because PostHog is all about tracking events, it&#x27;s easy to create your own simple feedback interfaces and analyse the results in PostHog.</p><p>On our website, every docs page has a question asking whether the page was useful – we use this to help identify pages that need improvement. </p><p>We also ask anyone who gets a 404 on our website whether pineapple belongs on pizza. We use this to report people to the pizza police. </p><p>Read our <a href="/tutorials/survey">running surveys with no backend</a> tutorial to learn how.</p><h2 id="5-calculate-custom-metrics-using-formulas">5. Calculate custom metrics using formulas</h2><p>You can track pretty much anything in PostHog, including custom metrics for business and product performance.</p><p>To do so, go to &#x27;Advanced Options&#x27; on any Trends insight and enter any custom formula for the metric your interested in.</p><p>For example, you could track your conversion rate by dividing <code>users signed up</code> by <code>website pageviews</code> and multiplying by 100, or new user activation by dividing <code>new users who completed key action</code> by <code>total number of new users</code> and multiplying by 100.</p><p>Our guide to <a href="/blog/b2b-saas-product-metrics">B2B product metrics</a> will give you some ideas for what to track.</p><h2 id="6-identify-users-who-are-at-risk-of-churning">6. Identify users who are at risk of churning</h2><p>You can track users who could churn using &quot;stopped doing an event&quot; Cohort condition.</p><p>First, you need to identify an event – it may be the same one you use to identify power users – and then decide on the date range for your cohort. For example, you could ask for &quot;users who haven&#x27;t logged in during the last 30 days, but had done so in the 30 days prior&quot;.</p><p>Once you&#x27;ve defined your cohort, you can evaluate if you&#x27;ve used the correct parameters, build insights to understand what these users have in common, or simply get in touch with them to see if you can help.</p><p>You can also capture users who didn&#x27;t churn using the &quot;started doing an event again&quot; condition, and that&#x27;s just one more among more than half a dozen conditions. </p><p>Here are a few more examples:</p><ul><li><p><strong>Did not complete event:</strong> Find users who aren&#x27;t doing what you expect. For example, &quot;Give me users who visited the home page, but did not click on the &#x27;Sign up&#x27; button&quot;.</p></li><li><p><strong>Completed an event multiple times:</strong> Find your most active users. For example, &quot;Give me users who have &#x27;Bought item&#x27; more than 3 times in the last 30 days&quot;.</p></li><li><p><strong>Completed a sequence of events:</strong> Find users using your product in a very specific way. For example, &quot;Give me users who added something to their cart and then entered a promo code within a day&quot;.</p></li><li><p><strong>Do not have the property:</strong> Find more specific sets of users. For example, &quot;Give me users outside of Europe&quot;.</p></li><li><p><strong>Completed an event for the first time:</strong> Find the newest users of a feature. For example, &quot;Give me users who bought an item for the first time in the last 7 days&quot;.</p></li><li><p><strong>Completed an event regularly:</strong> Find your power users. For example, &quot;Give me users who bought an item in 5 out of the last 7 weeks&quot;.</p></li></ul><p>Try experimenting with any of the above, while also using AND/OR operators, to create new and useful insights.</p><h2 id="7-validate-a-product-change-using-experiments">7. Validate a product change using experiments</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/experiments-1.png" alt="PostHog experiments"/></p><p>Experimentation is a fundamental tool every engineer and product manager needs. While you can roll out changes and observe their impact after the fact, it&#x27;s impossible to verify whether small shifts in your metrics are down to your changes or some other unknown variable.</p><p>PostHog&#x27;s Experimentation suite is built atop our Feature Flag functionality, so you can run A/B tests and multivariate tests with ease. You set a minimum acceptable improvement for the test, and PostHog will recommend a sample size and test duration based on your parameters.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/experiments-2.png" alt="PostHog experiments"/></p><p>We then run a Bayesian analysis on the data to give a probability for each variant being the best, a graph of how things are looking for each variant, and whether the results are statistically significant or not.</p><p>For more info, you can read the <a href="/docs/user-guides/experimentation">Experimentation user guide</a> and our <a href="/blog/experiments">guide to running effective A/B tests</a>.</p><h2 id="8-use-feature-flags-as-kill-switches">8. Use feature flags as kill switches</h2><p><a href="/docs/user-guides/feature-flags">Feature flags</a> are often used to turn new features on under certain conditions, so that you can test things with a certain <a href="/docs/user-guides/cohorts">cohort</a> or user segment. But you can also use them globally, then leverage the flag as a kill switch to turn features off in the event of an emergency. </p><p>When <a href="/customers/phantom">Phantom</a> started using PostHog, it couldn&#x27;t deploy new updates or features to all users instantly. In Phantom&#x27;s case this was because the product was a browser extension. Using Feature Flags as kill switches gave them a degree of control not normally available to such products. </p><h2 id="9-track-the-performance-of-marketing-campaigns">9. Track the performance of marketing campaigns</h2><p>PostHog can track all sorts of data, including a variety of UTM fields – many of which will be automatically captured. Creating insights based on UTM parameters in PostHog also enables you to follow users along your entire funnel in a single platform, so you can isolate how paid ads correlate to traffic, acquisition and retention.</p><p>Quoting <a href="https://posthog.com/customers/pry">Pry CEO and co-founder Andy Su</a>: </p><blockquote><p>&quot;We were asking: How valuable are customers who come to us via ads as opposed to those who are organic? We were able to answer that question with PostHog and use that information to make decisions about our advertising strategy.”</p></blockquote><h2 id="10-use-correlation-analysis-to-discover-commonalities">10. Use Correlation Analysis to discover commonalities</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/correlation-analysis.png" alt="correlation analysis posthog"/></p><p>Accessible via Funnel insights, <a href="/docs/user-guides/correlation">Correlation Analysis</a> shows you the events and person properties that your converting users have in common. Is there an industry that really loves your product that you don&#x27;t event know about? Correlation Analysis helps surface insights like these, which can change your product strategy completely.</p><p>It&#x27;s also great for marketing and website teams. For example, we know visitors complete a specific user journey on our website are 5.0x more likely to perform the &#x27;clicked calculate scale price&#x27; event, 8x more likely to have used docs search, and 2.9x more likely to have arrived via Google.</p><h2 id="11-track-errors-as-events">11. Track errors as events</h2><p>You can track any sort of event in PostHog, including failures or other sorts of errors. All you need to do is put an <a href="/docs/data/actions">action</a> or <a href="/docs/user-guides/events">event</a> next to the error, find some other unique identifier you can use - such as views of a /404 page.</p><p>Tracking errors can be enormously useful for deciding where to invest engineering time, or when to prioritize areas of your product. <a href="https://posthog.com/customers/phantom">Phantom</a>, for example, used this to prioritize updates to their infrastructure by tracking failure rates for payments across their platform.</p><h2 id="12-watch-users-interact-with-your-acquisition-funnel">12. Watch users interact with your acquisition funnel</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/converted-users.png" alt="funnel users"/></p><p>Having session recording and product analytics in one tool means you can go from reviewing a funnel insight to watching exactly what those same users are doing, seamlessly. </p><p>Simply click on the number of users who completed the step, or dropped off, and you can view the full list of those users, and recordings of their sessions. From here you can understand what they&#x27;re doing individually, or create a cohort from them to drill down further.</p><h2 id="13-analyze-retrospective-data">13. Analyze retrospective data</h2><p>With some analytics tools, you can only look at data once you&#x27;ve started collecting it – you have to define an action, then wait months to gather data for it. In PostHog, you can look at retroactive data easily as we capture information automatically and enable you to make faster decisions. </p><p>Quoting <a href="https://posthog.com/customers/mention-me">MentionMe Software Engineer Lleo Harress</a>: </p><blockquote><p>“Retrospective data and event autocapture have been especially useful. We’ve had occasions where we’ve speculated something but haven’t been capturing the data to prove it, so we define an event and then see the retroactive data for it immediately. Previously we’d have to wait months to get usable data like that in Google Analytics or other tools.”</p></blockquote><h2 id="14-spend-a-week-watching-people-using-your-product">14. Spend a week watching people using your product</h2><p>Seriously, sometimes it&#x27;s just useful to spend a whole load of time watching people using your product. </p><p>In the Recordings page in PostHog, you can filter all recordings based on cohorts you&#x27;ve already created, or specific events you&#x27;re interested in. You can also select a date range and a minimum/maximum recording duration. </p><p>Once setup, you&#x27;re ready to dive in and discover all the odd things users do that you never anticipated, the problems they encounter, and the workarounds they employ.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/twitter-quote.png" alt="twitter quote"/></p><p>This guy gets it.</p><h2 id="15-build-your-own-app">15. Build your own app</h2><p>PostHog is an open source platform and one of the key benefits is you don&#x27;t have to wait for us to build a specific integration you need. You can build it yourself. </p><p><a href="/apps">The PostHog App Store</a> has numerous examples of useful apps built by our community, such as <a href="/apps/url-normalizer">URL Normalizer</a> (thanks to Mark Bennett), the <a href="/apps/property-filter">Property Filter</a> app (thanks to Lukas Kahwe Smith and Christian), and the <a href="/apps/user-agent-populator">User Agent Populator</a> (thanks to Weyert).</p><p>There&#x27;s no shortage of official PostHog apps, too. We&#x27;ve built over 40 apps and integrations so far, including import and export apps for most of the popular data warehouses on the market. </p><p>Don&#x27;t fancy building your own? Don&#x27;t hesitate to suggest one on the <a href="https://github.com/PostHog/posthog">PostHog repo</a>. We might decide to build it ourselves, or there may be another member of the community with the same problem. </p><h2 id="16-subscribe-to-an-insight-or-dashboard">16. Subscribe to an insight or dashboard</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/subscriptions.png" alt="posthog insight subscriptions"/></p><p>You don&#x27;t need to login to PostHog everyday to get insights. Instead, setup your most valuable insights and dashboards, and then get them sent to your inbox on any schedule and time to suit you. You can also send updates to multiple addresses, which is ideal for keeping stakeholders up-to-date.</p><p>Coming soon: Slack channel subscriptions!</p><h2 id="17-capture-where-people-first-heard-about-you">17. Capture where people first heard about you</h2><p>It&#x27;s useful for sales and marketing teams to understand how people find your product. There are numerous ways to do this, and like so many things you can track this using PostHog. </p><p>We ask everyone who books a PostHog demo this question using a free text box – we could use a defined list, but we prefer the flexibility. We collect this data in PostHog for our marketing and customer success dashboards.</p><h2 id="18-measure-how-long-it-takes-users-to-complete-a-series-of-actions">18. Measure how long it takes users to complete a series of actions</h2><p>Whether you want to understand how long it takes to onboard a new organization, or how long it takes for customers to complete a purchase, the <a href="/apps/event-sequence-timer">Event Sequence Timer</a> lets you define a series of events in order and track the time to complete them all. </p><p>Once you&#x27;re tracking this metric you can then make changes to improve the process and examine the difference, positive or negative. Improving processes like onboarding can have a big impact on customer satisfaction and other important downline metrics, like <a href="/blog/b2b-saas-product-metrics#new-user-activation">new user activation</a>.</p><h2 id="19-organize-your-custom-events-in-notion">19. Organize your custom events in Notion</h2><p>No modern data platform is complete without <a href="/apps/zapier-connector">Zapier</a>, so naturally PostHog has one. </p><p>What&#x27;s possible with PostHog and Zapier combined is almost limitless, but one option is to use Zapier to <a href="/tutorials/how-to-connect-posthog-and-notion-with-zapier">keep a record of custom events in Notion</a>. </p><p>This can be useful for sharing your most valuable metrics with colleagues who don&#x27;t use PostHog, or to simply keep an eye on things and make sure people aren&#x27;t creating duplicate custom events.</p><h2 id="20-collect-location-data-while-respecting-user-privacy">20. Collect location data while respecting user privacy</h2><p>We created the <a href="/apps/geoip-enrichment">GeoIP Enricher</a> app to enhance events and persons with IP location data, allowing you to run queries on a range of geographic data, including city name, country, continent and time zone data. </p><p>But what if you want geographic data, but don&#x27;t want to collect more personally identifiable IP data? </p><p>Enter the <a href="/apps/property-filter">Property Filter</a> app, which was built by PostHog users Witty Works so they <a href="/tutorials/property-filter">could collect country data in a privacy-friendly way</a>.</p><h2 id="21-visualize-user-behavior-using-the-posthog-toolbar">21. Visualize user behavior using the PostHog Toolbar</h2><p>Want to see where people are clicking on any page on your website or web app, just like this?</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/using-posthog/docs-heatmap.png" alt="heatmap"/></p><p>Try the <a href="/tutorials/toolbar">PostHog Toolbar</a>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why infrastructure is a competitive advantage for us]]></title><description><![CDATA[We're hiring  Site Reliability Engineers  (SREs). I'm biased of course, but I think it's worth explaining why we think PostHog is the most exciting…]]></description><link>https://posthog.com/blog/why-infra-is-our-competitive-advantage</link><guid isPermaLink="false">e91c203d-198a-5f4d-b348-f9f5de006e22</guid><dc:creator><![CDATA[Tim Glaser]]></dc:creator><pubDate>Wed, 20 Jul 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/migrating-hog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We&#x27;re hiring <a href="https://apply.workable.com/posthog/j/071DD5C05A/">Site Reliability Engineers</a> (SREs). I&#x27;m biased of course, but I think it&#x27;s worth explaining why we think PostHog is the most exciting place to be an SRE right now. </p><h2 id="building-a-product">Building a product</h2><p>In most places, with the exception of outages, working in infrastructure means you&#x27;re working on an invisible part of the company.</p><p>Sure, building out fast CI pipelines and continuous deployment, improving system reliability, and empowering other engineers to do more (providing methodologies, tools, etc) makes the rest of the engineering team more productive, but all your competitors do this too.</p><p>At PostHog, giving people the option to self-host is one of our biggest advantages compared to our competitors. That means we treat our self-hosted infra like a product. And, like any good product, we&#x27;ve written great public documentation.</p><p>To make sure our customers don&#x27;t experience issues, we do automated testing of our Helm chart on all major cloud providers. We get <a href="https://github.com/PostHog/charts/issues">Issues</a> raised by real customers, not just internal &#x27;consumers&#x27;.</p><p>It&#x27;s not just that building stuff <em>for</em> our customers is fun.</p><p>Most of the people we deal with are experienced engineers and SREs themselves, and often folks will scratch their own itch by raising pull requests, like <a href="https://github.com/PostHog/charts-clickhouse/pull/383">adding backups</a>, <a href="https://github.com/PostHog/charts-clickhouse/pull/377">making improvements to security context</a> and <a href="https://github.com/PostHog/charts-clickhouse/pull/366">simplifying deployment commands</a>.</p><h2 id="how-to-serve-20bn-events-for-real-time-analytics">How to serve 20bn events for real time analytics</h2><p>We don&#x27;t <em>just</em> build infrastructure for other people to run.</p><p>We run one of the biggest PostHog instances ourselves, with &gt;20 billion events. And before you ask, yes, our cloud infrastructure runs the same Helm chart that we ship to our customers.</p><p>Did you just read a sales pitch? Yes. Should you <a href="https://apply.workable.com/posthog/j/071DD5C05A/">immediately apply for the SRE role</a> at PostHog? Also yes.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Automating a software company with GitHub Actions]]></title><description><![CDATA[When developing software, there's no shortage of work: building new features, fixing bugs, maintaining infrastructure, launching new systems, phasing…]]></description><link>https://posthog.com/blog/automating-a-software-company-with-github-actions</link><guid isPermaLink="false">2eaabac3-26f1-5842-9cb5-84f4d55745f1</guid><dc:creator><![CDATA[Michael Matloka]]></dc:creator><pubDate>Tue, 05 Jul 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/simpler-self-deployments.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>When developing software, there&#x27;s no shortage of work: building new features, fixing bugs, maintaining infrastructure, launching new systems, phasing deprecated solutions out, ensuring security, keeping track of dependencies… Whew. And that&#x27;s before we get to product, people, or ops considerations.</p><p>Some of the above work requires a human brain constantly – software is all 1s and 0s, but in the end it serves human purposes. Without a massive breakthrough in artificial intelligence, figuring out features that compile AND suit human needs programmatically remains a pipe dream.</p><p>What about all the tedious tasks though? Running tests, publishing releases, deploying services, keeping the repository clean. Plain chores – boring and following the same pattern every time, but which are still are important.</p><p>We don&#x27;t need intelligence (artificial or otherwise) for those tasks every single time. We just need it once to define the jobs to be done, and have those jobs run based on some triggers. Actually, let&#x27;s take this further: any programming language you want, any supporting services you need, ready-made solutions up for grabs, and deep integration with the version control platform.</p><blockquote><p><em>This article was originally published in August, 2021. It has been updated to reflect recent product changes</em></p></blockquote><h2 id="actions-101">Actions 101</h2><p>This is where GitHub Actions come in. With Actions, you can define per-repository <strong>workflows</strong> which run on robust <strong>runner</strong> virtual machines. They run every time a specific type of event happens – say, a push to <code>main</code>, push to a pull request, addition of an issue label, or manual workflow dispatch.</p><p>A workflow consists of any number of <strong>jobs</strong>, each job being a series of <strong>steps</strong> that run a shell script <em>or</em> a standalone action. </p><p>Standalone actions can be run directly if written in TypeScript, or with the overhead of a Docker container for ultimate flexibility, and a multitude of them is freely available on the <a href="https://github.com/marketplace?type=actions">GitHub Marketplace</a>.</p><p>This sounds pretty powerful already. But let&#x27;s see where all this can take us in practice, with some
concrete examples right out of <a href="https://github.com/PostHog">PostHog GitHub</a>.</p><blockquote><p>Mind you, similar things can be achieved with competing solutions such as <a href="https://docs.gitlab.com/ee/ci/">GitLab CI/CD</a> or even <a href="https://www.jenkins.io">Jenkins</a>. GitHub Actions do have a seriously robust ecosystem though, despite being a relative newcomer, and at PostHog we&#x27;ve been avid users of GitHub since its early ARPANET days.</p></blockquote><h3 id="unit-testing">Unit testing</h3><p>Unit tests are crucial for ensuring reliability of software - don&#x27;t skip writing them, but also don&#x27;t skip <em>running</em> them. The best way to do that is to run them on each PR that is being worked on. That used to be called <a href="https://en.wikipedia.org/wiki/Extreme_programming">&quot;extreme programming&quot;</a> back in the day, but today it&#x27;s standard practice as a component of <a href="https://en.wikipedia.org/wiki/Continuous_integration">continuous integration</a>.</p><p>Below is a basic Django-oriented workflow that checks whether a database schema migration is missing and then runs tests.</p><blockquote><p>Note how by defining a <strong>matrix</strong> we make this happen for three specified Python versions in parallel! This way we guarantee support for a range of versions with a single line.</p></blockquote><pre><code class="language-YAML">on:
    - pull_request

jobs:
    django-tests:
        runs-on: ubuntu-latest
        strategy:
            fail-fast: false
            matrix:
                python-version: [&#x27;3.7.8&#x27;, &#x27;3.8.5&#x27;, &#x27;3.9.0&#x27;]
        steps:
            - name: Check out the repository
            ses: actions/checkout@v6

            - name: Set up Python
              uses: actions/setup-python@v6
              with:
                  python-version: ${{ matrix.python-version }}

            - name: Install pip dependencies
              run: |
                  python -m pip install -r requirements-dev.txt
                  python -m pip install -r requirements.txt

            - name: Check if a migration is missing
              run: python manage.py makemigrations --check --dry-run

            - name: Run unit tests
              run: python manage.py test
</code></pre><h3 id="end-to-end-testing">End-to-end testing</h3><p>It&#x27;s good to have each building block of your software covered with unit tests, but your users need the <em>whole</em> assembled machine to work – that is what end-to-end tests are about.</p><p>We use <a href="https://www.cypress.io/">Cypress</a> to run these on our web app, and while not perfect, <a href="/blog/cypress-end-to-end-tests">it&#x27;s been a boon for us</a>. Here&#x27;s the essence of our Cypress CI workflow:</p><pre><code class="language-YAML">on:
    - pull_request

jobs:
    e2e-tests:
        runs-on: ubuntu-latest
        steps:
          - name: Check out the repository
            uses: actions/checkout@v6

          - name: Setup Node.js
            uses: actions/setup-node@v2
            with:
                node-version: 14

          - name: Install dependencies
            run: pnpm install

          - name: Build and start application
            run: echo &quot;This is where you boot your application for testing&quot;

          - name: Run end-to-end Cypress tests
            uses: cypress-io/github-action@v2

          - name: Archive test screenshots
            if: failure()
            uses: actions/upload-artifact@v2
            with:
                name: screenshots
                path: cypress/screenshots
</code></pre><p>I&#x27;ve skipped app-specific setup steps and services, but there are a couple of interesting things in this:</p><ol><li><p>The workflow is made so simple by Cypress&#x27;s ready-made suite runner action – <a href="https://github.com/marketplace/actions/cypress-io"><code>cypress-io/github-action</code></a>. It smartly takes care of the task including test parallelization and integration with the <a href="https://www.cypress.io/dashboard">Cypress Dashboard</a> - much better than shell scripts.</p></li><li><p>GitHub Actions have a feature called &quot;artifacts&quot;. It&#x27;s storage provided by GitHub that temporarily stores files resulting from job runs and allows downloading these files. In this case it&#x27;s screenshots from failed tests that <a href="https://github.com/marketplace/actions/upload-a-build-artifact"><code>actions/upload-artifact</code></a> uploads for us to view.</p></li></ol><h3 id="linting-and-formatting">Linting and formatting</h3><p>Functionality tests verify that things <em>work</em> as expected. It&#x27;s great to have code that works, but having code that&#x27;s <em>written well</em> is even greater, otherwise development gets harder and harder over time.</p><p>To ensure that we don&#x27;t add <em>overly</em> messy spaghetti with every new feature, we use:</p><ul><li><p>linters, for making sure that best practices are used in the code and nothing funky is slipping through</p></li><li><p>formatters, for standardizing the look of our code and making it readable.</p></li></ul><p>As with tests, it&#x27;s great to run this on every PR to keep the quality of code landing in <code>master</code> high.</p><pre><code class="language-YAML">on:
    - pull_request

jobs:
    code-quality:
        runs-on: ubuntu-latest
        steps:
            - name: Check out the repository
              uses: actions/checkout@v6

            - name: Set up Node
              uses: actions/setup-node@v1
              with:
                  node-version: 14

            - name: Install package.json dependencies with Pnpm
              run: pnpm

            - name: Check formatting with prettier
              run: pnpm prettier .

            - name: Lint with ESLint
              run: pnpm eslint .
</code></pre><blockquote><p>One thing we&#x27;ve not covered yet is what running jobs on every PR gives us in practice.
It&#x27;s two things:</p><ol><li>Such jobs become <strong>PR checks</strong>, and they are shown on the PR&#x27;s page, along with their statuses.
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/github-actions/pr.png" alt="Bump labels"/></li><li>Select PR checks can be made required, in which case merging is prevented until all required checks turn green.</li></ol></blockquote><h3 id="keeping-stale-prs-in-check">Keeping stale PRs in check</h3><p>As our team has grown, so has the number of PRs open across repositories. Especially with our <a href="https://posthog.com/handbook/company/values#step-on-toes">pull requests over issues</a> approach, some PRs are left lingering for a bit – maybe because the work is blocked by something else, awaiting review, deprioritized, or only a proof-of-concept. </p><p>In any case, the longer a PR sits unattended, the harder it is to come back to, and it just causes more confusion later on.</p><p>To minimize that, we&#x27;ve added a very simple workflow to scan PRs for inactivity:</p><pre><code class="language-YAML">name: &#x27;Handle stale PRs&#x27;
on:
    schedule:
        - cron: &#x27;30 7 * * 1-5&#x27;

jobs:
    stale:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/stale@v4
              with:
                  only: pulls
                  stale-pr-message: &quot;This PR hasn&#x27;t seen activity in a week! Should it be merged, closed, or worked on further? If you want to keep it open, post a comment or remove the `stale` label – otherwise this will be closed in another week.&quot;
                  close-pr-message: &#x27;This PR was closed due to 2 weeks of inactivity. Feel free to reopen it if still relevant.&#x27;
                  days-before-pr-stale: 7
                  days-before-pr-close: 7
                  stale-issue-label: stale
                  stale-pr-label: stale
</code></pre><p>It looks trivial – it&#x27;s just one step – but that&#x27;s because all the heavy lifting is done by the official
<a href="https://github.com/marketplace/actions/close-stale-issues"><code>actions/stale</code></a> action.</p><p>Curiously, while the action can handle stale issues in an analogous way, we&#x27;ve found it to be awfully more noisy than valuable, so we recommend against that. If an old issue is not on our radar at the moment, a bot alert won&#x27;t make it relevant.</p><blockquote><p>Wondering what all those <code>@v1</code>, <code>@v2</code>, <code>@v4</code> mean?</p><p>This is simply pinning against Git tags. Because ready-made actions are just GitHub repositories, they are specified the same way as repositories in all other contexts – you can specify a revision (commit hash, branch name, Git tag…) - otherwise the latest revision of the default branch is used.</p><p>Tags are particularly nice, because they are created when publishing a release using GitHub&#x27;s UI.</p></blockquote><h3 id="deploying-continuously">Deploying continuously</h3><p>We use <a href="https://www.atlassian.com/continuous-delivery/continuous-deployment">continuous deployment</a> for PostHog Cloud and we&#x27;ve been very happy with the results – our Amazon ECS-based stack is deployed automatically on each push to <code>master</code> (in most cases: a PR being merged) and it&#x27;s made our developer lives so much easier.</p><p>The human element is removed from deployment. You can simply be sure that within 20 minutes of merging,
your code be live, every time.</p><pre><code class="language-YAML">on:
    push:
        branches:
            - master

jobs:
    build-and-deploy-production:
        runs-on: ubuntu-latest
        steps:
            - name: Configure AWS credentials
              uses: aws-actions/configure-aws-credentials@v1
              with:
                  aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
                  aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
                  aws-region: us-east-1

            - name: Log into Amazon ECR
              id: login-ecr
              uses: aws-actions/amazon-ecr-login@v1

            - name: Fetch posthog-cloud
              run: |
                  curl -L https://github.com/posthog/posthog-cloud/tarball/master | tar --strip-components=1 -xz --
                  mkdir deploy/

            - name: Check out main repository
              uses: actions/checkout@v6
              with:
                  path: &#x27;deploy/&#x27;

            - name: Build, tag, and push image to Amazon ECR
              id: build-image
              env:
                  ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
                  ECR_REPOSITORY: posthog-production
                  IMAGE_TAG: ${{ github.sha }}
              run: |
                  docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -f prod.web.Dockerfile .
                  docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
                  echo &quot;::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG&quot;

            - name: Fill in the new app image ID in the Amazon ECS task definition
              id: task-def-app
              uses: aws-actions/amazon-ecs-render-task-definition@v1
              with:
                  task-definition: deploy/task-definition.migration.json
                  container-name: production
                  image: ${{ steps.build-image.outputs.image }}

            - name: Fill in the new migration image ID in the Amazon ECS task definition
              id: task-def-migration
              uses: aws-actions/amazon-ecs-render-task-definition@v1
              with:
                  task-definition: deploy/task-definition.migration.json
                  container-name: production-migration
                  image: ${{ steps.build-image.outputs.image }}

            - name: Perform migrations
              run: |
                  aws ecs register-task-definition --cli-input-json file://$TASK_DEFINITION
                  aws ecs run-task --cluster production-cluster --count 1 --launch-type FARGATE --task-definition production-migration
              env:
                  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
                  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
                  AWS_DEFAULT_REGION: &#x27;us-east-1&#x27;
                  TASK_DEFINITION: ${{ steps.task-def-migrate.outputs.task-definition }}

            - name: Deploy Amazon ECS web task definition
              uses: aws-actions/amazon-ecs-deploy-task-definition@v1
              with:
                  task-definition: ${{ steps.task-def-web.outputs.task-definition }}
                  service: production
                  cluster: production-cluster
</code></pre><p>Every containerized app is structured in its way, so this workflow won&#x27;t do without your own adjustments,
but it should give you the right idea.</p><h3 id="verifying-build">Verifying build</h3><p>Docker is now a standard way of building deployment-ready software images. We use it too, quite happily. But we&#x27;ve broken the build a few times - make a mistake somewhere and the image may fail to build. So we&#x27;ve taken to testing image building <em>ahead</em> of time – before <code>master</code> is broken – on every PR.</p><p>We also <em>lint</em> the Docker files using <a href="https://github.com/hadolint/hadolint"><code>hadolint</code></a>, which has given us really useful tips for maximum reliability of our Docker-based build process.</p><pre><code class="language-YAML">name: Docker

on:
    - pull_request

jobs:
    test-image-build:
        runs-on: ubuntu-latest
        steps:
            - name: Check out the repository
              uses: actions/checkout@v6

            - name: Lint Dockerfiles with Hadolint
              run: |
                  # Install latest Hadolint binary from GitHub (not available via apt)
                  HADOLINT_LATEST_TAG=$( \
                    curl --silent &quot;https://api.github.com/repos/hadolint/hadolint/releases/latest&quot; | jq -r .tag_name \
                  )
                  sudo curl -sLo /usr/bin/hadolint \
                    &quot;https://github.com/hadolint/hadolint/releases/download/$HADOLINT_LATEST_TAG/hadolint-Linux-x86_64&quot;
                  sudo chmod +x /usr/bin/hadolint
                  hadolint **Dockerfile

            - name: Set up QEMU
              uses: docker/setup-qemu-action@v1

            - name: Set up Docker Buildx
              uses: docker/setup-buildx-action@v1

            - name: Build image
              id: docker_build
              uses: docker/build-push-action@v2
              with:
                  push: false

            - name: Echo image digest
              run: echo ${{ steps.docker_build.outputs.digest }}
</code></pre><p>Hint: Since Docker Hub has <a href="https://www.docker.com/blog/changes-to-docker-hub-autobuilds/">removed free autobuilds</a>, but GitHub Actions are still free for public repositories (and with limits for private ones), you can build Docker images and then push them to Docker Hub very similar to the above workflow. Just add the login action <a href="https://github.com/marketplace/actions/docker-login"><code>docker/login-action</code></a> at the beginning, set <code>push</code> to <code>true</code>, <em>et voila</em>, now you are pushing.</p><h3 id="putting-releases-out">Putting releases out</h3><p>Something particularly tedious we eliminated is incrementing package versions. Alright, not really – but the days of having to open <code>package.json</code>, edit, commit, push, build, publish, and tag are over.</p><p>What gives? Well, these days the only thing an engineer has to do is give their PR the right label:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/github-actions/bump-labels.png" alt="Bump labels"/></p><p>Right after that PR gets merged, the package version gets incremented in <code>master</code>:</p><pre><code class="language-YAML">name: Autobump

on:
    pull_request:
        types: [closed]

jobs:
    label-version-bump:
        runs-on: ubuntu-latest
        if: |
            github.event.pull_request.merged
            &amp;&amp; (
                contains(github.event.pull_request.labels.*.name, &#x27;bump patch&#x27;)
                || contains(github.event.pull_request.labels.*.name, &#x27;bump minor&#x27;)
                || contains(github.event.pull_request.labels.*.name, &#x27;bump major&#x27;)
            )
        steps:
            - name: Check out the repository
              uses: actions/checkout@v6
              with:
                  ref: ${{ github.event.pull_request.base.ref }}

            - name: Detect version bump type
              id: bump-type
              run: |
                  BUMP_TYPE=null
                  if [[ $BUMP_PATCH_PRESENT == &#x27;true&#x27; ]]; then
                      BUMP_TYPE=patch
                  fi
                  if [[ $BUMP_MINOR_PRESENT == &#x27;true&#x27; ]]; then
                      BUMP_TYPE=minor
                  fi
                  if [[ $BUMP_MAJOR_PRESENT == &#x27;true&#x27; ]]; then
                      BUMP_TYPE=major
                  fi
                  echo &quot;::set-output name=bump-type::$BUMP_TYPE&quot;
              env:
                  BUMP_PATCH_PRESENT: ${{ contains(github.event.pull_request.labels.*.name, &#x27;bump patch&#x27;) }}
                  BUMP_MINOR_PRESENT: ${{ contains(github.event.pull_request.labels.*.name, &#x27;bump minor&#x27;) }}
                  BUMP_MAJOR_PRESENT: ${{ contains(github.event.pull_request.labels.*.name, &#x27;bump major&#x27;) }}

            - name: Determine new version
              id: new-version
              if: steps.bump-type.outputs.bump-type != &#x27;null&#x27;
              run: |
                  OLD_VERSION=$(jq &quot;.version&quot; package.json -r)
                  NEW_VERSION=$(npx semver $OLD_VERSION -i ${{ steps.bump-type.outputs.bump-type }})
                  echo &quot;::set-output name=new-version::$NEW_VERSION&quot;

            - name: Update version in package.json
              if: steps.bump-type.outputs.bump-type != &#x27;null&#x27;
              run: |
                  mv package.json package.old.json
                  jq --indent 4 &#x27;.version = &quot;${{ steps.new-version.outputs.new-version }}&quot;&#x27; package.old.json &gt; package.json
                  rm package.old.json

            - name: Commit bump
              if: steps.bump-type.outputs.bump-type != &#x27;null&#x27;
              uses: EndBug/add-and-commit@v7
              with:
                  branch: ${{ github.event.pull_request.base.ref }}
                  message: &#x27;Bump version to ${{ steps.new-version.outputs.new-version }}&#x27;
</code></pre><p>Here&#x27;s what this looks like in GitHub&#x27;s workflow visualization feature:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/github-actions/1-autobump.png" alt="Visualization 1. Autobump"/></p><p>But this is just the starting point, because on every commit to <code>master</code> we check whether the version has been incremented - and if it has, all the aforementioned release tasks run automatically.</p><p>In fact, there are too many steps to show them all in this post – but I encourage you to take a look at real-world YAML that we use in our JS library&#x27;s repo: <a href="https://github.com/PostHog/posthog-js/blob/master/.github/workflows/cd.yml"><code>cd.yaml</code></a>. In it, we also use our own GitHub Action (free on the Actions Marketplace) which compares package version between the repository contents and npm: <a href="https://github.com/PostHog/check-package-version">PostHog/check-package-version</a>.</p><p>GitHub can also <em>visualize</em> workflows – extremely boring if there&#x27;s only one job, but here the graph is quite informative. Do keep in mind that this CD process is really an extension of the previous autobump workflow.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/github-actions/2-autorelease.png" alt="Visualization 2. Autorelease"/></p><h3 id="fixing-typos">Fixing typos</h3><p>This entire website, posthog.com, is stored in a GitHub repository: <a href="https://github.com/PostHog/posthog.com">PostHog/posthog.com</a>. In fact, this very post is nothing more than a Markdown file in the repository&#x27;s <code>/contents/blog/</code> directory.</p><p>All in all, we&#x27;ve got quite a bit of copy. All that text is written by humans… And that poses a problem, because humans make mistkes. </p><p>Letters get mixed up, which isn&#x27;t always easy to spot. It&#x27;s also a bit of a waste of time for a human to
be spending time looking for that, instead of thinking about the actual style and substance of the text.</p><p>For these reasons on every PR we try to fix any typos noticed. For that we use <a href="https://github.com/codespell-project/codespell"><code>codespell</code></a>, in an action looking like this:</p><pre><code class="language-YAML">on:
    - pull_request

jobs:
    spellcheck:
        runs-on: ubuntu-latest
        steps:
            - name: Check out the repository
            - uses: actions/checkout@v6

            - name: Set up Python
              uses: actions/setup-python@v6
              with:
                  python-version: 3.8

            - name: Install codespell with pip
              run: pip install codespell

            - name: Fix typos
              run: codespell ./contents -w

            - name: Push changes
              uses: EndBug/add-and-commit@v7
</code></pre><p>Admittedly, some typos still sneak in occasionally, but this is still very helpful.</p><h3 id="ensuring-pr-descriptions">Ensuring PR descriptions</h3><p>At PostHog, we collectively create lots of PRs daily. One issue we&#x27;ve seen is contributors or team members forgetting to write PR descriptions. This usually results in clarifications that could easily be avoided, and in lost context.</p><p>That&#x27;s why with a simple workflow we created a bot that points out newly-opened PRs that lack a description:</p><pre><code class="language-YAML">on:
    pull_request:
        types: [opened]

jobs:
    check-description:
        name: Check that PR has description
        runs-on: ubuntu-latest

        steps:
            - name: Check if PR is shame-worthy
              id: is-shame-worthy
              run: |
                  FILTERED_BODY=$( sed -r -e &#x27;/^(##? )|(- *\[)/d&#x27; &lt;&lt;&lt; $RAW_BODY )
                  echo &quot;::debug::Filtered PR body to $FILTERED_BODY&quot;
                  if [[ -z &quot;${FILTERED_BODY//[[:space:]]/}&quot; ]]; then
                      echo &quot;::set-output name=is-shame-worthy::true&quot;
                  else
                      echo &quot;::set-output name=is-shame-worthy::false&quot;
                  fi
              env:
                  RAW_BODY: ${{ github.event.pull_request.body }}

            - name: Shame if PR has no description
              if: steps.is-shame-worthy.outputs.is-shame-worthy == &#x27;true&#x27;
              run: |
                  SHAME_BODY=&quot;Hey @${{ github.actor }}! 👋\nThis pull request seems to contain no description. Please add useful context, rationale, and/or any other information that will help make sense of this change now and in the distant Mars-based future.&quot;
                  curl -s -u posthog-bot:${{ secrets.GITHUB_TOKEN }} -X POST -d &quot;{ \&quot;body\&quot;: \&quot;$SHAME_BODY\&quot; }&quot; &quot;https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments&quot;
</code></pre><h3 id="syncing-repositories">Syncing repositories</h3><p>One last case we&#x27;ll discuss is syncing one repository&#x27;s contents from another. In our case, we have a main product repo: <a href="https://github.com/PostHog/posthog">https://github.com/PostHog/posthog</a>. However, parts of it – enterprise features code – are non-FOSS, which means their code is not under a free license. We are happy to offer a purely FOSS version of PostHog with <a href="https://github.com/PostHog/posthog-foss">https://github.com/PostHog/posthog-foss</a>, which is just like the main repo but with non-free portions removed.</p><p>Keeping <code>posthog-foss</code> in sync with <code>posthog</code> manually would be awful work though. So we&#x27;ve automated it:</p><pre><code class="language-YAML">on:
    push:
        branches:
            - master

jobs:
    repo-sync:
        name: Sync posthog-foss with posthog
        runs-on: ubuntu-latest
        steps:
            - name: Sync repositories 1 to 1 - master branch
              if: github.repository == &#x27;PostHog/posthog&#x27;
              uses: wei/git-sync@v3
              with:
                  source_repo: &#x27;https://posthog-bot:${{ secrets.POSTHOG_BOT_GITHUB_TOKEN }}@github.com/posthog/posthog.git&#x27;
                  source_branch: &#x27;master&#x27;
                  destination_repo: &#x27;https://posthog-bot:${{ secrets.POSTHOG_BOT_GITHUB_TOKEN }}@github.com/posthog/posthog-foss.git&#x27;
                  destination_branch: &#x27;master&#x27;
            - name: Check out posthog-foss
              if: github.repository == &#x27;PostHog/posthog&#x27;
              uses: actions/checkout@v6
              with:
                  repository: &#x27;posthog/posthog-foss&#x27;
                  ref: master
                  token: ${{ secrets.POSTHOG_BOT_GITHUB_TOKEN }}
            - name: Change LICENSE to pure MIT
              if: github.repository == &#x27;PostHog/posthog&#x27;
              run: |
                  sed -i -e &#x27;/PostHog Inc\./,/Permission is hereby granted/c\Copyright (c) 2020-2021 PostHog Inc\.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy&#x27; LICENSE
                  echo -e &quot;MIT License\n\n$(cat LICENSE)&quot; &gt; LICENSE
            - name: Commit &quot;Sync and remove all non-FOSS parts&quot;
              if: github.repository == &#x27;PostHog/posthog&#x27;
              uses: EndBug/add-and-commit@v7
              with:
                  message: &#x27;Sync and remove all non-FOSS parts&#x27;
                  remove: &#x27;[&quot;-r ee/&quot;, &quot;-r .github/&quot;]&#x27;
                  github_token: ${{ secrets.POSTHOG_BOT_GITHUB_TOKEN }}
            - run: echo # Empty step so that GitHub doesn&#x27;t complain about an empty job on forks
</code></pre><h2 id="automate-your-day-to-day">Automate your day-to-day</h2><p>Hopefully these real-life examples inspire you to build the right workflow for your work, spending a bit of time <em>once</em> to reap the rewards of saved time indefinitely.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.37.0: Cohorts 2.0 and event & property detail pages]]></title><description><![CDATA[PostHog 1.37.0 introduces advanced filtering for cohorts, improved events and property pages, dancing hedgehogs and much, much more.]]></description><link>https://posthog.com/blog/the-posthog-array-1-37-0</link><guid isPermaLink="false">653b2b5d-d2df-52f0-9221-8321b83bd5cb</guid><pubDate>Mon, 27 Jun 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</p><blockquote><p>Running a self-hosted instance? Check out our <a href="/docs/runbook/upgrading-posthog">Upgrading PostHog guide</a>.</p></blockquote><h2 id="posthog-1370-release-notes">PostHog 1.37.0 release notes</h2><blockquote class="warning-note"><b>IMPORTANT!</b> This version will not run until async migration `0004_replicated_schema` is completed. Before upgrading, please make sure this migration is completed. Check out the <a href="/docs/runbook/async-migrations" target="_blank">async migrations</a> docs for details.</blockquote><p><strong>Release highlights:</strong></p><ul><li>New: <a href="#new-cohorts-2.0">Cohorts 2.0</a></li><li>New: <a href="#new-event-and-property-detail-pages">Event and property detail pages</a></li><li>New: <a href="#new-dancing-hedgehogs">Dancing hedgehogs</a></li><li>Improved: <a href="#improved-save-event-columns">Save event columns</a></li><li>Improved: <a href="#improved-faster-response-times">Faster response times</a></li><li>Improved: <a href="#improved-app-retry-and-failure-logic">App retry and failure logic</a></li></ul><h3 id="new-cohorts-20">New: Cohorts 2.0</h3><p>Cohorts are an extremely powerful tool. They let you define a group of users to later base your analytics on. In this release, we completely revamped how you define cohorts, giving you flexible and powerful filtering capabilities.</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-37-0-cohorts-2-0.png" alt="Cohorts 2.0" style="width:720px"/><h4 id="new-condition-types">New condition types</h4><p>Previously, cohorts could only be defined using the following conditions:</p><ul><li>Match users who have a certain property</li><li>Match users who have completed a certain event</li></ul><p>We&#x27;ve now added the following conditions:</p><ul><li><strong>Did not complete event:</strong> Find users who aren&#x27;t doing what you expect. For example, &quot;Give me users who visited the home page, but did not click on the &#x27;Sign up&#x27; button.&quot;.</li><li><strong>Completed an event multiple times:</strong> Find your most active users. For example, &quot;Give me users who have &#x27;Bought item&#x27; more than 3 times in the last 30 days&quot;.</li><li><strong>Completed a sequence of events:</strong> Find users using your product in a very specific way. For example, &quot;Give me users who added something to their cart and then entered a promo code within a day&quot;.</li><li><strong>Did not complete a sequence of events:</strong> Find users who aren&#x27;t using your product as you&#x27;d like. For example, &quot;Give me users who added something to their cart, but didn&#x27;t checkout within a day&quot;.</li><li><strong>Do not have the property:</strong> Find more specific sets of users. For example, &quot;Give me users outside of Europe&quot;.</li><li><strong>Completed an event for the first time:</strong> Find the newest users of a feature. For example, &quot;Give me users who bought an item for the first time in the last 7 days&quot;.</li><li><strong>Completed an event regularly:</strong> Find your power users. For example, &quot;Give me users who bought an item in 5 out of the last 7 weeks&quot;.</li><li><strong>Stopped doing an event:</strong> Find your users that are at risk of churning. For example, &quot;Give me users who haven&#x27;t bought anything in the last 7 days, but had bought something in the 30 days prior&quot;.</li><li><strong>Started doing an event again:</strong> Find your users that did not churn. For example, &quot;Give me users who bought something, then didn&#x27;t for 2 weeks, but have again in the last 7 days&quot;.</li></ul><h4 id="andor-operators-within-cohort-conditions">AND/OR operators within cohort conditions</h4><p>You can now combine these new conditions using complex AND/OR groupings.</p><p>For example, you can define a cohort that is &quot;Give me users who are outside of Europe AND have either regularly bought an item 4 of the last 5 weeks OR bought 3 items in the past week&quot;.</p><p>With the combination of these new conditions and the new AND/OR operators, you can now define extremely powerful cohorts for finding the exact users that you&#x27;re looking for.</p><h4 id="nested-cohorts">Nested cohorts</h4><p>But that&#x27;s not all! You can also use existing cohorts to define <em>new</em> cohorts. For example, you can define a cohort as &quot;Give me users in <em>Cohort X</em> that are not in <em>Cohort Y</em>&quot;.</p><p>Using these nested cohorts enables you to avoid redefining the same cohort over and over again.</p><h3 id="new-event-and-property-detail-pages">New: Event and property detail pages</h3><p>We&#x27;ve added a new page within Data Management, which enables you to dig into the details of all events and properties. For example, on the event page, you can now see:</p><ul><li>When an event was first and last seen</li><li>How many times it was sent in the last 30 days</li><li>The top properties for that event</li><li>A filterable list of the specific event for you to explore</li></ul><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-37-0-event-page.png" alt="Event Page" style="width:720px"/><h3 id="new-dancing-hedgehogs">New: Dancing hedgehogs</h3><p>Waiting for an insight to load? Our favorite mascot, Max, will now keep you company!</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-37-0-dancing-hog.gif" alt="Dancing HedgeHog" style="width:720px"/><h3 id="improved-save-event-columns">Improved: Save event columns</h3><p>You can now select and reorder the custom event columns that you want to see on the activity page. You can save the selected columns selected at the team level, so your colleagues can benefit too.</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-37-0-configurable-columns.png" alt="Configurable Columns" style="width:400px"/><h3 id="improved-faster-response-times-in-the-app">Improved: Faster response times in the app</h3><p>We&#x27;ve made it faster to load insights and recordings. We realized that some data payloads were quite big, which resulted in the network slowing things down. To improve this, we added compression to a few of the endpoints in the app, and now see at least 50% smaller responses sent to clients.</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-37-0-compression.png" alt="a screenshot showing an API client receiving 308KB instead of 1.4MB of data" style="width:800px"/><p>Here&#x27;s to things being faster!</p><h3 id="improved-app-retry-and-failure-logic">Improved: App retry and failure logic</h3><p>The retry policy of apps (formerly known as plugins) has been consolidated. Built-in retries with <code>RetryError</code> are now more widely available. Additionally, you will be notified by email if an app fails to load in your project due to a fatal <code>setupPlugin</code> error (<a href="/docs/self-host/configure/email">email configuration required</a>). See <a href="/docs/apps/build/reference#maximizing-reliability-with-retryerror">Apps developer reference</a> for more details.</p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>Version 1.37 also adds hundreds of other improvements and fixes, including...</p><ul><li><strong>Fixed</strong>: PostHog-js was logging an unnecessary warning <a href="https://github.com/PostHog/posthog/pull/10375">#10375</a></li><li><strong>Fixed</strong>: Only show dashed line if it is not the previous period. <a href="https://github.com/PostHog/posthog/pull/10345">#10345</a></li><li><strong>Fixed</strong>: Remove correlation table from the funnel preview in experiments <a href="https://github.com/PostHog/posthog/pull/10286">#10286</a></li><li><strong>Fixed</strong>: Only query for the user once when loading my flags <a href="https://github.com/PostHog/posthog/pull/10205">#10205</a></li><li><strong>Fixed</strong>: Disappearing breakdown tooltip <a href="https://github.com/PostHog/posthog/pull/10184">#10184</a></li></ul><p>View the commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.36.0...release-1.37.0"><code>release-1.36.0...release-1.37.0</code></a>.</p><h3 id="deprecation-and-removal-notices">Deprecation and removal notices</h3><ul><li><strong>For feature flags:</strong> Feature flags can no longer depend on cohorts with behavioral conditions. They can still depend on cohorts with only property conditions. You can read <a href="https://github.com/PostHog/posthog/issues/8628">more context here</a>.</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li>@MichaelLampe for a correction to PostHog docs</li><li>@girlProg for corrections to PostHog.com</li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="https://posthog.workable.com/jobs/2490685">Senior Product Manager</a></li><li><a href="https://posthog.workable.com/jobs/2105790">Site Reliability Engineer - Kubernetes</a></li><li><a href="https://posthog.workable.com/jobs/2482259">Senior Data Engineer</a></li><li><a href="https://posthog.workable.com/jobs/2422700">Developer Advocate</a></li><li><a href="https://posthog.workable.com/jobs/2175512">Full Stack Engineer - Community Tools, Website &amp; Docs</a></li><li><a href="https://posthog.workable.com/jobs/2362038">Full Stack Engineer - App</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. Don’t see a specific role listed? That doesn&#x27;t mean we won&#x27;t have a spot for you. <a href="mailto:careers@posthog.com">Send us a speculative application!</a></p><hr/><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog goodness!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The two ways to estimate your monthly event usage]]></title><description><![CDATA[When talking through our editions and pricing options with potential customers I'm often asked "How can I estimate my event count?" If you're not…]]></description><link>https://posthog.com/blog/calculating-events-from-users</link><guid isPermaLink="false">d57f5a04-ce02-5702-a193-aff1a2ded39b</guid><dc:creator><![CDATA[Simon Fisher]]></dc:creator><pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/data-management-feature/posthog-data-management.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>When talking through our editions and pricing options with potential customers I&#x27;m often asked &quot;How can I estimate my event count?&quot;</p><p>If you&#x27;re not already using an analytics tool, or it doesn&#x27;t readily give you a count of tracked events, it can be quite tricky to figure out how much adopting an event-based platform like PostHog is going to cost you.</p><p>This guide explains why we price by event and offers some tips for estimating your usage.</p><h2 id="why-we-price-based-on-events">Why we price based on events</h2><p>Pricing software is hard. It&#x27;s a delicate balance between being affordable for your <a href="/newsletter/ideal-customer-profile-framework">ideal customer profile</a>, competitive in the marketplace, while still allowing you to grow and fund further development in the product.</p><p>We settled on event-based pricing for two main reasons:</p><ol><li><p>Events are the main thing we store in our Clickhouse database in PostHog Cloud. The more events we store, the higher our own infrastructure costs.  It&#x27;s only fair that we incorporate those running costs into our pricing.</p></li><li><p>Product analytics is all about visualizing data about events which your users trigger. The more events available to you for analysis, the richer that analysis will be.</p></li></ol><p>Although point one is mainly focused on our own Cloud, we wanted pricing parity between our Cloud and self-hosted editions so that it was easy to migrate between the two. Hence event-based pricing for all editions.</p><h2 id="ok-that-makes-sense-but-how-do-i-calculate-my-event-count">Ok, that makes sense, but how do I calculate my event count?</h2><p>There are two ways to estimate your event count. One takes a bit of time but will give you a very accurate estimate; the second is much quicker but is more of a guestimate.</p><h3 id="1-start-sending-event-data-to-posthog-cloud">1. Start sending event data to PostHog Cloud</h3><p>The most accurate way to figure out your event count is to take advantage of our <a href="/pricing">1 million event per month free tier</a> on PostHog Cloud.</p><p>Simply use one of our <a href="/docs/integrate#libraries">libraries</a> to send your event data to PostHog (<a href="/docs/integrate/ingest-live-data#use-autocapture">autocapture</a> is easiest) and check your event usage on the <a href="https://app.posthog.com/organization/billing">Billing</a> page in the app.</p><p>Once you&#x27;ve sent a typical week&#x27;s worth of data then you can do some multiplication to project your monthly event count. </p><p>If you get close to the 1 million event limit then you can stop sending events and project forward based on how many days worth of data has already been captured.</p><h3 id="2-estimate-based-on-mau-and-your-product-category">2. Estimate based on MAU and your product category</h3><p>Most people who come to us not knowing their event count will have a handle on their monthly active user (MAU) number.  </p><p>This can be a useful starting point, but user interaction patterns vary by type of product, industry and target persona:</p><ul><li><p>For a banking app I might log in, check my balance, look at a few offers and then log out, generating a few events</p></li><li><p>For a social media app I might log in, check what my friends had for dinner, watch endless videos of cats jumping off things, find an appropriate GIF to send to my cousin for her birthday, all generating hundreds of events</p></li><li><p>For an infrastructure monitoring product I could be checking it in the morning and then only visiting the app if I&#x27;m alerted to a problem, generating events sporadically</p></li></ul><p>Event counts also vary based upon whether you are using <a href="/docs/integrate/ingest-live-data#use-autocapture">autocapture</a>, <a href="/docs/integrate/ingest-live-data#capture-user-events">custom capture</a> or a combination of both.  </p><p>As autocapture generates events for every pageview and click, it can start to get quite noisy, however there are things that can be done to limit that.</p><h2 id="example-event-counts-from-posthog-users">Example event counts from PostHog users</h2><p>For a little more context, we took a look at PostHog Cloud customers to get a better understanding of how event counts map to MAUs.</p><p>As a rule of thumb, most fell within the range of 50-100 tracked events per MAU per month. </p><p>We then did a deeper analysis of the different types of customers and came up with the following list of product types and expected monthly events per MAU.</p><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"><strong>Product</strong></td><td class="w-3/12 text-center"><strong>B2B / B2C</strong></td><td class="w-3/12 text-center"><strong>Monthly events per MAU</strong></td><td class="w-3/12 text-center"><strong>Autocapture</strong></td><td class="w-3/12 text-center"><strong>Platforms</strong></td></tr></thead><tbody><tr><td>PostHog</td><td class="text-center">B2B</td><td class="text-center">87</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Web</td></tr><tr><td>Financial reporting</td><td class="text-center">B2B</td><td class="text-center">44</td><td class="text-center"><span class="text-red text-lg">✖</span></td>        <td class="text-center">Web</td></tr><tr><td>Cloud monitoring</td><td class="text-center">B2B</td><td class="text-center">22</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center">Web</td></tr><tr><td>Document management</td><td class="text-center">B2B</td><td class="text-center">54</td><td class="text-center"><span class="text-green text-lg">✔</span></td>      <td class="text-center">Web</td></tr><tr><td>Speech to text API</td><td class="text-center">B2B</td><td class="text-center">583</td><td class="text-center"><span class="text-red text-lg">✖</span></td>        <td class="text-center">API</td></tr><tr><td>Crypto wallet</td><td class="text-center">B2C</td><td class="text-center">162</td><td class="text-center"><span class="text-red text-lg">✖</span></td>        <td class="text-center">Browser extension</td></tr><tr><td>Meditation app</td><td class="text-center">B2C</td><td class="text-center">118</td><td class="text-center"><span class="text-red text-lg">✖</span></td>        <td class="text-center">Android, iOS</td></tr><tr><td>Fashion retail</td><td class="text-center">B2C</td><td class="text-center">31</td><td class="text-center"><span class="text-green text-lg">✔</span></td>         <td class="text-center">Web</td></tr><tr><td>Event booking</td><td class="text-center">B2C</td><td class="text-center">8</td><td class="text-center"><span class="text-red text-lg">✖</span></td>        <td class="text-center">React Native</td></tr><tr><td>Restaurant booking</td><td class="text-center">B2B2C</td><td class="text-center">54</td><td class="text-center"><span class="text-green text-lg">✔</span></td>        <td class="text-center">Web, Mobile</td></tr></tbody></table></div><p>As you can see, event counts vary wildly across different types of products, but this should help you get closer to an estimated event count
based on your product and MAU count.</p><p>Once you&#x27;ve got this figure you can visit the <a href="/pricing">pricing</a> page and calculate your estimated costs for adopting PostHog. </p><p>And don&#x27;t forget, PostHog Cloud and Scale are free for up to 1 million tracked events per month.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Our new objective: Nail Self Serve]]></title><description><![CDATA[The longer your strategy gets, the more useless it becomes. That's why, at PostHog, we communicate strategy as 'Nail X', where X is the thing we need…]]></description><link>https://posthog.com/blog/changing-to-self-serve</link><guid isPermaLink="false">76bbc01a-620d-55b5-ba8b-290cf2079619</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Fri, 10 Jun 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>The longer your strategy gets, the more useless it becomes.</p><p>That&#x27;s why, at PostHog, we communicate strategy as &#x27;Nail X&#x27;, where X is the thing we need to nail. It&#x27;s simple and effective.</p><p>We <a href="https://github.com/PostHog/posthog.com/pull/3395">recently switched</a> from Nail Enterprise to Nail Self Serve. This walks you through the previous context, and why we made that change.</p><blockquote><p>James Hawkins is PostHog&#x27;s Co-Founder &amp; CEO. He launched PostHog with Tim Glaser in February 2020 as part the Y Combinator W20 batch. He lives in Cambridge, England with his wife Fran, daughter Ruby, and Wally (a cat).</p></blockquote><h2 id="why-did-we-focus-on-nail-enterprise-in-the-first-place">Why did we focus on Nail Enterprise in the first place?</h2><p>The best products are generally built for end users.</p><p>The game we&#x27;re playing isn&#x27;t to please C-level executives or procurement - we want an engineer in any size organization on Earth to be able to use our software in production without getting up from their desk. If they work at a larger company, and if we provide them with a great experience, they&#x27;ll share the platform with their peers, and will probably want to upgrade to one of our <a href="/pricing">paid offerings</a>. Our open source and free user base is our sales team.</p><p>Our original go to market plan was therefore a little like this:</p><ol><li>get our open source project to product market fit</li><li>get a paid mid-size (at the time, ~$20K-$40K a year) product to product market fit</li><li>get a paid large-size ($200K+ a year) product to product market fit</li></ol><p>It took us until last Summer to get the open source product to feel successful. It became less buggy, easier to deploy, better featured and more scalable. As a result, we saw our inbound growth increasing and our retention improving.</p><p>We then focused on getting five reference customers. It turned out, we had to <a href="new-vp-nailing-funnels">Nail Funnels</a> to do this.</p><h2 id="what-changed">What changed?</h2><p>Things went much better than we thought. For the last six months, our paid products have averaged 20% month over month revenue growth - that&#x27;s an 8.9x increase per year (for context - <a href="https://twitter.com/nimaroohis/status/1525970172237991939?s=21&amp;t=qzYbxjpPbHlPZ7Xjus_PUA">3x is considered great</a>, and <a href="https://www.lennysnewsletter.com/p/what-is-a-good-growth-rate?s=r">Lenny&#x27;s Newsletter breaks this out in more detail</a>). </p><p>Three things combined caused this:</p><ul><li>we were able to get larger (generally, up to $70k) deals than we expected</li><li>we made it easier to <em>pay</em> for our paid product, which <a href="pricing-lessons">led to more deals</a> that we expected</li><li>we had more existing customer growth than we expected</li></ul><p>Then we noticed something else.</p><p>Some customers are very fast (a couple of weeks, or less) to sell to, with minimal interaction, whereas others take months and are very intense. In fact, almost none of the customers that have put us through a big buying process have converted to revenue yet.</p><h2 id="what-does-nail-self-serve-mean">What does Nail Self Serve mean?</h2><p>So we should do more of what&#x27;s working.</p><p>For product, this means:</p><ul><li><strong>Quality:</strong> Our core features (insights, recordings, feature-flags / experimentation) work like a Swiss watch</li><li><strong>Self-Service Subscription:</strong> Customers of every size sign-up, start using and <a href="/blog/transparent-enterprise-pricing">subscribe to PostHog without asking us for help</a></li><li><strong>Deployments:</strong> PostHog is the easiest self-hosted product to deploy and scale in the world</li></ul><p>For go to market, this means:</p><ul><li><strong>Customer Success:</strong> Focus on time to revenue (for example, one of our Customer Success team&#x27;s key results is volume of deals in our target range per week - rather than trying to hit an overall revenue figure)</li><li><strong>Marketing:</strong> Accelerate word of mouth growth</li><li><strong>Website and Docs:</strong> Make community self serve (for example, <a href="https://squeak.posthog.com">make our <em>docs</em></a> rather than Slack the main support channel)</li></ul><h2 id="a-snapshot-of-the-future">A snapshot of the future</h2><p>Today, we&#x27;re very good at serving large mid-market B2B companies who can buy quickly (through self serving).</p><p>I suspect we&#x27;ll focus on B2C after the above is completed. From customer calls, it feels like this is how we&#x27;ll go from landing $20k-$70k customers in a couple of weeks to $100k to $300k customers in the same, short time frame. It&#x27;s much <em>more</em> appealing to do this, than to sell to B2B Enterprises that&#x27;ll take months or years to purchase from us.</p><p>We already have plenty of (paying) customers in B2C, but to focus on it would require stronger mobile support, greater scalability still, and a suitable pricing model so we capture the right amount of value.</p><p>Long term, we think the future of our revenue will come from large enterprise. We&#x27;re a natural fit - data control, consolidating multiple vendors, and complete extensibility. However, we want to avoid <em>needing</em> to go through complex purchasing decisions whilst there are easier ways to increase our numbers.</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why we ditched ‘talk to sales’ for transparent pricing]]></title><description><![CDATA["I wonder how much this SaaS product costs to..." "Contact sales!" 😤 Contact. Sales. Two words that embody everything we hate about modern SaaS…]]></description><link>https://posthog.com/blog/transparent-enterprise-pricing</link><guid isPermaLink="false">40d13921-8ff2-5d59-86e7-8dd2f5cd6360</guid><dc:creator><![CDATA[Simon Fisher]]></dc:creator><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hog-in-a-room-generic.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>&quot;I wonder how much this SaaS product costs to...&quot;</p><p>&quot;Contact sales!&quot;</p><p>😤</p></blockquote><p>Contact. Sales.</p><p>Two words that embody everything we hate about modern SaaS products. And, when you see them, you know it&#x27;s just the start of the sales dance.</p><p>Even if you&#x27;re deemed worthy enough for a sales rep to call you, it&#x27;s likely you still won&#x27;t find out the price until you&#x27;ve answered a <em>lot</em> of questions.</p><p>And maybe seen a demo.</p><p>And perhaps your own hands-on evaluation.  </p><p>And introduced your boss&#x27; boss. </p><p>And consulted the legal department.</p><p>And &quot;hey, would you like to join our webinar?&quot;</p><p>It&#x27;s all a colossal waste of time and energy that&#x27;s better spent focusing on what matters: building better products.</p><p>That&#x27;s why, at PostHog, we&#x27;ve adopted transparent pricing and self-service for every paid plan, even PostHog Enterprise.</p><blockquote><p>Simon Fisher leads customer success at PostHog. He&#x27;s made a career out of helping companies automate stuff, including seven years at IBM and five years at Chef Software. He lives in Sheffield in the North of England with his wife, three young boys, a black labrador, and a killer Lego collection. Seriously, it&#x27;s sweet.</p></blockquote><h2 id="transparent-pricing-works">Transparent pricing works</h2><p>For those new to PostHog, it&#x27;s an all-in-one product analytics suite that replaces siloed tools for <a href="/product#product-analytics">product analytics</a>, <a href="/product/session-recording">Session Recording</a>, <a href="/product/feature-flags">Feature Flags</a>, and Experimentation. It&#x27;s open source and you can host it yourself, giving you complete control over your data – we have a Cloud version too if that&#x27;s your thing. </p><p>As an open-source business, we put great value in transparency. We make our processes, policies, team structure – even <a href="/handbook/people/compensation">how we pay people</a> – available for anyone to read in our <a href="/handbook">company handbook</a>, and the vast majority of our comms is visible for anyone to read on <a href="https://github.com/PostHog/posthog/issues">our GitHub repo</a>.</p><p>This philosophy extends to transparent pricing and our self-serve model. </p><p>We believe transparent pricing is fundamentally better for both us and our customers. No one should ever feel like they&#x27;re paying over the odds because they didn&#x27;t haggle hard enough, or have to go through a lengthy process just to get a simple estimate.</p><p>Self-service, meanwhile, makes it easy for customers to get up and running as quickly as possible. Got a problem to solve? We&#x27;ll get out of your way and let you do that, and make it easy to upgrade to a higher tier when you actually need it.</p><p>That&#x27;s why we made our core paid plans totally self-serve and free up to 1 million events per month, with the &quot;per event&quot; price decreasing as usage increases, as you can see below.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/enterprise-pricing-blog/pricing-calc.png" alt="PostHog pricing calc"/></p><p>This model has worked incredibly well for us. </p><p>In the last six months, we&#x27;ve seen 20% month over month growth on our paid plans – an 8.9x increase per year. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/pricing-lesson/revenue-pricing.png" alt="PostHog&#x27;s revenue going sharply up and to the right"/></p><p>We achieved this without cold emailing companies, or chasing specific customers. We just make it super easy for companies to try us and pay us, and proactively help new and potential customers get what they need from PostHog.</p><p>It&#x27;s a winning combination more SaaS companies should adopt.</p><h2 id="adopting-transparent-enterprise-pricing">Adopting transparent enterprise pricing</h2><p>The last frontier for us was our Enterprise plans. While some companies practice partial transparency, we wanted 100% transparency across the board. This took a while to achieve, but we&#x27;re glad we did.</p><p>Our plans are split by whether you want to self-host PostHog, or have it hosted and managed by us.</p><p>There are three options for <a href="/pricing">self-hosting PostHog</a>:</p><ul><li><strong>Open-Source:</strong> Contains all of the base analytics features but is limited to one project</li><li><strong>Scale:</strong> Contains advanced features such as experiments and group analytics, and has unlimited projects</li><li><strong>Enterprise:</strong> Comes with SAML-based SSO, project permissions and a whole lot of help from us</li></ul><p>For PostHog Cloud, there are just two options:</p><ul><li><strong>Cloud:</strong> Mirrors the features of PostHog Scale, hosted by us</li><li><strong>Cloud Enterprise:</strong> Mirrors the features of PostHog Enterprise, hosted by us</li></ul><p>PostHog Scale and Cloud have had transparent pricing for a while and, unsurprisingly, we found companies interested in PostHog Enterprise would calculate the price using the Scale or Cloud pricing calculators. </p><p>This makes sense in isolation, but our enterprise plans cost more because you get more, particularly on self-hosted where we offer a lot of support to ensure things run smoothly.</p><p>We adapted our existing pricing models to be roughly 2x Scale pricing for self-hosted Enterprise, and 1.3x Cloud pricing for Cloud Enterprise to reflect the additional benefits you gain from these editions.</p><p>We didn&#x27;t want to mandate lengthy annual commitments, so all of our products can be subscribed to on a monthly basis and canceled at any time.</p><p>That said, most larger organizations fall into a traditional annual buying process, and we incentivize them with bigger discounts for the upfront commitment.</p><h2 id="what-did-we-learn">What did we learn?</h2><p>People expect self-hosted deployments to be cheaper than PostHog Cloud as they incur the additional infrastructure
costs. </p><p>While it&#x27;s true that running PostHog Cloud requires a minimum level of spend from us, self-hosting costs more than Cloud for a few important reasons:</p><ol><li><p>Developing and supporting a self-hosted platform is more complex than a traditional SaaS offering (and we offer both)</p></li><li><p>We are willing to invest a significant amount of our time in ensuring our large, self-hosted deployments are tuned effectively so customers have the best PostHog experience possible. </p></li></ol><p>This is a message we&#x27;ll continue to refine, but ultimately we feel tolerance for the expense PostHog Enterprise is directly connected to how important self-hosting is to a customer. </p><p>It&#x27;s still good value compared to other enterprise SaaS tools, especially considering the breadth of features we offer, and if the price isn&#x27;t right then Cloud Enterprise might be a better option for those customers.</p><h2 id="going-one-step-further-self-serve-for-enterprise">Going one step further... self-serve for Enterprise</h2><p>Things move fast at PostHog. When I started writing this blog post, our Enterprise plans had transparent pricing but still required you to contact us to get started. Not anymore.</p><p>You can now sign up for an Enterprise license yourself in a fully automated manner, so all our plans are now transparently-priced and self-serve.</p><p>If having SAML integration, project permissions and a whole lot of set up and ongoing help from us is for you, you can sign up for your <a href="https://license.posthog.com/?price_id=price_1L1AeWEuIatRXSdzj0Y5ioOU">Enterprise license key</a> in just a few clicks.</p><p>Our final hurdle is to make it so Scale and Cloud users can upgrade to Enterprise themselves without our intervention. It&#x27;s coming soon.</p><p>If all this talk of self-serving and automation isn&#x27;t for you then don&#x27;t worry – you can still always <a href="/talk-to-a-human">contact sales</a>. We love hearing from our customers, but it&#x27;s your choice when you do.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.36.0: Introducing AND/OR filtering, timezone support and universal search]]></title><description><![CDATA[PostHog 1.36.0 introduces AND/OR filtering, timezone support, universal search, multi-dashboard insights and much, much more.]]></description><link>https://posthog.com/blog/the-posthog-array-1-36-0</link><guid isPermaLink="false">f2b8a9de-a162-5624-899b-2f226d1baa2a</guid><pubDate>Mon, 30 May 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</p><blockquote><p>Running a self-hosted instance? Check out our <a href="/docs/runbook/upgrading-posthog">Upgrading PostHog guide</a>.</p></blockquote><p><a href="https://github.com/PostHog/posthog/compare/release-1.36.0...release-1.36.1"><strong>Patch 1.36.1</strong></a>: This update addresses an issue where some deployments, right after upgrading to 1.36.0, required a restart to fully ingest events again. If you&#x27;re already on 1.36.0, you only need to update if your instance has problems ingesting events.</p><h2 id="posthog-1360-release-notes">PostHog 1.36.0 release notes</h2><p><strong>Release highlights:</strong></p><ul><li>Changed: <a href="#changed-plugins-are-now-apps">Plugins are now Apps</a></li><li>New: <a href="#new-and-or-filtering">AND/OR filtering</a></li><li>New: <a href="#new-multi-dashboard-insights">Multi-dashboard insights</a></li><li>New: <a href="#new-universal-search">Universal Search</a></li><li>New: <a href="#new-timezone-support-for-insights">Timezone support for insights</a></li><li>New: <a href="#new-redesigned-funnels">Redesigned Funnels</a></li><li>Improved: <a href="#improved-a-more-accessible-color-palette">A more accessible color palette</a></li><li>Improved: <a href="#improved-a-more-accessible-color-palette">Accessible color palette</a></li><li>Improved: <a href="#improved-series-switching-in-persons">Improved series switching in Persons</a></li><li>Improved: <a href="#improved-preflight-checks">Better preflight checks</a></li><li>News: <a href="#new-restack-joins-the-posthog-marketplace">Restack joins PostHog Marketplace</a></li></ul><h3 id="changed-plugins-are-now-apps">Changed: Plugins are now Apps</h3><p>You may have noticed that we recently changed the name of our plugins, rebranding them to Apps. On the surface this may seem like a simple cosmetic change, but it plays in to the growing capability of <del>plugins</del> apps on PostHog.</p><p>We&#x27;ll have more to share about <a href="https://github.com/PostHog/posthog/issues/9654#issuecomment-1133222836">what&#x27;s possible with apps</a> in the future. For now you can check out <a href="/apps">our refreshed library</a> and a handful of new apps for services such as Amazon Kinesis and <a href="/apps/intercom">Intercom</a>. Enjoy!</p><h3 id="new-andor-filtering">New: AND/OR filtering</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-and-or-filtering.png" alt="AND/OR filters" style="width:720px"/><p>A frequent request in <a href="https://calendly.com/posthog-feedback">feedback calls</a> is for more powerful filtering options when creating insights. Specifically, for AND/OR filtering. Finally, we&#x27;ve delivered exactly that.</p><p>AND/OR operators can now be used in filters to mix and match conditions into new combinations and identify new sorts of user behavior. We&#x27;re still interested in any other requests you may have though, so why not <a href="https://calendly.com/posthog-feedback">schedule a feedback call</a> and let us know your suggestions?</p><h3 id="new-multi-dashboard-insights">New: Multi-dashboard insights</h3><div style="text-align:center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-insight-on-multiple-dashboards.png" alt="&quot;Add insight to dashboards&quot; modal" style="width:502px"/></div><p>Got an insight you&#x27;d like to have on two dashboards at the same time? Previously you had to duplicate it and keep the copies in sync all the time. What a pain!</p><p>Now, from PostHog 1.36 onwards, you can add a single insight to multiple dashboards at once. That means you don&#x27;t need to worry about maintaining multiple insights and keeping all those copies in sync! Check <a href="/docs/user-guides/dashboards">the dashboard docs</a> for more info.</p><h3 id="new-universal-search">New: Universal search</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-universal-search.png" alt="Universal search box" style="width:855px"/><p>Ever struggled to find an old insight, event or cohort in your PostHog project? We&#x27;ve added universal search to the familiar &quot;Search&quot; box in the top navigation, so now you have one tool you can use to find <em>anything</em> on PostHog.</p><h3 id="new-timezone-support-for-insights">New: Timezone support for insights</h3><div style="text-align:center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-timezone.png" alt="Insight tooltip in Eastern Daylight Time&quot;" style="width:322px"/></div><p>PostHog projects have included a timezone setting since <a href="/blog/the-posthog-array-1-24-0">version 1.24</a>, enabling you to manually convert dates and times shown in the app. But 1.36 takes it to the next level.</p><p>As of 1.36, all insights queries take into account the timezone you&#x27;ve set in your Project Settings, enabling more accurate results for projects using timezones other than UTC. This is especially helpful when grouping data by day, week, or month!</p><h3 id="new-redesigned-funnels">New: Redesigned Funnels</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-new-funnel-viz.png" alt="A three-step funnel in the new UI on the insight page" style="width:970px"/><p>Ever thought funnels on PostHog take up a bit too much space? Ever struggled to read longer funnels which are featured on a dashboard? You weren&#x27;t the only one. That&#x27;s why we redesigned them!</p><p>The new interface addresses the feedback we&#x27;ve heard, making funnels easier to use and clearer than ever. Check <a href="/docs/user-guides/funnels">the Funnels docs</a> for more information about what&#x27;s possible with funnels!</p><h3 id="improved-a-more-accessible-color-palette">Improved: A more accessible color palette</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-data-colors.png" alt="A funnel with new data colors" style="width:640px"/><p>Speaking of design, you may have noticed we&#x27;ve updated the color palette in most Insights (specifically: <a href="/docs/user-guides/trends">Trends</a>, <a href="/docs/user-guides/funnels">Funnels</a>, <a href="/docs/user-guides/retention">Retention</a>, and <a href="/docs/user-guides/stickiness">Stickiness</a>).</p><p>The new color palette is more pleasing to the eye, but the change isn&#x27;t just aesthetic. It&#x27;s also much more accessible for colorblind users. We want to continue improving accessibility in PostHog, so if you have specific feedback on this topic then please <a href="https://app.posthog.com/home#supportModal">let us know</a> or <a href="https://github.com/PostHog">create an issue</a>!</p><h3 id="improved-switch-between-series-in-the-persons-modal">Improved: Switch between series in the persons modal</h3><div style="text-align:center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-multi-point-persons-modal.gif" alt="Switching between series in the persons modal" style="width:621px"/></div><p>Thanks to the new series selector, the Persons modal is easier to use with multi-series Trends insights. In fact, you can now switch between series without ever having to close the window, quickly zooming in on particular user segments - just like in the GIF above!</p><h3 id="improved-preflight-checks">Improved: Preflight checks</h3><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-36-0-preflight.png" alt="New preflight checks screen" style="width:627px"/><p>When self-hosting PostHog, it&#x27;s crucial that all components are up and running, which is why the preflight checks screen is the first thing you see when setting up a fresh instance. Our new version of this screen makes initial setup of your instance all the more pleasant!</p><h3 id="new-restack-joins-the-posthog-marketplace">New: Restack joins the PostHog Marketplace</h3><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/clVpovL0vxI" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p>Restack is a platform for deployiong open-source software stacks on Kubernetes and is run by a team of open-source enthusiasts. It&#x27;s a natural match for the PostHog Marketplace, where we&#x27;ve steadily grown the number of businesses offering services and support over the last few months.</p><p>Restack enables you to deploy and benefit from a self-hosted PostHog instance, but without the maintenance busy work. Best of all, Restack Console can ensure deployments are <a href="/docs/privacy/hipaa-compliance">HIPAA</a>, FISMA and SOC 2 compliant — handy if you deal with a lot of <a href="/blog/what-is-personal-data-pii">PII</a>. Find out more in <a href="https://www.restack.io/store/posthog">the Marketplace, or head to Restack&#x27;s store listing for PostHog</a> to find more great videos like the one above!</p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>Version 1.36 also adds hundreds of other improvements and fixes, including...</p><ul><li><strong>New</strong>: Median conversion time is now presented in funnel insights, offering results that are more resistant to being skewed by outliers. The average continues to be available in detailed results. <a href="https://github.com/PostHog/posthog/pull/9810">#9810</a></li><li><strong>Improved</strong>: The in-app plugin source code editor has been divided into tabs, to make editing <code>plugin.json</code> and <code>index.ts</code> slightly more intuitive. Additionally, code is now automatically formatted with <code>prettier</code> on save. <a href="https://github.com/PostHog/posthog/pull/9795">#9795</a></li><li><strong>Improved</strong>: Large numbers are now presented with the comma as the thousands separator in Insights, greatly improving readability. <a href="https://github.com/PostHog/posthog/pull/9725">#9725</a> <a href="https://github.com/PostHog/posthog/pull/9733">#9733</a></li><li><strong>Improved</strong>: Properties table column sizing has been made smarter, making them scale better for various contents of properties. <a href="https://github.com/PostHog/posthog/pull/9502">#9502</a></li><li><strong>Fixed</strong>: User Paths with start/end points containing trailing slashes work now. It&#x27;s also been made impossible to unselect all event categories for a more intuitive experience. <a href="https://github.com/PostHog/posthog/pull/9482">#9482</a></li><li><strong>Fixed</strong>: Trends insight displayed as a table can be sorted independently on dashboards. <a href="https://github.com/PostHog/posthog/pull/9625">#9625</a></li><li><strong>Fixed</strong>: Custom series names are included in CSV exports. <a href="https://github.com/PostHog/posthog/pull/9677">#9677</a></li><li><strong>Fixed</strong>: Automatic provisioning of PostHog users logging in with SSO has been made more reliable. For instance, users who first logged-in <em>before</em> automatic provisioning was turned on for the organization, will be automatically added to it when they log in again. <a href="https://github.com/PostHog/posthog/pull/9515">#9515</a></li><li><strong>Fixed</strong>: The UI again always shows the correct active license. <a href="https://github.com/PostHog/posthog/pull/9575">#9575</a></li></ul><p>View the commit log in GitHub for a full history of changes: <a href="https://github.com/PostHog/posthog/compare/release-1.35.0...release-1.36.0"><code>release-1.35.0...release-1.36.0</code></a>.</p><h3 id="deprecation-and-removal-notices">Deprecation and removal notices</h3><ul><li><strong>For SAML admins:</strong> The previous update, <a href="/blog/the-posthog-array-1-35-0">PostHog 1.35.0</a>, changed SAML from being instance-based to domain-based. This means that SAML configuration takes place in the PostHog UI. You can have multiple SAML providers on the same instance (segment by domain, from the user&#x27;s email address). Please review our <a href="/sso">SSO docs</a> for more details.</li><li><strong>For SAML admins:</strong> If you use SAML on a self-hosted instance and have enabled SAML enforcement (previously <code>SAML_ENFORCED</code> environment variable) then this environment configuration has been deprecated too. You will now need to configure SSO enforcement via Authentication domains. Check the <a href="/sso#authentication-domains">SSO docs</a> for more details.</li><li><strong>For <del>plugin</del> app developers:</strong> <code>onEvent</code>, <code>onShapshot</code> and <code>onAction</code> event payloads have been cleaned up a bit. Specifically, <code>timestamp</code>, <code>$set</code>, and <code>$set_once</code> are always provided now, while <code>now</code>, <code>sent_at</code>, <code>site_url</code>, <code>offset</code>, as well as <code>kafka_offset</code> are no longer included. All apps available in our App Store are compatible with this change. <code>processEvent</code> is unaffected.</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li>@ParthGandhi for fixes to PostHog.com</li><li>@JDConley for corrections to PostHog docs</li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="https://posthog.workable.com/jobs/2096622">Growth Engineer</a></li><li><a href="https://posthog.workable.com/jobs/2105790">Site Reliability Engineer - Kubernetes</a></li><li><a href="https://posthog.workable.com/jobs/2482259">Senior Data Engineer</a></li><li><a href="https://posthog.workable.com/jobs/2490685">Senior Product Manager</a></li><li><a href="https://posthog.workable.com/jobs/2422700">Developer Advocate</a></li><li><a href="https://posthog.workable.com/jobs/2175512">Full Stack Engineer - Community Tools, Website &amp; Docs</a></li><li><a href="https://posthog.workable.com/jobs/2362038">Full Stack Engineer</a></li><li><a href="https://posthog.workable.com/jobs/2501789">Marketing Content Writer - 3 Month FTC</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. Don’t see a specific role listed? That doesn&#x27;t mean we won&#x27;t have a spot for you. <a href="mailto:careers@posthog.com">Send us a speculative application!</a></p><hr/><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog news!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[A non-coders thoughts on ‘Everybody Codes’ - Part Two]]></title><description><![CDATA[One of PostHog’s values is that everybody codes. That doesn’t mean everyone needs to be a developer, but we do encourage everyone to practice the…]]></description><link>https://posthog.com/blog/a-non-coders-thoughts-on-everybody-codes-culture-part-two</link><guid isPermaLink="false">8c1d25b3-4167-5757-9184-ebc69ca7989d</guid><pubDate>Fri, 27 May 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/migrating-hog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>One of PostHog’s values is that everybody codes. That doesn’t mean everyone needs to be a developer, but we do encourage everyone to practice the basics of shipping, no matter their role. Even site updates require GitHub and some basic knowledge of coding, for example. </p><p>But, of course, you may know that already. <a href="/blog/a-non-coders-thoughts-on-everybody-codes-culture">I wrote about it a year ago, when I joined PostHog</a>. Back then, my coding knowledge was limited to just a smattering of HTML.</p><p>Not anymore. PostHog is still unlikely to consider me a good candidate for <a href="/careers">an engineering  role</a>, but I’m <em>much</em> more confident with code. GitHub is no longer foreign ground and yesterday I juggled React, Javascript and HTML in a way which <em>mostly</em> worked! </p><p>In my previous post I wrote about the three principles that set me up for success, but now it’s time to reflect on what’s helped me succeed since. </p><h3 id="having-unrealistic-goals">Having unrealistic goals</h3><p>In my last post <a href="/blog/a-non-coders-thoughts-on-everybody-codes-culture">I said it was important to set realistic limits</a> and that’s true, at the start.</p><p>However, it’s also been important to follow less grounded ideas. One example is the ShuffleHog — an idea I had for a hackathon project which is essentially a shuffle button to help you discover new insights. I thought ShuffleHog was a fun idea, but nobody else latched on to it.</p><p>If I’d stuck to realistic limits, that would be the end of it. I can’t  build a product feature on my own, can I?</p><p>It turns out that I can. Late last year I made <a href="https://twitter.com/thehogbot">a ShuffleHog prototype on Twitter</a>, coded in <a href="https://www.tracery.io/">Tracery</a>. That lasted until <a href="https://github.com/PostHog/posthog/issues/9654#issuecomment-1133222836">Marius added the ability to make front-end apps in PostHog</a> last week. 24 hours later, ShuffleHog now lives inside PostHog as a beta feature that can suggest random query ideas.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/non-coders-thoughts/shufflehog_app.png" alt="ShuffleHog - AKA PostHog&#x27;s Best Feature"/></p><p>ShuffleHog still isn’t quite ready for other users to try yet, but who knows? Maybe I’ll keep following this dream. </p><h3 id="keep-making-mistakes">(Keep) making mistakes</h3><p>One thing that hasn’t changed over the last 12 months is the importance of making mistakes — and I should know. I make a lot of them.</p><p>The reason mistakes are so important is, I think, because coding isn’t a prescriptive discipline. There’s no single correct way to code or write, so it’s more valuable to know why something <em>broke</em> than how it ‘should’ be done. </p><p>Breaking things is a great way to learn about how to fix them. PostHog recently rebranded plugins to apps and, as part of that, we launched a new apps library. I broke a bunch of things while working on that project — but that&#x27;s OK because I managed to fix most of them (with occasional help from Eli) and carried those lessons over to the ShuffleHog project.</p><h3 id="take-it-offline">Take it offline</h3><p>Something I’ve loved about becoming more confident with code is that I’ve been able to follow this passion outside of work. This creates a <a href="/newsletter/how-to-give-feedback">feedback loop</a> where I get even more excited about what I’m learning and what I’m able to do, so I bring that energy back into work…where I <em>also</em> learn and do more. It’s very satisfying. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/non-coders-thoughts/arcade_open_source.png" alt="Joe&#x27;s Open Source Arcade"/></p><p>The experience I’ve had with GitHub, for example, ended up being the catalyst for me to build my own arcade emulation machine at home because I now had the skills to fork and tweak certain repos. Likewise, spending time in the world of open-source software led to me playing around with a <em>lot</em> of Raspberry Pi sensors at home.</p><p>These may be small projects, but they’re a million miles away from where I was before PostHog — and I’m excited to see how much farther working with code will push me to go!</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why I ditched Google Analytics and Mixpanel for PostHog]]></title><description><![CDATA[By Colin Wren, Co-founder of  Reciprocal.dev . It took me until I built my second product,  Reciprocal.dev , to really understand the value of…]]></description><link>https://posthog.com/blog/why-i-ditched-google-analytics-for-posthog</link><guid isPermaLink="false">4a323d56-aa50-542f-910e-4df2c2654f06</guid><dc:creator><![CDATA[Colin Wren]]></dc:creator><pubDate>Thu, 26 May 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><em>By Colin Wren, Co-founder of <a href="https://reciprocal.dev/">Reciprocal.dev</a>.</em></p><p>It took me until I built my second product, <a href="https://reciprocal.dev/">Reciprocal.dev</a>, to really understand the value of analytics. I’d always thought of such tools as being an invasion of privacy and questioned the need for front-end scripts when properly configured server logs could provide the same information. But, after learning how customer behavior metrics are key to performing the iterative small tweaks needed to align a product to customer needs, I took a second look at how analytics were used in my existing products.</p><p>Until this point, Google Analytics had always been my go-to analytics platform. This wasn’t based on any real knowledge of the analytics space. I just used it because I knew that others did.</p><p>In my opinion though, Google Analytics is a mess. It’s good for quantitative metrics, but not qualitative metrics. There are two different UIs for the same data (Firebase Analytics and Google Analytics), two different versions of tracking tag to pick from (v3 and v4; some JS libraries only support v3) and the Goals feature doesn’t easily lend itself to building up a clear picture of what users are actually doing.</p><div><div quote="“I’ve found PostHog to be miles ahead of the other tools I’ve tried and I’m a little miffed that I didn’t find it straight away and wasted time with Mixpanel.”"></div></div><p>I was getting so little value from Google Analytics that I started to look for a new tool that would provide more qualitative data. I picked Mixpanel because the UI looked good and it had funnel reports that allowed me to see conversions easily.</p><h3 id="switching-from-mixpanel-to-posthog">Switching from Mixpanel to PostHog</h3><p>Initially Mixpanel delivered the value we had hoped for. We were able to see how our app was used, see which areas of the product weren’t converting and use that data in discussions about improvements to the product. However, Mixpanel’s free tier is <em>very</em> limited and only lets you create five funnels. They want you to pay for their services, but we found them too expensive to justify. </p><p>So, I started looking for a <a href="/blog/best-mixpanel-alternatives">Mixpanel alternative</a> we could self-host. By <a href="/docs/self-host">self-hosting our analytics</a> we would only have to pay for the server the analytics tool was running on, which would be around one fifth of the cost of Mixpanel&#x27;s lowest pricing tier. We would also have more control over our user data. </p><p>During my research I came across PostHog. It offered the same funnel views that Mixpanel did, could be self-hosted and even offered a free tier that offered unlimited funnels. It was a no-brainer for us to switch.</p><p>Moving to PostHog required a few changes in our codebase, but because I’d abstracted the analytics events into a single function I only had to update that function and the analytics initialization. I used an options object which allows custom event data to be defined, which can then be used to filter out events or to tailor reports:</p><pre><code>export function recordEvent(eventName: string, options: AnalyticsOptions): void {
  if (getAnalyticsConsent()) {
-    ReactGA.event({
-      category: &#x27;User&#x27;,
-      action: eventName,
-      ...options,
-    });
-    mixPanel.track(eventName);
+    posthog.capture(eventName, options)
  }
}
</code></pre><p>After this, <a href="/docs/user-guides/funnels">building funnels in PostHog</a> was really easy. I built a sequence of events trigger as a user performs actions in the app and <a href="/docs/user-guides/dashboards">saved these insights into a dashboard</a> so there would be a single place to collect insights for a particular behavior or section of the product.</p><p>There are also tools that make it easier to track which iteration of the product events are being captured against, such as <a href="/docs/user-guides/feature-flags">feature flags</a> and <a href="/integrations">apps that integrate with release management tools</a>. Overall, I’ve found PostHog to be miles ahead of the other tools I’ve tried and I’m a little miffed that I wasted time with Mixpanel.</p><div><div quote="“PostHog better enables us to grow our product and, with self-hosting, we&#x27;re more in control of our analytics usage overall.”"></div></div><h3 id="how-switching-to-posthog-worked-for-us">How switching to PostHog worked for us</h3><p>As an early stage start-up our priority is to get the most out of our tools for the lowest price possible. Mixpanel gave us a qualitative dataset of how users were using our app, but the limitations and cost meant there was very little value in the tool. It wasn’t something we could use to grow the product.</p><p>PostHog gave us the means to build a qualitative dataset and didn’t limit us on how we dissected data. As a result, PostHog better enables us to grow the product and, with self-hosting as an option, we’re more in control of our analytics usage overall. By moving to PostHog we’ve been able to identify significant friction points in our sign-up process and make improvements that lead to an increase in people creating an account.</p><p><em>This article was written by Colin Wren, Co-founder of <a href="https://reciprocal.dev/">Reciprocal.dev</a>, who originally shared his experience on <a href="https://colinwren.medium.com/why-i-ditched-google-analytics-mixpanel-for-posthog-841fa77bb8cb">Medium</a>. It is shared here with his permission.</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Reflecting on YC, 2 years on]]></title><description><![CDATA[Y Combinator  (YC) is seen as the world's best, and most prolific, three-month accelerator program. Upwards of 7,000 founders have taken part. Yet, no…]]></description><link>https://posthog.com/blog/yc-2-years-on</link><guid isPermaLink="false">9a195867-302a-5fd6-8a12-1eb1da4773dd</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Wed, 18 May 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><a href="https://www.ycombinator.com/">Y Combinator</a> (YC) is seen as the world&#x27;s best, and most prolific, three-month accelerator program. Upwards of 7,000 founders have taken part. Yet, no one really talks about what happens afterwards.</p><p>PostHog did Y Combinator&#x27;s Winter 2020 batch. We made the top companies list a year later when we closed a series B led by YC Continuity. We provide an <a href="https://posthog.com/">open-source product analytics suite</a>.</p><p>So, what have the last two (and a bit) years like been for us, and how could they have been better?</p><blockquote><p>James Hawkins is PostHog&#x27;s Co-Founder &amp; CEO. He launched PostHog with Tim Glaser in February 2020 as part the Y Combinator W20 batch. He lives in Cambridge, England with his wife Fran, daughter Ruby, and Wally (a cat).</p></blockquote><h2 id="the-network">The network</h2><p>It&#x27;s a vague term, what does this <em>actually</em> mean?</p><p>The tools we have are an internal forum, dozens of unofficial YC WhatsApp/Slack groups filled with other founders, regular invites to informal in person events, and the contact details of all the partners and every founder. This extends to real life - we met many people there that are now good friends.</p><p>Ultimately, all these new contacts gave us access to many of the best founders and investors in the world. This was critical to us - as Silicon Valley outsiders, we really knew no one before we started with YC. This helped us to <a href="/newsletter/how-i-get-good-advice">meet people for advice</a>, angel investors and a few funds.</p><p>A benefit of many networks is emotional support, but being closely connected to other founders in particular can provide the opposite depending on how you react. When we were very small, we benefited greatly from <a href="a-chat-with-sid">talking to founders or senior people at successful developer-focussed</a> <a href="ceo-diary-4#hiring-the-right-people--what-stripe-taught-me">companies</a>. At other times, we&#x27;ve seen people we know well create multi billion dollar companies from scratch, faster than us. We should take lessons from them, but shouldn&#x27;t blindly raise money as fast as possible to compete on valuation.</p><p>The network brings customers. From time to time, the founder of a growth stage company will find and message us because of Y Combinator. We&#x27;re 100% inbound, but YC companies that do outbound sales potentially benefit even more from all these warm connections. We even started giving out <a href="https://www.allbirds.com/">Allbirds</a> / <a href="https://www.apple.com/airpods/">AirPods</a> to YC companies that pick us over our competitors (aka the San Francisco survival kit - although that needs updating now each batch is remote) - giving away shoes for free was amusingly profitable as a fraction of them convert to paying customers when they grow.</p><p>Finally, it helped us get to product market fit sooner. YC founders tend to give better (more direct) feedback when things aren&#x27;t working, and are naturally a little more understanding. An amusing example of this was when we once signed up <a href="https://twitter.com/ericmigi?lang=en">Eric Migicovsky</a> (Pebble founder / YC partner and now founder of <a href="https://www.beeper.com/">Beeper</a>) - a year ago, he gave us so much direct feedback including &quot;throw out your current interface&quot; (I removed context for dramatic effect - he was very polite and constructive!) that it made us realize, at that time, we didn&#x27;t have strong product market fit in his segment.</p><h2 id="investor-reviews">Investor reviews</h2><p>YC has a database that provides anonymized investor reviews written by founders about their experiences during fundraising. The fact this comes from within a trusted network means it&#x27;d be hard to replicate something from outside.</p><p>It was crucial to us in raising a seed round - we didn&#x27;t know anyone and used it to build trust and to figure out who had the best reputation.</p><p>Now, as a post series B company, this has gone from critical to slightly useful. It still provides another way to background check potential investors - although it doesn&#x27;t have as much relevant data... There are naturally way fewer reviews of later stage investors.</p><h2 id="office-hours">Office hours</h2><p>During the YC batch, every company is offered office hours - a 30 min slot whenever you want, to talk to whichever partner you pick! This benefit continues after the batch.</p><p>The number of partners that can deliver relevant advice to scaling is lower (whereas the majority are world experts in finding product market fit) - scaling PostHog is quite different to scaling <a href="https://boomsupersonic.com/">supersonic air flight</a>. However, there <em>are</em> many visiting partners that will meet with you - they bring deeper operating experience.</p><p>We&#x27;ve reduced how often we feel the need to do office hours a lot. During the batch, it was without exception every 2 weeks. Now, it&#x27;s every couple of months. I think this is because post product market fit, it has felt easier to know what to build - we have many users to talk to and a clear <a href="/newsletter/ideal-customer-profile-framework">ideal customer profile</a>. This means we usually know what we need to do, and simply doing the work as fast as we can.</p><p>However, when we do need help - it&#x27;s pretty leveraged. For example, we recently confirmed that the majority of our growth comes from word of mouth. We wanted to talk to someone relevant about this - YC meant we could talk to Nicolas Dessaigne (Algolia cofounder) about how he&#x27;d approach the problem. This had a major impact on how we think about marketing. As a result, PostHog&#x27;s marketing team objective is literally &quot;accelerate word of mouth growth&quot; today.</p><h2 id="money">Money...</h2><p>YC has a Continuity Fund that invests in later stage companies.</p><p>We&#x27;ve been fortunate to partner with them. They have:</p><ul><li>invested roughly $20M</li><li>helped us stay focused on (the right) users in board meetings</li><li>provided endless further intros to people for advice and hiring as needed</li></ul><p>This isn&#x27;t guaranteed though, but it wouldn&#x27;t have happened if we&#x27;d not gone through the batch.</p><h2 id="-and-how-to-spend-it-hiring">... and how to spend it (hiring)</h2><p><a href="https://www.workatastartup.com/">Work at a Startup</a> is provided to YC companies during and after the batch.</p><p>This has given us a bunch of interviews with candidates.</p><h2 id="stonks--angel-investing-side-hustle">Stonks / angel investing side hustle</h2><p>One of the things that surprised me was how common it is for founders to invest in other founders. Firstly, how come they&#x27;ve all got the cash?! It turns out that some founders act as scouts for VC funds, some have had good tech jobs before, and others have sold some stock. Being part of YC means you have easy access to lots of promising startups.</p><p>I did this twice then stopped primarily because I felt it&#x27;d get distracting to do it a lot. My personal life <a href="ceo-diary-3">got a bit chaotic</a> last year.</p><h2 id="conclusion">Conclusion</h2><p>There&#x27;s a lot of ongoing support. A lot of this is provided through network effects so it scales surprisingly well.</p><p>We&#x27;ve both given and received advice from dozens (probably 50 or more) other companies. This has given us years of experience in weeks, but it can make it tempting to stop thinking for yourself. It&#x27;s been suggested in a <a href="../handbook/people/feedback#full-team-feedback-sessions">full team feedback session</a> that I should work from first principles more often, which was helpful advice.</p><p>Most importantly, and as cheesy a conclusion as this is, it has changed how we see ourselves. </p><p>Being part of YC means we see people we know very well go on to build very successful companies, sharing what they&#x27;re up to along the way. </p><p>Before YC, we felt like outsiders. After YC, we have the confidence to build a impactful product, and that&#x27;s hugely valuable.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Using Google Analytics was deemed 'illegal' in some EU countries. We built a microsite in 48 hours to capitalize on the news.]]></title><description><![CDATA[On January 14, 2022, the world learned that Austria had declared Google Analytics to be illegal (in its default form), since it transmits IP addresses…]]></description><link>https://posthog.com/blog/is-google-analytics-illegal-microsite</link><guid isPermaLink="false">e75ad9b7-7b81-5ba3-a391-f648e4981501</guid><dc:creator><![CDATA[Cory Watilo]]></dc:creator><pubDate>Mon, 09 May 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/is-ga-illegal-microsite.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>On January 14, 2022, the world learned that Austria had declared Google Analytics to be illegal (in its default form), since it transmits IP addresses to the United States. The Netherlands declared the same view only days later.</p><p>Given that PostHog is an open source, self-hostable analytics tool that eliminates the need to transmit data to <em>any</em> third party, this was obviously a perfect opportunity for us to capitalize on the news.</p><p>Within five days, we launched <a href="https://isgoogleanalyticsillegal.com">IsGoogleAnalyticsIllegal.com</a> and shared it with the Hacker News community. Here’s the story of how we built it in two days, how it was received by the HN community, and our missteps along the way.</p><h2 id="a-timeline">A timeline</h2><h3 id="it-all-started-when-our-cto-shared-the-news-on-slack">It all started when our CTO shared the news on Slack</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/illegal-in-austria.png" alt="The Netherlends also likely to declare Google Analytics illegal"/></p><h3 id="then-our-vp-of-ops-came-up-with-an-idea-to-launch-a-microsite">Then our VP of Ops came up with an idea to launch a microsite</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/is-this-funny-or-just-really-dumb.png" alt="Is this idea funny or just really dumb?"/></p><h3 id="obviously-this-felt-like-a-fun-idea-so-i-put-together-a-quick-joke-of-a-wireframe">Obviously this felt like a fun idea, so I put together a quick joke of a wireframe</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/is-it-illegal-probably.png" alt="Is GA illegal?"/></p><h3 id="soon-we-had-a-gimmicky-domain-name-and-the-idea-was-born">Soon we had a gimmicky domain name and the idea was born</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/is-google-analytics-illegal.png" alt="Greatest domain name ever"/></p><h3 id="i-remember-being-on-a-flight-at-the-time-what-better-way-to-spend-a-couple-hours-in-coach-than-to-whip-up-a-mock">I remember being on a flight at the time. What better way to spend a couple hours in coach than to whip up a mock?</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/mockup.png" alt="1 hour mockup"/></p><h2 id="how-we-positioned-the-site">How we positioned the site</h2><p>We decided to share the site on Hacker News, a site that highly values authenticity. If a post has even the slightest whiff of self-promotion, you can be prepared to be torn to shreds.</p><p>Thankfully one of our marketing values is “No sneaky shit.” I can’t say it better than it’s already stated <a href="https://posthog.com/handbook/marketing#no-sneaky-shit">in our Company Handbook</a>:</p><blockquote><p>Our focus customers are technical and acutely aware of the tedious clickbaity marketing tactics that software companies use to try and entice them. Stop. It&#x27;s patronizing to both the customer and the marketing people creating the content.<br/><br/>
We will never try to trick someone into using PostHog through spammy marketing tactics. That&#x27;s a great way to boost vanity signup metrics in the short term before the customer quickly churns out.</p></blockquote><h3 id="our-challenges">Our challenges</h3><p>How can we:</p><ul><li>have a little fun with this site concept</li><li>provide real value to our visitors</li><li>see an uptick in traffic to PostHog.com</li><li>make it obvious we’re not trying to make this solely a marketing stunt?</li></ul><h3 id="1-provide-value-include-our-competitors-and-let-anyone-add-to-the-list">1. Provide value: <strong>Include our competitors and let anyone add to the list</strong></h3><p>We seeded our <a href="https://isgoogleanalyticsillegal.com/alternatives">Google Analytics alternatives</a> page with all of the competitors we could think of who would solve this problem for companies affected by this ruling:</p><ul><li>Open-source analytics tools</li><li>Self-hostable analytics tools</li><li>Analytics providers in the EU, where customer data isn’t transmitted to the United States</li></ul><p>We also <a href="https://github.com/PostHog/isgoogleanalyticsillegal.com">published our codebase on GitHub</a>, where anyone can submit a pull request to add another competitor to the list.</p><h3 id="2-dont-take-it-too-seriously">2. Don’t take it too seriously</h3><p>When you hover over the map of countries where Google Analytics has been deemed illegal, you’ll see a photo of Ursula von der Leyen, the President of the European Commission, indicating her enthusiasm about the rulings.</p><p>There’s also a giant scrolling news-style ticker posing the question, “Is Google Analytics illegal?”</p><p>We tried to find the balance between providing real value without trying to look like we’re scaring people into needing to use PostHog.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/france-too.png" alt="Now France too?!"/></p><h3 id="3-make-it-abundantly-clear-whos-behind-this">3. Make it abundantly clear who’s behind this</h3><p>Like a cigarette pack that has to include a giant health warning, we tried to go over the top to disclose who was behind the site. (You can’t demonize a <em>little</em> self-promotion, right?)</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/we-not-hiding-it-bro.png" alt="PostHog is clearly behind this"/></p><h2 id="the-response">The response</h2><p>Our <a href="https://news.ycombinator.com/item?id=29994183">Hacker News post</a> jumped to the #2 spot on launch day, driving over 100,000 pageviews to the site. As with most posts, responses were mixed, though we did make some pretty silly gaffes (which we tried to rectify quickly).</p><h3 id="maybe-dont-use-hosted-google-fonts-on-a-website-where-youre-trying-to-point-out-google-tracking-is-bad">Maybe don’t use hosted Google Fonts on a website where you’re trying to point out Google tracking is bad</h3><p>In our haste to get the site live, we used a hosted Google font. This was quickly pointed out by a commenter (and rightfully so). We <a href="https://github.com/PostHog/isgoogleanalyticsillegal.com/commit/66061d3e77902caf84482b11f888feea8dd615e9">fixed it</a>, but unfortunately that became the most popular comment, and is the top comment to this day. </p><h3 id="dont-use-page-urls-that-get-blocked-by-privacy-tools">Don’t use page URLs that get blocked by privacy tools</h3><p>As it turns out, uBlock is allergic to the following slug:</p><pre><code class="language-jsx">/google-analytics-alternatives
</code></pre><p>Since that page was inaccessible to uBlock users, we had to <a href="https://github.com/PostHog/isgoogleanalyticsillegal.com/pull/7">change the path</a> to <code>/alternatives</code>.</p><h3 id="the-difference-between-website-analytics-and-product-analytics-isnt-as-understood-as-we-thought">The difference between <em>website analytics</em> and <em>product analytics</em> isn’t as understood as we thought</h3><p>We see a differentiation between:</p><ul><li><em>Website analytics</em> - tool to analyze web-based traffic</li><li><em>Product analytics</em> - a larger, more in-depth toolset, designed for product teams and engineers to analyze and learn insights about in-app usage, whether web app or mobile</li></ul><p>We were very specific in saying <em>product analytics</em> and not <em>website analytics</em>. Unfortunately some mistook our statement as the latter, and the claim we’re the only open source website analytics platform would be false!</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/6EF42A7B-3EED-4852-884C-DEAA407A701E.jpeg" alt="6EF42A7B-3EED-4852-884C-DEAA407A701E.jpeg"/></p><h3 id="some-people-liked-the-design-others-didnt-typical-hacker-news">Some people liked the design, others didn’t (typical Hacker News!)</h3><p>As the designer on this microsite, I’d like to extend a shout out to melissalobos for the design love. (As a designer with perpetual imposter syndrome, it’s always nice to hear!)</p><p>It was quickly followed up by the contrarian opinion, followed by a discussion about said opinions. (Would it really be a Hacker News thread if it <em>didn’t</em> go down this rabbit hole?)</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/7BCF2377-DE39-4B1F-8019-1180C49D55CC.jpeg" alt="7BCF2377-DE39-4B1F-8019-1180C49D55CC.jpeg"/></p><h3 id="consider-how-people-will-interpret-what-youre-not-actually-saying">Consider how people will interpret what you’re <em>not</em> actually saying</h3><p>On the site, we ask the question: “Is Google Analytics illegal?” We are not stating Google Analytics <em>is</em> illegal.</p><p>Countries required to follow GDPR can still use Google Analytics if they don’t transmit personal data like IP address.</p><p>Unfortunately, not everyone understood this distinction.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/is-ga-illegal-microsite/D99263DC-C425-4D0D-989D-48C57C899C82.jpeg" alt="D99263DC-C425-4D0D-989D-48C57C899C82.jpeg"/></p><p>Given the fact that one of our values is to not use sneaky marketing tactics, I won&#x27;t deny we pushed the boundaries here.</p><p>There&#x27;s a risk that pitching the tagline the way we did could result in a negative perception with a certain userbase. Ultimately we decided to run with it, and we’ve been pleased with the outcome.</p><h2 id="results">Results</h2><p>Ultimately our goal was brand awareness. In the 30 days following the site&#x27;s launch, it resulted in 52,197 unique visitors to IsGoogleAnalyticsIllegal.com, which sent 1,791 unique visitors through to posthog.com.</p><h2 id="whats-next">What’s next?</h2><p>We continue to update the site as there are further developments across the EU. We also launched <a href="https://posthog.com/eu">PostHog Cloud EU</a>, providing a fully-managed <a href="/blog/ga4-alternatives">EU-hosted Google Analytics alternative</a> for our customers.</p><p>More recently, France found Google Analytics to be illegal, so we recently <a href="https://isgoogleanalyticsillegal.com/france/">added that to the site.</a> In fact, we saw a huge spike in traffic to the site around this time.</p><p>If this continues to become more of a trend, we’ll have to switch from manually creating graphics for the site and switch to an actual hosted mapping solution.</p><p>But if we get to that point, we’ll be sure to check that there’s no third-party tracking involved.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing the Avo Inspector app]]></title><description><![CDATA[We're excited to announce that we have launched a new app with  Avo , a leading data governance platform which enables you track data consistently and…]]></description><link>https://posthog.com/blog/avo-plugin-announcement</link><guid isPermaLink="false">668b2f90-71a1-5fab-80d0-ea9cfee568f3</guid><pubDate>Wed, 27 Apr 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We&#x27;re excited to announce that we have launched a new app with <a href="https://www.avo.app/">Avo</a>, a leading data governance platform which enables you track data consistently and scalably across multiple platforms. </p><p>Connecting PostHog to Avo is great if, for example, you&#x27;re worried about data going missing due to naming issues or because event details aren&#x27;t reliably maintained. </p><p>The new app, which is available immediately for users on PostHog Cloud or self-hosted deployments, works by streaming event schema (but <em>not</em> event data) to the Avo Inspector as it is ingested. Once the app is connected, Avo reads the event schemas we send so that you can monitor the quality of your tracking without any code changes and without exposing any user info. Simple.</p><p>The app is maintained by PostHog - <a href="https://github.com/PostHog/posthog-avo-plugin">check the repo here</a> - but we recommend checking out <a href="https://www.avo.app/docs/workspace/connect-inspector-to-posthog">Avo&#x27;s documentation</a> to learn more about how to setup the connection quickly. You can even check the Loom below where Avo demonstrates how to setup the connection in less than 90s! </p><div style="position:relative;padding-bottom:62.5%;height:0"><iframe src="https://www.loom.com/embed/7601e527e64e4d48855de25c3ee25028" frameBorder="0" allowfullscreen="" style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe></div><br/><p>We recently got the chance to meet the Avo team in Iceland at our last PostHog offsite, so we&#x27;re delighted to have been able to work together on this app so quickly. We&#x27;re also interested to hear your feedback as always, so <a href="https://app.posthog.com/home#supportModal">let us know what you think</a></p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.35.0: Introducing SAML, world map view and new plugins]]></title><description><![CDATA[PostHog 1.35.0 introduces activity logs and a brand new way of visualizing where your users are coming from with the World Map. Additionally we now support organization-level SAML login on both Cloud and Self-Hosted instances. Plus check out your Project Homepage for a few additional goodies.]]></description><link>https://posthog.com/blog/the-posthog-array-1-35-0</link><guid isPermaLink="false">6e4d5ce1-d14b-5e9e-8484-f0dfd9ca0f85</guid><pubDate>Mon, 25 Apr 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.35.0 introduces audit logs and a brand new world map view to help you visualize where your users are coming from. Additionally, we now support organization-level SAML login on both Cloud and Self-Hosted instances. Plus, check out your project homepage for a few additional goodies!</p><p>We&#x27;ve also recently launched a new newsletter, which we send once every two weeks! <a href="http://newsletter.posthog.com/subscribe">Subscribe today</a> to hear about our latest news, what we&#x27;re reading and how to get the most out of PostHog. </p><blockquote class="warning-note"><b>IMPORTANT!</b> If you use SAML, please read our <a href="#deprecation-and-removal-notices">deprecation notices below</a>.</blockquote><h2 id="posthog-1350-release-notes">PostHog 1.35.0 release notes</h2><blockquote><p>Wondering how to upgrade a self-hosted instance? Check out our <a href="/docs/runbook/upgrading-posthog">upgrade guide</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#new-activity-log">Activity log</a></li><li><a href="#new-world-map">World map</a></li><li><a href="#new-multitenant-saml">Multi-tenant SAML</a></li><li><a href="#improvement-project-homepage-updates">Project homepage updates</a></li><li><a href="#new-avo-plugin">New Avo plugin</a></li></ul><h3 id="new-activity-log">New: Activity log</h3><img width="827" alt="A screenshot of the app showing the new &#x27;history&#x27; tab on the feature flags page. In the screenshot you can see three recent changes by PostHog staff to our feature flags" src="https://user-images.githubusercontent.com/984817/164484091-f5dfce0b-c400-4699-ac55-642ccc2bc55b.png"/><p>Ever wondered who deleted that feature flag, or merged those two people? Wonder no more with the new activity log!</p><p>You can now view changes to feature flags and persons made in the UI and see who made them, when. Watch out for the activity log being added to more pages in future releases. Or <a href="https://app.posthog.com/home#supportModal">tell us</a> where we should add it next!</p><h3 id="new-world-map">New: World map</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1_35_0_map.png" alt="PostHog - World Map"/></p><p>A staple request of every PostHog hackathon has finally been realized, with the introduction of <strong>world map</strong> – a new Trends chart type which visualizes breakdowns by country (based on <a href="https://posthog.com/integrations/geoip">GeoIP</a> data). Intuitively compare how your traffic and usage differ across countries of the world!</p><h3 id="new-multi-tenant-saml">New: Multi-tenant SAML</h3><p>SAML has been a big focus point in this update (check the deprecation notices below for more info) and the upshot is that you can now configure SAML login on both self-hosted and PostHog Cloud instances! </p><p>You can configure up to one SAML provider per organization, but check out our <a href="/sso">SSO docs</a> for more information on how to get started with SAML on PostHog. </p><blockquote class="warning-note"><b>IMPORTANT!</b> If you use SAML please read our <a href="#deprecation-and-removal-notices">deprecation notices below</a>. SAML support is only available on Enterprise plans.</blockquote><h3 id="improvement-project-homepage-updates">Improvement: Project homepage updates</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1_34_0-homepage.png" alt="PostHog - Project Homepages"/></p><p>In the last update, we introduced <a href="/blog/the-posthog-array-1-34-0#new-homepage">project homepages</a> to help you find information quickly. Now, we&#x27;ve made them even better!</p><p>We&#x27;ve added a new homepage card which lists your recently viewed insights to the project homepage, as well as lists of recent recordings and newly identified persons. All of this is to help give you quick access to commonly-visited pages and recent insights.</p><h3 id="new-avo-plugin">New: Avo plugin</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1_35_0_avo.png" alt="PostHog - Avo plugin"/></p><p>We&#x27;re big fans of <a href="https://www.avo.app/">the Avo data governance platform</a> and were lucky enough to meet the team in person at our recent Iceland offsite. Now, we&#x27;ve launched a new plugin too!</p><p>The plugin sends event schemas to the Avo Inspector as they are ingested by PostHog, enabling you to detect inconsistencies in your schema without sharing any user data. Install it from the plugin tab to get started, or find out more in <a href="https://www.avo.app/docs/workspace/connect-inspector-to-posthog#step-2-enable-avo-inspector-plugin-in-posthog">Avo&#x27;s documentation</a>. </p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>Version 1.35.0 also adds hundreds of other fixes and improvements, including...</p><ul><li><strong>New</strong>: Warnings before leaving an insight with unsaved changes</li><li><strong>New</strong>: Page titles that fully reflect your place in the PostHog app</li><li><strong>New</strong>: &quot;Out-of-band&quot; events shown in session recordings</li></ul><h3 id="deprecation-and-removal-notices">Deprecation and removal notices</h3><ul><li>From PostHog 1.35.0 onwards, SAML will change from being instance-based to domain-based. This means that SAML configurations will take place in the PostHog UI. You will be able to have multiple SAML providers on the same instance (segment by domain, from the user&#x27;s email address). Please review our <a href="/sso">SSO docs</a> for more details.</li><li>If you use SAML on a self-hosted instance and have enabled SAML enforcement (previously <code>SAML_ENFORCED</code> environment variable) then this environment configuration has been deprecated too. You will now need to configure SSO enforcement via Authentication domains. Check the <a href="/sso">SSO docs</a> for more details.</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>We always welcome contributions from our community and this time we want to thank the following people...</p><ul><li><a href="https://github.com/Cavallando">Michael Cavallaro</a>, for Android bug fixes</li><li><a href="https://github.com/RoryCrispin">Rory Crispin</a>, for Docs improvements</li><li><a href="https://github.com/rahul3v">Rahul</a>, for website improvements</li><li><a href="https://github.com/albtsantos">Alberto</a>, for plugin enhancements</li><li><a href="https://github.com/joetrollo">Joe Trollo</a>, for Kafka and SASL support</li><li><a href="https://github.com/bjornj12">Björn and the rest of the Avo team</a>, for the Avo plugin</li></ul><p>Do you want to get involved in making PostHog better? Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>. We also have a <a href="https://github.com/PostHog/posthog/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">list of Good First Issues</a> for ideas on where you can contribute!</p><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="https://apply.workable.com/posthog/j/F6B73AD2F6/">Growth Engineer</a></li><li><a href="https://apply.workable.com/posthog/j/7A6F1142D0/">Site Reliabliulity Engineer - Kubernetes</a></li><li><a href="https://apply.workable.com/posthog/j/449572FD18/">Community Engineer</a></li><li><a href="https://apply.workable.com/posthog/j/2682B00B76/">Full Stack Engineer</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. Don’t see a specific role listed? That doesn&#x27;t mean we won&#x27;t have a spot for you. <a href="mailto:careers@posthog.com">Send us a speculative application!</a></p><hr/><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog news!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.34.0]]></title><description><![CDATA[PostHog 1.34.0 focuses on supporting collaboration. New features include a new default homepage for projects, smart names for all insights, an entire Data Management tool as well as support for horizontal scalability!]]></description><link>https://posthog.com/blog/the-posthog-array-1-34-0</link><guid isPermaLink="false">8a520d01-4a9b-5ed9-a6eb-6b733f8f2d2d</guid><pubDate>Wed, 30 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.34.0 focuses on supporting collaboration and helping you to find and share insights on PostHog. New features in this update include a new default homepage for projects, smart names for all insights and an entire Data Management tool!</p><blockquote class="warning-note"><b>IMPORTANT!</b> Before upgrading, make sure to run all async migrations on your instance. This version will not run until async migrations are completed. Please check out the <a href="/docs/runbook/async-migrations" target="_blank">async migrations</a> docs for details.</blockquote><blockquote class="warning-note"><b>IMPORTANT!</b> If you use SAML please read our <a href="#deprecation-and-removal-notices">deprecation notices below</a>.</blockquote><h2 id="posthog-1340-release-notes">PostHog 1.34.0 release notes</h2><blockquote><p>Wondering how to upgrade a self-hosted instance? Check out our <a href="/docs/runbook/upgrading-posthog">upgrade guide</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#new-homepage">Project homepages</a></li><li><a href="#new-data-management">Data Management</a></li><li><a href="#new-property-group-filtering">Property group filtering</a></li><li><a href="#improvement-smart-insight-naming">Smart insight naming</a></li><li><a href="#new-staff-users">Staff user controls</a></li><li><a href="#new-sharding-and-replication-support-for-clickhouse">Sharding and replication support for ClickHouse</a></li></ul><h3 id="new-project-homepages">New: Project homepages</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1_34_0-homepage.png" alt="PostHog - Project Homepages"/></p><p>We&#x27;ve added default homepages for each project in PostHog, to help you explore new data and keep track on important metrics. You can pin your favorite dashboard directly to this new homepage to easily access those insights and we&#x27;ll also surface popular insights for you too.</p><p>Best of all, if your team uses <a href="/product/session-recording">Session Recording</a>, we&#x27;ll also add your most recent recordings to the homepage too. We&#x27;ve found users who watch these recordings make 3x more useful discoveries, on average!</p><h3 id="new-data-management">New: Data Management</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/data-management-feature/data_management_tab.png" alt="PostHog - view definition context"/></p><p>We&#x27;ve also added a new Data Management system! This new tool helps you organize your PostHog data in-house through event definitions, definition tagging and many more features. This is especially useful in large teams, where it can sometimes be difficult to know if your insights are using the right events.</p><p>Check out our <a href="/blog/data-management-feature">blogpost which explains more about Data Management on PostHog</a> or dive straight into the <a href="/docs/user-guides/data-management">Data Management docs</a> for more information.</p><blockquote><p>🎁 Definition creation, tagging, and volume metrics are premium features which require a PostHog Scale or Enterprise license. <a href="/pricing">Learn more</a>.</p></blockquote><h3 id="improvement-smart-insight-naming">Improvement: Smart insight naming</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1_34_0-smart-naming.png" alt="PostHog - smart insight naming"/></p><p>Previously, we generated random default names for insights based on animals. It was fun and ensured each insight had a unique name, but they weren&#x27;t very descriptive and didn&#x27;t help if you wanted to browse existing insights.</p><p>Now, we&#x27;ve added smart insight naming to automatically generate descriptive names for every insight you create. This makes it a <em>lot</em> easier to find the insights you need - thought you can of course add custom animal names, if you want.</p><h3 id="new-property-group-filtering">New: Property group filtering</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/1_34_0-property-filter.png" alt="PostHog - property filters"/></p><p>One of the most requested features for PostHog, property group filters enable you to mix and match your favourite property filters with <code>OR</code>s and <code>AND</code> conditions. This makes it much simpler to create complex filters when building insights, though this is currently only available as a global filter for insights.</p><h3 id="new-staff-user-controls">New: Staff user controls</h3><p>Self-hosted users can now manage staff users on their instance settings. Staff users are a special instance-level permission which have access to instance-wide settings - and you probably want to have multiple staff users enabled to ensure your instance can always be properly maintained.</p><p>You can manage staff users either via the PostHog UI, or the API if you prefer - check out <a href="/docs/self-host/configure/instance-settings#staff-users">the staff user docs</a> for more information.</p><h3 id="new-sharding-and-replication-support-for-clickhouse">New: Sharding and replication support for ClickHouse</h3><p>Self-hosted users can now shard and replicate their data on ClickHouse to scale horizontally. This can help improve fault tolerance and improve query performance in certain situations.</p><p>Check out the <a href="/docs/runbook/services/clickhouse/sharding-and-replication">horizontal scaling runbook</a> for more information.</p><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><p>Version 1.34.0 also adds hundreds of other fixes and improvements, including...</p><ul><li><strong>Improved</strong>: Dashboard &quot;add insight&quot; flow</li><li><strong>Improved</strong>: SSO login redirect</li><li><strong>New:</strong> Experiments secondary metrics</li><li><strong>New</strong>: Shorter insight links</li></ul><h3 id="deprecation-and-removal-notices">Deprecation and removal notices</h3><ul><li>Starting from PostHog 1.35.0 SAML will change from being instance-based to domain-based. This means that SAML configurations will take place in the PostHog UI. You will be able to have multiple SAML providers on the same instance (segment by domain, from the user&#x27;s email address). Please review our <a href="/sso">SSO docs</a> for more details.</li><li>If you use SAML on a self-hosted instance and have enabled SAML enforcement (previously <code>SAML_ENFORCED</code> environment variable) then this environment configuration has been deprecated too. You will now need to configure SSO enforcement via Authentication domains (see <a href="/sso">SSO docs</a> for more details.)</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="contributions-from-the-community">Contributions from the community</h2><p>Want to help improve PostHog? We always welcome contributions from our community! Check out our <a href="/docs/contribute">contributing resources</a> to get started, or head to <a href="/posts">our community page</a>.</p><p>We would also specifically like to thank PostHog team members <a href="https://github.com/hazzadous">@hazzadous</a>, <a href="https://github.com/guidoiaquinti">@guidoiaquinti</a> and <a href="https://github.com/liyiy">@liyiy</a> for their efforts on this particularly stubborn release.</p><h3 id="community-shoutouts">Community shoutouts</h3><p>This month we also want to say thank you to the following people...</p><ul><li><a href="https://github.com/bnomei">Bnomei</a> for providing <a href="https://github.com/PostHog/posthog.com/issues/3190">feedback on our PHP docs</a></li><li><a href="https://github.com/hspotorno">Hspotorno</a> for additions to <a href="https://isgoogleanalyticsillegal.com/">Is Google Analytics Illegal?</a></li><li><a href="https://github.com/Bla">Bla</a> for submitting <a href="https://github.com/PostHog/posthog/issues/1">ideas and feedback</a></li></ul><h2 id="open-roles-at-posthog">Open roles at PostHog</h2><p>Want to join us in helping make more products successful? We&#x27;re currently hiring for remote candidates in any of the following roles:</p><ul><li><a href="https://apply.workable.com/posthog/j/449572FD18/">Community Engineer</a></li><li><a href="https://apply.workable.com/posthog/j/7A6F1142D0/">Site Reliability Engineer - Kubernetes</a></li><li><a href="https://apply.workable.com/posthog/j/2682B00B76/">Full Stack Engineer - Growth</a></li><li><a href="https://apply.workable.com/posthog/j/AB22DA7D5F/">Tech Talent Partner</a></li></ul><p>Curious about what it&#x27;s like to work at PostHog? Check out our <a href="https://posthog.com/careers">careers page</a> for more info about our all-remote team and transparent culture. We also welcome speculative applications for roles from exceptional candidates.</p><hr/><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a> for more PostHog news!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing Collaboration for PostHog]]></title><description><![CDATA[PostHog is better with teammates. You only have to create a  dashboard  once, but it becomes more valuable every time you invite someone from your…]]></description><link>https://posthog.com/blog/collaborating-on-posthog</link><guid isPermaLink="false">dd2c010d-178e-51b8-b5ff-17807c49ca70</guid><dc:creator><![CDATA[Paolo D'Amico]]></dc:creator><pubDate>Thu, 24 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/Collaboration.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog is better with teammates. You only have to create a <a href="/docs/user-guides/dashboards">dashboard</a> once, but it becomes more valuable every time you invite someone from your organization to view it. And this isn&#x27;t just some vague truism: it&#x27;s a measurable fact.</p><p>Our data shows organizations with multiple teammates retain 30%+ better than those with a single user. Better collaboration also powers our <a href="https://github.com/handbook/product/metrics">main Product metric</a>: insight discoveries. Our conservative estimates suggest we could increase discoveries by 20% by improving collaboration workflows <sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup>, so that&#x27;s what we&#x27;ve done.</p><p>Over the past few months, we&#x27;ve worked hard to make collaboration in PostHog as easy as possible, particularly for larger teams. That work will never end, but we want to show you what we have today and share our roadmap for the future.</p><h2 id="sharing-insights-with-stakeholders">Sharing insights with stakeholders</h2><p>The most basic collaborative action for an analytics product is sharing insights. This is critical because, in larger teams, there are usually multiple stakeholders making or influencing product decisions. In order to make solid decisions, you have to share context - such as letting your Marketing team see their impact through metrics such as high quality signups.</p><p>To address the above we introduced robust permalinks to insights that can easily be shared across multiple mediums. These links can now be used to send a specific insight (with all configurations) to a colleague, even if you are working across multiple projects.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/collaborating-on-posthog_1.png" alt="Concept of how insight links changed to permalinks today"/></p><p>You can share dashboards easily too. Even if you share a link to a dashboard in a different project, recipients will be automatically switched to the correct project if they have access</p><p>In small teams it&#x27;s common for a single person to own the analytics process, but feedback from larger clients demonstrated this wasn&#x27;t the case for them.  In response, we&#x27;ve introduced granular permissions to give users full control over who can edit their dashboards. This makes it easier for larger teams to work together, without stepping on each others toes.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_33_0-dashboard-permissions.png" width="500" alt="Screenshot of dashboard permissions"/><h3 id="exploring-data-speculatively">Exploring data speculatively</h3><p>Sometimes you don&#x27;t know what you&#x27;re looking for, or you don&#x27;t know where to start. There are many different avenues to improving your product. For example, we recently <a href="https://github.com/PostHog/posthog/pull/7973">discovered</a> users seldom use our Paths advanced features and these could introduce mental burden to users.</p><p>To aid serendipitous discoveries, we&#x27;ve created a project homepage to surface helpful insights you may not have considered. By making it the default page on PostHog, our aim is to help users make quick discoveries. We&#x27;ll surface your most important product and company metrics here as well as popular insights, and we&#x27;re leveraging social proof from what other teammates are doing in your app to help you discover more product improvements.</p><p>In addition, if your team uses the <a href="/product/session-recording">Session Recording</a> feature, we&#x27;ll also surface the most recent recordings here. We&#x27;ve found that users who return to Session Recordings make 3x more discoveries than other users (more context in <a href="https://github.com/PostHog/posthog/issues/8595#issuecomment-1056916848">issue #8595</a>). This should also help drive qualitative discoveries about your product.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/collaborating-on-posthog_4.png" alt="Concept of project home page"/></p><h2 id="leveraging-the-work-of-your-colleagues">Leveraging the work of your colleagues</h2><p>We find there are two general profiles for PostHog users:</p><ol><li>People who are naturally curious and whose job leads them to discover insights all the time and across multiple dimensions.</li><li>People who use PostHog to answer specific questions as they arise. </li></ol><p>For people who create insights, we&#x27;ve introduced one-click saving and automatic insight naming. This means people who create lots of insights don&#x27;t have spend time documenting their work, while their colleagues can easily understand what they&#x27;re looking at.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/collaborating-on-posthog_3.png" alt="Screenshot of automatic insight naming"/></p><p>And for people who love discovering insights that others made, we&#x27;ve made it easier to search and find saved insights.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/collaborating-on-posthog_2.png" alt="Screenshot of saved insights"/></p><p>To support this work, we also introduced the new <a href="/blog/data-management-feature">Data Management</a> feature, which brings together all the context on how your product is instrumented. Now there&#x27;s no need to ask an Engineer or Product Manager which event you should use to answer a question, which both parties will appreciate!</p><h2 id="whats-next">What&#x27;s next?</h2><p>We&#x27;re continuing to actively work on improving collaboration throughout the product and we have some specific plans in our short term roadmap. </p><p>However, we&#x27;re a fast moving company and we continuously reprioritize based on feedback, market needs, etc., so the way we tackle this problem may change.</p><p>With the disclaimer above in mind, here&#x27;s some exciting stuff we hope to ship soon.</p><h3 id="slack-previews">Slack Previews</h3><p>Almost every team uses some sort of Instant Messaging tool (think Slack, Discord, Teams, ...) and in particular, it&#x27;s a place for discussions. We believe that adding more context when you share a link to a PostHog insight or dashboard will speed up discussions (e.g. a screenshot of the graph, general details, recent changes, ...). We&#x27;re starting with Slack to test drive this concept, but if successful, expanding to other tools will make sense.</p><h3 id="email-subscriptions-to-dashboards-and-insights">Email subscriptions to dashboards and insights</h3><p>As we analyzed dashboard usage in PostHog, we discovered it&#x27;s quite common for teams to have one or two dashboards that represent their critical metrics, such as number of sales for an e-commerce company or retention for a pre-Product-Market-Fit startup. </p><p>A very user-friendly way of keeping users updated on these metrics is by integrating with their current workflows, such as email. Soon you&#x27;ll be able to start your Mondays (or any other day) with a digest of how your product and company are doing.</p><h3 id="embeddable-graph-images">Embeddable graph images</h3><p>You&#x27;ve seen the typical Medium post with a graph, well we have too and we hate they&#x27;re not PostHog graphs. But aside from that superficial argument, teams have different workflows and tools where product context is shared (e.g. an intranet, Notion, Google Docs, code repositories, blog posts). Usually product decisions are at least data-informed (and we do hope this will help drive this behavior further), so we want to make sure that the context from product data is properly shared, accessible and preserved. In particular, we also want to make sure these context remains up-to-date.</p><p>As always, we welcome and highly encourage you to share any feedback you may have about this or any other feature. Give us a shout in <a href="/posts">our community page</a> or join us directly for a <a href="https://calendly.com/posthog-feedback">call</a> with our Product or Engineering team.</p><div style="border:1px solid #D9D9D9;margin-bottom:16px;margin-top:16px"></div><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div class="footnotes"><hr/><ol><li id="fn-1">Based on the average number of discoveries per active user and the number of teammates that never perform a discovery, we estimated that we could get at least a ~12%+ increase in active discoverers, and 20%+ increase in weekly discoveries.<a href="#fnref-1" class="footnote-backref">↩</a></li></ol></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What launching Experimentation taught us about running effective A/B tests]]></title><description><![CDATA[We just launched our Experimentation suite, and there's a ton we learned about running successful experiments. It was a no brainer product decision…]]></description><link>https://posthog.com/blog/experiments</link><guid isPermaLink="false">e29e3593-748d-5636-9799-794b22522dab</guid><dc:creator><![CDATA[Neil Kakkar]]></dc:creator><pubDate>Wed, 23 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/experiments.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We just launched our Experimentation suite, and there&#x27;s a ton we learned about running successful experiments.</p><p>It was a no brainer product decision: Since you&#x27;re already analysing your data in PostHog, and you&#x27;re already using <a href="/product/feature-flags">Feature Flags</a> to roll out new features, why not have the capability to test how well these features are doing? Plus, what is the world without a <a href="/blog/best-open-source-ab-testing-tools">great open-source A/B testing tool</a>?</p><p>Experiments allow you to choose a target metric, choose specific people to run this experiment on, and set how long the experiment runs for.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/experimentation/experiment-creation.png" alt="PostHog - Experiment Creation"/></p><p>Thanks to Feature Flags, you can then easily validate whether each variant looks good, launch your experiment, and wait for data to come in. We then run a Bayesian analysis on the data to give a probability for each variant being the best, a graph of how things are looking for each variant, and whether the results are statistically significant or not.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/experimentation/experiment-results.png" alt="PostHog - Experiment Results"/></p><p>It&#x27;s a powerful tool for building great products, but that&#x27;s enough about how experiments work for now. If you&#x27;re interested in the technical details, check out the <a href="/docs/user-guides/experimentation">Experimentation user guide</a>.  </p><p>Instead, I&#x27;m going to share the three key things we&#x27;ve learned about running effective A/B tests so you can get the most out of this new feature.</p><blockquote><p>This article is Chapter III in our <a href="/blog/launch-week-universe-of-new-features">A Universe of New Features launch week</a> series</p></blockquote><h2 id="1-use-specific-metrics">1. Use specific metrics</h2><p>Let&#x27;s say you&#x27;re running an experiment to optimize the number of times users interact with PostHog graphs. Specifically, you&#x27;re testing out different layouts for funnels - horizontal and vertical - and want to find which one leads to more interactions.</p><p>You can choose one of two metrics, but which one is right?</p><ol><li>Number of interactions across all graphs, not just funnels.</li><li>Number of interactions for funnels.</li></ol><p>Note that you&#x27;re choosing the <em>total</em> interactions here, not <em>unique</em> interactions so if one person clicks on the funnel three times, that counts as three interactions for either metric, as it should.</p><p>There&#x27;s a big problem with metric #1: It&#x27;s global, and a lot more susceptible to things out of our control. For example, if Trends power users are somehow assigned to the control group, the data will have a big skew towards control which has nothing to do with the different funnel layouts.</p><p>We found this to be the case in reality - the more specific the metric, the fewer outside factors affect your result. Focusing on local optimization gives you better local information.</p><p>At the same time, you don&#x27;t want to discard second order effects. What if the horizontal funnel layout prevents users from switching to other graphs? This might increase funnel interactions (local metric #2 increases), but at a cost to the global metric (#1).</p><p>To solve this problem, we introduced secondary metrics. We encourage making the main metric as the local metric, and then allow the option of having a few secondary metrics. We don&#x27;t do significance analysis on these secondary metrics, but show the metric values for each variant, so you can ensure that there&#x27;s no huge drop in global metrics while deciding on results.</p><p>Another advantage of local metrics over global is that it can be hard to reliably move global metrics<sup id="fnref-2"><a href="#fn-2" class="footnote-ref">2</a></sup>. Local metrics allow you to see changes faster, since they&#x27;re narrower in scope, and thus move quicker.</p><h2 id="2-experiment-results-arent-set-in-stone">2. Experiment results aren&#x27;t set in stone</h2><p>You just finished running the experiment above, and the results are in. Horizontal funnel layout had 1,000 interactions, while vertical funnel layout had 1,200. The results ended up being significant, with vertical funnel layout being 20% better.</p><p>All well and good... except this goes against everything you intuitively know about using your own product. You find the vertical view congested, hard to parse, and sort of terrible.</p><p>Do you completely trust the data, or your intuition?</p><p>Both have issues. Your intuition might be how you see the world, but not necessarily how people who use the product see the world. At the same time, what if there was a bug in the vertical layout implementation, which counted each interaction twice? Maybe the &#x27;real&#x27; number was 600, instead of 1,200, which massively changes your product direction.</p><p>Perhaps unhelpfully, I&#x27;d recommend neither blindly trusting the data, nor your intuition. Experiments show you what is happening, but can&#x27;t answer why. The real institutional knowledge comes with answering the why, and building up an accurate model of who your users are, what they need, and how they interact with your product.</p><p>To answer the why, you need to talk through the causes. <a target="_blank" rel="noopener" href="https://neilkakkar.com/Bayes-Theorem-Framework-for-Critical-Thinking.html"> Create hypotheses about why this is happening</a> , watch user session recordings, and then make a call about what you want to do.</p><p>That is, bring data to conversations, but also talk through causes.</p><h2 id="3-changing-environments-can-invalidate-experiment-results">3. Changing environments can invalidate experiment results</h2><p>You&#x27;ve finally got results for the experiment above, and figured out why they&#x27;re like this. Turns out, the vertical layout promotes interaction – it allows users to see all steps of the funnel in one go, click on the steps that seem surprising, see the persons involved in that step, watch their recordings, etc. The horizontal layout, meanwhile, is a bit more frustrating to see all this information at a glance, causing faster bounces.</p><p>That&#x27;s a model that keeps on giving, even when things change.</p><p>Let&#x27;s say it&#x27;s now three months in the future, and you&#x27;ve done a design revamp. Horizontal bars are thinner now, while vertical bars are thicker. As a result, horizontal funnels fit in cleanly on screen, while vertical funnels don&#x27;t.<sup id="fnref-4"><a href="#fn-4" class="footnote-ref">4</a></sup></p><p>You could run an experiment again to find if user preferences have changed, but if your model is right, interactions should start going down, and you can make the call to revert back to a horizontal layout.</p><p>ULtimately, experiment results don&#x27;t stand the test of time - we cannot stress enough the importance of extracting a useful model out of your experiment results.</p><h2 id="bonus-experimentation-for-web-products-is-very-different-from-clinical-trials">Bonus: Experimentation for web products is very different from clinical trials</h2><p>Another interesting thing we learned is that we can&#x27;t simply run experiments for web products like you would a clinical trial. Rigor is important, but if it takes you a year to make up your mind about a vertical vs. horizontal layout, you&#x27;ll be in trouble.</p><p>This kind of rigor makes sense when you&#x27;re developing a new drug and optimizing for risk mitigation: there&#x27;s lives at stake, and mistakes do result in casualties. Further, you can take things slow because human biology is reliably consistent.</p><p>By contrast, web products are much lower stake, and are present in an ever-changing environment. Culture and individual preferences can change rapidly, and the cost of getting experiments wrong isn&#x27;t too high - you can easily revert them later on.</p><p>Moving quickly trumps rigor in web product experiments.</p><p>We built Experimentation with this in mind. It&#x27;s a web product, built for products that move quickly.</p><p>Another example where this difference shines through is the peeking problem.</p><p>The strawman, pop-sci version of the peeking problem goes something like: &quot;You shouldn&#x27;t look at experiment results while the experiment is running because that can lead to you ending experiments early, when the data is skewed in favour of one variant, thanks to random chance.&quot;</p><p>However, peeking isn&#x27;t the problem. The problem is taking action too quickly <em>after</em> peeking.</p><p>We built this into our product. Peeking is fun, almost addictive, when you can see your experiment results changing in real time. It gives a sense of excitement, seeing your hypotheses being proven right or wrong. More importantly, it keeps you coming back to the experiment, tracking its progress.</p><p>To solve the Taking-action-without-enough-information problem, we made it clear in our UI when it was okay to end an experiment. Specifically, this is when results become significant, or the pre-determined duration for peeking has passed.<sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup> This changed the conversation from &#x27;peeking early and ending experiment if results look good&#x27; to &#x27;waiting for the green light to switch on&#x27;, and led to an overall much better experience.</p><p>That&#x27;s all for this post, we&#x27;d love to have you start your own experiments and tell us what you learn. Feel free to open an issue in <a href="https://github.com/PostHog/posthog">our Github repo</a>, join us directly for a <a href="https://calendly.com/posthog-feedback">call</a> with our Product &amp; Engineering team, or <a href="https://app.posthog.com/home#supportModal">submit a ticket</a> if you have feedback to share.</p><p><div></div></p><div class="footnotes"><hr/><ol><li id="fn-2">Depends a lot on how big and mature your product is, and how many sub features it has. If there&#x27;s only one thing the app does, the local metric is the global metric.<a href="#fnref-2" class="footnote-backref">↩</a></li><li id="fn-4">A bit contrived, but easier to keep this blogpost manageable without explaining the ins and outs of PostHog graphs :). Also, don&#x27;t tell our designer, they&#x27;ll scream if they hear about this design revamp.<a href="#fnref-4" class="footnote-backref">↩</a></li><li id="fn-1">If you&#x27;re looking for how we calculate this, see the <a href="/docs/user-guides/experimentation">user guide</a><a href="#fnref-1" class="footnote-backref">↩</a></li></ol></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog Launch Week I: A Universe of New Features]]></title><description><![CDATA[PostHog made huge strides in 2021. To name just a few landmarks, we:  Raised a  $15 million Series B ahead of schedule Became one of  YC's top-valued…]]></description><link>https://posthog.com/blog/launch-week-universe-of-new-features</link><guid isPermaLink="false">9a739221-80db-5989-a0a6-faf458e81448</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 23 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/launch-week-teaser.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>PostHog made huge strides in 2021. To name just a few landmarks, we: </p><ul><li>Raised a <a href="/blog/why-we-raised-a-15m-series-b-ahead-of-schedule">$15 million Series B ahead of schedule</a></li><li>Became one of <a href="/blog/yc-top-companies">YC&#x27;s top-valued companies</a></li><li>Rebranded our website <a href="/blog/postmortem-rebrand">in just four weeks</a></li><li>Migrated from <a href="/blog/how-we-turned-clickhouse-into-our-eventmansion">postgresql to ClickHouse</a></li><li>Achieved product market fit for PostHog Scale</li></ul><p>All of this (and more) lead to huge growth. Users grew by 4x, the number of open source contributors doubled and we acquired <a href="/customers">numerous reference customers</a>.</p><p>But this is just the beginning. We&#x27;ve also been busy making PostHog a broader and more powerful tool for making great products. </p><p>To celebrate, we&#x27;re officially launching a new feature or initiative every day this week. Welcome to <em>PostHog Launch Week I: A Universe of New Features</em>.</p><h2 id="chapter-i-data-management">Chapter I: Data Management</h2><ul><li><strong>Starring:</strong> Alex Kim</li><li><strong>Introducing:</strong> New Data Management UI, event definitions, definition tagging and many more</li></ul><p>As the biggest dogfooder of our own product, we were beginning to see the consequences of the lack of in-house tools to manage our data. All the use cases we saw boiled down to a few common pain points:</p><ol><li>It is hard to understand events, actions, and properties that you yourself didn&#x27;t set up.</li><li>Data decays quickly, and most of the time fails to stay up-to-date with instrumentation.</li><li>Event-level context in insights and dashboards is difficult to share with external people and new team members.</li></ol><p>We set out to solve these pain points and the result is the new Data Management experience we&#x27;re introducing today on PostHog Cloud and next week for self-hosted.</p><p><strong>Read:</strong> <a href="/blog/data-management-feature">Introducing Data Management for PostHog</a></p><h2 id="chapter-ii-project-sparkle">Chapter II: Project Sparkle</h2><ul><li><strong>Starring:</strong> Karl-Aksel Puulmann, Harry Waye and Guido Iaquinti</li><li><strong>Introducing:</strong> Sharded ClickHouse and easier self-hosted deployments</li></ul><p>We created &#x27;Project Sparkle&#x27; to address two challenges: to <strong>make PostHog scalable for anyone</strong> and to <strong>make self-hosting PostHog easier</strong>.</p><p>In <a href="/blog/secrets-of-posthog-query-performance">The secrets of PostHog query performance</a>, Karl-Aksel Puulmann details the work we&#x27;ve done to make PostHog faster and more scalable, including (among other things) a massive 55% improvement to query performance on PostHog Cloud.</p><p>In <a href="/blog/improving-posthog-deployments">How we’re making PostHog deployments easier</a>, Harry Waye and Guido Iaquinti explain how PostHog&#x27;s architecture has evolved since its launch in 2020, and the steps we&#x27;re taking to make self-hosted deployments easier, including multi-layered testing and improved monitoring.</p><p>Finally, we&#x27;re delighted to officially confirm our <a href="/blog/posthog-altinity-announce">partnerhship with Altinity</a> and the launch of <a href="/marketplace">PostHog Marketplace</a>. You may know <a href="https://altinity.com/">Altinity</a> as experts in all things ClickHouse and data infrastructure. Altinity will be offering a variety of services to help give large organizations on PostHog an increased level of support for self-hosted deployments.</p><p>Going forward, the marketplace is where you’ll be able to find third-party services which layer on top of PostHog, such as companies offering support, integration or development services. Altinity is the first such company, but there are more to come in the future. </p><h2 id="chapter-iii-experimentation">Chapter III: Experimentation</h2><ul><li><strong>Starring:</strong> Neil Kakkar</li><li><strong>Introducing:</strong> A/B testing, multivariate tests and statistical significance</li></ul><p>Everyone has an opinion about user experience, and that&#x27;s fine. But it&#x27;s vital to test those opinions and validate what works, which is why we built our Experimentation suite. </p><p>Experiments allow you to choose a target metric, choose specific people to run this experiment on, and set how long the experiment runs for.</p><p>Thanks to Feature Flags, you can then easily validate whether each variant looks good, launch your experiment, and wait for data to come in. We run a Bayesian analysis on the data to give a probability for each variant being the best, show a graph of how things are looking for each variant, and whether the results are statistically significant or not. It&#x27;s awesome.</p><p>Today, Neil Kakkar shares three things we&#x27;ve learned about running effective A/B tests. If you want to build better products, we seriously recommend giving it a read.</p><p><strong>Read: <a href="/blog/experiments">What launching Experimentation taught us about running effective A/B tests</a></strong></p><h2 id="chapter-iv-collaboration">Chapter IV: Collaboration</h2><ul><li><strong>Releasing:</strong> Thursday, March 24</li><li><strong>Starring:</strong> Rick Marron and Paolo D&#x27;Amico</li><li><strong>Introducing:</strong> Granular dashboard permissions, automatic insight naming and much more  </li></ul><p>95% fresh on Tasty Earthworms</p><h2 id="chapter-v-session-recording">Chapter V: Session Recording</h2><ul><li><strong>Releasing:</strong> Friday, March 25</li><li><strong>Starring:</strong> Rick Marron</li><li><strong>Introducing:</strong> The most addictive feature you&#x27;ll ever know</li></ul><p>&quot;So good, I wrote a 1,000 word Twitter thread about it&quot; - A Twitter user, probably</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we’re making PostHog deployments easier]]></title><description><![CDATA[When PostHog was born in 2020, it was a simple Python application (Django + Celery) backed by a PostgreSQL datastore. Troubleshooting was easy, while…]]></description><link>https://posthog.com/blog/improving-posthog-deployments</link><guid isPermaLink="false">afcbb202-f525-59a2-945c-b28e859f8e7e</guid><dc:creator><![CDATA[Harry Waye]]></dc:creator><pubDate>Tue, 22 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/simpler-self-deployments.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>When PostHog was born in 2020, it was a simple Python application (Django + Celery) backed by a PostgreSQL datastore. Troubleshooting was easy, while the low barrier of entry meant fast adoption and more feedback on where to take the product.</p><p>This was great at the start, but it couldn&#x27;t last. More customers meant more data to ingest and analyze. Our ingestion couldn’t keep up with the volumes of events we were receiving, and our event queries using PostgreSQL were slow. If we wanted PostHog to scale, we had to revisit our stack.</p><p>Introducing Kafka helped us to decouple our data streams and our processing pipeline, while <a href="/blog/clickhouse-announcement">ClickHouse helped us to deliver very fast queries</a> on a large volume of data and more horizontal scaling capabilities. These additions helped us scale, but they came at a cost: complexity.</p><p>Here&#x27;s how our ingestion pipeline looks like now:</p><pre><code class="language-mermaid">graph TD
    CLIENT[Client Library]
    FLAGS[&quot;/flags API&quot;]
    CAPTURE[Capture API]
    PLUGINS[Plugin server]
    PERSONS[&quot;PostgreSQL (persons table)&quot;]
    Kafka2[Kafka]

    CLIENT -..-&gt; FLAGS

    CLIENT -..-&gt; CAPTURE
    CAPTURE --&gt; Kafka

    Kafka &lt;-..- PLUGINS

    PLUGINS &lt;--&gt; PERSONS
    PLUGINS --&gt; Kafka2

    Kafka2 &lt;-..- ClickHouse
</code></pre><p>While powerful, this new architecture has created the following challenges:</p><ul><li><p>We now have additional distributed services like Kafka, ClickHouse and Zookeeper to deploy and manage.</p></li><li><p>Each additional dependency requires considerations in terms of monitoring, migrations, upgrades, durability among others.</p></li><li><p>ClickHouse is a relatively new product. Whereas tooling around PostgreSQL is very mature, we need to do some of the heavy lifting ourselves with ClickHouse.</p></li><li><p>Very few people know or have experience with managing a ClickHouse cluster relative to PostgreSQL. Our <a href="/blog/posthog-altinity-announce">partnerhship with Altinity</a>, which offers 24/7 technical support for ClickHouse, and bespoke training, is another way we&#x27;re addressing this challenge. </p></li><li><p>Simple operations such as application deployments or database upgrades have become complex automations.</p></li></ul><p>To address this complexity and make PostHog easier to deploy, maintain and use for anyone, we gave ourselves two goals: <strong>improve our test framework</strong> and <strong>improve our built-in monitoring</strong>.</p><blockquote><p>This article is part of our <a href="/blog/launch-week-universe-of-new-features">A Universe of New Features launch week</a> series</p></blockquote><h2 id="goal-1-improve-test-framework">Goal 1: Improve test framework</h2><p>While you can self-host PostHog using <code>docker-compose</code> for the evaluation stage, for production we offer an abstraction system built on top of the <a href="https://kubernetes.io/">Kubernetes</a> platform via <a href="https://helm.sh/">Helm</a>.  </p><p>We’ve built on top of Kubernetes because although it&#x27;s overkill for many scenarios, it allows us to focus on one abstraction but target any cloud provider that has a Kubernetes offerings. Currently we support AWS, Azure (alpha), DigitalOcean and Google Cloud Platform.</p><p>In order to give us confidence that every self-hosted installation is reliable and we iterate fast, we needed to significantly improve our testing frameworks. </p><p>Kubernetes resources are usually represented as YAML objects, while Helm helps us to define, install, upgrade and package them via a template engine.</p><p>In order to make sure those resources are defined, installed and upgrade correctly across different cloud platforms, Kubernetes versions and deployment scenarios, we’ve introduced several layers of testing, each of which with a specific goal:</p><ul><li><p>lint tests (via <a href="https://helm.sh/docs/helm/helm_lint/"><code>helm lint</code></a>): to verify if the Helm templates can be rendered without errors</p></li><li><p>unit tests (via <a href="https://github.com/quintush/helm-unittest"><code>quintush/helm-unittest</code></a>): to verify if the rendered Helm templates are behaving as we expect</p></li><li><p>integration tests:</p><ul><li><p><a href="https://github.com/vapor-ware/kubetest"><code>kubetest</code></a>: to verify if applying the rendered Helm templates against a Kubernetes target cluster gives us the stack we expect (example: are the disks encrypted? Can this pod communicate with this service?)</p></li><li><p><a href="https://k6.io/"><code>k6</code></a>: HTTP test used to verify the reliability, performance and compliance of the PostHog installation (example: is the PostHog ingestion working correctly?)</p></li><li><p><a href="https://k3s.io/"><code>k3s</code></a>: to verify Helm install/upgrade commands across different versions</p></li><li><p><a href="https://github.com/PostHog/charts-clickhouse/blob/main/.github/workflows/test-amazon-web-services-install.yaml"><code>e2e - Amazon Web Services</code></a>, <a href="https://github.com/PostHog/charts-clickhouse/blob/main/.github/workflows/test-digitalocean-install.yaml"><code>e2e - DigitalOcean</code></a>, <a href="https://github.com/PostHog/charts-clickhouse/blob/main/.github/workflows/test-google-cloud-platform-install.yaml"><code>e2e - Google Cloud Platform</code></a>: to verify Helm install command on the officially supported cloud platforms</p></li></ul></li></ul><p>Thanks to those layers, we can now detect scenarios like:</p><ul><li><p>template is invalid</p></li><li><p>template is valid, but it didn’t get rendered as we expect</p></li><li><p>template is valid and got rendered as we expect but doesn’t work on a specific Kubernetes version</p></li><li><p>template is valid and got rendered as we expect, works on all supported Kubernetes version, but it doesn’t work on a specific implementation of a cloud provider</p></li></ul><p>Those tests are helping us to identify and fix several bugs in our implementation, catching regressions before code gets released and enabling us to iterate faster than ever.</p><p>There&#x27;s more information about the technical implementation <a href="https://github.com/PostHog/charts-clickhouse#testing">on our repo</a>.</p><h2 id="goal-2-improve-built-in-monitoring">Goal 2: Improve built-in monitoring</h2><p>Proper monitoring is vital for maintaining a successful installation.</p><p>To simplify this task for our self-hosting users, we’ve improved the built-in monitoring we provide as part of PostHog by leveraging best in class open source components like <a href="https://grafana.com/">Grafana</a>, <a href="https://prometheus.io/">Prometheus</a> and various service exporters.</p><p>We create new templated dashboards when we identify better metrics to monitor, and techniques to debug an installation, and make them available to everyone in the next release.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/improving-posthog-deployments/postgresql.png" alt="PostHog - built-in PostgreSQL dashboard"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/improving-posthog-deployments/redis.png" alt="PostHog - built-in Redis dashboard"/></p><p>Thanks to this work, you can now get critical insights about the majority of PostHog services by simply enabling the monitoring features in the Helm chart. You can read more about these in our <a href="/docs/self-host/deploy/configuration">chart configuration docs</a>.</p><h2 id="whats-next">What’s next?</h2><p>Improving deployments for PostHog Cloud and our self-hosting customers is an effort we will keep investing in. Here&#x27;s a sneak peek at some of the projects in our roadmap:</p><ul><li><p>keep improving our chart to align to Kubernetes best practices</p></li><li><p>add support for more cloud platforms</p></li><li><p>enhance our observability stack by integrating <a href="https://opentelemetry.io/">OpenTelemetry</a> across all our components and systems</p></li></ul><p>If you enjoyed reading this look at improving PostHog deployments, we recommend reading Karl&#x27;s deep dive into the <a href="/blog/secrets-of-posthog-query-performance">secrets of PostHog query performance</a>.</p><blockquote><p>Interested on chatting about those topics? <a href="https://app.posthog.com/home#supportModal">Get in touch with our teams!</a></p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog teams up with Altinity]]></title><description><![CDATA[That’s right, we’re  teaming up with Altinity . It’s an exciting new partnership that also marks the launch of the  PostHog Marketplace . Double…]]></description><link>https://posthog.com/blog/posthog-altinity-announce</link><guid isPermaLink="false">d65a15f2-7597-55af-8b20-0b352f446904</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 22 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>That’s right, we’re <a href="https://altinity.com/blog/announcing-the-new-altinity-posthog-partnership">teaming up with Altinity</a>. It’s an exciting new partnership that also marks the launch of the <a href="/marketplace">PostHog Marketplace</a>. Double announcement!</p><p>Going forward, the marketplace is where you’ll be able to find third-party services which layer on top of PostHog, such as companies offering support, integration or development services. Altinity is the first such company, but there are more to come in the future. </p><p>You may know <a href="https://altinity.com/">Altinity</a> as experts in all things ClickHouse and data infrastructure. That’s why we’re working with them! Going forward, Altinity will be offering a variety of services to help give large organizations on PostHog an increased level of support for self-hosted deployments.</p><p>This increased support includes:</p><ul><li>24/7 technical support for ClickHouse in any environment</li><li>Bespoke training for analytics developers and system administrators</li><li>Altinity Stable builds for ClickHouse</li></ul><p>In addition to providing training and support, Altinity can also offer <a href="/docs/self-host/configure/using-altinity-cloud">Altinity.Cloud as a backend</a> for PostHog users who prefer a private cloud environment. This essentially means Altinity can manage your ClickHouse deployment for you, turning PostHog into a fully managed service.</p><p>We think this partnership with Altinity is exciting because, while self-hosted deployments offer many unique benefits — such as better data capture and <a href="/customers/vendasta">data control</a> — they can also be challenging to set up and maintain. Altinity is the ideal middle ground, enabling you to retain full control over your data while experts manage your ClickHouse for you!</p><p>You can find out more about our partnership with Altinity in the PostHog marketplace, where we’ll soon add even more exciting partners to help you get even more from your PostHog deployment. Until then, we’d love to hear your feedback in <a href="/posts">our community page</a>.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The secrets of PostHog query performance]]></title><description><![CDATA[We want PostHog to become the first choice for product analytics at any scale. To do that, users should have a smooth experience exploring their…]]></description><link>https://posthog.com/blog/secrets-of-posthog-query-performance</link><guid isPermaLink="false">e573fd6f-6fa4-54f7-a4f1-176768d733bb</guid><dc:creator><![CDATA[Karl-Aksel Puulmann]]></dc:creator><pubDate>Tue, 22 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/lw-queries.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We want PostHog to become the first choice for product analytics at any scale. To do that, users should have a smooth experience exploring their product data - including not waiting minutes for queries to load.</p><p>In this post, I’m going to break down the why’s and how’s of several major performance improvements we&#x27;ve made in the last few months to achieve that goal.</p><blockquote><p>This article is part of our <a href="/blog/launch-week-universe-of-new-features">A Universe of New Features launch week</a> series</p></blockquote><h2 id="how-does-querying-work-within-posthog">How does querying work within PostHog?</h2><p>The free-form querying experience in PostHog allows you to ask questions about your Trends, Funnels, Retention, and Cohorts with complicated filtering to top it off.</p><p>These queries are processed by <a href="https://clickhouse.com/">ClickHouse</a>, where event, user, and group data is stored in a raw format without any preaggregation. ClickHouse excels at analyzing billions of events in seconds even with complex filtering.</p><p>However, as awesome as ClickHouse is, nothing is without sharp edges and trade-offs.</p><h2 id="speeding-up-property-filtering-by-25x">Speeding up property filtering by 25x</h2><p>PostHog allows users to send and analyze an arbitrary number of event and person properties with their data. We store these properties as JSON-encoded string columns in our tables.</p><p>One of the first issues we saw after moving to ClickHouse was that, for our largest users, filtering by properties was slow.</p><p><a href="https://github.com/Slach/clickhouse-flamegraph">Benchmarking these queries using flamegraphs</a> showed that the slowness came from two things: reading JSON properties from disk and (to a lesser extent) parsing it during query-time.</p><p>We ended up <a href="/blog/clickhouse-materialized-columns">materializing the most used properties into new columns</a>, leveraging the strength of a columnar database without running into column number limits.</p><p>Specifically, the new materialized columns are fast to read from disk as they compress really well and ClickHouse can skip parsing JSON entirely during queries.</p><p>On our PostHog Cloud setup, we saw this feature improve query performance by 55% on average, with the p99 improvement being 25x.</p><h2 id="making-joins-10x-faster-for-large-users">Making JOINs 10x faster for large users</h2><p>Over time, for larger PostHog users with over 10 million visitors, some simple queries like a count of unique users started timing out or running into memory errors.</p><p>We narrowed this down to one particular JOIN in our system:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">JOIN (
    SELECT distinct_id, argMax(person_id, _timestamp) as person_id
    FROM (
        SELECT distinct_id, person_id, max(_timestamp) as _timestamp
        FROM person_distinct_id
        WHERE project_id = 123
        GROUP BY person_id, distinct_id, team_id
        HAVING max(is_deleted) = 0
    )
    GROUP BY distinct_id
) AS pdi

-- Table schema
CREATE TABLE person_distinct_id
(
    distinct_id VARCHAR,
    person_id UUID,
    project_id Int64,
    _sign Nullable(Int8),
    is_deleted Nullable(Int8),
    _timestamp DateTime
) ENGINE = CollapsingMergeTree(_sign)
</code></pre><p>This JOIN is as complicated as it is due to a restriction from ClickHouse: updating data is expensive. In ClickHouse, updates require rewriting whole parts of the table instead of individual rows.</p><p>Instead, the recommended approach is to use a <a href="https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replacingmergetree/">ReplacingMergeTree</a> or <a href="https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/collapsingmergetree/">CollapsingMergeTree</a> table engine and handle updating logic at query-time.</p><p>During data ingestion, when a given <code>distinct_id</code> had its <code>person_id</code> changed, PostHog emits a row with <code>is_deleted=1</code> for the old <code>person_id</code> and a new row with <code>is_deleted=0</code>. The above query would then resolve the <code>distinct_id</code> =&gt; <code>person_id</code> mapping at query time.</p><p>However, in practice, this query was slow and used up too much memory, due to needing a subquery to aggregate data correctly. It also had subtle issues with using timestamps for versioning, which was problematic when ClickHouse encountered equal timestamps.</p><p>After noticing the problem, we realized we didn&#x27;t need to actually emit rows with <code>is_deleted=0</code> to behave correctly, and could move to an alternative schema, which can be queried as follows:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">JOIN (
    SELECT distinct_id, argMax(person_id, version) as person_id
    FROM person_distinct_id2
    WHERE project_id = 123
    GROUP BY distinct_id
    HAVING argMax(is_deleted, version) = 0
) AS pdi

-- Table schema
CREATE TABLE person_distinct_id2
(
    distinct_id VARCHAR,
    person_id UUID,
    project_id Int64,
    is_deleted Int8,
    version Int64 DEFAULT 1,
    _timestamp DateTime
) ENGINE = CollapsingMergeTree(version)
</code></pre><p>For PostHog users with over 10 million visitors, this sped up queries previously bottlenecked on this JOIN by up to 10x.</p><h3 id="sorting-events-for-a-23-win">Sorting events for a 23% win</h3><p>While debugging other performance issues, one question we kept asking is whether our data is laid out optimally for performance.</p><p>PostHog uses a <a href="https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/">ClickHouse MergeTree</a> table engine to store event data on disk. MergeTree tables can have an <code>ORDER BY</code> clause, which is then used by ClickHouse to store the data in a sorted format on disk and to create a sparse index of the data. The sparse index can then be used to skip reading data during queries.</p><p>Our <code>ORDER BY</code> clause originally looked something like this:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">ORDER BY (
    project_id,
    toDate(timestamp),
    cityHash64(distinct_id),
    cityHash64(uuid)
)
</code></pre><p>With that in mind, let’s consider this simplified query counting the number of users who had pageviews within a given time range:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">SELECT count(DISTINCT person_id)
FROM events
WHERE project_id = 2
    AND event = &#x27;$pageview&#x27;
    AND timestamp &gt;= &#x27;2022-03-01&#x27;
    AND timestamp &lt; &#x27;2022-04-01&#x27;
</code></pre><p>When executing this query, ClickHouse can leverage data being sorted and the sparse index to skip reading most of data from disk. In this case, events from other projects and organizations and events from months other than March.</p><p>However, almost all of our most time-sensitive queries in PostHog also filter by event type. After measuring and confirming this, we updated the <code>ORDER BY</code> clause to the following one:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">ORDER BY (
    project_id,
    toDate(timestamp),
    event,
    cityHash64(distinct_id),
    cityHash64(uuid)
)
</code></pre><p>This resulted in a roughly 23% query speed up on average. The best trick for performance optimizations is to skip doing unnecessary work.</p><h3 id="migrating-data">Migrating data</h3><p>Changing how data is sorted on disk is not cheap when you have billions on billions of events. For example, on PostHog Cloud, this took five separate attempts and multiple weeks in total to finish. In addition, PostHog has a lot of self-hosted users at various degrees of scale and technical skill who would need to repeat this process.</p><p>To tackle this problem, we ended up building a new <a href="/blog/async-migrations">async migrations</a> system, which safely runs these long-running operations at scale with the press of a button, while handling common edge cases and keeping the platform up and usable.</p><h2 id="self-hosted-performance">Self-hosted performance</h2><p>As mentioned, PostHog can be self-hosted by our users. However, getting it working smoothly across a wide range of deployments at scale <a href="/blog/improving-posthog-deployments">keeps our infrastructure team hard at work</a>.</p><p>Some features coming in PostHog 1.34.0 (releasing on Thursday) which affect performance for self-hosted users are:</p><ul><li>Ability to use an <a href="/docs/self-host/configure/using-altinity-cloud">external ClickHouse provider</a>. We’ve <a href="/marketplace/altinity">partnered with Altinity to help support larger installations</a>.</li><li>Support for ClickHouse sharding and replication <a href="/docs/runbook/services/clickhouse/sharding-and-replication">in our helm chart</a>. This allows leveraging more machines for faster queries.</li><li>(Expected in 1.35.0) Upgrading to ClickHouse 21.11: ClickHouse is changing rapidly and each new release is bringing in new performance improvements.</li></ul><h2 id="whats-next">What’s next?</h2><p>Performance work is never complete and PostHog has a lot of work ahead of us to make answering questions about your product fast, no matter your scale.</p><p>Some projects currently in the pipeline are:</p><ul><li><strong>Removing JOINs for persons (and groups)</strong> - ClickHouse is not designed for doing large-scale joins. We’re currently in the middle of refactoring our entire data model for events, persons, and groups to remove the need for JOINs, bypassing the biggest bottleneck most queries share. More information about our plans can be found <a href="https://github.com/PostHog/meta/pull/39/files#diff-4ba257e4b25986d35b3f05a142677c187a7b082284dfb66d5fd74d759c52d618">in this PR</a>.</li><li><strong>Smart caching time-series queries</strong> - PostHog dashboards continually refresh data to show up-to-date graphs. However this results in a lot of repeated work, slowing down queries. By changing semantics around person properties and identifying users, we will be able to start smartly re-using past results when re-calculating queries.</li><li><strong>Better JSON support in ClickHouse</strong> - <a href="https://github.com/ClickHouse/ClickHouse/issues/23516">This feature</a> has been experimentally released in ClickHouse 22.3 and will unlock the benefits of materialized columns with much less complexity.</li></ul><blockquote><p>Interested in chatting about ClickHouse performance or working on similar problems? Send me an email: <a href="mailto:karl+perf@posthog.com">karl+perf@posthog.com</a> or join <a href="/posts">our community page</a>.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing Data Management for PostHog]]></title><description><![CDATA[PostHog is growing fast. In just the last year we've measured ~36.5B total events ingested in PostHog Cloud, and hundreds of self-hosted users reached…]]></description><link>https://posthog.com/blog/data-management-feature</link><guid isPermaLink="false">ed6953f7-24a9-58fe-9405-e62720c9e676</guid><dc:creator><![CDATA[Alex Kim]]></dc:creator><pubDate>Mon, 21 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/data-management-feature/posthog-data-management.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog is growing fast. In just the last year we&#x27;ve measured ~36.5B total events ingested in PostHog Cloud, and hundreds of self-hosted users reached the 1M total ingested events milestone.</p><p>This is a sign of the superb growth we&#x27;re seeing as a business, but data explosion is real and can be a nightmare to scale in the context of a product analytics tool. Furthermore, poor data management can seriously harm your business as it can lead to inaccurate analyses and poor business decisions.</p><p>As the <a href="/product-engineers/dogfooding">biggest dogfooder of our own product</a>, we (and many other teams) were beginning to see the consequences of the lack of in-house tools to manage our data. All the use cases we saw boiled down to a few common pain points:</p><ol><li>It is hard to understand events, actions, and properties that you yourself didn&#x27;t set up.</li><li>Data decays quickly, and most of the time fails to stay up-to-date with instrumentation.</li><li>Event-level context in insights and dashboards is difficult to share with external people and new team members.</li></ol><p>We set out to solve these pain points and the result is the new Data Management experience we&#x27;re introducing today on PostHog Cloud and on Thursday for self-hosted.</p><blockquote><p>Data Management is Chapter 1 of our <a href="/blog/launch-week-universe-of-new-features">Universe of New Features launch week</a></p></blockquote><h2 id="the-new-data-management-and-activity-tabs">The new Data Management and Activity tabs</h2><p>The Data Management page (pictured below) is the new hub for viewing, editing and managing all the data coming into your instance. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/data-management-feature/data_management_tab.png" alt="PostHog - data management tab"/></p><p>Data Management introduces more ways to organize and categorize your events. Event definitions can now be organized using tags and we&#x27;ve created the &#x27;Verified&#x27; marker, which tells collaborators that an event should be favored over other similar events. </p><p>Verified events are prioritized within filters and other selection components, and we&#x27;ve introduced to two sortable &quot;freshness&quot; indicators (30-day volume and query volume) to make it easier to choose the correct events when creating Insights.</p><p>As part of this overhaul, we&#x27;ve made a few important changes to how data is organized, too. &#x27;Event Stats&#x27; and &#x27;Property Stats&#x27; have been renamed &#x27;Events&#x27; and &#x27;Event properties&#x27;, and we&#x27;ve moved them into the Data Management tab alongside &#x27;Actions&#x27;. The &#x27;Events &amp; Actions&#x27; tab has been renamed &#x27;Activity&#x27;, where you can debug incoming event data by streaming it in near real time.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/data-management-feature/live_events.png" alt="PostHog - live events tab"/></p><h2 id="making-it-easy-to-define-events-on-the-fly">Making it easy to define events &#x27;on the fly&#x27;</h2><p>Not only are we giving you more ways to organize and define events, we&#x27;re also making it easy to edit them wherever you are in the product.</p><p>Building an insight and see an Event or Event property that could be more descriptive? You can now create a definition for that without leaving the insight query builder.</p><p>Just hover over the Event property in the dropdown...</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/data-management-feature/read_definition_card.png" alt="PostHog - read definition hover card"/></p><p>And when you click &#x27;Edit&#x27; you can add a description, add tags or mark it as a Verified Event.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/data-management-feature/write_definition_card.png" alt="PostHog - write definition hover card"/></p><p>Alternatively, click on &#x27;View&#x27; in the definition hover card and you&#x27;ll be redirected to the new Data Management page, where you can explore all the Events and Event properties you&#x27;ve created.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/data-management-feature/data_management_view.gif" alt="PostHog - view definition context"/></p><p>And if you want a gold star in best practice, you can also opt to create definitions with our API. Check out our documentation on how to use the <a href="/docs/api/event-definitions"><code>event_definitions</code></a> and <a href="/docs/api/property-definitions"><code>property_definitions</code></a> API endpoints.</p><p>Oh, and in case you were wondering, the awesome thing about definitions in PostHog is that they can be created, updated, or deleted at any time without affecting the event data that is already there, so <strong>you don&#x27;t need to create event definitions before ingesting events</strong>. </p><h2 id="how-to-use-data-management-as-a-team-best-practices">How to use Data Management as a team (best practices)</h2><p>To help you in your journey to data management nirvana, here are a few rules of thumb to consider when using these new features.</p><p><strong>1. The more definitions you add, the easier it will be for your teammates to understand what each event and property represents.</strong></p><p>Take a custom event sent as <code>sign_up</code> for example that is triggered on user sign up. Pretty self-explanatory, right? Not necessarily. Imagine you have a second app pushing data to the same PostHog instance sending sign up events as <code>sign up</code>; or maybe you send a <code>sign up</code> event from your frontend and one from your backend. A new teammate using PostHog will find it impossible to differentiate between the two, potentially leading to incorrect conclusions and frustration. Describing these events properly can ensure your teammates find exactly what they&#x27;re looking for.</p><p><strong>2. Official organization-wide events should be verified so that teammates can discover and use them easily.</strong> </p><p>Verified events will be prioritized in filters and other selection components to signal to the rest of the team that this event should be used in favor of other similar events. An example where this comes in handy is if there are two events that sound familiar, <code>signed up</code> and <code>signed_up</code>. Verifying the first tells others very explicitly that one is still being used and the other has gone stale.</p><p><strong>3. Tagging is an easy way to categorize events into custom groups, be it for a product, feature or new page.</strong> </p><p>We highly recommend using tags to organize events coming in from different parts of your product. At PostHog for example, we use tags called <code>session-recordings</code>, <code>funnels</code>, and <code>feature-flags</code> to keep track of insights and dashboards related to those features. </p><p>Tags can also be useful for organizing PostHog for internal use. We create tags for each of our internal <a href="/handbook/team-structure/why-small-teams">small teams</a> to signal which dashboards are interesting to our respective teams.</p><h2 id="whats-next-for-data-management">What&#x27;s next for Data Management?</h2><p>To recap, the new Data Management experience means you can:</p><ul><li>Organize your definitions with tags</li><li>Manage event definitions on the fly while building insights</li><li>Verify trusted definitions which are prioritized in the UI</li><li>Easily manage all your Events, Event properties and Actions in the Data Management tab</li><li>Debug your incoming events using in the Activity tab</li></ul><p>These are powerful tools for organizing your data, but we&#x27;re just scratching the surface. Below are just a few ideas on our roadmap that we think you&#x27;ll like:</p><ul><li>Role-based ownership of definitions</li><li>Personally identifiable information (PII) rules</li><li>Anomaly detection for malformed events and properties</li><li>Person and Group Property definitions</li></ul><p>As always, we welcome any feedback you may have about this feature. Feel free to open an issue in <a href="https://github.com/PostHog/posthog">our Github repo</a>, join us directly for a <a href="https://calendly.com/posthog-feedback">call</a> with our Product &amp; Engineering team, or <a href="https://app.posthog.com/home#supportModal">submit a ticket in our app</a>. </p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Enabling zero downtime data migrations for self-hosted users]]></title><description><![CDATA[In this world nothing is certain except death, taxes, and database migrations. As your product evolves, your schemas evolve too, and you need…]]></description><link>https://posthog.com/blog/async-migrations</link><guid isPermaLink="false">e0442cdb-cc0a-5b93-8099-d2c8dfdc0745</guid><dc:creator><![CDATA[Yakko Majuri]]></dc:creator><pubDate>Fri, 18 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/migrating-hog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>In this world nothing is certain except death, taxes, and database migrations.</p><p>As your product evolves, your schemas evolve too, and you need migrations to update them.</p><p>However, not all migrations are made equal.</p><p>Some are simple, others are complex. Some run quickly, others take a long time.</p><p>For example, consider the following three scenarios that we&#x27;ve encountered at PostHog when updating table schemas in ClickHouse (our analytics database):</p><blockquote><p>Note: These scenarios are based on non-replicated tables.</p></blockquote><p><strong>1. Adding a column to a table</strong></p><p>This is reasonably simple. We can modify the table in place with an <code>ALTER TABLE</code> statement and add the column we want.</p><p><strong>2. Changing the engine of a table</strong></p><p>Here things start to get a bit more complicated. ClickHouse does not support changing table engines via <code>ALTER TABLE</code>, so we cannot modify the table in place.</p><p>Instead, we need to create a new table with the same schema, except for the engine change, and insert data from the old table into it.</p><p>Luckily, ClickHouse provides a nice way to do this. With <code>ATTACH PARTITION</code>, we can &quot;copy the data&quot; from the old table to the new table reasonably quickly, by simply &quot;attaching&quot; the existing partition(s) to the new table. In reality, no data gets &quot;copied&quot;, but rather new hard links are created to point to the existing data.</p><p>So while we do need to get data from a table to another, this isn&#x27;t very problematic.</p><p><strong>3. Changing the sorting key of a table</strong></p><p>This is where things get hairy.</p><p>ClickHouse tables using engines in the <code>MergeTree</code> family <a href="https://clickhouse.com/docs/en/development/architecture/#merge-tree">store data on disk in sorted parts following a &quot;sorting key&quot;</a>.</p><p>This is defined by the <code>ORDER BY</code> clause at table creation.</p><p>Now, say you&#x27;ve done some analysis on the most common queries you run and determined you&#x27;d have a massive performance benefit from adding a column to your sorting key.</p><p>Well, tough luck - can&#x27;t do that.</p><p>While a <code>MODIFY ORDER BY</code> statement <a href="https://clickhouse.com/docs/en/sql-reference/statements/alter/order-by/">does exist on ClickHouse</a>, the docs specifically note that &quot;you cannot add expressions containing existing columns to the sorting key&quot;.</p><p>The reason for this is that adding a column to the sorting key would require rewriting all parts on disk, as they should now be sorted differently.</p><p>This means that, like in example #2, we need to create a new table and add the old data to it. However, it also means that we cannot use <code>ATTACH PARTITION</code>, as the parts on the new table will be different from those on the old table.</p><p>That leaves us with one option: inserting all the data from the old table into the new table...</p><p>Row. By. Row.</p><h2 id="the-problem">The problem</h2><p>Needing to execute migrations like the one above leaves us with a difficult problem at hand: inserting data row by row can take <em>a long time</em>.</p><p>The time it will take depends on the size of the table to be migrated, and thus, if we&#x27;re migrating a large table (say, <a href="https://github.com/PostHog/posthog/issues/5684">our events table</a>), this can take weeks.</p><p>As a result, we can&#x27;t pop this in with our other (&quot;normal&quot;) migrations which run on every upgrade, as they would prevent the upgrade from happening, and potentially even cause downtime.</p><p>But that&#x27;s not all. We at PostHog have an additional problem: self-hosted users.</p><p>If PostHog was a SaaS-only platform (with no self-hosting available), we could have a team dedicated to running this &quot;manually&quot; on our instance, monitoring it, and making sure everything runs smoothly.</p><p>However, that&#x27;s not a viable option for users that run their own PostHog instance. Providing them with a runbook is <em>an</em> option, but it doesn&#x27;t align with our goal of making PostHog easy to deploy and manage.</p><p>We needed something better.</p><h2 id="enter-async-migrations">Enter async migrations</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/async-migrations-ui.png" alt="Async migrations UI"/></p><p>The solution we came up with for the problem mentioned above is a system for running so-called async migrations.</p><p>This system allows us to <strong>safely</strong> run long data migrations in the background without causing any downtime, as well as provides a full suite of tools for managing and debugging these migrations easily.</p><p>When we started building it, we wanted the system to have three key characteristics:</p><ol><li>It should be asynchronous, but with guarantees.</li><li>It should be safe.</li><li>It should be easy to work with, both for developers and users.</li></ol><p>Here&#x27;s how we achieved all three.</p><h3 id="1-it-should-be-asynchronous-but-with-guarantees">1. It should be asynchronous, but with guarantees</h3><p>As we established earlier, long-running (and potentially unbounded) migrations can&#x27;t be part of the upgrade path.</p><p>Thus, they can&#x27;t run <em>synchronously</em> during a version upgrade, they must run <em>asynchronously</em> during normal operations.</p><p>For this, we settled on a version range approach.</p><pre><code class="language-py">class Migration(AsyncMigrationDefinition):

    posthog_min_version = &quot;1.45.0&quot;
    posthog_max_version = &quot;1.47.9&quot;

    # ...
</code></pre><p>Unlike migrations that immediately become a pre-requisite for upgrading to the version they&#x27;re included in, async migrations specify a range of versions within which they can be run, and users can run them at any time they like, provided their instance is within the range.</p><p>The beauty of this system is that users have flexibility to pick a convenient period to run the migrations (maybe they want to keep a close eye on it, or scale some services temporarily), but we (PostHog developers) can rely on them being completed from a given version onwards.</p><p>The guarantees around completion are done via a combination of hard requirements for upgrading to certain versions and good communication through release notes and docs, and they prevent us from having to support multiple code paths depending on the state of the database.</p><p>Given our monthly release schedule for minor versions, a migration added in 1.45.0 with an upper bound of 1.48.0 gives users three months to run them before the version it is required in comes out. In addition, it allows us to start working on code that relies on the migration being done after two months, essentially as soon as the last supported version (in this case 1.47.0) is released.</p><p>As for how they run, we leveraged a service we already used for asynchronous operations: Celery. We only ever run one async migration task at a time, keep task states temporarily in Redis, and tasks are dispatched with <code>track_started=True</code> and <code>ignore_result=False</code>, so we can keep an eye on them and handle edge cases like the Celery worker dying unexpectedly.</p><h3 id="2-it-should-be-safe">2. It should be safe</h3><p>Anytime you&#x27;re messing with user databases there&#x27;s a risk that things will go bad. Period.</p><p>As such, just like with any migration, async migrations still rely on reviewers, tests, and checks to ensure nothing dangerous is shipped, like a migration with <code>DROP TABLE events</code>.</p><p>However, it was a top priority for us to make the async migrations system include all the necessary tools for running database operations safely on environments we don&#x27;t control (self-hosted instances).</p><p>To achieve this, we:</p><ul><li>Made available to developers a wide range of checks that can short circuit the running process, such as a precheck, a periodic healthcheck, service version requirements, and dependencies. To give one specific example, we often use prechecks to ensure the database has enough free disk space to run the migration, given we might temporarily duplicate a table&#x27;s data, for instance.</li><li>Built the system with resumability and rollbacks in mind, ensuring migrations can behave in a sane and non-destructive way if services crash, errors are thrown, timeouts occur, etc. Depending on the circumstances, we will either continue running the migration if we&#x27;ve determined it to be safe, or roll the database back to the initial state.</li></ul><h3 id="3-it-should-be-easy-to-work-with-both-for-developers-and-users">3. It should be easy to work with, both for developers and users</h3><p>Lastly, async migrations should be easy to launch and manage for users, as well as easy to write and build upon for developers.</p><p>To cover the latter part, we implemented the aforementioned guarantees and checks, as well as made the migration definitions closely resemble other migration systems we already have in place.</p><p>As for users, we built a fully-fledged UI for instance admins, where they can read about the migration, update settings (like default timeouts and automatic rollbacks), trigger a run, pause or resume a migration, force a rollback, monitor status and progress, as well as get a list of errors.</p><p>We also store the ID of the query that is currently running on the database and the ID of the Celery task handling the migration, so more advanced users can go into the services themselves for additional monitoring.</p><p>Ultimately, running a migration takes only the click of a button, but all the tools are in place for debugging issues if they come about.</p><p>It&#x27;s also worth noting that we implemented an API for migrations to check if they should even run at all on a given instance. This is particularly useful for preventing useless runs on fresh deploys. A user that deployed PostHog after the migration was introduced shouldn&#x27;t need to run a migration to get from an old schema to the new schema, given they already have the new schema in place (async migrations should come with corresponding changes to the original schema definitions). In these cases, we auto complete the migration and unblock upgrades without any user input at all.</p><h2 id="a-closer-look">A closer look</h2><h3 id="architecture">Architecture</h3><p>Async migrations are triggered from the UI and create a Celery task that handles its execution in a background worker.</p><p>Metadata about the migration is stored in Postgres, including things such as status (completed, errored, rolled back, etc), progress, start and finish times, and other useful information.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/async-migrations-architecture.png" alt="Async migrations Architecture"/></p><h3 id="structure">Structure</h3><p>An async migration can contain the following components:</p><ul><li><code>description</code>: A description of the migration.</li><li><code>operations</code>: A list of operations to run in sequence, each with a designated rollback. An operation can use plain SQL or arbitrary functions, and the operations list can be dynamic based on instance setup. For example, we may generate operations for each partition on a table.</li><li><code>posthog_min_version</code>: The minimum version of PostHog required for running the migration.</li><li><code>posthog_max_version</code>: The last PostHog version this migration can be run on.</li><li><code>is_required</code>: A check that determines if this migration needs to be run on the instance. Usually verifies the current schema of a table to determine if it needs to be migrated.</li><li><code>precheck</code>: A check that runs before the migration starts to determine if it is safe to do so. It returns a boolean and a message, so it can surface helpful errors to the user.</li><li><code>healthcheck</code>: A check that runs both before the migration starts and at an interval while it is running. If it fails, it will kill the migration. Also returns a message that will be shown to the user.</li><li><code>service_version_requirements</code>: A list of requirements for the versions of external services PostHog depends on, such as Kafka and PostgreSQL.</li><li><code>progress</code>: A function that specifies an arbitrary progress calculation, returning a percentage between 0 and 100. If not present, we calculate progress based on the number of operations executed so far, although this is often not a good proxy.</li></ul><h2 id="whats-next">What&#x27;s next?</h2><p>We currently have three async migrations in the codebase, each destined to make queries in PostHog significantly faster. If you&#x27;re a user, make sure to run them! For more info, see our <a href="/docs/runbook/async-migrations">dedicated docs</a>.</p><p>Going forward, we&#x27;re excited to make this system even better, polishing our upgrade flow, including more granular controls, and introducing automatic runs under certain circumstances.</p><p>Oh, and while we don&#x27;t spin this out into its own tool for others to use, feel free to check out <a href="https://github.com/PostHog/posthog/issues/7054">our codebase</a> if you have a similar problem - don&#x27;t worry, it&#x27;s open source 😉.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Using Gatsby and Puppeteer to create dynamic Open Graph images]]></title><description><![CDATA[The image preview you see when sharing a link is a great opportunity to get your brand’s message in front of people without them even clicking through to your website. Most sites just opt to display a logo and some brand elements.]]></description><link>https://posthog.com/blog/dynamic-open-graph-images</link><guid isPermaLink="false">d2a7942e-d598-55e7-86ae-e919912b9047</guid><dc:creator><![CDATA[Cory Watilo]]></dc:creator><pubDate>Thu, 03 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/actual-post-open-graph-image.png" length="0" type="image/png"/><content:encoded><![CDATA[<h2 id="the-tldr-version">The TL;DR version:</h2><p>The image preview you see when sharing a link on social media is called the Open Graph image, and is essentially free advertising space. It&#x27;s a chance to get a message in front of people without them even clicking through to your website.</p><p>But most sites (including ours, up until recently) just opt to display a logo and some branding, leaving a lot of opportunity on the table.</p><h3 id="before">Before</h3><p>This is what ours used to look like. There’s a lot of untapped potential here.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-0.png" alt="Our previous site-wide Open Graph image"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">Our previous site-wide Open Graph image</figcaption><h3 id="after">After</h3><p>We decided to make better use of the space that Open Graph provides by creating custom layouts and images for most individual pages of our website. Some dynamically generated every time we update <a href="http://posthog.com">posthog.com</a> (like <a href="/docs">this Docs article</a>).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-12.png" alt="Dynamically-generated Open Graph image with live data from our website"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">Dynamically-generated Open Graph image with live data from our website</figcaption><p>This project is now generating hundreds of Open Graph image previews daily and appearing in Twitter and LinkedIn timelines, and in Slack channels everywhere.</p><h2 id="now-for-the-extended-version">Now for the extended version...</h2><p>Now that I&#x27;ve drawn you in with the short version, I&#x27;ll explain in more detail about Open Graph, why we decided to put effort into ours, some inspiration behind it, and how we built our end result in a static website environment.</p><h3 id="what-is-an-open-graph-image">What is an Open Graph image?</h3><p>When you share a link on social sites like Twitter, LinkedIn, and Facebook, a special image called the <a href="https://ogp.me/">Open Graph image</a> will often appear with the URL. Other apps like Slack, iMessage, and Telegram also use it too.</p><p>It’s a great way for websites to make links more visually enticing and websites will often use the same type of imagery as they use in their company’s header image on Twitter, LinkedIn, or Facebook.</p><h3 id="some-examples">Some examples</h3><p><strong>Stripe</strong> uses a gradient background that is synonymous with anyone who’s ever seen Stripe’s website (it’s on brand).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-2.png" alt="Stripe&#x27;s Open Graph image"/></p><p><strong>Squarespace</strong> uses the space to feature some lifestyle imagery, and an example of the product they offer.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-3.png" alt="Squarespace&#x27;s Open Graph image"/></p><p><strong>Webflow</strong> displays some cool interface elements and product examples within their image.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-4.png" alt="Webflow&#x27;s Open Graph image"/></p><p>There are also a lot of major brands who have seemingly put zero effort into link previews.</p><p><strong>Apple</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-5.png" alt="Apple&#x27;s Open Graph image"/></p><p><strong>Shopify</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-6.png" alt="Shopify&#x27;s Open Graph Image"/></p><p><strong>Microsoft</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-7.png" alt="Microsoft&#x27;s Open Graph Image"/></p><p>There’s a lot of missed opportunity - our customers are essentially giving us free ad space in front of their friends, followers, and colleagues. Whatever their connections see here needs to encourage them to want to see more.</p><h2 id="concept-open-graph-images-as-a-digital-billboard">Concept: Open Graph images as a digital billboard</h2><h3 id="our-blog">Our blog</h3><p>We frequently post content <a href="/blog">on our blog</a>, and we frequently create custom artwork for posts we&#x27;re planning on promoting.</p><p>Last year <a href="/blog/the-posthog-array-1-26-0">for a product update</a>, we used artwork manually created in Figma that contained a summary of what was in the update. This was our first step in starting to think of better ways to use this space.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/array-custom-art.png" alt="The first unique Open Graph image we used for a product update"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">The first unique Open Graph image we used for a product update</figcaption><h3 id="just-days-before-github-made-open-graph-images-10x-better">Just days before, GitHub made Open Graph images 10x better!</h3><p>GitHub <a href="https://github.blog/2021-06-22-framework-building-open-graph-images">had just improved link previews</a> when sharing various links across their site.</p><p>Now when sharing links to repositories or pull requests, you can see more context before clicking through.</p><p><strong>For example, here’s what sharing a link to <a href="https://github.com/PostHog/posthog/pull/8142">a pull request</a> looks like.</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-8.png" alt="GitHub&#x27;s new Open Graph image example"/></p><p>Aside from being more visually interesting than a static image, it also serves to prepare the reader on what they’re about to click. Even this brief context is valuable - and definitely more valuable than a single static site-wide image.</p><p>I should point out that GitHub also allows repos to upload a custom Open Graph image, which we use as an opportunity to communicate the highlights of our product.</p><p>This served as inspiration for PostHog: <em>How could we take this concept but 10x what GitHub did?</em></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-9.png" alt="Our GitHub repo&#x27;s Open Graph image"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">Finally, an Open Graph image (for our GitHub repo) that was really designed to be looked at.</figcaption><h2 id="making-open-graph-images-100x-better">Making Open Graph images 100x better</h2><p>As PostHog is a developer-first product and we see our website as a leading sales channel, we’re constantly optimizing for our technical audience. We ask ourselves the question, “What would resonate with us?” and then we try to build that.</p><p>It’s important for our business that we capture a potential visitor’s attention regardless of their entry point and traffic source. They might discover PostHog on the feed of a social network or from a colleague sharing a link in their company’s Slack.</p><p>As a designer, I often think to myself, “If I were standing over someone’s shoulder as they see the PostHog brand for the first time, would I be proud of what they see?”</p><p>As a company, we typically agree spending a little extra time on these details is worth it for our brand.</p><h3 id="our-approach">Our approach</h3><p>We decided to use a hybrid approach, generating some images on-the-fly, and also employing static images for content that doesn’t change too frequently.</p><p>Our content is split into two main types:</p><ol><li>Static, marketing content - pages that aren’t frequently updated
<em>Eg: Product pages (<code>/product</code>, <code>/product/session-recording</code>, etc)</em></li><li>Dynamic, editable content - Docs, Handbook, Blog<ul><li>Docs pages (often shared internally when discussing deployment or installation)</li><li>Blog posts - all of which have artwork, many of them custom</li><li>Careers - obviously highly dynamic</li></ul></li></ol><h3 id="designing-the-concepts">Designing the concepts</h3><p>In <a href="https://www.figma.com/file/g1UCTW9ZX21GU85hLsWB31/Website-concepts?node-id=3133%3A76407">our website’s Figma project</a>, I used a <a href="https://www.figma.com/community/file/820337605519256142">template</a> by <a href="https://twitter.com/RyanWarnerCodes">Ryan Warner</a> that let me design on a single artboard (as a component) while simultaneously previewing the result for Twitter, Discord, Slack, and Facebook.</p><p>(It&#x27;s useful to verify image sizing, since sometimes images are scaled down. Also, don’t forget how small text is going to appear on mobile!)</p><h3 id="evolving-the-concept">Evolving the concept</h3><p>We posed some questions about what would make these Open Graph images useful:</p><ul><li>What if the image preview was a screenshot of the webpage? Is this type of thumbnail captivating?</li><li>What if you could read part of an article (Docs, Handbook, Blog) in the image preview (like when reading a news article before hitting the paywall)? Would this draw you in and make you want to read more?</li></ul><h2 id="static-open-graph-images"><strong>Static Open Graph images</strong></h2><p><a href="https://github.com/PostHog/posthog.com/issues/2785">In this PR</a>, we created static Open Graph images for each of our main product pages. These images don’t need to be frequently updated, so it was okay to put a little more time in crafting one-off pieces for each.</p><p>Here’s what you’ll see when sharing <a href="/product/session-recording">posthog.com/product/session-recording</a>:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-10.png" alt="PostHog&#x27;s Session Recording Open Graph image"/></p><p>We also build custom artwork for pages we know are likely to be shared, like for an event we’ll be hosting soon.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-11.png" alt="Personalized Open Graph image for an event"/></p><h2 id="dynamic-open-graph-images"><strong>Dynamic Open Graph images</strong></h2><p><em>Now for the fun part...</em></p><p>Similar to GitHub’s approach, we automatically generate some Open Graph images so our Graphic Designer, Lottie, doesn’t have to be on call 24x7 for whenever we publish a blog post.</p><h3 id="beforeafter-sharing-a-docs-url">Before/after: Sharing a <code>/docs</code> URL</h3><p><strong>Before (previous site-wide Open Graph image)</strong></p><p>We shared a single static image across all Docs articles</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-0.png" alt="Open Graph image"/></p><p><strong>After</strong></p><p>Now we show a preview from the article, along with some relevant information about it that you might like to know.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-12.png" alt="Open Graph image"/></p><p>This gives us the chance to draw a user into the content on the page before they decide to click. Our bet was this could increase clickthroughs by reducing the uncertainty about what was on the other side of the link.</p><p>Questions visitors may subconsciously have could include:</p><ul><li>How fresh is this content?</li><li>How much of a time investment is this going to be?</li><li>Is this a website that&#x27;s going to bombard me with ads?</li><li>Will I be able to easily access the information I might click to see?</li><li>Does this website &quot;seem&quot; like it will load quickly?</li></ul><p>Believe it or not, we can address all of these questions using visual cues in these images, and we can communicate them in a fraction of a second.</p><h3 id="other-open-graph-templates-throughout-posthogcom">Other Open Graph templates throughout PostHog.com</h3><p><strong>Blog post</strong></p><p>There are a considerations for our blog posts:</p><ul><li>If we place an image in the background, text layered on top needs to be readable. The fix? We added subtle text shadows and partially transparent gradients layered between the text and image.</li><li>Some posts have multiple authors, so that needs to be factored in.</li><li>In some cases, post images have text <a href="https://posthog.com/blog/yc-top-companies">inside the image</a> that would be obscured with auto-generated Open Graph images. We have a parameter in our blog post’s front matter to skip this image generation.</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-13.png" alt="Blog Open Graph image"/></p><p><strong>Customer stories</strong></p><p>Since each customer story involves two logos, we placed them at the top along with a heart in between.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-14.png" alt="Example of Open Graph image in a customer story"/></p><p><strong>Careers</strong></p><p>Especially useful for the PostHog team when posting roles on LinkedIn, this image is always up to date with the latest roles we’re hiring.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-1.png" alt="Careers Open Graph image"/></p><h2 id="how-it-works">How it works</h2><h3 id="overview">Overview</h3><p>We use <a href="https://www.gatsbyjs.com">Gatsby</a>, a static site generator, so once the build process is complete, we run through a series of steps:</p><ul><li>Pass an HTML string containing some page data to <a href="https://github.com/puppeteer/puppeteer">Puppeteer</a> (a Node library for headless screenshotting) for each page</li><li>Load images and our custom font and screenshot the preview</li><li>Use the new image instead of our site-wide fallback Open Graph image</li></ul><h3 id="details">Details</h3><p>Gatsby has a really cool API that allows you to hook into the last point of the build process: <code>onPostBuild</code>. This is where all of the magic takes place.</p><p>We first query for each page that will use custom Open Graph images. (Right now, that&#x27;s Docs, Handbook, Customers, Careers, and our blog posts.)</p><p>From there, we do some initial setup:</p><ol><li>Create folders for images and fonts</li><li>Download our webfont</li><li>Spin up a new Chromium page with Puppeteer</li></ol><p>After setup is complete, we finally iterate through each queried page, set the content of the Chromium page with an HTML string, screenshot the page, and save it. Here&#x27;s what that looks like for blog posts:</p><pre><code class="language-js">for (const post of data.blog.nodes) {
    const { title, authorData, featuredImage } = post.frontmatter
    const image = fs.readFileSync(featuredImage.absolutePath, {
        encoding: &#x27;base64&#x27;,
    })
    await createOG({
        html: blogTemplate({ title, authorData: authorData &amp;&amp; authorData[0], image, font }),
        slug: post.fields.slug,
    })
}
</code></pre><p><strong>What&#x27;s happening in this for...of loop, though?</strong></p><pre><code class="language-js">const image = fs.readFileSync(featuredImage.absolutePath, {
    encoding: &#x27;base64&#x27;,
})
</code></pre><p>Since the site isn&#x27;t technically &quot;live&quot; yet, we don&#x27;t have access to a public URL to insert into our HTML template. The workaround is embedding it in an <code>&lt;img /&gt;</code> element as Base64. You&#x27;ll see this workaround in a few other places in the code.</p><pre><code class="language-js">await createOG({
    html: blogTemplate({ title, authorData: authorData &amp;&amp; authorData[0], image, font }),
    slug: post.fields.slug,
})
</code></pre><p>We have an asynchronous function called <code>createOG</code>. This handles setting the Chromium page content, screenshotting, and saving the image. It takes an HTML string to set the Chromium page content and a slug to create the file name of the screenshot.</p><blockquote><p>You can explore our solution <a href="https://github.com/PostHog/posthog.com/pull/2695">in this pull request</a>.</p></blockquote><h3 id="testing-open-graph-previews">Testing Open Graph previews</h3><p>There are a handful of tools to test Open Graph previews, but my personal favorite has become <a href="https://metatags.io/">metatags.io</a>, as it’s fast, simple, and not cluttered with ads. (It will even generate your Open Graph meta tags for you!)</p><p>It&#x27;s important to note that some websites cache Open Graph on their servers. If you think you uploaded a new version of an Open Graph image to your website but your changes aren&#x27;t appearing, this might be why! Facebook has a useful <a href="https://developers.facebook.com/tools/debug/">Graph debugging/cache busting tool</a>.</p><h2 id="in-summary">In summary...</h2><p>This was a really fun project to work on, as it adds immediate value on a daily basis to anyone seeing a link to PostHog.com. On a personal note, it’s pretty special to work at a company where this type of polish is valued.</p><p>We still consider this a v1 approach, as there are plenty of edge cases to work through - not to mention what to do with article&#x27;s begin with images or titles - like how to format it all.</p><p>In a future update, we plan to <a href="https://github.com/PostHog/posthog.com/issues/2720">make our Tutorials Open Graph images transparent</a> so they naturally work in both light and dark modes.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/opaque-tutorials.png" alt="Opaque tutorial Open Graph images"/></p><p>We&#x27;ve also designed (and plan to implement) dynamic images for personalized landing pages (to be shared with prospective customers) so PostHog feels a little more personalized when our link is shared around a company’s Slack.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-graph-images/og-15.png" alt="Next Steps Open Graph image"/></p><p>But this first step is light years more interesting to look at than a simple PostHog logo on a white background. (If you see opportunity for improvement, we invite you to submit a pull request <a href="http://github.com/posthog/posthog.com">on our website’s repo</a>!)</p><p>A tip of the hat goes to the team at GitHub who worked on their new Open Graph images, as it served as a starting point in inspiring what we ultimately built.</p><p>We really hope you enjoy seeing our Open Graph previews across the internet as much as we enjoyed making them!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Using Gatsby and Puppeteer to create dynamic Open Graph images]]></title><description><![CDATA[The image preview you see when sharing a link is a great opportunity to get your brand’s message in front of people without them even clicking through to your website. Most sites just opt to display a logo and some brand elements.]]></description><link>https://posthog.com/library/design/dynamic-open-graph-images</link><guid isPermaLink="false">36596356-5fe1-5c13-a037-40ad9ec99640</guid><dc:creator><![CDATA[Cory Watilo]]></dc:creator><pubDate>Thu, 03 Mar 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/actual-post-open-graph-image.png" length="0" type="image/png"/><content:encoded><![CDATA[<h2 id="the-tldr-version">The TL;DR version:</h2><p>The image preview you see when sharing a link on social media is called the Open Graph image, and is essentially free advertising space. It&#x27;s a chance to get a message in front of people without them even clicking through to your website.</p><p>But most sites (including ours, up until recently) just opt to display a logo and some branding, leaving a lot of opportunity on the table.</p><h3 id="before">Before</h3><p>This is what ours used to look like. There’s a lot of untapped potential here.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-0.png" alt="Our previous site-wide Open Graph image"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">Our previous site-wide Open Graph image</figcaption><h3 id="after">After</h3><p>We decided to make better use of the space that Open Graph provides by creating custom layouts and images for most individual pages of our website. Some dynamically generated every time we update <a href="http://posthog.com">posthog.com</a> (like <a href="/docs">this Docs article</a>).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-12.png" alt="Dynamically-generated Open Graph image with live data from our website"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">Dynamically-generated Open Graph image with live data from our website</figcaption><p>This project is now generating hundreds of Open Graph image previews daily and appearing in Twitter and LinkedIn timelines, and in Slack channels everywhere.</p><h2 id="now-for-the-extended-version">Now for the extended version...</h2><p>Now that I&#x27;ve drawn you in with the short version, I&#x27;ll explain in more detail about Open Graph, why we decided to put effort into ours, some inspiration behind it, and how we built our end result in a static website environment.</p><h3 id="what-is-an-open-graph-image">What is an Open Graph image?</h3><p>When you share a link on social sites like Twitter, LinkedIn, and Facebook, a special image called the <a href="https://ogp.me/">Open Graph image</a> will often appear with the URL. Other apps like Slack, iMessage, and Telegram also use it too.</p><p>It’s a great way for websites to make links more visually enticing and websites will often use the same type of imagery as they use in their company’s header image on Twitter, LinkedIn, or Facebook.</p><h3 id="some-examples">Some examples</h3><p><strong>Stripe</strong> uses a gradient background that is synonymous with anyone who’s ever seen Stripe’s website (it’s on brand).</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-2.png" alt="Stripe&#x27;s Open Graph image"/></p><p><strong>Squarespace</strong> uses the space to feature some lifestyle imagery, and an example of the product they offer.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-3.png" alt="Squarespace&#x27;s Open Graph image"/></p><p><strong>Webflow</strong> displays some cool interface elements and product examples within their image.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-4.png" alt="Webflow&#x27;s Open Graph image"/></p><p>There are also a lot of major brands who have seemingly put zero effort into link previews.</p><p><strong>Apple</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-5.png" alt="Apple&#x27;s Open Graph image"/></p><p><strong>Shopify</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-6.png" alt="Shopify&#x27;s Open Graph Image"/></p><p><strong>Microsoft</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-7.png" alt="Microsoft&#x27;s Open Graph Image"/></p><p>There’s a lot of missed opportunity - our customers are essentially giving us free ad space in front of their friends, followers, and colleagues. Whatever their connections see here needs to encourage them to want to see more.</p><h2 id="concept-open-graph-images-as-a-digital-billboard">Concept: Open Graph images as a digital billboard</h2><h3 id="our-blog">Our blog</h3><p>We frequently post content <a href="/blog">on our blog</a>, and we frequently create custom artwork for posts we&#x27;re planning on promoting.</p><p>Last year <a href="/blog/the-posthog-array-1-26-0">for a product update</a>, we used artwork manually created in Figma that contained a summary of what was in the update. This was our first step in starting to think of better ways to use this space.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/array-custom-art.png" alt="The first unique Open Graph image we used for a product update"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">The first unique Open Graph image we used for a product update</figcaption><h3 id="just-days-before-github-made-open-graph-images-10x-better">Just days before, GitHub made Open Graph images 10x better!</h3><p>GitHub <a href="https://github.blog/2021-06-22-framework-building-open-graph-images">had just improved link previews</a> when sharing various links across their site.</p><p>Now when sharing links to repositories or pull requests, you can see more context before clicking through.</p><p><strong>For example, here’s what sharing a link to <a href="https://github.com/PostHog/posthog/pull/8142">a pull request</a> looks like.</strong></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-8.png" alt="GitHub&#x27;s new Open Graph image example"/></p><p>Aside from being more visually interesting than a static image, it also serves to prepare the reader on what they’re about to click. Even this brief context is valuable - and definitely more valuable than a single static site-wide image.</p><p>I should point out that GitHub also allows repos to upload a custom Open Graph image, which we use as an opportunity to communicate the highlights of our product.</p><p>This served as inspiration for PostHog: <em>How could we take this concept but 10x what GitHub did?</em></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-9.png" alt="Our GitHub repo&#x27;s Open Graph image"/></p><figcaption class="text-center text-primary text-opacity-70 font-semibold !text-sm -mt-4 mb-4 hover:text-primary dark:text-white dark:hover:text-white">Finally, an Open Graph image (for our GitHub repo) that was really designed to be looked at.</figcaption><h2 id="making-open-graph-images-100x-better">Making Open Graph images 100x better</h2><p>As PostHog is a developer-first product and we see our website as a leading sales channel, we’re constantly optimizing for our technical audience. We ask ourselves the question, “What would resonate with us?” and then we try to build that.</p><p>It’s important for our business that we capture a potential visitor’s attention regardless of their entry point and traffic source. They might discover PostHog on the feed of a social network or from a colleague sharing a link in their company’s Slack.</p><p>As a designer, I often think to myself, “If I were standing over someone’s shoulder as they see the PostHog brand for the first time, would I be proud of what they see?”</p><p>As a company, we typically agree spending a little extra time on these details is worth it for our brand.</p><h3 id="our-approach">Our approach</h3><p>We decided to use a hybrid approach, generating some images on-the-fly, and also employing static images for content that doesn’t change too frequently.</p><p>Our content is split into two main types:</p><ol><li>Static, marketing content - pages that aren’t frequently updated
<em>Eg: Product pages (<code>/product</code>, <code>/product/session-recording</code>, etc)</em></li><li>Dynamic, editable content - Docs, Handbook, Blog<ul><li>Docs pages (often shared internally when discussing deployment or installation)</li><li>Blog posts - all of which have artwork, many of them custom</li><li>Careers - obviously highly dynamic</li></ul></li></ol><h3 id="designing-the-concepts">Designing the concepts</h3><p>In <a href="https://www.figma.com/file/g1UCTW9ZX21GU85hLsWB31/Website-concepts?node-id=3133%3A76407">our website’s Figma project</a>, I used a <a href="https://www.figma.com/community/file/820337605519256142">template</a> by <a href="https://twitter.com/RyanWarnerCodes">Ryan Warner</a> that let me design on a single artboard (as a component) while simultaneously previewing the result for Twitter, Discord, Slack, and Facebook.</p><p>(It&#x27;s useful to verify image sizing, since sometimes images are scaled down. Also, don’t forget how small text is going to appear on mobile!)</p><h3 id="evolving-the-concept">Evolving the concept</h3><p>We posed some questions about what would make these Open Graph images useful:</p><ul><li>What if the image preview was a screenshot of the webpage? Is this type of thumbnail captivating?</li><li>What if you could read part of an article (Docs, Handbook, Blog) in the image preview (like when reading a news article before hitting the paywall)? Would this draw you in and make you want to read more?</li></ul><h2 id="static-open-graph-images"><strong>Static Open Graph images</strong></h2><p><a href="https://github.com/PostHog/posthog.com/issues/2785">In this PR</a>, we created static Open Graph images for each of our main product pages. These images don’t need to be frequently updated, so it was okay to put a little more time in crafting one-off pieces for each.</p><p>Here’s what you’ll see when sharing <a href="/product/session-recording">posthog.com/product/session-recording</a>:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-10.png" alt="PostHog&#x27;s Session Recording Open Graph image"/></p><p>We also build custom artwork for pages we know are likely to be shared, like for an event we’ll be hosting soon.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-11.png" alt="Personalized Open Graph image for an event"/></p><h2 id="dynamic-open-graph-images"><strong>Dynamic Open Graph images</strong></h2><p><em>Now for the fun part...</em></p><p>Similar to GitHub’s approach, we automatically generate some Open Graph images so our Graphic Designer, Lottie, doesn’t have to be on call 24x7 for whenever we publish a blog post.</p><h3 id="beforeafter-sharing-a-docs-url">Before/after: Sharing a <code>/docs</code> URL</h3><p><strong>Before (previous site-wide Open Graph image)</strong></p><p>We shared a single static image across all Docs articles</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-0.png" alt="Open Graph image"/></p><p><strong>After</strong></p><p>Now we show a preview from the article, along with some relevant information about it that you might like to know.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-12.png" alt="Open Graph image"/></p><p>This gives us the chance to draw a user into the content on the page before they decide to click. Our bet was this could increase clickthroughs by reducing the uncertainty about what was on the other side of the link.</p><p>Questions visitors may subconsciously have could include:</p><ul><li>How fresh is this content?</li><li>How much of a time investment is this going to be?</li><li>Is this a website that&#x27;s going to bombard me with ads?</li><li>Will I be able to easily access the information I might click to see?</li><li>Does this website &quot;seem&quot; like it will load quickly?</li></ul><p>Believe it or not, we can address all of these questions using visual cues in these images, and we can communicate them in a fraction of a second.</p><h3 id="other-open-graph-templates-throughout-posthogcom">Other Open Graph templates throughout PostHog.com</h3><p><strong>Blog post</strong></p><p>There are a considerations for our blog posts:</p><ul><li>If we place an image in the background, text layered on top needs to be readable. The fix? We added subtle text shadows and partially transparent gradients layered between the text and image.</li><li>Some posts have multiple authors, so that needs to be factored in.</li><li>In some cases, post images have text <a href="https://posthog.com/blog/yc-top-companies">inside the image</a> that would be obscured with auto-generated Open Graph images. We have a parameter in our blog post’s front matter to skip this image generation.</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-13.png" alt="Blog Open Graph image"/></p><p><strong>Customer stories</strong></p><p>Since each customer story involves two logos, we placed them at the top along with a heart in between.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-14.png" alt="Example of Open Graph image in a customer story"/></p><p><strong>Careers</strong></p><p>Especially useful for the PostHog team when posting roles on LinkedIn, this image is always up to date with the latest roles we’re hiring.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-1.png" alt="Careers Open Graph image"/></p><h2 id="how-it-works">How it works</h2><h3 id="overview">Overview</h3><p>We use <a href="https://www.gatsbyjs.com">Gatsby</a>, a static site generator, so once the build process is complete, we run through a series of steps:</p><ul><li>Pass an HTML string containing some page data to <a href="https://github.com/puppeteer/puppeteer">Puppeteer</a> (a Node library for headless screenshotting) for each page</li><li>Load images and our custom font and screenshot the preview</li><li>Use the new image instead of our site-wide fallback Open Graph image</li></ul><h3 id="details">Details</h3><p>Gatsby has a really cool API that allows you to hook into the last point of the build process: <code>onPostBuild</code>. This is where all of the magic takes place.</p><p>We first query for each page that will use custom Open Graph images. (Right now, that&#x27;s Docs, Handbook, Customers, Careers, and our blog posts.)</p><p>From there, we do some initial setup:</p><ol><li>Create folders for images and fonts</li><li>Download our webfont</li><li>Spin up a new Chromium page with Puppeteer</li></ol><p>After setup is complete, we finally iterate through each queried page, set the content of the Chromium page with an HTML string, screenshot the page, and save it. Here&#x27;s what that looks like for blog posts:</p><pre><code class="language-js">for (const post of data.blog.nodes) {
    const { title, authorData, featuredImage } = post.frontmatter
    const image = fs.readFileSync(featuredImage.absolutePath, {
        encoding: &#x27;base64&#x27;,
    })
    await createOG({
        html: blogTemplate({ title, authorData: authorData &amp;&amp; authorData[0], image, font }),
        slug: post.fields.slug,
    })
}
</code></pre><p><strong>What&#x27;s happening in this for...of loop, though?</strong></p><pre><code class="language-js">const image = fs.readFileSync(featuredImage.absolutePath, {
    encoding: &#x27;base64&#x27;,
})
</code></pre><p>Since the site isn&#x27;t technically &quot;live&quot; yet, we don&#x27;t have access to a public URL to insert into our HTML template. The workaround is embedding it in an <code>&lt;img /&gt;</code> element as Base64. You&#x27;ll see this workaround in a few other places in the code.</p><pre><code class="language-js">await createOG({
    html: blogTemplate({ title, authorData: authorData &amp;&amp; authorData[0], image, font }),
    slug: post.fields.slug,
})
</code></pre><p>We have an asynchronous function called <code>createOG</code>. This handles setting the Chromium page content, screenshotting, and saving the image. It takes an HTML string to set the Chromium page content and a slug to create the file name of the screenshot.</p><blockquote><p>You can explore our solution <a href="https://github.com/PostHog/posthog.com/pull/2695">in this pull request</a>.</p></blockquote><h3 id="testing-open-graph-previews">Testing Open Graph previews</h3><p>There are a handful of tools to test Open Graph previews, but my personal favorite has become <a href="https://metatags.io/">metatags.io</a>, as it’s fast, simple, and not cluttered with ads. (It will even generate your Open Graph meta tags for you!)</p><p>It&#x27;s important to note that some websites cache Open Graph on their servers. If you think you uploaded a new version of an Open Graph image to your website but your changes aren&#x27;t appearing, this might be why! Facebook has a useful <a href="https://developers.facebook.com/tools/debug/">Graph debugging/cache busting tool</a>.</p><h2 id="in-summary">In summary...</h2><p>This was a really fun project to work on, as it adds immediate value on a daily basis to anyone seeing a link to PostHog.com. On a personal note, it’s pretty special to work at a company where this type of polish is valued.</p><p>We still consider this a v1 approach, as there are plenty of edge cases to work through - not to mention what to do with article&#x27;s begin with images or titles - like how to format it all.</p><p>In a future update, we plan to <a href="https://github.com/PostHog/posthog.com/issues/2720">make our Tutorials Open Graph images transparent</a> so they naturally work in both light and dark modes.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/opaque-tutorials.png" alt="Opaque tutorial Open Graph images"/></p><p>We&#x27;ve also designed (and plan to implement) dynamic images for personalized landing pages (to be shared with prospective customers) so PostHog feels a little more personalized when our link is shared around a company’s Slack.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/library/images/blog/open-graph-images/og-15.png" alt="Next Steps Open Graph image"/></p><p>But this first step is light years more interesting to look at than a simple PostHog logo on a white background. (If you see opportunity for improvement, we invite you to submit a pull request <a href="http://github.com/posthog/posthog.com">on our website’s repo</a>!)</p><p>A tip of the hat goes to the team at GitHub who worked on their new Open Graph images, as it served as a starting point in inspiring what we ultimately built.</p><p>We really hope you enjoy seeing our Open Graph previews across the internet as much as we enjoyed making them!</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.33.0]]></title><description><![CDATA[Introducing a full multivariate Experimentation suite, granular permissions on dashboards, Altinity Cloud support for ClickHouse, configuring your instance from the PostHog UI and 290+ improvements/fixes.]]></description><link>https://posthog.com/blog/the-posthog-array-1-33-0</link><guid isPermaLink="false">04e7d1ea-7d05-5646-b91a-939b6c950329</guid><pubDate>Mon, 28 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.33.0 introduces a full Experimentation suite, enabling you to run multivariate experiments to ensure you maximize value for your end users. Introducing also support for a managed ClickHouse infrastructure through Altinity Cloud, insight legends and insight permalinks. Plus, there are over 290+ improvements and bugfixes included!</p><p>For Enterprise customers, we&#x27;ve also added the ability to set granular permissions on dashboards.</p><blockquote class="warning-note"><b>IMPORTANT!</b> From this version onwards, you&#x27;ll need to make sure to run all async migrations on your instance <b>after upgrading to 1.33.0</b>. The next version (1.34.0) will not run until async migrations are completed. Please check out the <a href="/docs/runbook/async-migrations" target="_blank">async migrations</a> docs for details.</blockquote><h2 id="posthog-1330-release-notes">PostHog 1.33.0 release notes</h2><blockquote><p>To upgrade your PostHog instance, you can check out our <a href="/docs/runbook/upgrading-posthog">upgrade guide</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#new-experimentation">Experimentation</a></li><li><a href="#new-dashboard-permissions">Dashboard permissions</a></li><li><a href="#new-altitiny-cloud-support">Altinity Cloud support</a></li><li><a href="#new-instance-configuration-ui">Instance configuration UI</a></li></ul><h3 id="new-experimentation">New: Experimentation</h3><p>PostHog now offers a full, <a href="/blog/best-open-source-ab-testing-tools">open source end-to-end A/B testing</a> suite! Previously you could use <a href="/product/feature-flags">Feature Flags</a> to run experiments, but it took a lot of manual work to setup and interpret. We wanted to fix that. This new experimentation suite will help you plan tests by selecting users, sample sizes and run times, then track results and let you know when results are statistically significant.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_33_0-experiments.png" alt="Screenshot: Experiments view"/><p>With <a href="/docs/user-guides/experimentation">Experimentation</a>, you can now test multiple variants to optimize for a specific metric, or even conversion rate for a funnel. This enables you to ship product changes confidently while maintaining speed.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_33_0-experiments-2.png" alt="Screenshot: Experiments with a funnel conversion rate target metric"/><blockquote><p>🎁 Experimentation is a premium feature and requires a PostHog Scale or Enterprise license. <a href="/pricing">Learn more</a>.</p></blockquote><br/><h3 id="new-dashboard-redesign">New: Dashboard redesign</h3><p>We&#x27;ve redesigned dashboards to make them more useful than ever. Changes include better exposition of titles, descriptions, tags and activity, so that it&#x27;s easier to understand at a glance.</p><p>We&#x27;ve also added a new Insight Details feature that can give you a handy summary of the query. Now all the information you need to understand a dashboard is right there in front of you!</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/docs/user-guides/funnels/geoip-docs-image.png" alt="Screenshot: Dashboard redesign"/></p><br/><h3 id="new-dashboard-permissions">New: Dashboard permissions</h3><p>It&#x27;s now possible to granularly control team members&#x27; access to dashboards – by default anyone in the project can still edit them, but there is also an option to restrict editing only to specific invited team members. Those who don&#x27;t have edit access to a dashboard are also prevented from editing insights belonging to it. With this feature unwanted changes to existing dashboards and insights no longer pose a problem for teams.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_33_0-dashboard-permissions.png" alt="Screenshot: Dashboard permissions"/></p><blockquote><p>🎁 Dashboard permissions is a premium feature and requires a <strong>PostHog Enterprise</strong> license. <a href="/pricing">Learn more</a>.</p></blockquote><br/><h3 id="new-altinity-cloud-support">New: Altinity Cloud support</h3><p>We&#x27;ve partnered with Altinity to offer a worry-free managed ClickHouse database. Altinity is an expert in ClickHouse and data infrastructure and helps large organizations to deploy, manage and scale their PostHog instance. If you need to self-host PostHog, but don&#x27;t want to manage the deployment yourself then Altinity is the solution for you.</p><br/><h3 id="new-instance-configuration-ui">New: Instance configuration UI</h3><p>We&#x27;re making it much more straightforward to manage your PostHog instance, with a new UI that surfaces options and removes the need to rely on environment variables such as email settings. You can read more about these settings in the <a href="/docs/self-host/configure/instance-settings">instance settings docs</a> and <a href="/docs/self-host/configure/environment-variables">environment variables docs</a>.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_33_0-instance-configuration.png" alt="Screenshot: Instance configuration"/><br/><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><ul><li>Improved: Short robust permalinks. When sharing an insight link (e.g. <code>https://app.posthog.com/insights/BYt1oFdI</code>), we&#x27;ll now automatically switch you to the relevant project (if the link is from a different project). You can now be confident the recipient will see the insight you intended.</li><li>Improved: Smarter events and property filters. We&#x27;ve made a lot of improvements to how we show events and event properties across the app. We&#x27;ll now only show you the relevant properties for a specific event and we&#x27;ll signal when an event has not been seen in the last 30 days, so you can create insights faster.</li><li>Improved: Redesigned share dashboard modal. We&#x27;ve made it simpler and clearer when your dashboard is shared, internally and externally.</li><li>Improved: A new async migration (<code>person_distinct_id2</code>) will speed up queries &gt;70% for projects with 10M+ unique users.</li><li>New: Insight legends. Each insight now offers a legend within each graph to provide clarity to what each line represents. This is particularly useful when sharing screenshots of an insight so the recipient knows what each line represents.</li><li>Improved: Automatic API documentation. We&#x27;ve implemented <a href="https://github.com/swagger-api">Swagger</a> to automatically generate API docs to ensure these are always up-to-date.</li><li>Improved: Performance of Events page. The events page will now load up to 10x faster! We&#x27;ve improved the way queries are performed, and what information is loaded to reduce load times to a minimum.</li><li>Plus 290+ improvements &amp; fixes.</li></ul><h3 id="deprecation--removal-notices">Deprecation &amp; removal notices</h3><ul><li>Please make sure to run all <a href="/docs/runbook/async-migrations">async migrations</a> after upgrading to this version (1.33.0) and before upgrading to the next version (1.34.0, March 2022).</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog News</h2><p>Welcome Grace McKenzie! Grace joined PostHog as an Ops Manager to help keep the company running smoothly. Grace has a very unique position on pineapple on pizza (🍍 on 🍕), &quot;I will tolerate pineapple on pizza as long as there is bacon and ranch dipping sauce involved&quot;.</p><blockquote><p>I once lead a self-researched and organized pub crawl for 30 strangers in Prague after having only been in the city for 6 hours!</p></blockquote><h2 id="share-your-feedback-1">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h3 id="community-shoutouts">Community shoutouts</h3><p>We want to thank <a href="https://github.com/jc00ke">jc00ke</a> and <a href="https://github.com/TheDoctor0">TheDoctor0</a> who contributed to this release of PostHog!</p><h2 id="open-roles">Open roles</h2><p>Join us in helping make more products successful! We&#x27;re currently hiring for the following roles:</p><ul><li>Ex-Founders</li><li>Engineering Manager</li><li>Full Stack Engineer</li><li>Site Reliability Engineer - Kubernetes</li><li>Full Stack Engineer - Growth</li></ul><p>Learn more about these roles on our <a href="https://posthog.com/careers">Careers page</a>.</p><p>Don&#x27;t see a role for you? We&#x27;re always looking for exceptional people, so reach out to us via the link above.</p><hr/><p><em>Follow us on <a href="https://twitter.com/PostHog">Twitter</a> or <a href="https://linkedin.com/company/posthog">LinkedIn</a>, and subscribe to our <a href="https://posthog.com/newsletter">newsletter</a> for more posts on startups, growth, and analytics.</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[You can now reverse ETL into PostHog with Hightouch]]></title><description><![CDATA[We're delighted to announce that  Hightouch  has released an integration with PostHog so you can sync modeled data from your data warehouse into…]]></description><link>https://posthog.com/blog/hightouch-posthog-reverse-etl-integration</link><guid isPermaLink="false">d5a96a89-6220-5f3c-ba0f-67c1c6f82033</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Thu, 24 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We&#x27;re delighted to announce that <a href="https://hightouch.io/">Hightouch</a> has released an integration with PostHog so you can sync modeled data from your data warehouse into PostHog.</p><h2 id="what-is-hightouch">What is Hightouch?</h2><p>Hightouch is an alternative to Customer Data Platforms (CDP) like Segment, though it can be used in conjunction with them. It allows data teams and engineers to sync data from centralized data warehouses (e.g. Google BigQuery, Redshift, Snowflake etc.) to products like PostHog. This is called reverse ETL – that&#x27;s extract, transform and load.</p><h2 id="why-is-reverse-etl-useful">Why is reverse ETL useful?</h2><p>Because it makes your data warehouse the single source of truth, ensuring all your tools are using the same up-to-date data. It effectively turns your data warehouse into a CDP, removing the need for a third-party platform that owns your data or introduces latency into your data pipeline.</p><p>It&#x27;s worth pointing out that you can send customer data directly to PostHog from CDPs to like <a href="/docs/libraries/rudderstack">Rudderstack</a> and <a href="/docs/libraries/segment">Segment</a> with <a href="/integrations">existing PostHog integrations</a>. However, CDPs will send raw data, whereas a reverse ETL from your data warehouse gives data scientists the opportunity to model data before it&#x27;s synced. </p><p>Ultimately, the pros and cons of CDPs vs data warehouses is an article in itself, but the most useful thing to know is that, in most organizations, a data warehouse will be owned by a data science team, whereas a marketing team will own a CDP.</p><h2 id="what-data-can-be-synced">What data can be synced?</h2><p>Currently, Hightouch can sync &#x27;Events&#x27; and data to the &#x27;Persons&#x27; object in PostHog from any of the following data sources:</p><ul><li>Airtable</li><li>Athena</li><li>BigQuery</li><li>Databricks</li><li>Looker</li><li>MySQL</li><li>PostgreSQL</li><li>Presto</li><li>Google Sheets</li><li>Rockset</li><li>Redshift</li><li>Snowflake</li><li>SQL Server</li></ul><p>You can read more about Hightouch&#x27;s PostHog integration <a href="https://hightouch.io/docs/destinations/posthog/">in its documentation</a>.</p><h2 id="why-is-this-useful">Why is this useful?</h2><p>Let&#x27;s say your marketing team uses a CRM. It&#x27;s syncing customer data into your data warehouse, such as names, email addresses, how they found your product, job title, pricing information and organization data. This is all contextual data you can use in PostHog.</p><p>Once this data is synced into &#x27;Persons&#x27; in PostHog, you can create Cohorts of users with this additional data. You could, for example, create Cohorts based on:</p><ul><li>Users who are on a particular payment plan or product tier</li><li>Users from the same company</li><li>Users with similar job titles or roles</li></ul><p>The possibilities are only limited by the data you&#x27;re collecting, but the key point is you&#x27;re ensuring the Persons data in PostHog is the same as in your CRM, data warehouse and other tools.</p><h2 id="how-much-does-hightouch-cost">How much does Hightouch cost?</h2><p>Hightouch has three standard tiers:</p><ul><li>Individual (free for up to 1 destination)</li><li>Starter ($350 per month for up 2 destinations)</li><li>Pro ($800 per month for up to 3 destinations)</li></ul><p>You can try any destination for free for 14 days and Hightouch also offers a 30-day trial on its paid tiers. Head to its <a href="https://hightouch.io/pricing/">pricing page</a> for more detail and custom options.</p><h2 id="can-i-build-my-own-reverse-etl-app-for-posthog">Can I build my own reverse ETL app for PostHog?</h2><p>You absolutely can. </p><p>PostHog is open source and we love it when people contribute to making the product better for everyone. The community has already contributed apps for, to name just a few, <a href="https://github.com/Vinovest/posthog-salesforce">Salesforce</a>, <a href="https://github.com/vendasta/pubsub-plugin">Google Pub Sub</a>, and <a href="https://github.com/rudderlabs/rudderstack-posthog-plugin">Rudderstack</a>.</p><p>We also recently ran a <a href="https://github.com/PostHog/posthog/issues/8437">PostHog App Bounty</a> for a few specific apps we&#x27;d like have on PostHog. All current bounties have been assigned, but we&#x27;re always open to suggestions.</p><p>Whether you have an idea for an app or just need some help, please <a href="https://app.posthog.com/home#supportModal">let us know</a> if you&#x27;d like to get involved.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Is Google Analytics HIPAA compliant?]]></title><description><![CDATA[HIPAA, which stands for the Health Insurance Portability and Accountability Act, regulates how individuals and organizations are required to secure…]]></description><link>https://posthog.com/blog/is-google-analytics-hipaa-compliant</link><guid isPermaLink="false">e269ea8f-5274-57aa-84aa-5c0019bdaacd</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 21 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hipaa-compliant-product-analytics.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>HIPAA, which stands for the Health Insurance Portability and Accountability Act, regulates how individuals and organizations are required to secure, handle and transmit protected health information (PHI) – and the stringent penalties for failing to do so.</p><p>Put simply, you should not use Google Analytics if your business is a &#x27;Covered Entity&#x27; or &#x27;Business Associate&#x27; under HIPAA: <strong>Google Analytics is not HIPAA-compliant</strong> and using it could result in a breach and substantial fines. </p><p>This means other tools which rely on Google Analytics, such as the experimentation platform <a href="/blog/optimize-to-posthog">Google Optimize</a>, are also not HIPAA-compliant. Read our guide to <a href="/blog/best-hipaa-compliant-ab-testing-tools">HIPAA-compliant split testing tools</a> if you need an alternative to Optimize as well.</p><p>In this article, we&#x27;ll explain:</p><ol><li>Why Google Analytics isn&#x27;t HIPAA-compliant</li><li>Why product analytics is a better alternative</li><li>Why self-hosting your analytics is the best way to stay HIPAA-compliant</li></ol><h3 id="common-hipaa-terms-explained">Common HIPAA terms explained</h3><ul><li><p><strong>Protected Health Information (PHI):</strong> Also known as personal health information, PHI includes any health data on an individual and any identifying information (e.g. emails, phone numbers, etc.) connected to it. IP addresses, device identifiers and URLs are among the <a href="https://cphs.berkeley.edu/hipaa/hipaa18.html">18 recognized identifiers</a> </p></li><li><p><strong>Covered Entity:</strong> A first-party organization (hospital, healthcare provider, etc.) or product (health app, website, wearable device, etc.) that collects any kind of PHI</p></li><li><p><strong>Business Associate:</strong> A third party that receives and / or manages data on behalf of a Covered Entity </p></li><li><p><strong>Business Associate Agreement:</strong> An agreement between a covered entity and third party that handles their PHI; it ensures the Business Associate shares the same legal requirements and liability as the Covered Entity   </p></li></ul><h2 id="why-isnt-google-analytics-hipaa-compliant">Why isn&#x27;t Google Analytics HIPAA-compliant?</h2><p>Because Google doesn&#x27;t allow Covered Entities to enter into a BAA with it, as this <a href="https://support.google.com/analytics/answer/6366371#zippy=%2Cin-this-article">disclaimer</a> on its website explains:</p><blockquote><p>Unless otherwise specified in writing by Google, Google does not intend uses of Google Analytics to create obligations under the Health Insurance Portability and Accountability Act, as amended, (“HIPAA”), and makes no representations that Google Analytics satisfies HIPAA requirements. If you are (or become) a Covered Entity or Business Associate under HIPAA, you may not use Google Analytics for any purpose or in any manner involving Protected Health Information unless you have received prior written consent to such use from Google.</p></blockquote><p>A BAA is necessary because Google Analytics transmits data to Google-owned servers when you use it. Were you to use Google Analytics to process or transmit PHI you would be liable for investigation and a fine.</p><h2 id="hipaa-fines-explained">HIPAA fines, explained</h2><p>HIPAA fines operate on a sliding scale based on the severity of the breach and the total number of breaches. This means they get expensive very quickly, especially for products or businesses with large user bases. The largest HIPAA fine to date is <a href="https://www.hipaajournal.com/anthem-inc-settles-state-attorneys-general-data-breach-investigations-and-pays-48-2-million-in-penalties/">$16 million</a> against health insurer Anthem.</p><p>Fines aren&#x27;t limited to large businesses. In 2017, a <a href="https://www.hhs.gov/hipaa/for-professionals/compliance-enforcement/agreements/ccdh/index.html">children&#x27;s charity was fined</a> due to storing PHI on a third-party platform without a BAA.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[A simple guide to personal data and PII]]></title><description><![CDATA[Engineers and product managers need to be vigilant when collecting user data. Punitive GDPR fines can run to €20 million or 4% of a company's global…]]></description><link>https://posthog.com/blog/what-is-personal-data-pii</link><guid isPermaLink="false">4a91d774-5997-5ca8-8053-ffd32211f80d</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 21 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/google-analytics-gdpr.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Engineers and product managers need to be vigilant when collecting user data. Punitive GDPR fines can run to €20 million or 4% of a company&#x27;s global turn (whichever is greater) and that&#x27;s after the expense, time, energy, and stress generated by the legal process.</p><p>This guide will help you understand what is and isn&#x27;t personal data, so you can identify what personal data you&#x27;re collecting and take appropriate actions.</p><p><strong>Contents:</strong></p><ul><li><a href="#what-is-pii">What is PII?</a><ul><li><a href="#examples-of-pii">Examples of PII</a></li><li><a href="#whats-the-difference-between-pii-and-phi">The difference between PII and PHI</a></li></ul></li><li><a href="#what-is-personal-data">What is personal data?</a><ul><li><a href="#examples-of-personal-data-under-gdpr">Examples of personal data under the GDPR</a></li><li><a href="#what-is-non-personal-data">What is non-personal data?</a></li></ul></li><li><a href="#posthog-and-privacy-compliance">PostHog and privacy compliance</a></li></ul><h2 id="what-is-pii">What is PII?</h2><p>Personally Identifiable Information (PII) is a US legal term - it&#x27;s not used in the EU&#x27;s GDPR, which prefers the broader term &#x27;personal data&#x27;. That said, if something is considered PII in the US, it&#x27;s <em>probably</em> considered personal data under the GDPR.</p><p>There is no single legal document in the US that defines PII. Instead, specific federal and state laws define what is considered PII in any given context. Helpfully, though, the National Institute of Standards and Technology (NIST), has a definition of PII that is <a href="https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-122.pdf">widely accepted</a>:</p><blockquote><p><em>&quot;(1) any information that can be used to distinguish or trace an individual&#x27;s identity, such as name, social security number, date and place of birth, mother&#x27;s maiden name, or biometric records&quot;</em></p></blockquote><blockquote><p><em>&quot;(2) any other information that is linked or linkable to an individual, such as medical, educational, financial, and employment information.&quot;</em></p></blockquote><h3 id="examples-of-pii">Examples of PII</h3><p>Again, we&#x27;re leaning on the NIST here, which provides numerous examples of PII:</p><ul><li><p><strong>Names</strong>, including an individual&#x27;s full name, maiden name, mother&#x27;s maiden name, or known aliases</p></li><li><p><strong>Personal identification numbers</strong>, such as such a social security number (SSN), passport number, driver‘s license, taxpayer identification number, patient identification number, and financial accounts or credit card numbers</p></li><li><p><strong>Digital identifiers</strong>, which includes but is not limited to static IP addresses, MAC addresses, and unique device identifiers (UDI)</p></li><li><p><strong>Addresses and contact information</strong>, including home addresses, email addresses, and any type of telephone number</p></li><li><p><strong>Personal characteristics</strong>, such as photos of an individual&#x27;s face or other distinguishing characteristics, x-rays, fingerprints, and biometric data</p></li><li><p><strong>Any other linked of linkable information</strong>, including date of birth, place of birth, race, religion, weight, employment information, medical data, education information, financial information, and most kinds of geographical identifier.</p></li></ul><h3 id="whats-the-difference-between-pii-and-phi">What&#x27;s the difference between PII and PHI?</h3><p>Protected Health Information (PHI) is a <em>type</em> of PII as defined by the US HIPAA law and many of the items listed above are also examples of PHI.</p><p>PHI that&#x27;s connected to individual identifiers, such as name, address, etc.,  must be treated with extreme care under HIPAA. Penalties for breaches include fines and even jail time in extreme cases.</p><p>If HIPAA compliance is a concern for your business, read our guide to the <a href="/blog/best-hipaa-compliant-analytics-tools">best HIPAA-compliant analytics tools</a>. And, in case you were wondering, <a href="/blog/is-google-analytics-hipaa-compliant">Google Analytics is not HIPAA compliant</a>.</p><h2 id="what-is-personal-data">What is personal data?</h2><p>Under the GPDR, &#x27;personal data&#x27; is defined as any information which:</p><ol><li>Identifies a &#x27;data subject&#x27; directly</li><li>Can be used to identify a &#x27;data subject&#x27; when combined with other information</li></ol><p>This second point is what makes the GDPR powerful, or troublesome depending on your point of view. The GDPR anticipates, and seeks to prevent, organizations from combining data in order to circumvent its provisions.</p><p>Also, note the use of &quot;data subject&quot; here. It&#x27;s deliberate. You don&#x27;t even need to know an individual&#x27;s name for them to be identified. Any kind of digital profile counts, even if the profile doesn&#x27;t include a name.</p><p>Of course, any time you&#x27;re collecting personal data, consent is required: hence cookie consent notices on websites.</p><h3 id="examples-of-personal-data-under-gdpr">Examples of personal data under GDPR</h3><p>Names, identification numbers, location data and plenty more besides qualifies as personal data under the GDPR, but there is no official list of what the regulation considers personal data. Common sense prevails, though, and certainly everything in our list of PII examples applies to the GDPR.</p><p>The GDPR does, however, define &#x27;special categories of personal data&#x27; that are subject to additional protections. These include:</p><ul><li>race</li><li>ethnic origin</li><li>political opinions</li><li>religious or philosophical beliefs</li><li>trade union membership</li><li>genetic data</li><li>biometric data (where this is used for identification purposes)</li><li>health data</li><li>sex life</li><li>sexual orientation</li></ul><p>Collecting this data requires &quot;explicit consent&quot; and must be justifiable under relevant local laws and under the GDPR. The UK Information Commissioner&#x27;s Office (ICO) has a <a href="https://ico.org.uk/for-organisations/guide-to-data-protection/guide-to-the-general-data-protection-regulation-gdpr/lawful-basis-for-processing/special-category-data/">useful guide summarizing the requirements</a>.</p><h3 id="what-is-non-personal-data">What is non-personal data?</h3><p>It&#x27;s also useful to understand what <em>isn&#x27;t</em> considered personal data under the GDPR. Here are a few examples:</p><ul><li>Personal data that has been successfully anonymized</li><li>Generalized data, such age ranges</li><li>Partially or fully-masked IP addresses</li><li>Data not originating from an identifiable individual</li></ul><p>The European Commission published <a href="https://ec.europa.eu/commission/presscorner/detail/en/MEMO_19_2750">guidance on the free flow of non-personal data</a> in relation to the GDPR in May, 2019. It stresses that mixed data sets of personal and non-personal data <strong>doesn&#x27;t</strong> have to be processed separately, but when combined the GDPR fully applies even when &quot;personal data represents only a small part of the dataset&quot;.</p><h2 id="posthog-and-privacy-compliance">PostHog and privacy compliance</h2><p>PostHog offers EU hosting for GDPR compliance and a Business Associate Agreement (BAA) is available for companies who need to comply with HIPAA.</p><p>Read our <a href="/docs/privacy">privacy compliance documentation</a>, which covers the <a href="/docs/privacy/gdpr-compliance">GDPR</a>, <a href="/docs/privacy/hipaa-compliance">HIPAA</a> and <a href="/docs/privacy/ccpa-compliance">CCPA</a> for more information on how to deploy PostHog in a privacy-compliant manner.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[HostHogs - free drinks, free pizza and frequently asked questions]]></title><description><![CDATA[As you may have heard, we’ll soon host our first ever meet-up for anyone who uses or is interested in finding out more about PostHog. It’ll take place…]]></description><link>https://posthog.com/blog/hosthog-blog</link><guid isPermaLink="false">9e458dbf-e775-59b8-8ae4-dccdbecba29f</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 15 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hosthog-banner.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>As you may have heard, we’ll soon host our first ever meet-up for anyone who uses or is interested in finding out more about PostHog. It’ll take place in London, on February 24th — <a href="https://www.eventbrite.com/e/hosthog-london-2022-tickets-259372428917">we’d love for you to join us</a>. </p><p>And if you haven’t RSVPed yet because you’re unsure of something, we’ve got answers to your questions…</p><h2 id="why-are-we-hosting-an-event">Why are we hosting an event?</h2><p>We first discussed the idea of meetups last year during <a href="/handbook/company/offsites">one of our hackathon offsites</a>. It’s possible we were inspired by the chance to launch something called <em>HostHogs</em>, but from the start we also imagined events would be a great way to learn about building better products with analytics. That’s why we’ve invited Anca Filip, Head of Product at <a href="/customers/mention-me">Mention Me</a>, to join us for a fireside chat — so she can explain how Mention Me, which recently finished a $25M raise, uses PostHog.</p><h2 id="who-are-hosthogs-for">Who are HostHogs for?</h2><p>HostHogs are for everyone and anyone who wants to build better things. You don’t have to be a PostHog client. Maybe you’ve only just heard of PostHog, or maybe you want to meet the team and find out about working here! Either way, HostHogs are open to you.</p><h2 id="what-about-covid-19">What about Covid-19?</h2><p>We’re hosting this event in the UK, where the rate of vaccination is high. We’ve also taken steps to ensure this event is as safe as we can make it, such as having hand sanitizer and masks available throughout the event. We’ve also purposefully chosen a venue which is on the larger side, to help ensure there’s room for everyone to maintain a safe distance from each other. </p><p>We won’t be requiring masks or vaccination history to attend a HostHog, but if you’re not comfortable attending then we’ll be writing up an article about the talks afterwards. </p><h2 id="is-there-a-dress-code-or-code-of-conduct">Is there a dress code or code of conduct?</h2><p>There’s no dress code, but we will expect everyone to adhere to <a href="/docs/contribute/code-of-conduct">our standard code of conduct</a>. Please help us create a safe, inclusive environment for everyone! </p><h2 id="i-dont-live-in-london-where-will-the-next-hosthog-be">I don’t live in London. Where will the next HostHog be?</h2><p>We definitely plan to host more events in the future, but we don’t yet know when or where they will be. If you’d like to suggest a location, or have any other feedback then just let us know in <a href="/posts">our community page</a>. </p><h2 id="do-i-need-to-rsvp">Do I need to RSVP?</h2><p>This is a free event with limited capacity, so we very strongly encourage that you RSVP in order to secure your spot. We will do our best to accommodate, but in the event we’re over-attended, we will give priority to those who have RSVPed. </p><h2 id="did-you-say-free-drinks-and-pizza">Did you say free drinks and pizza?</h2><p>Yes! The offers a great selection of beers, wines and cocktails, as well as non-alcoholic options and tasty food. We can’t guarantee we can accommodate for any allergies or intolerances, but let us know in <a href="/posts">our community page</a> and we’ll try our best.</p><h2 id="i-have-another-question">I have another question...</h2><p>If you have a question which isn’t answered here or in the Eventbrite page, you can either raise an issue on GitHub, email us at <a href="mailto:hey@posthog.com">hey@posthog.com</a>,  or ask in the community Slack group. We’d be happy to help!</p><blockquote><p>Join us in London,UK  on February 24th, 2022 for our first ever community meetup. It’s a free event, but spaces are limited — <a href="https://www.eventbrite.com/e/hosthog-london-2022-tickets-259372428917">RSVP to secure your spot</a>. </p></blockquote><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Solving the mystery of PostHog’s missing session recordings]]></title><description><![CDATA[Session Recording  is one of PostHog's core features, and one of the few completely  open source ression replay tools  available. It allows you to see…]]></description><link>https://posthog.com/blog/missing-recordings</link><guid isPermaLink="false">7cee0dc1-4d22-530c-9a6c-56ea4f2911d7</guid><dc:creator><![CDATA[Rick Marron]]></dc:creator><pubDate>Fri, 11 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><a href="/product/session-recording">Session Recording</a> is one of PostHog&#x27;s core features, and one of the few completely <a href="/blog/best-open-source-session-replay-tools">open source ression replay tools</a> available. It allows you to see how real users use your website, mouse clicks and all. It&#x27;s really cool and addictive (give it a try and you&#x27;ll see what I mean).</p><p>Recently, we made a ton of improvements to the feature. To name a few, we:</p><ul><li>Decreased average recording load time from ~2.5s to 700ms</li><li>Resolved a big bug that caused recordings to &quot;wonk out&quot; if a recording spanned multiple tabs or browser windows</li><li>Revamped the player experience to make it faster for users to get to the moment in the recording they care about</li><li>Improved the speed to query recordings, allowing users to search across all recordings at once (it used to be limited to a single day&#x27;s worth of recordings)</li></ul><p>But there was one fix that stood out in this quality push. Customers would often tell us recordings were missing, and we didn&#x27;t know why.  </p><p>This is the story of how we decreased the number of missing recordings from 15% to &lt;1%, and in doing so, moved the feature out of beta.</p><blockquote><p>Rick Marron is a software engineer at PostHog. In previous lives Rick was a Program Manager at Microsoft, and he spent over a year in Nairobi, Kenya where he developed the first publicly available real-time source for traffic data in the city using computer vision and street cameras. He&#x27;s a native of Rochester, New York but lives in Los Angeles now because... sunshine. Follow him <a href="https://twitter.com/rick_marron">on Twitter</a> and <a href="https://github.com/rcmarron">Github</a>. </p></blockquote><h2 id="measuring-the-issue">Measuring the issue</h2><p>To start, we had to find a way to measure missing recordings. If we can&#x27;t measure it, we can&#x27;t know if we fixed it. But how can you measure something that&#x27;s missing?</p><p>We had a couple ideas, but they all had drawbacks. The two main ones we considered were:</p><p><strong>1. Measure how often we receive web analytics events outside of a recording:</strong> The idea is that a user should have a recording if they&#x27;re sending up other events. The problem is that this doesn&#x27;t account for cases when recordings are disabled, so the metric would always be &lt; 100%.</p><p><strong>2. Measure how often we&#x27;ve received data for a recording, but it wasn&#x27;t complete:</strong> For a recording to be shown to users, it needs to have enough data that we can draw the entire page - we call this a &#x27;full snapshot&#x27;. This metric would measure how often we started a recording but didn&#x27;t send up a full snapshot, so we couldn&#x27;t render the page for the user. Theoretically, this should rarely happen.</p><p>We decided to use the second metric because it would let us strive for 0% missing recordings. If you&#x27;re curious, you can read the conversation that led to this decision in <a href="https://github.com/PostHog/posthog/issues/5478">this GitHub issue</a>.</p><p>In the first run of the metric, it showed that we were missing ~15% of recordings across <a href="/pricing">PostHog Cloud</a> users.</p><h2 id="checking-sentry-for-clues">Checking Sentry for clues</h2><p>Now that we had a metric, we started hunting for clues. What was causing the missing recordings?</p><p>The first place we looked was Sentry. There were a couple of errors in the ingestion pipeline that seemed suspicious. The most notable was a &quot;Max data upload size exceeded&quot; error that was firing a few thousand times a day. This seemed like it could be an obvious cause of missing recordings. If some data was not being uploaded because it was too big, it would make sense that we could not get a &#x27;full snapshot&#x27;.</p><p>To figure out what was causing this error, we looked at data that had been uploaded which was just below our size threshold of 20mb. It looked like large data URLs of images were the cause.</p><p>To test this out, we made a filter that would remove data URLs from any payload that exceeded a 5mb threshold, and it would replace the image with an obvious placeholder.</p><p><img src="https://user-images.githubusercontent.com/4813045/137223852-eeb4273e-d81c-49ca-a115-02b9cd0979e1.png" alt="Recording Page with SVGs"/></p><p>One issue we faced was that we didn&#x27;t want this feature to significantly increase the size of <code>posthog-js</code>, but we would have to include the placeholder image in the bundle. After some discussion, we landed on the idea of using a very small SVG that could easily scale to the size of the image being replaced. You can read more about the discussion that landed us here in <a href="https://github.com/PostHog/posthog-js/pull/317">the PR itself</a>.</p><p>After deploying the fix, two things happened:</p><ol><li>The Sentry error went away 🥳</li><li>The missing recordings only went down a few percent 😩</li></ol><p>Back to the drawing board.</p><h2 id="looking-deeper">Looking deeper</h2><p>What was causing the rest of the missing recordings? With no more clues, it came time to dig through the mechanics of the code.</p><h3 id="so-how-does-session-recording-work">So, how does Session Recording work?</h3><p>Under the hood, we&#x27;re using the open source project <a href="https://github.com/rrweb-io/rrweb">RRWeb</a> to power our recordings feature. RRWeb handles capturing what happened in the DOM, serializing it (so you can send it to your server), and then replaying the serialized data.</p><p>To decrease the amount of data that&#x27;s transmitted, RRWeb works by taking a full snapshot of the DOM at the beginning of the recording, and from this point forward, it watches the <a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver">MutationObserver</a> and records only the changes to the page.</p><p>From the full snapshot, you can re-create a still image of the website, and from the mutations, you can replay how the page changes over time. This is very similar to how video compression works with &quot;key frames&quot; and deltas.</p><h3 id="solving-the-real-mystery">Solving the real mystery</h3><p>With this knowledge in mind, we started looking into why we were receiving mutation data for recordings, but without a full snapshot.</p><p>Presumably, if the mutations were being sent up, the snapshot code must&#x27;ve already run. The mutations depend entirely on the snapshot existing in memory, so it didn&#x27;t make sense that there was no full snapshot.</p><p>After a day or so of pounding our heads on the keyboard, we realized that most of the missing recording cases were on single-page applications. With this clue in mind, and knowing that RRWeb takes a full-snapshot on page load, it didn&#x27;t take long to realize the cause. </p><p>We were splitting recordings when a user was inactive for 30 minutes (so users don&#x27;t see a 10-hour long recording). But when the split happened, we were not taking a new full snapshot.</p><p>We made <a href="https://github.com/PostHog/posthog-js/pull/318">a fix</a> for this, and the missing recordings started to quickly drop.</p><h2 id="slow-moving-metrics">Slow moving metrics</h2><p>Because this fix went into posthog-js, and different customers upgrade at different speeds, it took a while to see the full effect of the fix in our metrics. </p><p>However, after about a month of waiting (and continuously checking the metrics 😬), the 15% missing recordings metric dropped to &lt;1% 🎉.</p><p>With this focus on quality, we&#x27;ve seen the usage of the Session Recordings feature go up significantly. Weekly active users is up 2.5x, and each of those users are watching about twice as many recordings per week.</p><p>And we&#x27;re not done yet, we&#x27;re still working to make it even easier to find and watch the recordings that show you valuable insights about your users.</p><p>As for the remaining &lt;1% of recordings that are missing, we&#x27;re still working on that too. The going theory is that it has to do with data compression errors or slow networks, but we&#x27;re not quite to the bottom of that one yet.</p><p>Read our <a href="/docs/user-guides/recordings">Sessions Recordings documentation</a> for more detailed information about the feature, or you can <a href="https://posthog.com/pricing">make an account for free</a> to try it out yourself!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Send love to open-source projects on Valentine's Day]]></title><description><![CDATA[Valentine's Day is coming up and we'd like to share our love for the open-source community that helps power PostHog! Here's how: For every GitHub star…]]></description><link>https://posthog.com/blog/send-love-to-open-source</link><guid isPermaLink="false">911639da-8fa6-5640-b249-089ef335c961</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Tue, 08 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/send-love-to-open-source.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Valentine&#x27;s Day is coming up and we&#x27;d like to share our love for the open-source community that helps power PostHog! Here&#x27;s how:</p><blockquote><p><strong>For every GitHub star we receive on <a href="https://github.com/PostHog/posthog">the PostHog repo</a> between now and the end of Valentine&#x27;s Day, we&#x27;ll donate $5 USD across four handpicked open-source community contributors.</strong></p></blockquote><p>We&#x27;ll donate a maximum of $50,000 in total. </p><h2 id="who-gets-the-money">Who gets the money?</h2><p>We&#x27;re donating to three projects and one open-source developer whose work is used extensively in our website or product.</p><table><thead><tr><th><strong>Who?</strong></th><th><strong>Why?</strong></th></tr></thead><tbody><tr><td><a href="https://github.com/rrweb-io/rrweb">Rrweb</a></td><td>Rrweb is an open-source web session replay library that supports PostHog&#x27;s <a href="https://posthog.com/product/session-recording">Session Recording</a> feature</td></tr><tr><td><a href="https://github.com/encode/django-rest-framework">Django REST</a></td><td>DRF is <em>the</em> framework for building APIs in Django and the foundation of PostHog&#x27;s web API</td></tr><tr><td><a href="https://github.com/babel/">Babel</a></td><td>We use Babel to safely run TypeScript apps in a NodeJS environment</td></tr><tr><td><a href="https://github.com/sindresorhus">Sindre Sorhus</a></td><td>Sindre is a prolific open-source developer who maintains some of our <a href="https://github.com/sponsors/community?account=PostHog&amp;page=1&amp;sort_by=MOST_USED">most-used packages</a></td></tr></tbody></table><h2 id="how-does-this-work">How does this work?</h2><p>That&#x27;s easy. Between now and the end of Valentine&#x27;s Day, simply follow these steps:</p><ol><li>Login to GitHub and go to <a href="https://github.com/PostHog/posthog">the PostHog repo</a>.</li><li>Click the ⭐️ icon. Hint: it&#x27;s in the top right corner.</li><li>That&#x27;s it. We&#x27;ll donate on your behalf!</li></ol><p>On the morning of Tuesday, February 15, we&#x27;ll count up how many stars we&#x27;ve gained and contact the projects above to make the donations. We&#x27;ll quickly verify the stars are legitimate (see <em>small print</em> below).</p><h2 id="why-are-we-doing-this">Why are we doing this?</h2><p>PostHog is an open-source project and our team is proud to be part of the open-source community. We wanted to take this week as an opportunity to celebrate and support the open-source community in a meaningful way.</p><p>Also, getting people who care about open-source projects to star our repo is of course beneficial to us - it&#x27;ll give us an opportunity to reach a relevant new audience of people who are likely to benefit from using PostHog. If we get enough stars, we may feature on GitHub Trending, which also helps us to reach a wider audience.</p><h2 id="the-small-print">The small print</h2><ol><li>There&#x27;s a maximum donation of $50,000 in total </li><li>The total sum of donations shall be divided equally between projects</li><li>Donations are at the discretion of PostHog and all decisions are final </li><li>Donations are in addition to <a href="https://posthog.com/handbook/marketing/open-source-sponsorship">our usual, ongoing open-source sponsorship</a></li></ol><blockquote><p>Support the projects that make PostHog possible by <a href="https://github.com/PostHog/posthog">heading to the PostHog repo and starring it today!</a> We&#x27;ll donate $5 for every star between now and through to the end of Valentine&#x27;s Day!</p></blockquote><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How I learned to love feedback loops (and make better products)]]></title><description><![CDATA[I recently wrote a blog post for my personal site about the  lessons I'd learned from leading my first two projects as a Software Engineer at PostHog…]]></description><link>https://posthog.com/blog/feedback-loops</link><guid isPermaLink="false">5cf75f4a-9d9e-51eb-a37c-5cbaa58a2066</guid><dc:creator><![CDATA[Neil Kakkar]]></dc:creator><pubDate>Fri, 04 Feb 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>I recently wrote a blog post for my personal site about the <a target="_blank" rel="noopener" href="https://neilkakkar.com/How-I-Own-Projects-as-a-Software-Engineer.html">lessons I&#x27;d learned from leading my first two projects as a Software Engineer at PostHog </a>. In it, I lay out a five-step approach for how I own projects.  </p><p>One common theme that stood out was how feedback loops between each stage lead to much better decisions. In this post, I want to talk about why these feedback loops are useful, and how to actively seek iterative gains from these loops.</p><h2 id="my-aggressive-approach-to-feedback-loops">My aggressive approach to feedback loops</h2><p>To recap, the five steps I mentioned are</p><blockquote><ol><li>Gather Context</li><li>Figure out a solution</li><li>Build</li><li>Gather Feedback</li><li>Align metrics with feedback</li></ol></blockquote><p>I expect most people are familiar with agile development, which makes the basic case for gathering feedback: Finding out you&#x27;re building the wrong thing before you&#x27;ve built it lets you be a lot faster than finding this out once you&#x27;ve built something.</p><p>But what if, instead of getting feedback on the product, you get feedback on each stage you go through? If feedback is good, and helps keep you on the right track, getting feedback between each step should be better than getting feedback only at the end.<sup id="fnref-1"><a href="#fn-1" class="footnote-ref">1</a></sup></p><p>I like the five-step model because it provides <a href="https://en.wikipedia.org/wiki/Focal_point_(game_theory)">natural schelling points</a> to check for feedback.</p><p>For example, when gathering context and figuring out the problem, I love involving teammates, especially product owners. We explore competitor products together. We make discussion and strategy threads open, so everyone in the company can see and contribute to it. It’s valuable to hear from colleagues who might have more context because they were previously an insider or have other relevant knowledge. <a href="https://github.com/PostHog/posthog/issues/8261">Here&#x27;s a recent example for automated insights</a></p><p>None of this happens automatically, but asking the question: &quot;How can I verify my thinking?&quot; actively forces me to seek feedback. One of the highest leverage activities I can do here is reducing the barrier of entry for others to give feedback.</p><p>Another good example you might be familiar with is the maxim: &quot;Make small pull requests&quot;. The generating function behind this maxim is faster feedback loops. Smaller pull requests are easier to review, which not only helps catch problems quickly, but ensures you get feedback faster. Imagine how much faster you get things done and how much better your code looks when you have small PRs that get reviewed quickly, vs. a 500 line change that takes reviewers ages to get to.</p><p>Threading together feedback loops like these allows you to explore a larger sample space of solutions.</p><p>For example, consider you&#x27;re in the build phase. You&#x27;ve come up with a solution, and are building out the solution. It may happen that you hit a technical snag. Now, usually, you&#x27;d look for technical solutions to a technical problem. However, this can sometimes be counterproductive.</p><h2 id="how-feedback-loops-helped-make-posthog-better--an-example">How feedback loops helped make PostHog better – an example</h2><p>Here&#x27;s a concrete example. <a href="/docs/user-guides/experimentation">Experimentation</a> is a new feature we&#x27;ve been building that allows users to run A/B tests. We have feature flags, and you can use these in your code to show A &amp; B variants of a website, and we automatically measure results like significance, and whether you should switch or not.</p><p>We decided to allow users to reuse an existing <a href="/docs/user-guides/feature-flags">Feature Flag</a> to do experiments. This made sense because people would create the feature flag, test the A/B versions look alright, and then use that same Feature Flag in an experiment, without having to do any code changes.</p><p>However, during implementation I found that this made variant distribution very tricky. Making things work like this meant the results would not be 100% accurate, unless I go through several technical hoops to guarantee distribution.<sup id="fnref-2"><a href="#fn-2" class="footnote-ref">2</a></sup> This would&#x27;ve taken much longer.</p><p>Instead, we treated this as valuable feedback and went back to the drawing board. &quot;Can we come up with a better flow, given that we can&#x27;t reuse existing feature flags?&quot;. If this led nowhere, I would&#x27;ve revisited the technical solution. But, this turned out to be very much possible, and we formalised the extra constraint of not re-using Feature Flags.</p><p>Seeking feedback loops between stages allowed us to think of non-technical solutions to a technical problem, and led us to a UX flow that was a lot less confusing. Every experiment has three stages now: Creation, Implementation, and Results.</p><p>Sometimes, it can be hard to get feedback at each stage.</p><p>We recently reached the &quot;Gathering feedback&quot; stage of Experimentation, and this surfaced a new problem: Running A/B tests takes a while, which means feedback is delayed. We want to hear how users run their experiments, but to get feedback around this, we need to wait 2+ weeks for users to finish running experiments. Usually, we&#x27;d continue building important stuff until we get feedback and iterate.</p><p>But, if I want to aggressively seek feedback at every stage, this doesn&#x27;t work. Here, we came up with an alternative solution: once basic experimentation features were in place, we switched focus away from building Experimentation. Instead, we focused on other priorities, and getting users to use experiments. This meant tying up any loose ends, writing up documentation, and ensuring that basic features were obvious-bugs free.</p><p>The benefits here are three-fold: </p><ol><li>We aren&#x27;t building features we&#x27;ll later scrap because some basic assumption was invalidated </li><li>We&#x27;re making progress on other priorities</li><li>We&#x27;re increasing the number of users running experiments. This means a larger surface area of people who finish experiments and more feedback, allowing us to iterate well</li></ol><p>Note how gathering feedback was not an afterthought, but an important part of planning out our sprint, which justified the change in direction.</p><p>I go through all these examples to serve as an intuition pump: feedback loops don&#x27;t arise out of thin air, but aggressively seeking them yourself allows you to move quicker, come up with solutions you wouldn&#x27;t have otherwise thought of, and leads to a higher quality product.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div class="footnotes"><hr/><ol><li id="fn-1">There&#x27;s a case to be made about diminishing returns, and the cost of effort it takes to create the feedback loop, which is why you wouldn&#x27;t want to extend this argument to &quot;gathering feedback every hour/minute/second&quot;<a href="#fnref-1" class="footnote-backref">↩</a></li><li id="fn-2"><a href="https://github.com/PostHog/posthog/issues/7462#issuecomment-987868293">The specifics are in this GitHub comment</a>. Have I told you yet how much I love open source companies because I can link to examples like these?<a href="#fnref-2" class="footnote-backref">↩</a></li></ol></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.32.0]]></title><description><![CDATA[PostHog 1.32.0 makes it easier to find what you want in the Persons & Groups page, introduces vertical funnels and sets the stage for the launch of Experimentation!]]></description><link>https://posthog.com/blog/the-posthog-array-1-32-0</link><guid isPermaLink="false">b38e8dff-018b-5409-aea6-b7589ef13760</guid><pubDate>Mon, 31 Jan 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote class="warning-note"><b>IMPORTANT!</b> Do not upgrade to this version if you have deployed PostHog using Postgres. PostHog no longer supports a Postgres-based installation (last version supported is <code>1.30.0</code>) and now requires Clickhouse.</blockquote><h2 id="posthog-1320-release-notes">PostHog 1.32.0 release notes</h2><blockquote><p>Don&#x27;t see the new features on your self-hosted deployment? Remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#redesigned-persons--groups-pages">Redesigned Persons &amp; Groups pages</a></li><li><a href="#short-insight-link-sharing">Short insight link sharing</a></li><li><a href="#improved-insight-experience">Improved insight experience</a></li><li><a href="#funnels-vertical-breakdown">Funnels vertical breakdown</a></li></ul><h3 id="redesigned-persons--groups-pages">Redesigned Persons &amp; Groups pages</h3><p>We&#x27;ve redesigned how the Persons &amp; Groups pages look to make it easier to find what you&#x27;re looking for. You&#x27;ll now be able to easily see which groups (if any) the user belongs to, and better manage the user&#x27;s properties.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_32_0-new-person-page.gif" alt="Example screenshot: New Person page"/><br/><h3 id="short-insight-link-sharing">Short insight link sharing</h3><p>When sharing saved insights, you will now get a short and sweet URL to share with your teammates. This means something like this: <code>https://app.posthog.com/insights/y3tskB1B</code>, instead of well.... a very, very long URL you would see before. Further, this now makes it possible to create very complex insights with multiple series and filters (which could be limited by the maximum URL length supported).</p><h3 id="improved-insight-experience">Improved insight experience</h3><p>Searching for the right event or property when building an insight could be hard. That&#x27;s why we implemented some key improvements to make it easier:</p><ol><li>You will now see a &quot;Stale&quot; label next to any event we haven&#x27;t seen for a while, so you know not to use it.</li><li>When filtering events by properties, we will now clearly show you properties that are relevant for the event (as opposed to all your properties).</li><li>When filtering events by properties, we will now give you better suggestions about potential values to filter on.</li></ol><p>In addition to the above, we&#x27;ve improved how tooltips are displayed so they contain clearer and more useful information, and implemented a frequently asked for &quot;Legend&quot; feature. You can now share screenshots with all the required information to understand them.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_32_0-new-tooltips.png" alt="Example screenshot: New tooltips"/><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_32_0-legends.png" alt="Example screenshot: Legends"/><h3 id="funnels-vertical-breakdown">Funnels vertical breakdown</h3><p>Funnels with breakdowns just got a lot better. This new view enables you to quickly understand how your users convert through a funnel. The colors can help you quickly identify patterns based on the breakdown applied.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_32_0-funnel-vertical-breakdown.png" alt="Example screenshot: Funnels with a vertical breakdown"/><br/><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><ul><li>Set friendly names to your groups (from <a href="/docs/user-guides/group-analytics">Group Analytics</a>). Now instead of seeing <code>org</code> (as you may call it in your code), you can rename it to see &quot;Organization&quot; in PostHog&#x27;s UI. Further, you can now set the plural version as well to improve readability. <a href="https://github.com/PostHog/posthog/pull/7974">PR</a>.</li><li>Simplified dashboard grid that makes it more responsive and consistent across multiple screen sizes.</li><li>Toolbar launch page. When navigating to toolbar on the sidebar you&#x27;ll now see a simplified experience to launch it. Plus, we&#x27;ve improved how authorized domains are managed.</li><li>Significant performance improvements to the Actions page. When viewing an action, we&#x27;ll now show you the most recent events (~6 months ago) without constant polling. This should make it easy and faster to debug actions.</li><li>Lifecycle query just got faster! We&#x27;ve also clarified how each of the groups (new, returning, resurrecting and dormant) in lifecycle are defined. <a href="https://github.com/PostHog/posthog/pull/8021">Read more</a> on this.</li><li>When your users are in multiple tabs, we&#x27;ll now properly separate recordings so you can see what users were doing on each tab. Previously this could lead with a botched experience when playing back recordings.</li><li>To improve query performance, the &quot;All time&quot; filter will now only consider events from 2015 onwards. We realized some instances had events with incorrect timestamps (frequently UNIX epoch [Jan 1, 1970]), which would lead to performance issues and hard to parse graphs.</li><li><a href="/docs/user-guides/feature-flags#multivariate-feature-flags">Multivariate Feature Flags</a> are now out of Beta and generally available. This is a premium feature.</li><li>Fixed a bug when if a user joined an organization with private projects, they would get a broken experience (from being assigned to a project to which they don&#x27;t have access).</li><li>Improved performance and increase execution size for complex retention queries.</li><li>Newly design Preflight page to update with our latest brand.</li><li>Fixed a bug in which a lot of failing requests would be made when opening a shared dashboard unauthenticated.</li><li>Fixed a bug in which filtering insights by &quot;Yesterday&quot; and &quot;Daily&quot; would lead to two data points instead of one.</li><li>Plus 330+ improvements &amp; fixes.</li></ul><h3 id="deprecation--removal-notices">Deprecation &amp; removal notices</h3><ol><li>Since the previous version (1.31.0), we no longer support a Postgres-only deployment of PostHog. ClickHouse provides faster queries and is optimized for very large volumes of data, and you will also get a new lot of features.</li><li>We&#x27;re removing support for insights with &quot;Minute&quot; intervals. From user feedback, these insights were hard to parse and could lead to significant performance issues in self-hosted instances. Please <a href="/support">reach out</a> if you have any feedback on this. More details on the <a href="https://github.com/PostHog/posthog/pull/7847">PR</a>.</li></ol><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h3 id="experimentation-launch-">Experimentation launch 🚀</h3><p>We&#x27;ve been working hard on a brand new Experimentation feature which will let you quickly and confidently run experiments to test product improvements. This feature is currently available on Beta on PostHog Cloud, but if you&#x27;d like to be a beta tester or get a demo, please <a href="https://app.posthog.com/home#supportModal">reach out</a> or schedule a <a href="https://calendly.com/posthog-feedback">demo call</a> with the Engineering Team that created it.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_32_0-experiments-sneak-peek.png" alt="Example screenshot: Experiments sneak peek"/><h2 id="posthog-news">PostHog News</h2><p>We want to welcome our new team members!</p><p><a href="/andy">Andy</a> joined PostHog as our first Content Marketer. Andy is a definite 👎 on pineapple on pizza (🍍 on 🍕).</p><blockquote><p>I am the only person called Andrew Vandervell in the universe.</p></blockquote><p><a href="/simon">Simon</a> joined us in Customer Success to help our Enterprise customers get the most value out of PostHog. Simon&#x27;s stance on pineapple on pizza (🍍 on 🍕) is: On the fence. I&#x27;d never actively order a pizza with pineapple on it, but as a pizza lover and pineapple was the only option - I’d still eat it. Same response for Marmite.</p><blockquote><p>I’m (loosely) related to an actor who’s starred in 6 Star Wars movies.</p></blockquote><h2 id="share-your-feedback-1">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="open-roles">Open roles</h2><p>Join us in helping make more products successful! We&#x27;re currently hiring for the following roles:</p><ul><li>Software Engineer - Kubernetes</li><li>Full Stack Engineer - Growth</li><li>Tech Lead Manager/Engineering Manager</li><li>Community Engineer, more details here</li><li>Ex-Founders*</li></ul><p>Learn more about these roles on our <a href="https://posthog.com/careers">Careers page</a>.</p><p>Don&#x27;t see a role for you? We&#x27;re always looking for exceptional people, so reach out to us via the link above.</p><hr/><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why open-source projects are essential for large businesses]]></title><description><![CDATA[The famous line from Marc Andreesen that  “software is eating the world”  has become part and parcel of modern technology’s canon and it continues to…]]></description><link>https://posthog.com/blog/scarf-open-source-projects</link><guid isPermaLink="false">199623df-9f75-5eaf-9bd6-f889b02dc831</guid><dc:creator><![CDATA[Avi Press]]></dc:creator><pubDate>Fri, 28 Jan 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-blog-image.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>The famous line from Marc Andreesen that <em>“software is eating the world”</em> has become part and parcel of modern technology’s canon and it continues to act as a rallying cry for the industry as a whole.</p><p>But there is another phenomenon riding on those coattails that doesn’t receive the attention it deserves. If you look closely, you’ll see that open-source software specifically is eating more and more of the overall software space – and is set to transform how large companies think about technology.</p><blockquote><p>This is a guest post by Avi Press, founder and CEO at <a href="https://about.scarf.sh/scarf-gateway">Scarf</a> - a platform dedicated to helping open-source maintainers connect with their users and deliver better software.</p></blockquote><h3 id="where-do-we-see-open-source-software-playing-a-role">Where do we see open-source software playing a role?</h3><p>Research from Red Hat shows that <a href="https://www.redhat.com/rhdc/managed-files/rh-enterprise-open-source-report-f27565-202101-en.pdf">90%</a> of enterprise IT leaders are using open-source tools to maintain and grow their organizations. This is occurring across a vast scope of different uses, but some of the more common applications include:</p><ul><li><p><strong>Software Supply Chain Management</strong> - <a href="https://www.npmjs.com/">npm</a>, for instance, is an open-source package manager and registry for JavaScript that is used almost everywhere as part of core development toolkits. It has become a vital component of the enterprise IT space for modern web applications.</p></li><li><p><strong>Operating Systems</strong> - For the majority of computing workloads in the enterprise space, Linux is the operating system of choice. From web servers, containers, remote development environments, and beyond, Linux has become one of the most important open-source projects to the modern enterprise.</p></li><li><p><strong>Databases</strong> - Many large companies use open-source database solutions such as PostgreSQL, MySQL or <a href="/handbook/engineering/clickhouse">Clickhouse</a> rather than choosing a proprietary solution. This gives them greater compatibility and flexibility as they integrate it into the rest of their technology stack.</p></li><li><p><strong>Analytics</strong> - Open-source analytics solutions have also become very popular, giving enterprises full control over their data handling, hosting, and the like. Solutions like <a href="https://posthog.com/">PostHog</a>, which also includes an <a href="/blog/best-open-source-session-replay-tools">open source session recording feature</a>, have been revolutionary in giving companies the peace of mind to know that their data is never leaving the confines of the company itself.</p></li></ul><p>These examples represent just a portion of the ways that open-source software continues to grow its influence within large organizations. The trend is accelerating as the open-source methodology spreads to just about every other part of the tech stack from low-level firmware to cloud SaaS applications.</p><h3 id="why-has-open-source-software-been-gaining-momentum">Why has open-source software been gaining momentum?</h3><p>Convincing enterprise clients to consider open-source solutions is often not an easy proposition, and so it might seem counterintuitive to see so much movement in this direction. Some of the reasons that we can attribute to this include:</p><ul><li><p><strong>Cost</strong> - Companies are always looking to reduce costs, and if open-source solutions can provide the requisite value, then it makes for a compelling option when compared to high-priced proprietary software. Commercial open-source support has also improved significantly, often rivaling what one might expect from proprietary software providers.</p></li><li><p><strong>Community</strong> - Perhaps the most significant factor when it comes to open-source software is the community that gets built around these tools. A diverse set of individuals and companies leveraging, modifying, and redistributing a piece of software allows for vibrant knowledge sharing and innovation.</p></li><li><p><strong>Security</strong> - Having more eyes on any given piece of code means that vulnerabilities are spotted and resolved faster. This is the precise rationale behind the common warning in software engineering to “never roll your own cryptography”. Building secure software is hard; to solve the very hardest problems, open collaboration has proven most effective. In this vein, open-source also allows enterprises to take more control over their own security by enabling easy auditing and submitting fixes that can be shared with the community.</p></li></ul><p>This is not to say that open-source software doesn’t come with its own challenges for large businesses. When you are relying on the good nature of maintainers, <a href="https://about.scarf.sh/post/package-registries-and-open-source">incentives between stakeholders can be misaligned</a> and things can go wrong.</p><p>A <a href="https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/">recent example</a> of this can be seen where multiple popular npm packages were sabotaged by the developer who had <a href="http://web.archive.org/web/20210704022108/https://github.com/Marak/faker.js/issues/1046">previously expressed frustration</a> with providing free support to large companies relying on his code. This story highlights that <a href="/newsletter/choosing-technologies">adopting any piece of technology</a> involves an amount of risk, and businesses of all sizes must meticulously manage their risks to be successful.</p><p>In order to ensure the long-term success of open-source by large businesses, we need tighter collaboration between open-source developers and the commercial end-users who rely on their software.</p><p>At <a href="https://about.scarf.sh/">Scarf</a>, we’ve been hard at work trying to help open-source developers build these connections and nurture them so that all parties can benefit. <a href="https://about.scarf.sh/scarf-gateway">Scarf Gateway</a> does this by delivering better observability into the distribution of open-source components, uncovering key information for creators like which companies are using the software and how they are relying on it.</p><p>If we can facilitate better communication and collaboration between the open-source community and the wide range of enterprise end-users, we can make the most of the immense potential that is there for the taking.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Things I learned last year]]></title><description><![CDATA[2021 went well for PostHog - especially given we're not even two years old yet. 7,014 customers across our range of products (!) 800% increase in…]]></description><link>https://posthog.com/blog/ceo-diary-5</link><guid isPermaLink="false">bae68efe-d25f-5210-88bf-c62083de04ad</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Sun, 09 Jan 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>2021 went well for PostHog - especially given we&#x27;re not even two years old yet.</p><ul><li>7,014 customers across our range of products (!)</li><li>800% increase in organic traffic (!)</li><li>300% net revenue retention (!)</li><li>0.41 years CAC payback (!)</li></ul><p>Here&#x27;s what we learned - good and bad...</p><h2 id="we-were-disciplined-at-letting-people-go-but-we-got-scared-to-re-hire">We were disciplined at letting people go, but we got scared to re-hire</h2><p>We hired <a href="/people">world class people</a>, and we let people go quickly when it wasn&#x27;t working (paying much greater <a href="../handbook/people/offboarding#involuntary-departure">severance</a> than industry standard when this happened).</p><p>Tim and I believed that people working with great people is a huge motivator - <a href="../handbook/company/values#talent-compounds">talent compounds</a> is one of our <a href="../handbook/company/values">values</a>. Feedback from our team surveys have since confirmed our team agrees. </p><p>However, when things didn&#x27;t work out, we often didn&#x27;t re-hire for the role quickly, or at all. We got scar tissue! We must&#x27;ve been hiring for the role in the first place for a reason.</p><p>The end result? Lost time - and that has a lot of opportunity cost.</p><h2 id="who-to-listen-to">Who to listen to</h2><p>It was midway through last year when it clicked.</p><p>We had thousands of companies deploying, but some companies just felt like they were a better fit than others. PostHog&#x27;s platform is exceptionally broad - we have multiple traditional products built in. We had doubled the <a href="/people">team</a> size too. Those things combined makes knowing where to focus particularly challenging!</p><p>We were getting a lot of inbound paid demand, so we felt we should figure out how to get product market fit for our paid product. This would force us to have a clear split between our free and paid products.</p><p>We did this:</p><ul><li>Aimed to get 5 reference customers.<ul><li>Reference = paying list price, genuinely delighted, using the product a lot</li></ul></li><li>Wrote out what they had in common along the way. We created a spreadsheet that looked a little like this:</li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/5-reference-customers.png" alt="A spreadsheet showing company names listed alongside what they need and what they have"/></p><p>Note - we had to sell more than 5 deals, to get 5 reference customers. We also looked for antipatterns - when a customer wasn&#x27;t having a great experience, what did they look like.</p><p>Once we&#x27;d learned what our best customers had in common, we realized this is the group we should listen to when deciding what to build.</p><h1 id="product-people-can-transform-your-company">Product people can transform your company</h1><p>As a founder, I never used to want to invest in hiring product people.</p><p>Don&#x27;t they just dictate what to build to our team, thus annoying our team, and probably understanding our (technical) users less well than our engineers? Can&#x27;t anyone listen to users? Wouldn&#x27;t an extra layer of communication slow us down?</p><p>At our first offsite in 2020, we ran a <a href="../handbook/people/feedback#full-team-feedback-sessions">full team feedback session</a>. This is a unique experience:</p><ul><li>Everyone sits around a table. Ok, you&#x27;ve probably done that before.</li><li>The person who&#x27;s turn it is, gets <a href="/newsletter/how-to-give-feedback">feedback from everyone else in the team</a></li><li>This feedback is moderated to be 70% <a href="../handbook/people/feedback#how-to-give-good-feedback">constructive and as specific as possible</a></li></ul><p>Tim and I were both given the feedback that we&#x27;ve seen product done badly in our previous careers, and as a result, we aren&#x27;t building this discipline at all into the company. We were just a bunch of engineers building what we felt users wanted - which was probably the right choice in the first few months, but not the path to building a world-class experience.</p><p>Compellingly, Paolo - then, one of our engineers - had proactively acted like a product manager. He gathered deep feedback from dozens of users, which he summarised at the start of the offsite to everyone. It was incredibly useful (and influenced us going broad with our product, giving us a much better strategy).</p><p>We thought about it, and realized this was something we needed to act on. We put Paolo into a full time product role, and we hired Marcus into a VP Product role in 2021. The focus they gave us was a key part of getting to five reference customers - this became really obvious last year.</p><p>The best part? We&#x27;ve not had to sacrifice engineering autonomy.</p><p>Both Marcus and Paolo can write code, and they both ship from time to time. This creates a more collaborative environment with engineering (and it helps them understand our end users better). Our structure also promotes this - we rely on <a href="../handbook/company/small-teams">small teams</a>, with individuals setting their own priorities each week or two, to give real ownership of what people choose to build. Product gives very valuable context and high level guidance so engineers can make better decisions in this situations.</p><h2 id="how-to-build-a-design-team">How to build a design team</h2><p>I often looked up to other companies, blown away by the quality of design work - from aesthetics to product. In 2020, PostHog could get something built to an ok standard very fast, but it never got to the level others were achieving. That changed in 2021.</p><p>We learned that great designers for early stage design teams:</p><ul><li>iterate very quickly</li><li>are broad</li></ul><p>We followed this guidance. The end result?</p><p>The majority of people in our design team can code <em>and</em> work in Figma.</p><p>Many people in the hiring process told us this was way too much to ask for. It helps us empathize with technical users, it helps designers collaborate with engineers, and it means our design team are flexible and don&#x27;t get stuck. So we iterate faster.</p><h2 id="having-a-founder-do-the-first-sales-was-useful">Having a founder do the first sales was useful</h2><p>We had to make a lot of changes in a very short space of time to get the first deals done.</p><p>Here&#x27;s the list of what we changed to get our first five reference customers:</p><ul><li>pricing model</li><li>who we were selling to</li><li>the sales process</li><li>if we did trials or not</li><li>how we did customer success meetings</li><li>how support works</li><li>how demos work</li><li>how payments work</li><li>how and when people sign versus self serve</li><li>the difference between free/paid products</li></ul><p>A founder will have the easiest time trying to make changes fast. It was tempting to hire someone to do all of the above, but we optimized for downside risk. It was more important we&#x27;d bottleneck not getting other work done (like focussing more on marketing or developer relations earlier in the year) than not to learn how to sell at all.</p><p>The outcome was extremely fast revenue growth with exceptional retention... and being a bit behind on top of funnel growth - which we can catch up on next.</p><h2 id="self-serve-was-way-better-than-we-thought-it-would-be">Self-serve was way better than we thought it would be</h2><p>We&#x27;ve had wild success with self-serve in 2021.</p><p>We made pricing transparent, put as much info as we could into our docs, created a self-serve payment flow, eliminated the need for annual minimum commitments, and had money flowing in almost immediately.</p><p>There are two further things we did that helped:</p><ul><li>we incentivized users to add their card (more free usage) </li><li><a href="/newsletter/pricing-advice">usage-based pricing</a> means you can have zero minimum costs, making it easier to get started</li></ul><p>Once we got better at product, we saw dramatic improvements in our retention too.</p><h2 id="bus-transfers-in-portugal--hell-no">Bus transfers in Portugal = hell no</h2><p>If you ever do a trip to Portugal, avoid lots of bus transfers. Trust us.</p><h2 id="2022-prediction">2022 prediction</h2><p>Focus will be the hardest thing to achieve <em>and</em> the most important.</p><p>As we&#x27;ve hit product market fit for our free <em>and</em> paid products, we can&#x27;t throw the entire company at just one thing at a time any more. We need to build features while improving quality.</p><p>The team is bigger, we have way more customers, and the platform is bigger and more powerful. </p><p>The good news? We know we&#x27;re selling something people want.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[What is user segmentation?]]></title><description><![CDATA[User segmentation is a term which is thrown around a lot within product-led teams, but what does it mean? In this article we'll explain what user…]]></description><link>https://posthog.com/blog/how-to-do-user-segmentation</link><guid isPermaLink="false">1c59224d-ca91-5e53-af13-2caf6555e6ed</guid><dc:creator><![CDATA[Marcus Hyett]]></dc:creator><pubDate>Wed, 05 Jan 2022 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/product-people.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>User segmentation is a term which is thrown around a lot within product-led teams, but what does it mean? In this article we&#x27;ll explain what user segmentation is, why it&#x27;s important and give examples of how segmenting your userbase can uncover important customer insights.</p><p><strong>Contents:</strong></p><ul><li><a href="#user-segmentation-explained">User segmentation, explained</a></li><li><a href="#why-is-user-segmentation-important">Why is user segmentation important?</a></li><li><a href="#what-are-user-segments-used-for">What are user segments used for?</a></li><li><a href="#the-four-different-types-of-user-segmentation">The four different types of user segmentation</a></li><li><a href="#further-reading">Further reading</a></li></ul><h2 id="user-segmentation-explained">User segmentation, explained</h2><p>User segmentation is the process of looking at your userbase and breaking it down into groups based on user characteristics or behaviors. You can then analyze these groups to identify opportunities to improve and grow your product.</p><p>For example, a global ecommerce company such as Amazon might have user segments such as: </p><ul><li>Users in the US </li><li>Users who subscribe to Amazon Prime</li><li>Users who use the mobile app</li></ul><p>By understanding how these segments differ, Amazon would then be able to build products which better meet their individual needs.</p><blockquote><p>This article is part of our <a href="/tracks">PostHog Academy series</a> where we explain the fundamentals of product analytics. Marcus Hyett is VP of Product at PostHog. Prior to PostHog, he was a Senior Product Manager at Meta working on ecommerce experiences across Instagram and its family of apps. </p></blockquote><h2 id="why-is-user-segmentation-important">Why is user segmentation important?</h2><p>In order to serve your users, you need to understand them in as much detail as possible. If you don&#x27;t segment users then you&#x27;re only able to understand them as individuals (which becomes impossible once you userbase start to grow) or as a whole. </p><p>Trying to understand your userbase as a whole is a trap. It means you can only focus on the <em>average</em> of all your users, which can both distort the data and eliminate the detail you need to make informed decisions.  </p><p>For example, imagine a company has 10 customers. Seven of these customers are aged between 15-16 years old, while two are aged 40-42 and a single customer is aged 75. Segmenting users by age in this way reveals that the company is successful with users in the 15-16 age bracket, while looking at the average of the whole userbase would suggest an average customer age of 26 - almost twice the actual age of 70% of users. </p><p>Segmenting users enables you to focus on understanding, prioritizing and solving the unique needs of smaller and more focused group, rather than looking at everything at once. </p><h2 id="what-are-user-segments-used-for">What are user segments used for?</h2><p>User segmentation is especially important for activities such as:</p><ul><li><p><strong>Product personalization:</strong> Tailoring the experience to users, such as by recommending products based on their behaviors, means they’ll be more engaged and more successful.</p></li><li><p><strong>Marketing:</strong> You need marketing that’s relevant to your users. Sending special offers in English to customers to Japan won&#x27;t lead to good conversion rates.</p></li><li><p><strong>Prioritization:</strong> You can have more impact by focusing on solving specific problems for certain users rather than trying to build a one-size-fits all solution. (e.g. building a price comparison tool for price conscious customers).</p></li></ul><h2 id="the-four-different-types-of-user-segmentation">The four different types of user segmentation</h2><p>There are four key types of segmentation you can use to identify groups of users: </p><ul><li><p><strong>Demographic:</strong> Looking at attributes of the person (e.g. age, household income, gender)</p></li><li><p><strong>Geographic:</strong> Considering where they are from or where they are currently (e.g. delivery town or country of residence)</p></li><li><p><strong>Behavioral:</strong> Considering how they use the product (e.g. frequency of use, average order values)</p></li><li><p><strong>Technographic:</strong> What technologies do they use to interact with the product (e.g. mobile, desktop or voice assistant)</p></li></ul><p>It&#x27;s often necessary to combine multiple segmentation types when running analyses. You might, for example, look at the behavior of older users in France, or early-adopters on mobile. </p><h2 id="how-can-i-segment-my-userbase">How can I segment my userbase?</h2><p>There are a variety tools available to help you segment users or use the segments to understand their behaviors within your product. These can include basic web analytics tools such as Google Analytics, or all-in-one product analytics tools such as PostHog. </p><p>PostHog is a powerful tool for user segmentation because you can explore segmented users using tools such as <a href="/product/funnels">funnels</a>, <a href="/product/trends">trends</a>, <a href="/product/user-paths">paths</a> and more. </p><h2 id="further-reading">Further reading</h2><ul><li><p><a href="/blog/product-market-fit-game">How to achieve B2B product market fit</a>: How to approach finding market fit for a B2B product</p></li><li><p><a href="/blog/how-to-do-user-segmentation">What is user segmentation?</a>: A quick guide to use segmentation and how to apply if to your business</p></li><li><p><a href="/blog/how-to-measure-product-engagement">How to measure product engagement</a>: How to define engagement for your platform, and how to use analytics tools to measure and build on the results</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Group Analytics is now available in PostHog]]></title><description><![CDATA[Today, we’re excited to announce that PostHog has launched Group Analytics for both PostHog Scale / Enterprise users and those on PostHog Cloud…]]></description><link>https://posthog.com/blog/group-analytics-launch</link><guid isPermaLink="false">11bada36-f453-5b2c-94b1-21dfbed55ae9</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 16 Dec 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-company-culture-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Today, we’re excited to announce that PostHog has launched Group Analytics for both PostHog Scale / Enterprise users and those on PostHog Cloud. </p><p>Group Analytics are used for tracking and analyzing multiples of any event type within PostHog. Unlike cohorts, which essentially create lists of users, groups can track a far wider range of information because they apply at the event level. </p><div><div imageSource="/images/customers/weyert-tapico.png" name="Weyert de Boer" title="Senior Software Engineer, Tapico" quote="“The Groups functionality in PostHog gives us the flexibility and power to target users at a higher level. Group Analytics also give us more detailed insight into user behavior between instances. We love it!”"></div></div><p>As a result, Group Analytics is especially useful for certain types of product, such as:</p><ul><li><p><em>B2B products:</em> If you sell primarily to businesses, groups can be used to track data at a company level and report on metrics such as Daily Active Companies. </p></li><li><p><em>Crypto and financial products:</em> If your product deals with payments, groups can be used to track events such as transactions and report on metrics such as Daily Payments. </p></li><li><p><em>Social media products:</em> If your product deals with user-generated content (UGC), groups can be used to track subscriptions, as well as report on metrics such as Likes, Follows or Shares. </p></li></ul><p>Groups work perfectly with all other PostHog tools, enabling you to analyze group data with <a href="/docs/user-guides/funnels">funnels</a>, <a href="/docs/user-guides/trends">trends</a>, <a href="/docs/user-guides/paths">paths</a> and <a href="/docs/user-guides/retention">retention charts</a>. This opens up the potential for entirely new insights, such as using groups within a funnel analysis to see how a company moves through a sign-up funnel in the same way that you would do for an individual user. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/funnels-group-aggregation.png" alt="View Groups"/></p><p>You can even use groups with <a href="/docs/user-guides/feature-flags">feature flags</a> to roll out or test new features with all users within an organization. This makes feature flags a lot more practical for B2B focused products, as organizations such as <a href="https://tapico.io/">Tapico</a>, the open finance engine, have found out.</p><p>&quot;Using groups we can enable feature flags per instance, dark launch features for a specific instance, or implement kill switches and ops flags,&quot; said Weyert de Boer, Senior Software Engineer at <a href="https://tapico.io/">Tapico</a>.</p><p>Group Analytics has been released as a <a href="/pricing">premium feature</a> and is available now for both PostHog Scale, PostHog Enterprise, and PostHog Cloud users. If you’re on PostHog Cloud you can get started with groups immediately, while self-hosted instances will first need to be updated to the latest version. We’ve prepared some <a href="/docs/user-guides/group-analytics">documentation to help you get started with the new group types</a> and illustrate some popular use-cases. </p><p>As always, we welcome any feedback you have as an issue in <a href="https://github.com/PostHog">the GitHub repo</a>, or in <a href="/posts">our community page</a>.  </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.31.0]]></title><description><![CDATA[PostHog 1.31.0 introduces Group Analytics, improved Correlation Analysis, a revamped overall user experience on Insights and 350+ more improvements and fixes.]]></description><link>https://posthog.com/blog/the-posthog-array-1-31-0</link><guid isPermaLink="false">d8cc8977-496e-5b5d-879c-3daaa5ce3e4d</guid><pubDate>Thu, 16 Dec 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-array-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Happy holidays from PostHog! PostHog 1.31.0 is our last release of the year, introducing Group Analytics, improved Correlation Analysis, a revamped user experience on Insights and 350+ more improvements and fixes. Please note that Postgres-based installations are no longer supported for PostHog 1.31.0.</p><blockquote class="warning-note"><b>IMPORTANT!</b> Do not upgrade to this version if you have deployed PostHog using Postgres. PostHog no longer supports Postgres as of v1.30.0 and you must upgrade to ClickHouse first.</blockquote><h2 id="posthog-1310-release-notes">PostHog 1.31.0 release notes</h2><blockquote><p>Don&#x27;t see the new features on your self-hosted deployment? Remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#group-analytics">Group Analytics</a></li><li><a href="#improved-correlation-analysis">Improved Correlation Analysis</a></li><li><a href="#improved-user-experience">Improved user experience</a></li></ul><h3 id="new-group-analytics">New: Group Analytics</h3><p>Introducing Group Analytics! Group Analytics enable you to analyze groups, which aggregate events within PostHog. You can have multiple groups and they can even change dynamically.</p><p>Group Analytics is especially useful if you have a B2B product, as you will now be able to create a Company group type which tracks all unique users within a company, then create insights such as retention by company and events performed by unique companies.</p><p>Visit our <a href="/docs/user-guides/group-analytics">Group Analytics documentation</a> to find out what else is possible with Group Analytics.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/group-analytics-list.png" alt="Example screenshot: List of groups"/><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/group-analytics-insight.png" alt="Example screenshot: Using groups in an insight"/><blockquote><p>🎁 Group Analytics is a premium feature and requires a PostHog Scale or Enterprise license. <a href="/pricing">Learn more</a>.</p></blockquote><br/><h3 id="improved-correlation-analysis">Improved: Correlation Analysis</h3><p>Correlation Analysis just got better! In addition to significantly improving the UI &amp; UX, we&#x27;ve also introduced a details option for advanced users looking for deeper understanding of how events and properties contribute to conversion or drop-offs. This new detail view shows a complete confusion matrix which shows true positives, true negatives, false negatives and false positives. We&#x27;ve also added a correlation score from <code>-1.0</code> to <code>1.0</code> to signal how strongly an event or property correlates with conversion or drop-off.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/correlation-matrix.png" alt="Example screenshot: correlation matrix"/><br/><h3 id="polished-experience-of-insights">Polished: Experience of insights</h3><p>Insights and dashboards are the core of PostHog&#x27;s analytics capabilities, which is why we&#x27;re putting extra focus on making using them <em>spark joy</em>. This release brings various improvements to the experience:</p><ul><li>You can now easily link to saved insights like so: <a href="https://app.posthog.com/insights/vMA1IlmP">https://app.posthog.com/insights/vMA1IlmP</a>. While unwieldy query parameters were previously required, now all PostHog wants for Christmas is the ID of the insight. Merry sharing!</li><li>Visualization of funnels has been reworked for improved readability of results, particularly when using breakdown. This makes comparing conversion based on properties easier than ever.</li><li>Searching events &amp; properties is now significantly faster. We&#x27;ve changed the way these properties are shown and now list them by popularity within the project. Create those insights faster!</li><li>The funnel query builder has been streamlined – essential settings are better exposed, while advanced options can be expanded when you need them.</li><li>The dashboard grid has been simplified to avoid annoying situations where your carefully crafted layout becomes misaligned on a different screen resolutions. Instead of four complicated layouts, there are now two: single-column for mobile devices, and multi-column for larger screens.</li></ul><p>Expect further major improvements to this area in 1.32.</p><br/><h3 id="enhanced-app-design-and-performance">Enhanced: App design and performance</h3><p>Following up on the <a href="/blog/the-posthog-array-1-30-0#fresh-new-lookandfeel">overhaul of navigation in 1.30</a>, we&#x27;ve made major UI improvements to the app&#x27;s most used pages. These top-level views have been overhauled for uniformity, clarity, and snappiness.</p><p>Breadcrumbs are now fully dynamic and adjust to the current page in all situations.</p><p>The sidebar has been made more graceful: it adjusts to the screen size in a smarter way, and will remember your preferences in the browser.</p><p><img src="https://user-images.githubusercontent.com/4550621/146378918-1738e262-3f5c-4b6b-adfb-b69767995b99.png" alt="Pages"/></p><br/><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><ul><li>Recordings now load up to a few times faster.</li><li>Fixed bug in feature flags when in certain cases a 0% release was considered as a 100% release.</li><li>Fixed bug where private project names were shown to members who shouldn&#x27;t have access.</li><li>Plus 350+ improvements &amp; fixes.</li></ul><h3 id="deprecation--removal-notices">Deprecation &amp; removal notices</h3><ol><li>This version (1.31.0) no longer supports a Postgres-only deployment of PostHog. Read <a href="/docs/migrate/migrate-to-cloud">our migration guide</a> for instructions on moving over to a ClickHouse version. ClickHouse provides faster queries and is optimized for very large volumes of data, and you will also get a new lot of features.</li><li>We&#x27;re <a href="/blog/sessions-removal">deprecating the <strong>Sessions</strong> insight</a> (distribution of session length). Please <a href="/support">reach out</a> if you have any feedback on this.</li></ol><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog News</h2><p>Welcome Cameron DeLeone! Cameron joined PostHog to help us level up our Customer Success experience. Cameron is a definite no for pineapple on pizza (🍍 on 🍕).</p><blockquote><p>I&#x27;ve always been a food lover, and started talking about food at 7 months old (my first word was &quot;broc&quot; for broccoli). I haven&#x27;t shut up about it since.</p></blockquote><h2 id="community">Community</h2><p>Want to help improve PostHog? We always welcome contributions from our community! Check out our <a href="/docs/contribute">contributing resources</a> to get started.</p><h3 id="community-shoutouts">Community shoutouts</h3><p>We want to thank each and every community member that contributed to this release of PostHog!</p><ul><li><a href="https://github.com/abtinmo">abtinmo</a></li><li><a href="https://github.com/k4kuz0">k4kuz0</a></li><li><a href="https://github.com/vicampuzano">vicampuzano</a></li><li><a href="https://github.com/jyuvaraj03">jyuvaraj03</a></li><li><a href="https://github.com/ajsharp">ajsharp</a></li><li><a href="https://github.com/maxmue">maxmue</a></li><li><a href="https://github.com/hjweddie">hjweddie</a></li><li><a href="https://github.com/asherf">asherf</a></li><li><a href="https://github.com/chasovskiy">chasovskiy</a></li><li><a href="https://github.com/joesaunderson">joesaunderson</a></li><li><a href="https://github.com/Jaspreet-singh-1032">Jaspreet-singh-1032</a></li></ul><h2 id="open-roles">Open roles</h2><p>Join us in helping make more products successful! We&#x27;re currently hiring for the following roles:</p><ul><li>Full Stack Engineering - Growth</li><li>Operations Manager</li><li>Software Engineer</li></ul><p>Learn more about these roles on our <a href="https://posthog.com/careers">Careers page</a>.</p><p>Don&#x27;t see a role for you? We&#x27;re always looking for exceptional people, so reach out to us via the link above.</p><hr/><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to work out what your users really need]]></title><description><![CDATA[Understanding the needs of your users better than anyone else is critical for the success of any product. For years, taxis solved the primary user…]]></description><link>https://posthog.com/blog/how-to-work-out-what-users-need</link><guid isPermaLink="false">e6ab2701-850d-5987-96b4-007ea38c52e9</guid><dc:creator><![CDATA[Marcus Hyett]]></dc:creator><pubDate>Wed, 08 Dec 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-blog-image.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Understanding the needs of your users better than anyone else is critical for the success of any product.</p><p>For years, taxis solved the primary user need of getting from A to B quickly. Someone would wait by the roadside until an available taxi drove past, hail the taxi, and travel to their destination. </p><p>However, Uber, Lyft, and co. came along and disrupted this market by understanding and solving the user’s needs better than any taxi company. They made it possible to quickly hail vehicles from wherever you are, and also built trust in the service through driver and car identification, driver ratings, and sharing your trip with trusted contacts - things previously impossible with ordinary taxis. This gave ride-sharing apps a massive advantage over normal taxis drivers.</p><p>When building a product, your users don’t always know what they need; and when they do, they might not be able to express it clearly. The role of a Product Manager is to piece together multiple pieces of information to identify actual user needs and empower a team to solve them. Below are a few ways you can gather this information.</p><blockquote><p>This article is part of our <a href="/tracks">PostHog Academy series</a> where we explain the fundamentals of product analytics. Marcus Hyett is VP of Product at PostHog. Prior to PostHog, he was a Senior Product Manager at Meta working on ecommerce experiences across Instagram and its family of apps.</p></blockquote><h2 id="interviews">Interviews</h2><p>Speaking 1:1 with customers is a great way to immerse yourself in their experience and the daily problems they encounter. It’s key when interviewing customers that you avoid biased or leading questions. To get unfiltered answers, ask open questions such as “Can you talk me through how you would travel home from an airport?” rather than “Can you tell me about the last time you took a taxi?” or “Did you take a taxi in the last 7 days?”.</p><p>Have an approximate structure for the interview, and vary the questions to get a range of insights that will help you understand their needs. But don’t be too rigid - if the conversation goes off on a relevant tangent, follow it. It might lead to some subconsciously valuable insights.</p><h3 id="how-does-posthog-do-this">How does PostHog do this?</h3><p>Gathering user feedback is something we invest in as an ongoing activity, regularly reaching out to members of the community and speaking with them directly. Often we record and share these calls internally. </p><p>We also run separate usability tests with handpicked users when releasing new features. You can find out more about <a href="/handbook/product/user-feedback">how we gather user feedback in the PostHog handbook</a>.</p><h2 id="specifications--requirements">Specifications / Requirements</h2><p>Customers (especially large enterprises) enjoy providing detailed requirements and specifications around user experiences and their product’s performance. As a Product Manager, it’s easy to dismiss these requirements as “prescriptive”, “solutionizing” or “bespoke”, but they’re often a valuable source of insights.</p><p>I always read through any list of customer requirements diligently (no matter how long or detailed), and try to piece together the core needs that motivate them to state these requirements. Solving these core needs leads to a much better solution and a lot less work.</p><h3 id="how-does-posthog-do-this-1">How does PostHog do this?</h3><p>At PostHog, we have an advantage over most companies in that we&#x27;re an open-source project with a large community. As a result, we regularly receive feature requests in the form of GitHub issues - so it&#x27;s mostly a matter of reading each one and speaking with users about them. </p><p>Interested in submitting an idea or seeing what the community has proposed? <a href="https://github.com/PostHog/posthog/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement">Check out our GitHub repo!</a></p><h2 id="surveys">Surveys</h2><p>Asking people what their needs are at scale is a great way to validate the need for your product and get a sense of which problems to prioritize. When surveying people, ask the right mix of open and closed questions to increase response rates and allow for more creative answers.</p><p>Keep your surveys short so that people can complete them quickly and easily. You may need to incentivize people to respond - but be aware that heavy incentives may provide biased answers. Additionally, look to reduce bias by randomly sampling your user base.</p><p>Another option to a scaled survey is to hold a focus group - a cross between the customer interview and a small survey which can yield high-confidence results. It’s essential to limit the possibility of people influencing each other to give the same answer, and it can be helpful to get people to write down their answers before sharing them with the group.</p><h3 id="how-does-posthog-do-this-2">How does PostHog do this?</h3><p>In addition to collecting user feedback through direct conversations, we occasionally run surveys via our Slack community to find out how we&#x27;re doing. We use this primarily as a tool for collecting ideas on topics outside of our core product, such as new community or marketing initiatives. </p><p>Want to find out more about our community? You can join <a href="/posts">our community page</a> today!</p><h2 id="metrics">Metrics</h2><p>Monitor how people are using your product,  as they may be getting stuck when trying to accomplish something. You can piece together key pieces of information from success metrics to see what differs between users who are successful and those who are not, to shed light on unmet user needs.</p><p>You can use PostHog to monitor user behaviors through metrics across your product using our <a href="/product-features/trends">trends tool</a>.</p><h3 id="how-does-posthog-do-this-3">How does PostHog do this?</h3><p>It&#x27;s fair to say that metrics are a vital part of the way we work at PostHog and, unsurprisingly, we use our own product to collect such information. We have dedicated dashboards setup for most teams and <a href="/blog/north-star-metrics">a north star metric we use</a> as a company to stay on track, but we also enable everyone to query the data themselves and discover new insights.</p><p>If you&#x27;re struggling to define the best metrics for your team, <a href="/blog/aarrr-pirate-funnel">we always recommend the AARRR &#x27;pirate&#x27; framework</a> as a good starting point. </p><h2 id="session-recordings">Session recordings</h2><p>There is no substitute for observing a user use your product in their natural environment. As long as you randomly sample customers you’re likely to get unbiased results here - the users will not change their behavior due to your presence. Watching session recordings can give valuable insights into why people are failing to achieve something with your product: perhaps they’re accessing your product through their mobile browser and it’s much harder to use. Watching session recordings provides a lot of context for this type of issue. </p><h3 id="how-does-posthog-do-this-4">How does PostHog do this?</h3><p>One of the features PostHog offers is the ability to <a href="/manual/recordings">record and replay user sessions</a> in your product. So, naturally, we use this feature on a daily basis to see how users are interacting with our product and our website - all while redacting any sensitive information to protect their privacy. </p><p>Session recordings are often an invaluable tool for us, which is why we recently updated them to be faster and easier to use in <a href="/blog/the-posthog-array-1-30-0">PostHog v1.30</a>.</p><h2 id="competitive-research">Competitive research</h2><p>Leveraging first principles is a great way to understand needs without being biased by current market solutions, but looking at these existing solutions can help you validate and understand your users’ needs.</p><p>Look at your competitor’s products and ask yourself, “Why do they have this feature?”. This will help you identify the problems they were solving for and build a better solution.</p><h3 id="how-does-posthog-do-this-5">How does PostHog do this?</h3><p>Competitor research is an ongoing process at PostHog, which involves both actively looking into our competitor&#x27;s products and communitities to identify opportunities, as well as the market at large. </p><p>There&#x27;s no shortcut here; research takes time to do and has to be done thoroughly. However, it&#x27;s also something that is supported by other types of research - many times in user feedback calls we hear from customers who have used competitors in the past, such as Saga, who have run Mixpanel and PostHog side-by-side to compare performance.</p><h2 id="further-reading">Further reading</h2><ul><li><p><a href="/blog/north-star-metrics">Finding your North Star metric and why it matters</a>: Successful products need actionable metrics. Here&#x27;s how to find them.</p></li><li><p><a href="/blog/introduction-to-customer-retention">An introduction to customer retention</a>: Explains customer retention, why it&#x27;s important and tactics you can use to reduce churn</p></li><li><p><a href="/blog/how-to-product-market-fit">How to achieve B2B product market fit</a>: How to approach finding market fit for a B2B product</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Don’t bother securing your trademarks in the beginning]]></title><description><![CDATA[Disclaimer:  This is intended as a short, tactical guide to getting your trademarks sorted out for the first time, on a minimal budget. This is  not…]]></description><link>https://posthog.com/library/ops/registering-trademarks</link><guid isPermaLink="false">5bcdec1d-1095-55ce-a5e3-5cb49acb4591</guid><dc:creator><![CDATA[Charles Cook]]></dc:creator><pubDate>Wed, 01 Dec 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/library/images/blog/posthog-blog-image.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><em><strong>Disclaimer:</strong> This is intended as a short, tactical guide to getting your trademarks sorted out for the first time, on a minimal budget. This is <em>not</em> legal advice and we are not lawyers - this is just what has worked for us.</em></p><p>Don&#x27;t bother securing your trademarks in the early days of your business - wait until you&#x27;ve raised a seed round first to mitigate the risk of wasting your money. </p><p>Those first crucial months present bigger problems to worry about - like finding product-market fit or hiring. There&#x27;s also a good chance that your brand will evolve, from name changes and logo revamps to brand fonts and colors. This makes trademarking a word mark or logo mark <em>that</em> early a risky bet.</p><h2 id="what-is-the-different-between-a-word-mark-and-a-logo-mark">What is the different between a word mark and a logo mark?</h2><p>A word mark is basically just the name of the brand (as written in a specific font, if applicable). In our case, it&#x27;s the word &#x27;PostHog.&#x27; A logo mark is typically pictorial - in our case, the hedgehog logo either alone or combined with a stylized word. The word mark is the most versatile, so that should be your first trademark priority.</p><div class="text-center my-8"><img src="/brand/posthog-logo.svg" class="w-full"/></div><p>When you decide to register your trademark, you don&#x27;t need to spend a fortune doing it. With a tactical combination of using the right type of lawyer and doing it yourself, you should be able to get trademarks filed in the US, UK, EU and China for ~$3,000 <em>in total</em>.</p><p>(Why China? Even if you&#x27;re not doing business there today, China operates a &#x27;first to file&#x27; rule for trademarks, rather than &#x27;first use,&#x27; which means whoever registers the trademark there first gets to keep it. Great for IP trolls - not so great for you.)</p><p>We’ve currently secured our brand name (&#x27;PostHog&#x27;) and word mark in the four territories listed above. The process differs slightly for each region:</p><ol><li><strong>US:</strong> Hire a trademark attorney to do it for you (necessary if you live outside the US). You can find fixed-fee service providers to avoid getting charged by the hour. We used <a href="https://www.cognitionip.com/">Cognition IP</a> and like them. Cost = ~$1,300.  </li><li><strong>UK:</strong> File it yourself through the <a href="https://www.gov.uk/topic/intellectual-property/trade-marks">UK Intellectual Property Office</a>’s easy to use website. It’s actually faster than hiring a trademarks and IP lawyer to do it for you. Cost = $0. </li><li><strong>EU:</strong> If you live in the European Union, you can simply file the trademark yourself via the <a href="https://euipo.europa.eu/ohimportal/en/apply-now">EU IPO website</a> If you’re outside the EU, you&#x27;ll need to hire an agent to do it for you. You can search for an agent in your country through the <a href="https://euipo.europa.eu/eSearch/#advanced/representatives">EU IPO</a> as well. Cost = $0 if you live in the EU, ~$200 if you need an agent. </li><li><strong>China:</strong> Hire a reputable agent on the mainland to do it for you - we used <a href="http://www.anlilaw.com/100040/">Anli Partners</a> who were great. Remember, you have to be the first to file the trademark otherwise your application will be rejected. Cost = ~$1,500. </li></ol><h2 id="should-open-source-companies-trademark-their-brand-names">Should open source companies trademark their brand names?</h2><p>The phrase &#x27;open source&#x27; might denote a public codebase, but a brand name can definitely be trademarked. For example, we want people to <a href="https://github.com/PostHog/posthog">deploy our open source edition</a> wherever they please, but we don&#x27;t want them to slap the &#x27;PostHog&#x27; name on random products. Besides, if you’re <a href="https://posthog.com/blog/open-source-business-models">raising money</a> for your startup in the future, IP is a box that investors will want you to check as part of their diligence. </p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introduction to self-service analytics]]></title><description><![CDATA[There are lots of ways to do analytics. You can  do SQL . You can do it in the cloud. You can not do it at all and hire an analytics agency or…]]></description><link>https://posthog.com/blog/Introduction-to-self-service-analytics</link><guid isPermaLink="false">f7e4b316-ccc5-5b76-9791-98981b76b103</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 30 Nov 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/blog-generic-4.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>There are lots of ways to do analytics. You can <a href="/blog/sql-for-analytics">do SQL</a>. You can do it in the cloud. You can not do it at all and hire an analytics agency or consultancy instead. But by far one of the most popular (and, we think, best) ways is <em>self-service</em> analytics. </p><p>That’s a term which covers a lot of popular analytics platforms, including PostHog, Mixpanel and <a href="/blog/best-amplitude-alternatives">Amplitude</a>. But what does it mean, exactly? </p><p>To put it simply, a self-service analytics platform is one which empowers everyone within an organization to analyze product and user data themselves. Self-service analytics platforms therefore provide access to the data and the tools to interrogate it — all without resorting to dozens of unorganized spreadsheets, and specifically without requiring your team to have SQL skills.</p><p>In this article we’ll describe how product-led teams benefit from self-service analytics, what the alternatives are and discuss some of the popular tools in this space. </p><h2 id="what-are-the-alternatives-to-self-service-analytics">What are the alternatives to self-service analytics?</h2><p>When you know what self-service analytics is, the main alternative should be obvious: it’s when not everyone in an organization is empowered to analyze data themselves. </p><p>This is usually because an organization has a specific data analysis function instead, which is devoted to providing analytics as a service to the rest of the organization. It can be an external team, but most of the time it’s an internal team of data analysts, data scientists or business intelligence specialists. </p><p>There are a few reasons organizations may prefer this approach: </p><ul><li><p><em>Security:</em> Limiting who has access to the raw data, which can include personally identifying information (PII), is generally wise and can be a matter of regulation in some industries.</p></li><li><p><em>Expertise:</em> A specialized team enables organizations to leverage expertise most effectively, not only for running queries but also in terms of data structure and management. The team can also interact with data directly, rather than requiring accessible tooling.</p></li><li><p><em>Efficiency:</em> In theory, routing requests through a centralized team should eliminate duplicate work.</p></li></ul><p>It’s important to emphasize that efficiency gains in particular can be a controversial point in some organizations. Centralized teams aren’t always as efficient as they may seem and a reality in many organizations is that data specialists may spend a lot of time building simple dashboards for business leadership or may lack the wider context to prioritize effectively.</p><p>Issues can also come from elsewhere in the organization, as teams may lack visibility into the data team and be unable to leverage them. As always, communication is key. </p><div><div imageSource="/images/customers/andy.jpeg" name="Andy Su" title="Founder and CEO, Pry" quote="“We look into things such as how valuable customers who come to us via ads are compared to those who are organic. We then use that information to make decisions about our advertising strategy.”"></div></div><h2 id="what-are-the-benefits-of-self-service-analytics">What are the benefits of self-service analytics?</h2><p>As self-service analytics tools have become more sophisticated they have overcome many of the challenges outlined above. PostHog’s saved insights and shared dashboards eliminate the risk of duplicate work, for example, and make it easier for individuals to collaborate on data analysis. </p><p>PostHog also includes security features to limit who has access to the data and can even redact sensitive information from session recordings so that user privacy is preserved. </p><p>More generally, self-service analytics tools also offer other advantages:</p><ul><li><em>Democratization:</em> Biases can occur for all sorts of reasons and you can never be sure where your next great idea will come from. Enabling more users to interact safely with data increases your chance of finding meaningful insights. </li><li><em>Single source of truth:</em> If you don’t have a dedicated team which is managing your data well then it’s easy for decisions to be made based on out of date spreadsheets or faulty information. Self-service analytics tools ensure everyone sings from the same hymn sheet. </li><li><em>Efficiency:</em> Most <a href="/blog/best-open-source-business-intelligence-tools">business intelligence (BI) tools</a> require knowledge of SQL or equivalent programming languages. This means it can take a long time just to get the answer to simple questions, whereas self-service tools such as PostHog offer a more accessible UI.</li><li><em>Speed:</em> The reality of centralized data teams is that they rapidly become a bottleneck for the rest of the business. Opening analytics up with a self-service platform enables all teams to move faster and interact with data in real time. </li></ul><p>Ultimately, self-service analytics is important because it enables organizations to get more value from their data, faster — and usually more cost effectively too. Some organizations that maintain dedicated data teams will even adopt self-service analytics tools regardless, so they can free data teams up to pursue more bespoke analysis. </p><h2 id="are-tools-like-google-analytics-good-for-self-service-analytics">Are tools like Google Analytics good for self service analytics?</h2><p>It’s complicated. </p><p>Google Analytics is a self-service analytics platform but that doesn’t mean it is a good platform for understanding your user behavior. This is because Google Analytics is a self-service <em>web</em> analytics platform and so focuses on metrics such as pageviews, bounce rate and click-through rates. It lacks the ability to go deep into topics such as retention and user trends, or the ability to watch session recordings and create multivariate experiments. </p><div><div imageSource="/images/customers/anca.png" name="Anca Filip" title="Head of Product, Mention Me" quote="“We used to use Google Analytics, but PostHog has helped us improve our product and get a much better understanding of our users than we&#x27;ve ever been able to before.&quot;"></div></div><p>For that, you need <em>product</em> analytics. </p><p>There are lots of self-service product analytics tools, but naturally we think PostHog provides the best one. Not only is PostHog entirely self-service, but it’s also an all-in-one suite of dev tools which offers a full suite of everything from session recording and feature flags to path analysis and cohorts. </p><p>PostHog is also unique in that it can be self-hosted on your organization’s existing infrastructure — which means user data stays on your system so that it is safer and more compliant with privacy regulations. This isn’t possible with other self-service analytics platforms, such as Mixpanel or Amplitude, which can be competitive but require you to share data with their systems. </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Give Back Friday with PostHog]]></title><description><![CDATA[Black Friday is normally an occasion to shop around for a new TV or mobile phone. But we wanted to do something a little different, something to…]]></description><link>https://posthog.com/blog/give-back-friday-2021</link><guid isPermaLink="false">aa950b6f-1445-526b-8be6-4877fa71785b</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 25 Nov 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/give-back-friday.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Black Friday is normally an occasion to shop around for a new TV or mobile phone. But we wanted to do something a little different, something to celebrate and support the open source community which we both rely upon and are proud to be part of.  So, we&#x27;re announcing our Give Back Friday campaign:</p><blockquote><p><strong>For every GitHub star we receive on <a href="https://github.com/PostHog/posthog">the PostHog repo</a> between starting Black Friday through Cyber Monday, we&#x27;ll donate $5 USD across seven handpicked open-source projects.</strong></p></blockquote><p>We&#x27;ll donate a maximum of $50,000 to these projects in total. </p><h2 id="who-gets-the-money">Who gets the money?</h2><p>We&#x27;re donating to the following projects, all of which are either used extensively in our website or product, or have been suggested for their daily usefulness to our team outside of work. </p><table><thead><tr><th><strong>Project</strong></th><th><strong>What is it?</strong></th><th><strong>Why we&#x27;re supporting it</strong></th></tr></thead><tbody><tr><td><a href="https://github.com/rrweb-io/rrweb">Rrweb</a></td><td>An open-source web session replay library.</td><td>Rrweb powers <a href="/docs/user-guides/recordings">our session recording features</a></td></tr><tr><td><a href="https://github.com/graphile/worker">Graphile/Worker</a></td><td>A high performance Node.js/PostgreSQL job queue.</td><td>Graphile/Worker powers logic for our plugin server.</td></tr><tr><td><a href="https://github.com/encode/django-rest-framework">Django REST framework</a></td><td>Open-source web APIs for Django.</td><td>This powers the PostHog REST APIs.</td></tr><tr><td><a href="https://keepass.info/donate.html">KeePass</a></td><td>An open-source multi-platform password manager.</td><td>Keepass is used regularly by our team and was suggested by Joe Martin.</td></tr><tr><td><a href="https://github.com/piscinajs/piscina">Piscina</a></td><td>A fast, efficient Node.js Worker Thread Pool implementation.</td><td>We run a fork of Piscina which powers activities across PostHog.</td></tr><tr><td><a href="https://github.com/all-contributors/all-contributors">All-contributors</a></td><td>A tool to recognize community contributions to open-source projects.</td><td>We run a form of All-contributors to power our contributions bot.</td></tr><tr><td><a href="https://github.com/get-alex/alex">Alex</a></td><td>A tool to detect insensitive or inconsiderate writing.</td><td>Alex is used by our team and was suggested by Paul D&#x27;Ambra.</td></tr></tbody></table><h2 id="how-does-this-work">How does this work?</h2><p>That&#x27;s easy. Between now and the end of Cyber Monday, simply follow these steps:</p><ol><li>Login to GitHub and go to <a href="https://github.com/PostHog/posthog">the PostHog repo</a>.</li><li>Click the ⭐️ icon. Hint: it&#x27;s in the top right corner.</li><li>That&#x27;s it. We&#x27;ll donate on your behalf!</li></ol><p>On the morning of Tuesday, November 30th, we&#x27;ll count up how many stars we&#x27;ve gained and contact the projects above to make the donations. We&#x27;ll quickly verify the stars are legitimate (see <em>small print</em> below).</p><h2 id="why-are-we-doing-this">Why are we doing this?</h2><p>PostHog is an open-source project and our team is all individually proud to be part of the open-source community. We wanted to take this weekend as an opportunity to truly celebrate and support the open-source community in a meaningful way. We don&#x27;t do short-lived price cuts, as we don&#x27;t believe it&#x27;s the right way to build trust with our customers or a sustainable business in the long run.</p><p>We also wanted to involve our community too, which is why we&#x27;ve chosen to give donations based on GitHub stars. If you&#x27;d like to unstar us after we&#x27;ve counted your contributions, that&#x27;s absolutely fine - we suggest just waiting until later in the week to be sure your star is counted towards the total. We previously had the idea of allowing people to directly donate to open source projects and we&#x27;d match them, but we felt this idea makes it a lot easier for our community to express their support this way, and counting stars is a straightforward way to keep track. </p><p>Finally, getting people who care about open source projects to star our repo is of course beneficial to us - it&#x27;ll give us an opportunity to reach a relevant new audience of people who are likely to benefit from using PostHog. If we get enough stars, we may feature on GitHub Trending, which also helps us to reach a wider audience still. </p><h2 id="is-there-any-small-print">Is there any small print?</h2><p>Yes, some.</p><p>Firstly, there were two projects we chose <em>not</em> to support and which we feel it is important to be transparent about:</p><ul><li><strong><a href="https://github.com/ClickHouse">ClickHouse</a>:</strong> We use ClickHouse <em>a lot</em>. But we think <a href="https://uk.finance.yahoo.com/news/clickhouse-raises-250m-series-b-140000178.html?guccounter=1&amp;guce_referrer=aHR0cHM6Ly9kdWNrZHVja2dvLmNvbS8&amp;guce_referrer_sig=AQAAAE-ii8UrZj10_InIQuIXQaVVpXMUZFq_hGhLr5Nh-plFNGhlJU8KfFuvv0vwF-dJAwYLMNg01nmNWJS5YycYfL9tKRx7JvWpx31j7TSosATyCMKLnzoib5yh-T7zGn2lxVHmFTkWZ1tyiwcxVEVnbZBKTXX5DCzI0x0h57EkiSnp">they&#x27;re OK for money</a> right now. </li><li><strong><a href="https://github.com/keajs/kea">Kea</a>:</strong> We use Kea a lot too, but it is run by one of our existing team members, Marius. He&#x27;s fine with this, by the way. </li></ul><p>Some other matters of small print:</p><ol><li>There&#x27;s a maximum donation of $50,000 in total. </li><li>The total sum of donations shall be divided equally between projects. </li><li>Donations are at the discretion of PostHog and all decisions are final. </li><li>Donations are in addition to <a href="https://posthog.com/handbook/marketing/open-source-sponsorship">our usual, ongoing open-source sponsorship</a>.</li></ol><p>That&#x27;s it. </p><blockquote><p>Support the projects that make PostHog possible by <a href="https://github.com/PostHog/posthog">heading to the PostHog repo and starring it today!</a> We&#x27;ll donate $5 for every star between now and the end of Cyber Monday!</p></blockquote><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to measure product engagement]]></title><description><![CDATA[Product engagement is the most important factor when it comes to driving retention and revenue for your business. Though it seems easy to view success…]]></description><link>https://posthog.com/blog/how-to-measure-product-engagement</link><guid isPermaLink="false">7325d493-6f45-56f7-869c-790d7354a538</guid><dc:creator><![CDATA[Hanna Crombie]]></dc:creator><pubDate>Tue, 23 Nov 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/lw-queries.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Product engagement is the most important factor when it comes to driving retention and revenue for your business. Though it seems easy to view success through a financial lens, revenue alone is rarely a clear indicator of a sustainable product. </p><p>In this article we’ll take a look at why strong customer engagement metrics are vital to the success of your product, how to define engagement for your platform, and how to use analytics tools to measure and build on the results.</p><p><strong>Contents:</strong></p><ul><li><a href="#what-is-product-engagement">What is product engagement?</a></li><li><a href="#what-are-product-engagement-metrics">What are product engagement metrics?</a><ul><li><a href="#common-engagement-metrics">Common engagement metrics</a></li></ul></li><li><a href="#what-is-the-best-way-to-measure-product-engagement">What is the best way to measure product engagement?</a><ul><li><a href="#active-users">Active users</a></li><li><a href="#stickiness">Stickiness</a></li><li><a href="#adoption">Adoption</a></li></ul></li><li><a href="#what-tools-are-good-for-tracking-product-engagement">What tools are good for tracking product engagement?</a></li><li><a href="#further-reading">Further reading</a></li></ul><blockquote><p>This article is part of our <a href="/tracks">PostHog Academy series</a> where we explain the fundamentals of product analytics.</p></blockquote><h2 id="what-is-product-engagement">What is product engagement?</h2><p>The golden rule for any product manager: <a href="https://posthog.com/handbook/product/user-feedback">listen to your users</a>.</p><p>Product engagement metrics measure how active your users are and how they spend time with your product. They give valuable insight into what is resonating, and what’s not quite hitting the mark. Knowing more about the specifics of customer engagement can inform your product roadmap going forward, so you build more features that matter and don’t dilute your offering with ones that don’t. </p><p>Churn is a metric we associate closely with customer satisfaction but alone it isn’t sophisticated enough to explain <em>why</em> your customers do or do not stay. It’s also a lagging metric – it can take at least 30 days just to understand that a customer is not coming back, during which you’ve lost precious time.</p><p>Your users are constantly providing feedback through their actions; which features they interact with, how they scroll, where their mouse hovers. By interpreting those actions, you’ll better understand what keeps them on your platform and be able to build more of what they need and love.</p><p>Product engagement also makes a great <a href="https://posthog.com/blog/north-star-metrics">North Star Metric</a>, as it’s usually a reliable forecast for retention and can provide a strong foundation for product development.</p><h2 id="what-are-product-engagement-metrics">What are product engagement metrics?</h2><p>The engagement metrics you need to track will depend on what your business looks like and what your product is.</p><p>In order to use the right product engagement metric for your organization you need a strong understanding of your customer personas. What does your ideal user look like? How do they interact with your platform? What are the revenue drivers attached to them?
By examining <a href="/product-engineers/how-to-create-user-personas">your user personas</a> and how their individual actions influence revenue and growth, you can select the most appropriate engagement metrics for your product.</p><h3 id="common-engagement-metrics">Common engagement metrics</h3><p>If your product is an online service which users engage with regularly then <strong>interactions</strong> are a key metric. Social media platforms, for example, look at numbers of likes, comments and shares.</p><p>For gaming products <strong>session duration</strong> is likely to be a good indicator of positive user engagement. The longer users play, the better. </p><p>If you&#x27;re a business which delivers content then your key metric should be based on how that content is delivered. YouTube may base engagement metrics on <strong>views</strong>, for example, while Google may use the number of <strong>search queries</strong>.</p><p>The individual metrics are limitless. You’ll see <strong>pageviews</strong>, <strong>bounce rate</strong>, <strong>page scroll depth</strong>, <strong>purchases</strong> and many more used as KPIs for different business models. It’s important not to choose these glibly, but to make sure you’ve chosen the perfect fit for your product.</p><h2 id="what-is-the-best-way-to-measure-product-engagement">What is the best way to measure product engagement?</h2><p>Listening to users’ actions is important, but how can you track engagement metrics and translate them into actionable insights?</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/how-to-measure-engagement/product-engagement-metrics.jpeg"/></p><p>A good way to get started is to use some basic metrics to create a broad framework for engagement insight. The following metrics are very easy to track with the help of product analytics software such as PostHog (pictured above).</p><h3 id="active-users">Active users</h3><p>Active users are those who perform valuable actions on your platform.
Daily Active Users (DAU) is a key metric for subscription services and is expressed as a percentage of total users. High DAU is evidence that you’ve been successful in attracting customers. On PostHog, you can track this by <a href="/docs/data/actions">defining actions for key activities, such as daily sign-ins</a>.</p><p>This metric is particularly important if you’re working with an ad-based revenue model. The number of daily users you see is directly linked to your profitability, so you should be keeping a close eye on DAU.</p><h3 id="stickiness">Stickiness</h3><p>Imagine you’re a customer at a local hair salon. </p><p>You like the cut you’re given, so you book to go back. That’s great for their business – at that salon you’re considered a sticky customer. </p><p>The stickiness metric validates that your customers are happy and are likely to keep using your product. It’s a good demonstration of <a href="https://posthog.com/blog/introduction-to-customer-retention">retention</a>.</p><p>Again, the way you measure stickiness will depend on your business but many product managers calculate stickiness using this formula: </p><blockquote><p>DAU ÷ MAU. </p></blockquote><p>This will show you what percentage of customers you’re retaining over a period of time. </p><p>An easier way to track this is to use a tool such as PostHog, which has a dedicated stickiness tool which can be used to track the stickiness of any defined action and gives a granular view of how this correlates to engagement. </p><h3 id="adoption">Adoption</h3><p>Adoption represents the number of users using key features in your product.
Each new feature presents an opportunity for additional customer value. Low adoption implies that you’re offering something which users don’t need, or that there’s something wrong with the feature itself. High adoption means users are flocking to a new feature.</p><p>If users are paying for features they don’t use then it lowers the perceived value, so it’s essential to keep an eye on what isn’t working and rollback where necessary. That’s why PostHog offers tools like <a href="/docs/feature-flags/tutorials">feature flags</a>, which help you to incrementally roll out new features and key an eye on adoption progress. If something isn’t working, you can roll it back instantly. </p><p><a href="/docs/user-guides/events">Flagging the use of specific features as a key event</a> per user type will also help you to track adoption.whether you’re successfully reaching the users they were intended for.</p><p>By comparing the values of these metrics against each other you can begin to get an idea of where you’re winning on product engagement, and where you might be losing out. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/how-to-measure-engagement/correlation.png"/></p><h2 id="what-tools-are-good-for-tracking-product-engagement">What tools are good for tracking product engagement?</h2><p>Naturally, we think PostHog is the best tool for tracking product engagement. </p><p>This is because, in addition to tracking the metrics above, PostHog enables you to understand their context through tools such as  <a href="/docs/user-guides/sessions">Session Recording</a>, <a href="/docs/user-guides/toolbar#inspecting-elements">Heatmaps</a>, <a href="/docs/user-guides/cohorts">Cohorts</a> and <a href="/docs/user-guides/correlation">Correlation analysis</a>. You can also <a href="/templates">create dashboards</a> to monitor engagement continuously.</p><p>Paying attention to engagement and building more of what your customers love is a sure way to turn them from regular users into fans and advocates. Stay on top of your user engagement, listen and respond, and you’ll turn casual customers into product champions.</p><h2 id="further-reading">Further reading</h2><ul><li><p><a href="/blog/north-star-metrics">Finding your North Star metric and why it matters</a>: Successful products need actionable metrics. Here&#x27;s how to find them.</p></li><li><p><a href="/blog/how-to-do-user-segmentation">What is user segmentation?</a>: A quick guide to user segmentation and how to apply it to your business</p></li><li><p><a href="/blog/b2b-saas-product-metrics">B2B Product Metrics 101:</a>: Everything you need to know about metrics for B2B SaaS products</p></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.30.0]]></title><description><![CDATA[Brand new and faster user interface, automatic conversion signal detection with Correlation analysis, saving insights for future use and a fully revamped recordings playback experience and more than 350 improvements/fixes more.]]></description><link>https://posthog.com/blog/the-posthog-array-1-30-0</link><guid isPermaLink="false">52e346d5-0ebf-592c-b750-07695bb271f0</guid><pubDate>Wed, 17 Nov 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-30-0.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.30.0 is a milestone release! We&#x27;ve introduced a brand new, faster user interface, automatic conversion signal detection with correlation analysis, the ability to save insights for future use and a fully revamped recordings playback experience. And that&#x27;s just for starters!</p><blockquote class="warning-note"><b>Postgres-based deployments are now deprecated</b> in favor of ClickHouse-backed installations. It&#x27;s important to migrate your installation to keep getting the latest updates and features. <a href="#deprecation--removal-notices">Read more</a> about this below.</blockquote><h2 id="posthog-1300-release-notes">PostHog 1.30.0 release notes</h2><blockquote><p>Don&#x27;t see the new features on your self-hosted deployment? Remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#posthog-1300-release-notes">PostHog 1.30.0 release notes</a><ul><li><a href="#fresh-new-look-and-feel">Fresh new look-and-feel</a></li><li><a href="#correlation-analysis">Correlation analysis</a></li><li><a href="#saved-insights">Saved insights</a></li><li><a href="#fully-revamped-recordings">Fully revamped recordings</a></li><li><a href="#other-improvements--fixes">Other improvements \&amp; fixes</a></li><li><a href="#deprecation--removal-notices">Deprecation \&amp; removal notices</a></li><li><a href="#help-us-improve-posthog">Help us improve PostHog</a></li></ul></li><li><a href="#community">Community</a><ul><li><a href="#community-mvp-">Community MVP 🏆</a></li><li><a href="#community-shoutouts">Community shoutouts</a></li></ul></li><li><a href="#open-roles">Open roles</a></li></ul><h3 id="fresh-new-look-and-feel">Fresh new look-and-feel</h3><p>We reworked PostHog&#x27;s UI philosophy from the ground up, all to offer you the most intuitive and sleek user experience possible. With 1.30.0 we&#x27;re introducing our redesigned navigation experience – codenamed Lemonade for its freshness. An evolution of the interface you know, it&#x27;s simply much nicer packaging for the existing features, along with a new helpful addition: breadcrumbs for hierarchical navigation. We hope you&#x27;ll find this a joy to use. And if you have any feedback regarding the redesign, we&#x27;d love to hear your thoughts!</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_30_0-lemonade.png" alt="Screenshot of new user interface"/><p>In addition to the new coat of paint, we&#x27;ve been working on performance improvements – codenamed Turbo Mode. Although not visible at first glance, recent under-the-hood changes make switching between pages feel smoother and snappier.</p><br/><h3 id="correlation-analysis">Correlation analysis</h3><p>Want to understand why users convert or churn? Presenting: Correlation analysis. This nifty new insight automatically matches funnels to any relevant conversion signals, giving you effortless correlation information such as &quot;Users in Canada are 5x more likely to convert&quot; or &quot;Users in Chrome are 3x less likely to convert&quot;. This is a very powerful feature which enables you to take funnel optimization to the next level.</p><p>Read more on the <a href="/docs/user-guides/correlation">Correlation analysis docs</a>.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_30_0-correlation.png" alt="Screenshot of correlation analysis"/><blockquote><p>🎁 Correlation analysis is a premium feature and requires a PostHog Scale or Enterprise license. <a href="/pricing">Learn more</a>.</p></blockquote><br/><h3 id="saved-insights">Saved insights</h3><p>Tired of creating the same insights multiple times? You can now save insights on PostHog without adding them to a dashboard. Further, you&#x27;re able to see, search and filter a list of insights created by other team members - which makes it a lot easier to collaborate with PostHog.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_30_0-saved-insights.png" alt="Screenshot of saved insights"/><br/><h3 id="fully-revamped-recordings">Fully revamped recordings</h3><p>The recordings experience just got a lot better. We added a new recordings tab that enables you to filter and search across multiple days (replacing the <a href="/blog/sessions-removal">old sessions tab</a>). Once you&#x27;ve found the recording you want to watch, there&#x27;s a brand new player experience that loads much faster and overlays events on the seekbar. Find the right spot in a recording quickly and understand better what your users are doing.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_30_0-recordings.png" alt="Screenshot of new recordings playback experience"/><br/><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><ul><li><strong>Turbo mode</strong>. You&#x27;ll notice a significant speed improvement when using PostHog. App navigation will now happen almost instantly. In particular, you&#x27;ll notice navigation between dashboards and insights happens without any delay.</li><li><strong>Duplicate dashboards</strong>. Thanks to community member <a href="https://github.com/PostHog/posthog/pull/6476">Yuvaraj J</a>, you can now easily duplicate dashboards instead of manually recreating them. Thanks, Yuvaraj!</li><li><strong>Security on Docker builds.</strong> We&#x27;ve moved to a different base image for Docker (<code>alpine</code>) and this new image build solves a lot of security vulnerabilities on upstream dependencies.</li><li><strong>Improved query performance</strong>. We improved how person properties are handled which results in up to 2x faster queries.</li><li>Have a large number of dashboards? You&#x27;ll now be able to <strong>easily search the dashboard list.</strong></li><li>Fixed a bug that caused the app to believe there was a new version available when it wasn&#x27;t ready to be shipped.</li><li>Fixed bugs with person counts not matching between an insight graph and the person list.</li><li>Significantly faster frontend builds as we transitioned from <code>webpack</code> to <code>esbuild</code>.</li><li>Fixed a bug that prevented creating cohorts from trends.</li><li>Success and error toast alerts will now show at the bottom of the screen so it no longer covers critical elements in the page.</li><li>Plus <strong>350+ more</strong> improvements &amp; fixes.</li></ul><h3 id="deprecation--removal-notices">Deprecation &amp; removal notices</h3><ol><li>This version (<code>1.30.0</code>) will be the last version where we support a Postgres-only deployment of PostHog. See <a href="/docs/migrate/migrate-to-cloud">our migration guide</a> for instructions on moving over to a ClickHouse version. ClickHouse provides faster queries and is optimized for very large volumes of data, and you will also get a new lot of features.</li><li>We&#x27;re now fully removing the legacy Sessions list page. Read more about it, <a href="/blog/sessions-removal">in this blog post</a>.</li></ol><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="community">Community</h2><h3 id="community-mvp-">Community MVP 🏆</h3><p>Thanks to all our community members for helping move PostHog forward! This release cycle&#x27;s Community MVP goes to <a href="https://github.com/asherf">asherf</a>!</p><p>Asher pushed several PRs to improve the Python code quality in the main PostHog app.</p><h3 id="community-shoutouts">Community shoutouts</h3><p>We want to thank each and every community member that contributed to this release of PostHog!</p><ul><li><a href="https://github.com/asherf">asherf</a> 🏆</li><li><a href="https://github.com/banagale">banagale</a></li><li><a href="https://github.com/pixlwave">pixlwave</a></li><li><a href="https://github.com/romj">romj</a></li><li><a href="https://github.com/Nishant-Sagar">Nishant-Sagar</a></li><li><a href="https://github.com/xrendan">xrendan</a></li><li><a href="https://github.com/inbreaks">inbreaks</a></li><li><a href="https://github.com/Jaspreet-singh-1032">Jaspreet-singh-1032</a></li><li><a href="https://github.com/mether">mether</a></li><li><a href="https://github.com/jyuvaraj03">jyuvaraj03</a></li></ul><p>Looking to contribute? We&#x27;ve recently improved our CI process and tests will now run smoothly if you create a PR from a fork.</p><h2 id="open-roles">Open roles</h2><p>Join us in helping make more products successful! We&#x27;re currently hiring for the following roles:</p><ul><li>Developer Educator</li><li>Operations Manager</li><li>Sales Engineer</li><li>Technical Customer Success Manager</li><li>Software Engineer</li></ul><p>Learn more about these roles on our <a href="https://posthog.com/careers">Careers page</a>.</p><p>Don&#x27;t see a role for you? We&#x27;re always looking for exceptional people, so reach out to us via the link above.</p><hr/><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The state of plugins on PostHog]]></title><description><![CDATA[Update (May 2022):  Plugins are now known as  apps ! The plugin server has become an integral part of PostHog, as it is responsible for event…]]></description><link>https://posthog.com/blog/the-state-of-plugins</link><guid isPermaLink="false">4d4a49c2-e81d-59fd-aefb-534926630f30</guid><dc:creator><![CDATA[Yakko Majuri]]></dc:creator><pubDate>Tue, 16 Nov 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/running-content.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p><strong>Update (May 2022):</strong> Plugins are now known as <a href="/apps">apps</a>!</p></blockquote><p>The plugin server has become an integral part of PostHog, as it is responsible for event ingestion. However, it isn’t called “ingestion server” because it was originally designed to run plugins. So, how are those going?</p><p>I used a combination of PostHog, Metabase, Python scripts, and Google Sheets to compile, analyze, and display the data you see here to answer that question as transparently as possible. </p><h2 id="tldr">TL;DR</h2><ul><li>Most teams using PostHog use plugins (if GeoIP is included)</li><li>Relatively few Cloud teams use plugins (if GeoIP is excluded)</li><li>Self-hosted users are way more likely to use plugins than Cloud users</li><li>Export plugins are key for our larger customers (particularly self-hosted ones)</li><li>Simple plugins covering basic functionality that PostHog lacks are quite popular</li><li>The plugins ecosystem still needs a lot of work </li></ul><h2 id="why-we-like-plugins">Why we like plugins</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/state-of-plugins/plugin-views.png"/></p><p>Above: Pageviews for the Plugin Library (weekly).</p><p>Fun fact: the average length for the top six most popular plugins on PostHog is only 57 lines of code. Some, such as the Timestamp Parser, are only 16 lines long! The other thing they have in common is that they cover basic functionality which we haven’t built natively into PostHog yet. </p><p>This is a deliberate decision. It’s true that we could spend engineering time to build these features, such as filtering nested properties, but plugins enable us to quickly solve the same challenge without the resource overhead. Then, once we fully understand the challenge, we can create a better solution — some plugins are literally the duct tape version of full-fledged features we’re building at the moment. </p><p>Plugins also enable us to build useful functionality in a matter of hours. The Twitter Followers plugin hits an API and creates an event once a day. It would never make sense to build this natively, but it took just 30 minutes to make it as a plugin which is used by 30+ teams.</p><h2 id="about-the-geoip-plugin">About the GeoIP plugin</h2><p>Despite feeling like a core part of the product, PostHog’s geolocation capabilities are actually handled by a plugin. This is a widely used feature, and the plugin is enabled for everyone by default, meaning it has thousands of users, both on self-hosted instances and Cloud. </p><p>As a result, it has been removed from all the graphs and tables you’ll be seeing in this document, so we can focus on plugins which users have deliberately enabled.</p><h2 id="plugins-on-posthog-cloud">Plugins on PostHog Cloud</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/state-of-plugins/cloud-usage.png"/></p><p>Above: Plugin usage on PostHog Cloud.</p><p>PostHog Cloud users have a selection of whitelisted plugins that they can install from <a href="https://posthog.com/plugins">our plugin library</a>. Arbitrary plugins are not allowed, so if users want to install their own plugins, they must first submit a PR to our <a href="https://github.com/PostHog/plugin-repository">Plugin repo</a> for review.</p><p>Out of the more than 4,000 teams we have on PostHog Cloud, 50.3% use plugins (including GeoIP).</p><p>However, only 4% of teams use a plugin that is not GeoIP. This is quite low. That said, many plugins weren&#x27;t available to everyone on cloud until recently, so this is likely to be under-reporting the reality of how many teams would use them.</p><p>The most popular plugin on Cloud (excluding GeoIP) is the Timestamp Parser, which turns timestamp data into date properties. This helps developers answer questions such as ‘<em>Why did our traffic spike on Tuesday?</em>’ or ‘<em>Do we get more purchases at the weekend or not?</em>’</p><h2 id="plugins-on-self-hosted-posthog-deployments">Plugins on self-hosted PostHog deployments</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/state-of-plugins/self-usage.png"/></p><p>Above: Plugin usage on self-hosted deployments.</p><p>Gathering and parsing data on self-hosted users is a bit harder, but we can pull some data from status reports going back two months from teams who did not opt out. This comes with the caveat that we are looking at distinct IDs, meaning some organizations may be counted twice.</p><p>Of the 1,500+ organizations in the dataset, 75.6% use plugins, and 23.5% use a plugin other than GeoIP. Both are much better ratios than Cloud. </p><p>This analysis shows the power of community plugins, as the most popular plugin is the User Agent plugin which was created by a community contributor. Thank you, <a href="https://github.com/weyert">Weyert</a>! </p><blockquote><p><em>Note:</em> This plugin doesn’t show for PostHog Cloud stats because, as I found out while writing this, it wasn’t whitelisted for other organizations. We’ve since corrected this. </p></blockquote><p>Finally, the most important point about self-hosted plugins is that they’re far more powerful than on Cloud. When you run your own instance, you can add whatever plugins you like to it. As such, we see some teams creating and running their own massively complicated plugin across multiple projects. </p><p>One user, for example, created a plugin to migrate more than 15 million events from Heap to PostHog. Others, such as <a href="https://posthog.com/customers/mention-me">MentionMe</a>, have successfully used plugins we’ve made but haven’t released yet by installing them directly from GitHub!</p><h2 id="export-plugins">Export plugins</h2><p>Export plugins are arguably our most important type of plugin, as they are specifically useful for Enterprise customers and form a core part of PostHog’s offering by enabling users to export PostHog info to a data warehouse.</p><p>BigQuery is by far the most popular export destination, across both self-hosted and Cloud deployments.  </p><h2 id="the-future-of-plugins">The future of plugins</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/state-of-plugins/plugin-time.png"/></p><p>Above: Time spent running plugins on PostHog Cloud (weekly).</p><p>One of the most striking data points we have about plugins is that installations per week have been mostly flat and the correlation with user sign-ups is constant. This means we’re not doing a good job of getting more users to try out plugins (at least on Cloud) even though we are doing a good job of getting people to try PostHog. </p><p>Part of the reason for that could be that plugins still need a lot of polishing. We’ve had multiple reports in our community Slack that the release tracker plugin is broken, for example, and both the developer tooling and the user-facing plugin library are somewhat underwhelming to use. </p><p>Yet, it can be hard to prioritize fixing these issues. Almost by definition any work to improve the extensibility of PostHog will never be a short-term priority because the product has to come before the efforts to extend it. </p><p>In the short term I’m currently focusing on fixing known bugs as part of my current sprint, but the <em>only</em> real way to prioritize extensibility is to look at it from a long-term perspective and I hope we can invest ongoing engineering efforts into PostHog in the future.</p><p><em>Want to know more about what we&#x27;re up to? <a href="https://newsletter.posthog.com/subscribe">Subscribe to our new newsletter</a>, which we send once every two weeks!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Cancer and revenue - the latest board meeting]]></title><description><![CDATA[It has been a dramatic month. Four weeks ago, our 16 month old daughter was diagnosed with  retinoblastoma  - a fairly rare form of cancer that…]]></description><link>https://posthog.com/blog/ceo-diary-3</link><guid isPermaLink="false">57bb68e6-aeb2-5c04-9356-6a759f8b418b</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Fri, 12 Nov 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>It has been a dramatic month.</p><p>Four weeks ago, our 16 month old daughter was diagnosed with <a href="https://www.nhs.uk/conditions/retinoblastoma/#:~:text=Retinoblastoma%20is%20cancer%20of%20the,form%20a%20cancer%20called%20retinoblastoma.">retinoblastoma</a> - a fairly rare form of cancer that affects the eyes.</p><blockquote><p>Update April 2022: we&#x27;ve finished chemo, she&#x27;s now done with treatment and we&#x27;re in regular testing mode. There&#x27;s a very high chance it comes back, but we&#x27;ll take this as a win!</p></blockquote><h2 id="it-got-bad-fast">It got bad, fast</h2><p>The sequence of events:</p><ul><li>Her left iris became darker than her right one over the course of a few days.</li><li>We showed an optician a day or two later at a regular eye appointment we already had scheduled. We were referred to a specialist, but with more than a month of waiting.</li><li>Over the next couple of days her pupil got dilated. We were told to go to A&amp;E immediately. </li><li>Within two days we had a diagnosis of cancer in both her eyes. Eyes with retinoblastoma are graded from A (least advanced) to E (most advanced) for the disease - one of her eyes was an E (certain removal), the other was a D. She had a range of other symptoms and raised lymph nodes in her head and neck, which caused concern that it had spread. That has only happened once in the last eight years in the UK.</li><li>Within a further two weeks, she&#x27;d had five general anaesthetics for a range of tests, including surgery to remove one of eye and fit a <a href="https://en.wikipedia.org/wiki/Hickman_line">Hickman line</a> for chemotherapy. Each time a toddler has a general anaesthetic, they cannot eat for up to six hours beforehand. The appointments run around two to three hours late on average, and we had a large amount of travel. All of this, combined with uncertainty, was the hardest part. We also moved house, which was a good thing - it was a nice upgrade, and we had lots of help from family.</li><li>A month after the diagnosis, we&#x27;ve had final confirmation that it hasn&#x27;t spread outside her eyes. Chemo has started to treat her seeing eye and we&#x27;re coming to the end of the first week of that. Hopefully the tumours will respond to the chemo - there is a 66% chance of saving her seeing eye.</li></ul><h2 id="youre-so-brave">&quot;You&#x27;re so brave&quot;</h2><p>We&#x27;ve heard this a lot, but the reality is that we have no choice.</p><p>When you get a diagnosis, there&#x27;s no debate - you have to get over the next hurdle. It&#x27;s very clear that we&#x27;re on a long ride, and we will parent through this.</p><h2 id="100-remote-0-regrets">100% remote, 0% regrets</h2><p>For the first few weeks, it was unclear if it had spread. In the early days, both my wife and I had living nightmares - finding ourselves day dreaming about the worst case scenario. I was grateful that I was lucky enough to work from home and be present during these periods.</p><p>I was worried about balance. I decided that if the cancer hadn&#x27;t spread, we&#x27;d end up on a cycle of chemo, largely at home, which I could work around. If it had spread, I&#x27;d need to learn more to make a decision. It&#x27;d be horrible to be commuting.</p><h2 id="so-the-board-meeting">So, the board meeting</h2><p>Cancer has taken an eye; my way of saying screw you to the disease is that I&#x27;m not going to let it take away or reduce the opportunity at PostHog for anyone directly or indirectly (including my family!) involved.</p><p>PostHog has made tremendous progress. Our goal for August was to get five reference customers for our paid self-hosted product. We&#x27;ve gone way past that and are at around 10, with around 100 paying customers on PostHog Cloud, and a further 8,000ish companies deployed in total.</p><p>There are two modes for <a href="https://www.ycombinator.com/library/5z-the-real-product-market-fit">product market fit</a>:</p><ul><li>0 to 1</li><li>1 to many</li></ul><p>This means we feel that:</p><ul><li>Open source project = 1 to many mode</li><li>PostHog Cloud = 1 to many mode (although we are focused on self-hosted)</li><li>PostHog Scale = 1 to many mode</li></ul><h2 id="next-up">Next up</h2><p>We now need to:</p><ul><li>More in: Accelerate growth of the open source product and the Scale product.</li><li>More out: Get higher order values. We are working on our Enterprise product. This has a longer cycle since larger organizations are slower moving.</li></ul><p>We believe these two activities will compound.</p><h3 id="more-in">More in</h3><p>This is an unknown unknown; the only way to figure it out is to get started making our own luck.</p><p>We&#x27;ve been blessed with mainly organic growth to date. The advantage is that this product-led channel is very leveraged - we can double down on our product and we will grow faster (more word-of-mouth growth, and better retention). However, we can&#x27;t create wild product improvements overnight (mostly) - we need to push on more channels than this to accelerate.</p><p>As we created our reference customers, we&#x27;ve realized what the most successful users of PostHog <a href="/handbook/strategy/overview">have in common</a>.</p><p>First, we need to create a scorecard. Long term revenue is the <em>output</em> but we want to look upstream for a metric that is more controllable, with a faster feedback loop.</p><p>We are creating a simple algorithm that scores each company that deploys (and is opted in). This is based on their usage and company data. We&#x27;re doing this by sending <a href="https://github.com/PostHog/hubspot-plugin">PostHog data to Hubspot</a> and using their lead scoring. This lets us figure out if we&#x27;re getting high quality signups. Once we have this, we can figure out if our work in marketing and developer relations is having an impact.</p><h3 id="more-out">More out</h3><p>We&#x27;ve some huge fans using us in massive enterprises. It stands to reason - they care greatly about data control, and they&#x27;re able to deploy PostHog the day they find it since all data stays in their infrastructure, and they can start for free.</p><p>We are going to put more focus on <a href="/newsletter/pricing-advice">our pricing</a> and adoption model for enterprises. Should we start on the open source project, grow to PostHog Scale in a few places, then grow to Enterprise? Or should we go from PostHog open source to PostHog Enterprise? We&#x27;ll find out by experimenting and talking to users.</p><h2 id="back-to-business">Back to business</h2><p>I&#x27;ll be taking advantage of our random working hours for sure, but it&#x27;s great to be back and building.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we turned ClickHouse into our event mansion]]></title><description><![CDATA[Recently, PostHog was invited to speak at  OSA Con 2021 , an open source analytics conference organised by Altinity. It was a fantastic opportunity to…]]></description><link>https://posthog.com/blog/how-we-turned-clickhouse-into-our-eventmansion</link><guid isPermaLink="false">11f4d212-9db9-5c92-bad4-5d37af554652</guid><dc:creator><![CDATA[James Greenhill]]></dc:creator><pubDate>Sat, 06 Nov 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/clickhouse-announcement.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Recently, PostHog was invited to speak at <a href="https://altinity.com/osa-con-2021/">OSA Con 2021</a>, an open source analytics conference organised by Altinity. It was a fantastic opportunity to talk to the community, alongside other engineers and leaders from projects such as <a href="https://clickhouse.com/">ClickHouse</a>, <a href="https://airflow.apache.org/">Airflow</a>, <a href="https://superset.apache.org/">Superset</a> &amp; <a href="https://preset.io/">Preset</a>, <a href="https://pinot.apache.org/">Pinot</a>, <a href="https://druid.apache.org/">Druid</a>, <a href="https://cube.dev/">Cube.js</a>, and <a href="https://prestodb.io/">Presto</a>.</p><p>Topics ranged from deep dives into reverse ETL processes to discussions about broad trends in the data engineering sector. At PostHog, we chose to talk about our experience <a href="/blog/clickhouse-announcement">migrating PostHog from Postgres to ClickHouse</a> — why we did it, how it went and what impact it had. ClickHouse is a technology we’re heavily invested in, so we wanted to share some points from our presentation here too.</p><h2 id="the-night-before-clickhouse">The night before ClickHouse</h2><p>The original version of PostHog ran on Postgres. In fact, the <em>very</em> first version was an MVP created by our co-founder, Tim Glaser, over the course of <a href="/blog/inflated-risk-seems-riskier">four intense weeks at Y Combinator</a>.</p><p>These early revisions were straightforward web apps which relied entirely on Django ORM for queries and ran on Postgres because of its capacity to handle relational data. They had easy, one-click deployments set up via Heroku.</p><p>This approach was great for getting early traction, but we very quickly started to push Heroku Postgres to the absolute limit. As more teams adopted PostHog and as those teams ingested more events, our performance started to decline. The more users we had and the more they used us, the worse their experience got.</p><p>This is what spurred us to consider a new database. We needed a more scalable solution and it needed to be one which fit with both the characteristics of our product — that it’s open-source and can be self-hosted — and the needs of our users — that it can offer real-time results and users can define and filter on their own event properties.</p><h2 id="choosing-clickhouse">Choosing ClickHouse</h2><p>Faced with this need, we started investigating replacements for Postgres. We looked at a wide range of OLAP solutions, including <a href="https://pinot.apache.org/">Pinot</a>, <a href="https://prestodb.io/">Presto</a>, <a href="https://druid.apache.org/">Druid</a>, <a href="https://www.timescale.com/">TimescaleDB</a>, CitusDB, and ClickHouse. Some of our team had used these tools before at other companies, such as Uber where Pinot and Presto are both used extensively.</p><p>While assessing each tool, we looked at on three main factors:</p><ul><li><em>Speed:</em> Our users want results in real-time, so our new database needed to scale really well and give fast results. Ideally it wouldn’t be too expensive either.</li><li><em>Complexity:</em> PostHog users can self-host and install our product themselves, so we didn’t want it to be too complicated for users to manage or deploy. We didn’t want users to have to install an entire Hadoop stack, for example.</li><li><em>Query interface:</em> We like standardised tools. We eliminated tools such as Druid because, while it does have a SQL wrap around it, it’s not <em>exactly</em> SQL. That can get messy.</li></ul><p>ClickHouse was a good fit for all of these factors, so we started doing a more thorough investigation. We read up on benchmarks and researched the experience of companies such as <a href="https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/">Cloudflare that uses ClickHouse to process 6m requests per second</a>. Next, we set up a test cluster to run our own benchmarks.</p><p>ClickHouse repeatedly performed an order of magnitude better than other tools we considered and we discovered other perks, such as the fact that it is column-orientated and written in C++.</p><ul><li><em>Compression:</em> ClickHouse has <em>excellent</em> compression and the size-on-disk was incredible. ClickHouse even beat out serialization formats such as ORC and Parquet.</li><li><em>Process from disk:</em> Some OLAP solutions, like Presto, require data to live in memory. That’s fast, but you need to have a <em>lot</em> of memory for big datasets. ClickHouse processes from disk, which is better for smaller instances too.</li><li><em>Real-time data updates:</em> ClickHouse basically processes data as it arrives, so there’s no need to pre-aggregate data. It’s faster for us, and our users.</li></ul><p>Eventually, we decided we knew enough to proceed and so we spun our test cluster out into an actual production cluster. It’s just part of how <a href="/careers">we like to bias for speed</a>.</p><h2 id="turning-clickhouse-into-our-eventmansion">Turning ClickHouse into our EventMansion</h2><p>It wasn’t all smooth sailing. <a href="https://clickhouse.com/docs/en/sql-reference/statements/alter/#mutations">Mutations</a>, in particular, tripped us up, as we initially used them a lot instead of taking the time to model the data perfectly for ClickHouse. The documentation suggests not running more than one or two mutations an hour. We were running several hundred per minute.</p><p>Our advice? Don’t do that. It will get you so far, but it’s not a sustainable approach and eventually lead to us experiencing an outage.</p><p>The reason for this is that, as you are mutating the data, ClickHouse essentially waits until it merges the mutated table parts in a single, larger table part. The more mutations you run, the further behind ClickHouse gets and the slower queries can get. This process is very good for small numbers of large files, but not for large numbers of small files. It took us a long time to figure this out.</p><p>We also had some issues with <a href="https://clickhouse.com/docs/en/sql-reference/statements/alter/index/">ClickHouse’s indexes</a>. If you know exactly what data you need to pull and can specify the exact key and row then that can end up slower than other requests because ClickHouse builds sparse indexes which aren’t a true index of the entire dataset.</p><p>However, beyond this the experience of migrating to ClickHouse was incredibly positive — especially if you compare to the way we solved our original priorities:</p><ul><li><em>Real-time results</em>: Our users want PostHog to stay as fast as it was in the beginning. ClickHouse’s performance improvements were such that, with a little cleverness in the way we architect, we’re still able to provide answers in real-time.</li><li><em>Future-proofing:</em> We need to constantly grow our feature set. <a href="https://clickhouse.com/docs/en/sql-reference/">ClickHouse SQL</a> was developed to resemble Postgres and MySQL syntax, which means we’ve been able to continue adding new features without ClickHouse becoming a bottleneck.</li><li><em>Filter on user-defined properties:</em> We leverage ClickHouse’s JSON deserialization functionality and features such as <a href="/blog/clickhouse-materialized-columns">materialized columns</a> to provide this, albeit at the cost of some CPU overhead.</li></ul><h2 id="making-the-switch">Making the switch</h2><p>Normally, the process of switching to a new database model could be quite tricky. Luckily, however, we’d just created <a href="/docs/feature-flags">feature flags</a> within PostHog and were able to leverage this when switching.</p><p>First, we deployed ClickHouse in parallel to Postgres and began ingesting data simultaneously into both. We then put all of our features and internal tools behind a feature flag in PostHog, reimplemented our analytic queries one by one and then used the feature flags to switch over.</p><p>Once everything was migrated we were able to simply stop storing data on Postgres while our users began deploying PostHog through our <a href="https://github.com/PostHog/charts-clickhouse">Helm Chart</a>, which we use because of the amazing <a href="https://altinity.com/kubernetes-operator/">ClickHouse-Operator made by Altinity</a>. Easy.</p><h2 id="the-future-of-clickhouse-on-posthog">The future of ClickHouse on PostHog</h2><p>It’s fair to say that we bet the farm on ClickHouse, but it’s definitely turned out to be a good bet so far. ClickHouse has recently <a href="https://clickhouse.com/blog/en/2021/clickhouse-raises-250m-series-b/">raised a significant amount of funding</a> to secure its long-term future and accelerate its product development, but more importantly, it’s created a better experience for PostHog users.</p><p>So, naturally we’re thinking about how to do even more with ClickHouse and build deeper connections with the technology.</p><p>One of the things we’re interested in exploring, for example, is the possibility of building functions at the source instead of writing queries for the functionality. Our hope is that adding these functions to a master code base will be more efficient and we won’t need to rely on SQL to do so much heavy lifting. We’re looking to <a href="https://posthog.com/careers">hire a C++ Engineer</a> who can help us achieve this.</p><p>We’re also currently experimenting with <a href="https://clickhouse.com/docs/en/engines/database-engines/materialized-postgresql/">MaterializedPostgresSQL engine</a> as a way to consume the logical replication log coming from Postgres and materializes it in a mergetree table on ClickHouse. Data drift is a huge pain point for any near real-time data product and we’re hopeful we can find a way to guarantee to some extent the quality of data in ClickHouse compared to our source of truth in Postgres.</p><p>But that may be a topic for a future blogpost...</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to speed up ClickHouse queries using materialized columns]]></title><description><![CDATA[ClickHouse supports speeding up queries using materialized columns to create new columns on the fly from existing data. In this post, I’ll walk…]]></description><link>https://posthog.com/blog/clickhouse-materialized-columns</link><guid isPermaLink="false">038e40bf-e16b-5d47-9af8-7bc7ff0e652f</guid><dc:creator><![CDATA[Karl-Aksel Puulmann]]></dc:creator><pubDate>Tue, 26 Oct 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-engineering-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>ClickHouse supports speeding up queries using materialized columns to create new columns on the fly from existing data. In this post, I’ll walk through a query optimization example that&#x27;s well-suited to this rarely-used feature.</p><p>Consider the following schema:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">CREATE TABLE events (
    uuid UUID,
    event VARCHAR,
    timestamp DateTime64(6, &#x27;UTC&#x27;),
    properties_json VARCHAR,
)
ENGINE = MergeTree()
ORDER BY (toDate(timestamp), event, uuid)
PARTITION BY toYYYYMM(timestamp)
</code></pre><p>Each event has an ID, event type, timestamp, and a JSON representation of event properties. The properties can include the current URL and any other user-defined properties that describe the event (e.g. NPS survey results, person properties, timing data, etc.).</p><p>This table can be used to store a lot of analytics data and is similar to what we use at PostHog.</p><p>If we wanted to query login page pageviews in August, the query would look like this:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">SELECT count(*)
FROM events
WHERE event = &#x27;$pageview&#x27;
  AND JSONExtractString(properties_json, &#x27;$current_url&#x27;) = &#x27;https://app.posthog.com/login&#x27;
  AND timestamp &gt;= &#x27;2021-08-01&#x27;
  AND timestamp &lt; &#x27;2021-09-01&#x27;
</code></pre><p>This query takes a while complete on a large test dataset, but without the URL filter the query is almost instant. Adding even more filters just slows down the query. Let&#x27;s dig in to understand why.</p><h2 id="looking-at-flamegraphs">Looking at flamegraphs</h2><p>ClickHouse has great tools for introspecting queries. Looking at <code>system.query_log</code> we can see that the query:</p><ul><li>Took 3,433 ms</li><li>Read 79.17 GiB from disk</li></ul><p>To dig even deeper, we can use <a href="https://github.com/Slach/clickhouse-flamegraph"><code>clickhouse-flamegraph</code></a> to peek into what the CPU did during query execution.</p><div class="relative mt-2 mb-4"><object data="/images/flamegraph.svg" type="image/svg+xml"></object></div><p>From this we can see that the ClickHouse server CPU is spending most of its time parsing JSON.</p><p>The typical solution would be to extract <code>$current_url</code> to a separate column. This would get rid of the JSON parsing and reduce the amount of data read from disk.</p><p>However, in this particular case it wouldn’t work because:</p><ol><li>The data is passed from users - meaning we’d end up with millions (!) of unique columns</li><li>This would complicate live data ingestion a lot, introducing new and exciting race conditions</li></ol><h2 id="enter-materialized-columns">Enter materialized columns</h2><p>Turns out, those are exactly the problems materialized columns can help solve.</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">ALTER TABLE events
ADD COLUMN mat_$current_url
VARCHAR MATERIALIZED JSONExtractString(properties_json, &#x27;$current_url&#x27;)
</code></pre><p>The above query creates a new column that is automatically filled for incoming data, creating a new file on disk. The data is automatically filled during <code>INSERT</code> statements, so data ingestion doesn&#x27;t need to change.</p><p>The trade-off is more data being stored on disk. In practice, ClickHouse compresses data well, making this a worthwhile trade-off. On our test dataset, <code>mat_$current_url</code> is only 1.5% the size of <code>properties_json</code> on disk with a 10x compression ratio. Other properties which have lower cardinality can achieve even better compression (we’ve seen up to 100x)!</p><p>Just creating the column is not enough though, since old data queries would still resort to using a <code>JSONExtract</code>. For this reason, you want to backfill data. The easiest way currently is to run the <a href="https://clickhouse.tech/docs/en/sql-reference/statements/optimize/">OPTIMIZE</a> command:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">OPTIMIZE TABLE events FINAL
</code></pre><p>After backfilling, running the updated query speeds things up significantly:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">SELECT count(*)
FROM events
WHERE event = &#x27;$pageview&#x27;
  AND mat_$current_url = &#x27;https://app.posthog.com/login&#x27;
  AND timestamp &gt;= &#x27;2021-08-01&#x27;
  AND timestamp &lt; &#x27;2021-09-01&#x27;
</code></pre><p>Looking at <code>system.query_log</code>, the new query:</p><ul><li>Took 980ms (<strong>71%/3.4x improvement</strong>)</li><li>Read 14.36 GiB from disk (<strong>81%/5x improvement</strong>)</li></ul><p>The wins are even more magnified if more than one property filter is used at a time.</p><h2 id="backfilling-efficiently">Backfilling efficiently</h2><p>Using <code>OPTIMIZE TABLE</code> after adding columns is often not a good idea, since it will involve a lot of I/O as the whole table gets rewritten.</p><p>As of writing, there&#x27;s a feature request on <a href="https://github.com/ClickHouse/ClickHouse/issues/27730">Github</a> for adding specific commands for materializing specific columns on ClickHouse data parts.</p><p>Here&#x27;s how you can use <code>DEFAULT</code> type columns to backfill more efficiently:</p><pre><code class="language-sql" metastring="runInPostHog=false" runInPostHog="false">ALTER TABLE events
ALTER COLUMN mat_$current_url
VARCHAR DEFAULT JSONExtractString(properties_json, &#x27;$current_url&#x27;);

ALTER TABLE events UPDATE mat_$current_url = mat_$current_url WHERE timestamp &gt;= &#x27;2021-08-01&#x27;;

-- Wait for mutations to finish before running this
ALTER TABLE events
ALTER COLUMN mat_$current_url
VARCHAR MATERIALIZED JSONExtractString(properties_json, &#x27;$current_url&#x27;);
</code></pre><p>This will compute and store only the <code>mat_$current_url</code> in our time range and is much more efficient than <code>OPTIMIZE TABLE</code>.</p><p>Be aware though that this will:</p><ol><li>Break your <code>INSERT</code> statements if you don&#x27;t specify column names explicitly</li><li>Alter the behavior of <code>SELECT *</code> queries</li></ol><h2 id="usage-at-posthog">Usage at PostHog</h2><p>PostHog as an analytics tool allows users to slice and dice their data in many ways across huge time ranges and datasets. This also means that performance is key when investigating things - but also that we currently do nearly no preaggregation.</p><p>Rather than materialize all columns, we built a solution that looks at recent slow queries using <code>system.query_log</code>, determines which properties need materializing from there, and backfills the data on a weekend. This works well because not every query needs optimizing and a relatively small subset of properties make up most of what’s being filtered on by our users.</p><p>You can find the code for this in <a href="https://github.com/PostHog/posthog/blob/c23704b3909ae8ebb827e6a43453e32b3d3487bd/ee/clickhouse/materialized_columns/analyze.py#L42-L119">analyze.py</a> and <a href="https://github.com/PostHog/posthog/blob/c23704b3909ae8ebb827e6a43453e32b3d3487bd/ee/clickhouse/materialized_columns/columns.py#L37-L130">columns.py</a>.</p><p>After materializing our top 100 properties and updating our queries, we analyzed slow queries (&gt;3 seconds long). <strong>The average improvement in our query times was 55%, with 99th percentile improvement being 25x.</strong></p><p>As a product, we&#x27;re only scratching the surface of what ClickHouse can do to power product analytics. If you&#x27;re interested in helping us with these kinds of problems, <a href="https://posthog.com/careers">we&#x27;re hiring</a>!</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.29.0]]></title><description><![CDATA[Fully revamped Paths experience enables you to better explore what actions your users take. New features include multivariate feature flags, private projects and DAU/WAU/MAU graphs.]]></description><link>https://posthog.com/blog/the-posthog-array-1-29-0</link><guid isPermaLink="false">d177b99b-ace0-5cb7-b2d7-41e7022ca724</guid><pubDate>Thu, 21 Oct 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-28-0.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>💡 This version contains a patch release (1.29.1), which fixes a migration lock when upgrading to 1.29.0. If you have issues upgrading to 1.29.0, please try upgrading directly to 1.29.1.</p></blockquote><p>PostHog 1.29.0 includes a fully revamped Paths experience which enables you to better explore what actions your users take. New features include multivariate feature flags, private projects and DAU/WAU/MAU graphs.</p><h2 id="posthog-1290-release-notes">PostHog 1.29.0 release notes</h2><blockquote><p>For a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#posthog-1290-release-notes">PostHog 1.29.0 release notes</a><ul><li><a href="#explore-and-deep-dive-with-paths">Explore and deep dive with Paths</a></li><li><a href="#multivariate-support-in-feature-flags">Multivariate support in feature flags</a></li><li><a href="#private-projects">Private projects</a></li><li><a href="#trailing-dauwaumau-graphs">Trailing DAU/WAU/MAU graphs</a></li><li><a href="#other-improvements--fixes">Other improvements \&amp; fixes</a></li><li><a href="#deprecation-notice">Deprecation notice</a></li></ul></li><li><a href="#share-your-feedback">Share your feedback</a></li><li><a href="#posthog-news">PostHog News</a></li><li><a href="#community">Community</a><ul><li><a href="#community-mvp-">Community MVP 🏆</a></li><li><a href="#community-shoutouts">Community shoutouts</a></li></ul></li><li><a href="#open-roles">Open roles</a></li></ul><h3 id="explore-and-deep-dive-with-paths">Explore and deep dive with Paths</h3><p>Continuing our quest to help you understand why your users convert or don&#x27;t convert, we fully revamped our Paths feature to help you explore the actions users are taking.</p><p>From jumping from a conversion drop-off in a funnel to identifying paths ending in a desired action, you will be able to fully understand the paths of your users. We&#x27;re introducing a lot of additional features such as:</p><ul><li>The ability to select up to 20 steps</li><li>Fine-grained controls on what paths to show</li><li>Grouping paths through wildcards</li></ul><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_29_0-paths-advanced.png" alt=""/><br/><blockquote><p>🎁 Some of these new features require a PostHog Scale or Enterprise license. <a href="/pricing">Learn more</a>.</p></blockquote><h3 id="multivariate-support-in-feature-flags">Multivariate support in feature flags</h3><p>Feature flags just got a lot more powerful! Forget A/B testing, introducing A/B/C/D/... testing. You will now be able to create feature flags with multiple variants to allow for more comprehensive testing and feature releases.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_29_0-multivariate-feature-flags.png" alt=""/><h3 id="private-projects">Private projects</h3><p>Extra concerns on privacy or compliance? Private projects now allow you to limit access to select team members. Learn more on <a href="/docs/settings/access-control">our docs</a>.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_29_0-private-project.png" alt=""/><br/><blockquote><p>🎁 Private projects is a premium feature and requires a PostHog Scale or Enterprise license. <a href="/pricing">Learn more</a>.</p></blockquote><h3 id="trailing-dauwaumau-graphs">Trailing DAU/WAU/MAU graphs</h3><p>If you&#x27;re interested in better measuring your user engagement, DAU/WAU, WAU/MAU &amp; DAU/MAU ratios can provide great signals. Create graphs like this to better understand your engagement.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_29_0-dau-wau-mau.png" alt=""/><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><ul><li><strong>Renaming filters</strong> - You will now be able to set custom names for your graph series. Your teammates will now be able to better understand your graphs.</li><li><strong>UI improvements</strong> - We&#x27;re introducing significant UI improvements across the board to better match our <a href="/founders/postmortem-rebrand">new branding</a>. </li><li><strong>Column configurator</strong> - You will now be able to select the columns you want to see in your events table.<img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_29_0-column-configurator.png" alt=""/></li><li><strong>Password reset revamp</strong> - We&#x27;ve shipped a lot of improvements to the password reset experience, including a new UI, API processing, and even new email designs 🎨. If you run with SAML-only login, password reset is now disabled.</li><li><strong>Fixes to dashboard loading</strong> - Previously loading huge dashboards could be quite slow and in some scenarios even cause some backend strain, this is now fixed.</li><li><strong>Improved navigation in Insights</strong> - A lot of under-the-hood improvements which will make navigation in Insights significantly smoother. Clicking back in your browser will now work as expected.</li><li><strong>Automatically load new events</strong> in the events table.</li><li><strong>Fixed colors in insight table</strong> - We&#x27;ve fixed a pesky bug in which graph series were being displayed with different colors on the graph versus on the table below.</li><li><strong>Fixes to tooltips and person deep dive</strong> - We&#x27;ve improved the way we display information on tooltips and the person deep dive modal.</li><li>Plus <strong>350+ more</strong> improvements &amp; fixes.</li></ul><h3 id="deprecation-notice">Deprecation notice</h3><ol><li><p>We&#x27;re deprecating the sessions page and fully removing it in PostHog 1.30.0. Read more about it, <a href="/blog/sessions-removal">in this blog post</a>. If you have any feedback on this change, please <a href="/posts">reach out</a>.</p></li><li><p>In PostHog 1.30.0 we will be introducing major improvements to the experience of using PostHog with multiple projects and that requires us to rework part of the API structure. Hence, in PostHog 1.29.0 the following API paths are deprecated, with straightforward replacements:</p></li></ol><ul><li><code>/api/action/</code> becomes <code>/projects/&lt;project_id&gt;/actions/</code></li><li><code>/api/annotation/</code> becomes <code>/projects/&lt;project_id&gt;/annotations/</code></li><li><code>/api/cohort/</code> becomes <code>/projects/&lt;project_id&gt;/cohorts/</code></li><li><code>/api/dashboard/</code> becomes <code>/projects/&lt;project_id&gt;/dashboards/</code></li><li><code>/api/dashboard_item/</code> becomes <code>/projects/&lt;project_id&gt;/saved_insights/</code></li><li><code>/api/element/</code> becomes <code>/projects/&lt;project_id&gt;/elements/</code></li><li><code>/api/event/</code> becomes <code>/projects/&lt;project_id&gt;/events/</code></li><li><code>/api/feature_flag/</code> becomes <code>/projects/&lt;project_id&gt;/feature_flags/</code></li><li><code>/api/insight/</code> becomes <code>/projects/&lt;project_id&gt;/insights/</code></li><li><code>/api/paths/</code> becomes <code>/projects/&lt;project_id&gt;/paths/</code></li><li><code>/api/person/</code> becomes <code>/projects/&lt;project_id&gt;/persons/</code></li><li><code>/api/plugin_config/</code> becomes <code>/projects/&lt;project_id&gt;/plugin_configs/</code></li><li><code>/api/sessions_filter/</code> becomes <code>/projects/&lt;project_id&gt;/session_filters/</code></li></ul><p>In a future PostHog version the deprecated paths will be removed. At the same time we will also have to remove the special <code>project_id</code> value <code>@current</code> (representing the currently selected project).</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog News</h2><p>Welcome Harry Waye! Harry is joining us as a Full Stack Engineer on the <div slug="infrastructure">Platform Team</div>.</p><h2 id="community">Community</h2><h3 id="community-mvp-">Community MVP 🏆</h3><p>Thanks to all our community members for helping move PostHog forward! This release cycle&#x27;s Community MVP goes to <a href="https://github.com/jyuvaraj03">jyuvaraj03</a>!</p><p>Yuvaraj implemented the highly requested feature to let you duplicate dashboards! This way, you will now be able to use a dashboard as a template for other dashboards. The feature will be fully available on the next release (1.30.0).</p><h3 id="community-shoutouts">Community shoutouts</h3><p>We want to thank each and every community member that contributed to this release of PostHog!</p><ul><li><a href="https://github.com/jyuvaraj03">jyuvaraj03</a> 🏆</li><li><a href="https://github.com/tirkarthi">tirkarthi</a></li><li><a href="https://github.com/geary">geary</a></li><li><a href="https://github.com/dakshshah96">dakshshah96</a></li><li><a href="https://github.com/terrymunro">terrymunro</a></li><li><a href="https://github.com/stefnnn">stefnnn</a></li><li><a href="https://github.com/csykes">csykes</a></li><li><a href="https://github.com/skabbes">skabbes</a></li><li><a href="https://github.com/banagale">banagale</a></li><li><a href="https://github.com/leoMehlig">leoMehlig</a></li><li><a href="https://github.com/asherf">asherf</a></li><li><a href="https://github.com/steveyackey">steveyackey</a></li></ul><h2 id="open-roles">Open roles</h2><p>Join us in helping make more products successful! We&#x27;re currently hiring for the following roles:</p><ul><li>Developer Educator</li><li>Software Engineer</li><li>Technical Content Marketer</li><li>Technical Customer Success Manager</li></ul><p>Learn more about these roles on our <a href="https://posthog.com/careers">Careers page</a>.</p><p>Don&#x27;t see a role for you? We&#x27;re always looking for exceptional people, so reach out to us via the link above.</p><hr/><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[An introduction to product analytics and how it works]]></title><description><![CDATA[What is product analytics? At the most basic level product analytics refers to the process of gathering data about how a product is used, then…]]></description><link>https://posthog.com/blog/what-is-product-analytics</link><guid isPermaLink="false">3dfe05d1-1892-519a-a54c-d35afb82707e</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 21 Oct 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<h2 id="what-is-product-analytics">What is product analytics?</h2><p>At the most basic level product analytics refers to the process of gathering data about how a product is used, then analyzing that data in order to make decisions about improving it.</p><p>Where it gets more complicated is in the particular situations and decisions that are made using product analytics tools.</p><p>A good example of product analytics in action is collecting information about how many users reach each stage of an onboarding funnel, then using that information to improve or optimize a funnel. This is exactly <a href="/customers/hasura">what companies such as Hasura use tools like PostHog for</a>!</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/tutorials/pirate-funnel/slide-funnels.png" alt="Product analytics funnel"/></p><p align="center"><figcaption>Above: An example of a simple product analytics funnel</figcaption></p><p>There are two types of data which you can gather for product analytics:</p><ul><li><em>Quantitative data</em> is objectively measurable, such as an increase in a number of users or sales. Using <a href="/docs/user-guides/funnels">funnel analysis</a> in PostHog to measure drop-off is an example of quantitative data analysis.</li><li><em>Qualitative data</em> is that which is subjective, such as user feedback or observations. Using <a href="/docs/user-guides/recordings">session recording</a> in PostHog to intuit where users may be experiencing friction is an example of qualitative data analysis.</li></ul><p>There are also frameworks which can be used to translate information between the two. <a href="/product-engineers/nps-vs-csat-vs-ces">NPS and CSAT scores</a>, for example, are often used to translate user sentiment into a measurable data point.</p><blockquote><p>This article is part of our <a href="/tracks">PostHog Academy series</a> where we explain the fundamentals of product analytics.</p></blockquote><h2 id="why-are-product-analytics-tools-important">Why are product analytics tools important?</h2><p>Product analytics tools are important because they enable you to make thoughtful and well-informed decisions about changes to a product. Product analytics tools also enable you to measure success (or failure!) when needed, so you know if you need to rollback or double-down on a change. </p><p>It&#x27;s possible to get by without product analytics, but then it&#x27;s impossible to know if changes are having a beneficial impact, or even if you are solving the right problems to start with. Product development without product analytics is like stumbling around in a dark room, trying to find the way out. You <em>might</em> find the way out, but you might also fall down a hole! </p><h2 id="who-uses-product-analytics">Who uses product analytics?</h2><p>Nearly all modern businesses will employ product analytics tools at some level, from new start-ups such as <a href="/customers/pry">Pry</a> to established products with thousands of users such as <a href="/customers/hasura">Hasura</a>.</p><p>Product analytics tools are <em>not</em> used solely by Product teams, but can be used by a wide range of teams or individuals within a business. These can include:</p><ul><li>Product Managers or Product Engineers</li><li>Software Engineers or Developers</li><li>Leadership or senior management</li><li>UI or UX Designers</li></ul><p>Individuals will often employ product analytics on a particular area, depending on their role. Product Engineers, for example, may investigate the adoption rate for new features so that they can make decisions about the product roadmap. Meanwhile, UX Designers may use product analytics tools to understand where users are rage-clicking, so they can optimize the interface. </p><div><div imageSource="/images/customers/joe.png" name="Joe Saunderson" title="Software Engineer, Mention Me" quote="“We use feature flags to issue changes to 50% of users and then compare the effect. Experiment, find results, decide where to focus and then iterate.”"></div></div><h2 id="what-product-metrics-should-i-track">What product metrics should I track?</h2><p>It’s important when using product analytics tools to look at metrics relevant to specific decisions. Metrics such as the number of customers, can give you a good sense of your overall <a href="/blog/product-health-metrics">product health</a> but won&#x27;t help you plan a roadmap.</p><p>One simple set of metrics which can help all teams to focus their efforts is the so-called pirate funnel, which was created by Dave McClure and tracks AARRR. That stands for:</p><ul><li><em>Acquisition:</em> Users who discover your product (e.g. free trials, web traffic)</li><li><em>Activation:</em> Users who use your product (e.g. sign-ups, first orders)</li><li><em>Retention:</em> Users who stay with your product (e.g. repeat purchases)</li><li><em>Revenue:</em> The money bought in by users (e.g. Subscriptions, LTV)</li><li><em>Referral:</em> The users who share your product (e.g. reviews, shares)</li></ul><blockquote><p>Find out <a href="/blog/aarrr-pirate-funnel">how to build a AARRR funnel</a> in PostHog</p></blockquote><h2 id="do-i-need-to-share-my-data-when-using-product-analytics-tools">Do I need to share my data when using product analytics tools?</h2><p>No. </p><p>Most product analytics tools such as Mixpanel and Amplitude work by capturing user actions with a short code snippet or third-party cookie which sends data to their data centers. But not all platforms work this way.</p><p>PostHog enables you to self-host your product analytics, so you keep data on your infrastructure and don&#x27;t need to share data with anyone. Not even PostHog. </p><p>There are many situations where it may be preferable not to share data with a third-party analytics platform, such as a need to protect user information or mitigate the risk of data breaches. Self-hosting product analytics also provides other benefits, such as circumventing ad blockers due to the lack of third-party cookies.</p><blockquote><p>Find out <a href="/docs/self-host">how to self-host product analytics</a> with PostHog and easily deploy to your infrastructure using DigitalOcean. </p></blockquote><h2 id="is-google-analytics-good-for-product-analytics">Is Google Analytics good for product analytics?</h2><p>No.</p><p>Google Analytics is one of the most popular analytics platforms in the world and is useful for understanding a number of important metrics, but it isn’t the ideal platform for running product analytics. This is because Google Analytics was built to help users understand web metrics, rather than answer questions about <em>why</em> users behave in certain ways. </p><p>In short, Google Analytics provides a handy overview of web traffic or vanity metrics such as bounce rate, but it doesn’t offer tools such as feature flags or session recording.</p><p>As a result, Google Analytics is often the preferred tool for specific roles in a Marketing team that uses other Google tools, but is unsuitable for the needs of Product or Engineering teams. </p><h2 id="what-are-the-best-product-analytics-tools">What are the best product analytics tools?</h2><p>Naturally, we think PostHog has the best product analytics tool available. </p><p>Why? PostHog enables you to self-host your analytics, integrates with tools such as data warehouses and offers everything you need to interrogate your data in a simple, visual UI. No SQL required. PostHog also offers many unique features which closed-source competitors do not, such as feature flags and session recording. </p><p>There are a variety of product analytics tools available to choose from however, each with its own quirks and strengths. Popular options include platforms such as Amplitude, Heap, or Mixpanel, though none of these offer self-hosted deployments. </p><h2 id="further-reading">Further reading</h2><ul><li><p><a href="/blog/introduction-to-customer-retention">An introduction to customer retention</a>: Customer retention metrics are vital to the long term success of any product</p></li><li><p><a href="/blog/how-to-measure-product-engagement">How to measure product engagement</a>: How to define engagement for your platform, and how to use analytics tools to measure and build on the results</p></li><li><p><a href="/blog/how-to-product-market-fit">How to achieve B2B product market fit</a>: How to approach finding market fit for a B2B product</p></li></ul><blockquote><p>PostHog is an open-source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why we're removing the sessions page]]></title><description><![CDATA[This blog post explains why we're removing the "Sessions" page in PostHog. This page used to contain a daily list of all sessions by your users…]]></description><link>https://posthog.com/blog/sessions-removal</link><guid isPermaLink="false">cadcb970-4348-5d14-b40a-f3e37f29bffa</guid><dc:creator><![CDATA[Paolo D'Amico]]></dc:creator><pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/generic-release-notes.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>This blog post explains why we&#x27;re removing the &quot;Sessions&quot; page in PostHog. This page used to contain a daily list of all sessions by your users, separating them by periods where inactivity lasted longer than 30 minutes. In addition, this is where you would be able to access <a href="/docs/user-guides/recordings">recordings</a>.</p><p>Now, you will see a <strong>Recordings</strong> tab on the main menu in its place.</p><h2 id="why">Why?</h2><p>We got continuous reports from users that this page was causing confusion (e.g. &quot;missing recordings&quot;, sessions definition not fitting all use cases, inability to filter properly), which led us to question the purpose of this page and sessions in general at PostHog. </p><p>We found two main session analytics use cases:</p><ol><li>Run session-based behavioral analytics. Useful for products with certain types of engagement where interactions over time are important and natural. Examples: Netflix, Slack, Notion.</li><li>Explore, debug, deep dive to answer <em>why</em> users are behaving a certain way.</li></ol><p>We realized we don&#x27;t currently support the first use case fully. The only session-based analysis you can do is session duration distribution and even then it has the fundamental problem of how sessions are computed. Not all products define sessions the same way, and further, we had edge cases such as server-side events being sent asynchronously for a user.</p><p>For the second case, sessions is not the best way to solve the problem. Further, all the work we are doing around Paths and Quantitative Analysis (see <a href="/handbook/strategy/overview#milestone-2-early-august-onwards">Diagnosing Causes</a>) will actually solve for this use case and provide significantly more value. In particular, you&#x27;ll get the same useful qualitative information, but the quantitative overlay will greatly reduce bias (and effort).</p><h3 id="whats-new">What&#x27;s new?</h3><p>From the context above, we decided to take the following actions:</p><ul><li><p>We have removed the Sessions page. It introduced significant confusion and provided limited value. Less than 3% of pageviews in the app in the last month were on the sessions page for users with no recordings enabled (proxy metric).</p></li><li><p>We introduced a recordings list page instead. This page is mostly intended for finding specific recordings you want to watch (e.g. customer support or recordings with exceptions). This page also includes filtering tools geared towards that. <em>Funnels will be the starting point for other use cases.</em></p></li><li><p>On the Person modal you get when clicking on a data point in an insight graph, and particularly in Funnels, you now get a direct link to relevant recordings for the specific users in the data point.
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/person-modal-with-recordings.png" alt="Person modal with recordings"/></p></li><li><p>On a Person page, recordings are now shown first (if enabled) and events as a secondary tab.</p></li><li><p>We&#x27;ve renamed the &quot;Sessions recordings&quot; feature into just &quot;Recordings&quot; to make it clear these are separate features, with different use cases.</p></li><li><p>We&#x27;re evaluating getting rid of the &quot;Sessions&quot; insight. The functionality is quite limited (only a time distribution with scant visualization) and confusing (e.g. the events/actions that compose a session). Further, only 1.5% of insights analyzed in the last month were on &quot;Sessions&quot;. Please <a href="https://app.posthog.com/home#supportModal">reach out</a> if you have any thoughts.</p></li></ul><p>In addition to the changes above, we&#x27;re also significantly improving recordings ingestion and the playback experience. This will make sure more sessions are captured and that you can seamlessly find the relevant parts of a recording.</p><blockquote><p>💡 <strong>Not seeing these changes yet?</strong> We&#x27;re A/B testing some of these changes in PostHog Cloud, you may still not be in the release group. Please <a href="/posts">contact us</a> if you&#x27;d like to be included. If you&#x27;re on a self-hosted deployment of PostHog please keep an eye out for the next release.</p></blockquote><h2 id="whats-next">What&#x27;s next?</h2><p>We are considering full support for session-based <a href="/product-engineers/behavioral-analytics">behavioral analytics</a> and want to gather more context on the use cases for this. In particular, we want to make sure users have flexibility around their own concept of sessions, support a full range of analytics (e.g. session count, duration, multi-device sessions), etc.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we designed the PostHog mascot]]></title><description><![CDATA[Creating mascots goes beyond just putting iPencil to iPad. It’s a long, confusing, and sometimes frustrating process which requires a lot of patience…]]></description><link>https://posthog.com/blog/drawing-hedgehogs</link><guid isPermaLink="false">41d30920-435e-5394-bff0-84e25575b31b</guid><dc:creator><![CDATA[Lottie Coxon]]></dc:creator><pubDate>Thu, 07 Oct 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/blog-hedgehog-design.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Creating mascots goes beyond just putting iPencil to iPad. It’s a long, confusing, and sometimes frustrating process which requires a lot of patience and tolerance for drawing hedgehogs 12 hours a day.</p><p>A successful mascot should go beyond representing what a company does. It should build and strengthen a brand&#x27;s identity by representing its tone of voice and overall vibe. Think about GitHub&#x27;s octocat mascot, which is now a familiar figure in memes, merch, and even statues. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/github-octocat.jpeg" alt="GitHub - Octocat"/></p><h2 id="think-before-you-ink">Think before you ink</h2><p>When I set out to design PostHog&#x27;s mascot, it felt like there was an ocean of possibility. I&#x27;ll admit I&#x27;ve chased ideas in the past simply because they were cool or aesthetically pleasing, but this can be dangerous. So, I took the time to think and reflect before diving into the creative process. I&#x27;ve learned that taking the time to consider what your company stands for and who it is selling to helps massively later in the process. </p><p>For example, last year I chased a &#x27;tech-head&#x27; visual involving human mascots with old Acorn computers for their heads. Aesthetically it looked modern and surrealist, but it was also subliminally suggesting that PostHog was outdated and inhuman - not what you want for a forward thinking tech startup. </p><p>Eventually I realized my error and iterated towards something better - but please, learn from my mistake and avoid such confused fumblings.</p><h2 id="do-market-research">Do market research</h2><p>I find that some good old market research is the perfect spring board for ideas, and that looking at companies with similar values can be especially rewarding. </p><p>When creating PostHog&#x27;s mascot, I took inspiration from companies such as Sentry and Hasura, both of which balance a very technical product with colourful and friendly mascots. They strike the perfect balance between playful and modern styles which allows the user to feel at ease.</p><p>Both Sentry and Hasura also use their logos as inspiration for their mascots. From here, it was obvious to me which direction to go in and that the hedgehog must be brought back. </p><h2 id="origins-of-a-hedgehog">Origins of a hedgehog</h2><p>In the early days of PostHog we often debated whether the hedgehog should be a main character for our brand or if it would be too distracting. Since then, we&#x27;ve jumped from the original &#x27;hairy thumb&#x27; logo designed by our founder and CEO, James, to focusing on 80s pixel art, to space and rockets and back to hedgehogs. </p><p>It’s been a process, to say the least, but an informative one. We never should have strayed from our first and one true love: the hedgehog. </p><p>The hard part, of course, is actually designing the hedgehog. This is no easy feat, but the secret is the same as most things at PostHog: focus on iteration and experimentation. </p><p>My process is as follows:</p><ul><li>Don’t think too much, just draw</li><li>Draw a lot and be willing to make mistakes</li><li>Try things you think you won’t like (if its awful, at least you’ve ruled it out)</li><li>Don’t copy from others. You may think this will allow you to improve, but people will see through it. Originality makes you great.</li></ul><h2 id="use-a-tablet">Use a tablet</h2><p>Personally, I use a tablet to aid me in the drawing process. Maybe I&#x27;m biased or maybe I’m wise but there is nothing more satisfying than being able to press undo instead of starting again on paper - though I&#x27;ve been known to try to pinch zoom on real-life paper. </p><p>Using a tablet also lets me share unfinished ideas quickly, so I can expand on them later. I use [ProCreate] or [Fresco], both of which allow for realistic drawing with a wide range of pencils, pens, and even paint. </p><p>What really sets digital drawing apart from traditional design practice is that it comes with <em>layers</em>. Layers change lives. Long gone are the days of linear painting - now I can select a layer and work in isolation on that, or cut out a small section and reuse it later (because I love to recycle). It has sped up my work while giving me so much freedom to work with my creations. Would 10/10 recommend to a friend.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/hairy-thumb-logo.jpeg" alt="PostHog - Hairy Thumb"/></p><p>This was our initial logo, made by our CEO James. Since this humble beginning the hedgehog has had many faces, some of which were better than others. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/square-hedgehog-logo.jpeg" alt="PostHog - Square Hedgehog"/></p><p>Take this square, dead-eyed creature, for example. To be honest I quite liked him and felt he gave off a quirky vibe. But he lacked character, and he had a cold, hard stare, which when looking back onto the brief it wasn’t what we wanted.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/sun-hedgehog.jpeg" alt="PostHog - Sun Hedgehog"/></p><p>Injecting a bit more character into the mix, I created this fella. He gave off a happier, friendlier vibe - maybe because he can’t see and wears glasses. This was progress. But something didn’t quite feel right. He felt old and out of touch - once again I found myself not quite sending the right message. It was time for something different.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/3d-hedgehog.jpeg" alt="PostHog - 3D Hedgehog"/></p><p>Next, I dabbled in 3D. I created a hedgehog in Blender to break the mould of what a mascot could look like - but this backfired and the little guy just felt cold and robotic. I was chasing something warmer, with character, something friendly. Something like...</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/pastel-hedgehog.jpeg" alt="PostHog - Final Hedghehog"/></p><p>This guy, with his texture and silly, frumpy round body, just makes me happy. He reminds me of the kawaii character Gudetama, except this hog doesn&#x27;t have his bum out.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/work-hedgehog.png" alt="PostHog - Working Hedgehog"/></p><p>I liked the idea of this hedgehog as a relatable character, who sits at his desk tapping away at keys just like us. I think that is key for a successful mascot,; something the team can get behind.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/police-hedgehog.jpeg" alt="PostHog - Police Hedgehog"/></p><p>From here the character grew and grew, taking up new hobbies and professions, such as the police hog, who stops our users  making mistakes when filling in forms. Helpful, yet stern.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/drawing-hedgehogs/hedgehog-evolution.gif" alt="PostHog - Hedgehog Evolution"/></p><p>As you can see, the hedgehog went through about 18 different variations before I knew which one suited the brand best - including large, small, angry, 3D and even square versions. </p><p>You need to test different versions to find what works - but even after finding that golden hog you still need to iterate to strengthen that brand identity.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to seed, grow, and scale Developer Relations (and how we're doing it at PostHog)]]></title><description><![CDATA[Developer Relations exists and is executed in different ways at almost every company. Our Developer Relations journey at PostHog has just begun, and…]]></description><link>https://posthog.com/blog/seed-grow-scale-devrel</link><guid isPermaLink="false">b7a7c36b-e8c6-5cb2-8173-0ef56b1137a8</guid><dc:creator><![CDATA[Phil Leggetter]]></dc:creator><pubDate>Thu, 30 Sep 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/devrel-posthog-roles.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Developer Relations exists and is executed in different ways at almost every company. Our Developer Relations journey at PostHog has just begun, and we still don&#x27;t know exactly what it will look like in the medium term. But we can still assess what our needs are going to look like and formulate a plan to seed, grow, and scale Developer Relations. This plan, at the very least, provides a level of clarity that enables us to move forward as we iterate, learn, and continuously improve.</p><p>In this post, I&#x27;ll share the questions I&#x27;ve posed myself about seeding, growing, and scaling Developer Relations. I&#x27;ll include my general answers and the specifics about how we&#x27;re approaching DevRel at PostHog. In doing so, I hope you will find the sharing of these questions, how we intend to answer them, and the process we&#x27;ve gone through valuable when planning the growth of your DevRel team.</p><h2 id="does-your-company-need-developer-relations">Does your company need Developer Relations?</h2><p>This one is simple. If a company has one or more products that developers use, then the answer is &quot;yes&quot; because Developer Relations exists to serve customers who are developers.</p><p>Needing DevRel doesn&#x27;t instantly mean you need to hire a team or even have a person in a full-time DevRel role. But it does indicate that you need somebody to wear a DevRel hat from time to time.</p><h3 id="at-posthog">At PostHog...</h3><p>PostHog is an open-source developer platform. We do have end-users of PostHog that aren&#x27;t developers. But there are plenty of interactions with PostHog from developers. It is <a href="/docs/self-host">installed</a>, maintained, <a href="/docs/integrate">integrated</a>, and also <a href="/using-posthog">used</a> by software developers with a product mindset. My current thinking is that a key persona for DevRel at PostHog is someone who would identify themselves as a &quot;Product Engineer&quot; or a product-minded software developer.</p><h2 id="what-will-developer-relations-do">What will Developer Relations do?</h2><p>Responsibilities that could fall to dedicated Developer Relations roles will likely fall to other team members at early stage developer-focused startups. But, as a company grows, there will be a need to have people taking on DevRel in a full-time capacity.</p><p>DevRel is a multi-functional profession:</p><ul><li><strong>Product vision and definition</strong>: Some Developer Relations teams wholly own parts of the product, but this will almost always come hand-in-hand with being responsible for engineering execution, too (see next bullet point). This will include market research, vision setting, and customer interviews to validate ideas or get product feedback. For example, at Nexmo/Vonage where I previously helped grow DevRel, the team was responsible for the API standards and the entire life-cycle of the documentation and server SDKs.</li><li><strong>Engineering execution</strong>: Within DevRel, this is often referred to as &quot;Developer Experience&quot;, &quot;DevX&quot; or &quot;DX&quot;. It&#x27;s unlikely to include responsibility for anything within a core platform but often encompasses ownership of more peripheral product assets such as documentation, SDKs, sample code, plugins, and integrations. The ownership of a documentation platform and docs creation can also fit either here or within Product.</li><li><strong>Customer success</strong>: You sometimes see partner developer advocates or partner engineers within Developer Relations who work directly with customers to help them deploy, integrate, and customize a product. This is most often the case at developer-centric companies with a partner ecosystem of apps or addons but can sometimes be the case at pure API companies. These roles more traditionally sit within Sales as Sales Engineers or Solutions Engineers.</li><li><strong>Developer-focused marketing</strong>: Ranging from customer enablement through tutorials, screencasts, and onboarding emails, to acquisitional or brand awareness marketing. Yes, DevRel does indeed do marketing                                                                                                                                                                                                                                                                                                                             ; occasionally, very traditional marketing such as sponsorship and paid advertisement for brand awareness and acquisition, but should spend the majority of time on education. The line can get a little blurred here with developer experience.</li></ul><p>What activities you&#x27;ll need your DevRel roles to undertake from the above will depend on the company goals and on:</p><ul><li>Gaps identified in what your existing teams are doing but aren&#x27;t going to take on.</li><li>What activities should be handed off from other team functions to allow them to focus elsewhere.</li><li>Company stage of growth or strategic shift that introduces the need, increases the need or identifies an opportunity for DevRel.</li></ul><p>Anyone who knows me and is reading this may be surprised I&#x27;ve not mentioned <a href="http://www.leggetter.co.uk/aaarrrp">AAARRRP, the DevRel strategy framework</a> yet. Well, there you go. The point of AAARRRP is to help you <strong>map your company&#x27;s goals to DevRel activities that can help you achieve those goals</strong>.</p><blockquote><p><strong>Further reading:</strong> If you find this guide useful, you might also enjoy what we&#x27;ve learned about <a href="/blog/dev-marketing-for-startups">dev tool marketing</a> so far.</p></blockquote><h3 id="at-posthog-1">At PostHog...</h3><p>PostHog has seen significant growth over the past year resulting in a <a href="https://posthog.com/blog/15-million-series-b">Series B raise</a>. Following this, <a href="/james">James</a> and <a href="/tim">Tim</a>, our co-founders, decided it was the right time to introduce dedicated DevRel roles (I&#x27;m particularly pleased about this because it means I now get to work here!). Before this, all potential DevRel activities were spread across other team members. But, because PostHog is a developer-centric company, operates with <a href="/handbook/company/small-teams">small teams</a>, and embraces <a href="/handbook/company/values#step-on-toes">stepping on toes</a>, people need to continue to do what&#x27;s required to ship. There are, however, some gaps and opportunities where DevRel can make improvements or begin new activities.</p><p>In the near term, our AAARRRP goals are Activation, Retention, Referral, and Product. Instead of narrowing in on specific activities, we&#x27;ve broadly mapped the priorities as:</p><ol><li><strong>Oversee documentation</strong>: This isn&#x27;t about dictating how documentation is written or being a gatekeeper. It&#x27;s about encouraging and enabling consistency, having the time to iterate on content that could otherwise become stale, and identifying gaps based on analysis, feedback, or utilizing team experience. DevRel, much like our amazing <div slug="website"></div>, can function as a service team with people deployed to the small team that most requires them at that time.</li><li><strong>Catalyze our community</strong>: We have a thriving community across <a href="https://github.com/posthog">our GitHub repos</a> and the <a href="/posts">PostHog community page</a>. On GitHub, we reward contributions with thanks on our READMEs, a listing on the <a href="/contributors">Contributors page</a> of our website, and credit for our <a href="https://merch.posthog.com">merch store</a>. But we want to do more to build upon this fantastic foundation because [community is core to our business](/handbook/strategy/business-model #why-would-you-work-on-the-community-edition).</li><li><strong>Engage with broader developer communities</strong>: Right now, the only community we actively engage with is the one we&#x27;ve built. We need to expand our reach and build relationships within communities that will benefit from the PostHog platform.</li></ol><h2 id="what-developer-relations-roles-do-you-need">What Developer Relations roles do you need?</h2><p>The roles your company needs depend on the focus and activities undertaken by people within DevRel roles.</p><p>The most frequently found roles within Developer Relations and the activities they undertake are<sup>†</sup>:</p><ul><li><strong>Developer Advocate</strong>: A generalist role who takes on numerous DevRel activities. This role is also the role you&#x27;d expect to see out representing your brand within external communities.</li><li><strong>[Developer] Community Manager</strong>: Responsibilities will range from defining programs that enable community engagement and growth to event management.</li><li><strong>Developer Educator</strong>: A role focused on content and code samples that educate developers - normally expected to focus on written and video content as well as possible courses or self-paced learning.</li><li><strong>Developer Evangelist</strong>: Like the developer advocate, this is a generalist role traditionally associated with marketing-focused activities.</li><li><strong>Developer Relations Engineer</strong>: A newer catch-all job title for a code-focused role within DevRel. The job spec for this role is frequently very similar to that of a Developer Advocate.</li><li><strong>Developer Experience Engineer</strong>: Focusing on the experience that developers have when using a product. Covers documentation, API standards and specs, SDKs, code samples, integrations, and other assets directly touched by the developer customer.</li></ul><p><em><sup>†</sup> [Source: Most popular roles within Developer Relations](<a href="https://noti.st/leggetter/9B23EW/defining-the-roles-within-developer-relations-v0-1-0">https://noti.st/leggetter/9B23EW/defining-the-roles-within-developer-relations-v0-1-0</a> #s6yhNbi)</em></p><h3 id="at-posthog-2">At PostHog...</h3><p>We&#x27;ll hire based on our activities priority list:</p><ol><li><strong>Oversee documentation</strong>: A role we&#x27;re actively hiring for is a <a href="https://apply.workable.com/posthog/j/F928106DB5/">Developer Educator</a> who will focus on documentation and enabling our existing customer base, making it easier for Data Engineers to integrate with PostHog. We&#x27;ve gone with this role over Technical Writer (omitted from the list above because it&#x27;s a very broad job title) because, although the initial focus is docs, we do want this person to engage with the community and create other types of educational content in the future. I would like to hire a Tech Writer in the future to help provide even more structure and standardization to our docs.</li><li><strong>Catalyze our community</strong>: The hire we require for this is a Community Programs Manager to define programs and execute on them.</li><li><strong>Engage with broader developer communities</strong>: Once we&#x27;ve identified key external communities, we&#x27;ll hire a Developer Advocate with the interests and skills required to authentically engage with those communities.</li></ol><h2 id="how-do-you-seed-and-grow-developer-relations">How do you seed and grow Developer Relations?</h2><p>In early-stage startups that need Developer Relations, the go-to hire is frequently a Developer Advocate because this person will have to do a bit of everything. The company is probably still trying to work out what DevRel will do.</p><p>The other roles that are often the first DevRel hires are Technical Writers and Developer Educators because documentation, sample code, and exceptional developer content is fundamental to developer-focused products. A Developer Educator role has more of a focus on community engagement activities such as blog posts and video creation.</p><p>As a company grows, there will be more specialization. This isn&#x27;t specific to DevRel and is common across many functions.</p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/devrel-seed-grow-grow-more-diagram.png" alt="DevRel: Seed, grow, and, grow more by function" class="blog-post-img-large"/><p>You may begin by hiring one or more generalist Developer Advocates who will contribute to docs, update and maintain SDKs, create sample code, and engage with external communities. It&#x27;s also likely that you&#x27;ll need to bring a Community Manager on board to engage with directly and facilitate broader engagement with communities.</p><p>As the company and thus DevRel team grows, you&#x27;re going to need specialist roles.</p><p>For example, you can create a Developer Experience team of Technical Writers/Developer Educators and Developer Experience Engineers that focus on documentation, SDKs, and sample code. Developer Advocates will then shift focus to more community engagement activities such as workshops, meetups, speaking, and continuously gathering feedback directly from developers or identifying technology trends within communities. In addition, you may create a Developer Education team focused on blog and video content because 2020 has demonstrated the value of companies having such dedicated developer content teams.</p><p>As this growth-fueled shift occurs, it&#x27;s essential to understand that you&#x27;re changing the roles&#x27; definition - or at least the potential breadth. You may lose people who like being a generalist unless you can continue to allow them to contribute outside of their specialization. For example, Developer Advocates are likely hands-on coders, so when shifting, ensure they still have opportunities to contribute to docs, SDKs, and sample code.</p><h3 id="at-posthog-3">At PostHog...</h3><p>I&#x27;ve been hired as the first person in Developer Relations, and I&#x27;ve spent some time working on docs, engaging with our community on GitHub and Slack, have organized some newsletter sponsorship, and am taking a look and upgrading our swag/merch. I&#x27;m the generalist first hire.</p><p>The &quot;What DevRel roles do you need?&quot; section outlines our likely short-term hiring plan of Developer Educator, Community Programmes Manager, a Developer Advocate, and ideally a Technical Writer. Beyond that, I can see a few growth opportunities:</p><ul><li><strong>More Developer Educators</strong>: I see the benefit of more Developer Educators joining the team to ensure that we have content that enables developers to deploy, maintain, scale, integrate, and extend (see <a href="/docs/apps">apps</a>) the PostHog open-source platform. As we grow, I can see people in these roles specializing in either existing customer education (Activation) or using educational content to reach new developers (Acquisition). A rotation schedule<sup>††</sup> could be implemented to ensure opportunities to maintain a broad skillset exist.</li><li><strong>Developer Advocates for external communities</strong>: As we identify key external communities, there&#x27;s a definite benefit to having developer advocates focused on them. At Nexmo/Vonage, we hired programming language developer advocates (JS, Python, Ruby, PHP, C                                                                                                                                                                                                                                                                                                                                      # .NET, Java etc.) because we believed a communications API platform has potential value to most developers. At PostHog, the advocacy roles are more likely to be focused on:</li><li>General web and app technology trends such as Next.js, Gatsby, Supabase, Sanity.io, Netlify, Vercel etc. used by progressive companies who are building new or actively upgrading products. For this, a Jamstack Advocate may be the correct role.</li><li>Data storage, manipulation, and transformation technologies such as Snowflake, Data Bricks, Google/BigQuery, Microsoft Azure/SQL Data Warehouse, ETL platforms, etc. A Data Cloud Advocate may be the right role to focus on these technologies.</li><li><strong>Create a startup program</strong>: In the same way that every company needs to send email to engage with their customers, every company needs to understand and improve how their customers are using their product. I use this analogy because SendGrid were very successful in their work with startup communities. So, working with startup incubators and accelerators to ensure PostHog is the go-to developer platform is a no-brainer to me. Starting with FinTech may be a good approach since it will align with our focus on companies that have a fundamental need for privacy and data control.</li></ul><p><em><sup>††</sup> I can see value in a rotation schedule being across multiple DevRel roles and also into non-DevRel roles.</em></p><h4 id="a-developer-relations-guild">A Developer Relations Guild</h4><p>As things stand, I don&#x27;t believe we&#x27;re going to form a &quot;DevRel team&quot;. Instead, I believe we&#x27;ll have a <strong>DevRel Guild</strong> where DevRel roles will reside within <a href="/handbook/company/small-teams">small teams</a>, providing DevRel skills to those teams as they need them. If we grow as outlined above, I can see teams formed that consist mainly of DevRel roles with a focus on experience, education, and marketing.</p><p>How we grow will change with the company needs, but this gives us a few directions we could potentially go in.</p><h2 id="how-do-you-scale-developer-relations">How do you scale Developer Relations?</h2><p>I believe there are three key factors:</p><ol><li>A team structure that empowers and provides focus.</li><li>Work with customers, partners, and community.</li><li>A transparent change management process that ensures the team can provide input and feedback.</li></ol><h3 id="an-empowering-team-structure">An empowering team structure</h3><p>I&#x27;ve already covered that with growth comes specialization. Specialization results in focus, and a team will ultimately be able to deliver more that way ; a team asked to focus purely on developer content creation will deliver more than a team asked to <a href="/newsletter/what-nobody-tells-devs-about-docs">write docs</a>, <a href="/docs/sdk-doctor">update SDKs</a>, write sample code, write blog posts, manage and present on Twitch streams, and speak at events.</p><p>Team structure can be <strong>Functional</strong>, <strong>Multi-Functional</strong>, or <strong>Regional</strong>, but the DevRel roles should be focused.</p><p>Examples of <strong>Functional</strong> and focused DevRel teams are:</p><ul><li><strong>Developer Experience</strong>: API standards, documentation, code samples, SDKs, libraries, other tooling that enables developers.</li><li><strong>Developer Education</strong>: Developer enabling content covering documentation, blog posts, static video, live video, and other educational materials.</li><li><strong>Community</strong>: Creating and managing programs for customers, partners, and third-party communities. At some companies, this team can also support and enable community within the company.</li><li><strong>Integrations &amp; Partnerships</strong>: Integrations with third-party technologies used by developers, direct integrations with key customers, or helping build an ecosystem with partners such as those seen with Slack apps, Salesforce apps etc.</li></ul><p>In a <strong>Multi-Functional</strong> team set up where a team consists of Product Managers, Engineers, DevRel roles, and Marketing roles, the specialization may change from sprint to sprint as a product moves through the product life-cycle ; from inception/proof of concept through to a go-to-market phase. <em>Occasionally</em> changing specialization can be a good setup for a generalist developer advocate, allowing them to apply their broad range of skills but still have time to focus in stages as product development progresses.</p><p>For example, the DevRel role&#x27;s focus may shift:</p><ul><li><strong>Proof of Concept</strong>: At this stage, the person in the DevRel role may be &quot;customer zero&quot; (see <a href="https://developerrelations.com/dev-rel/the-developer-advocate-as-customer-zero">the developer advocate as customer zero</a>), providing feedback and acting as a customer.</li><li><strong>Development</strong>: Continuing to act as &quot;customer zero&quot; as well as preparing the assets and structure for the beta (or other early access) program.</li><li><strong>Beta</strong>: Executing on the beta plan, using this stage to raise awareness and excitement with developers, enabling developers with the product, and getting product feedback.</li><li><strong>Go-to-market</strong>: Ramping up activities focused on awareness, acquisition, and <a href="/product-engineers/activation-metrics">activation</a>.</li></ul><p><strong>Regional</strong> teams are often multi-functional but, as you&#x27;d expect, focus on a specific geographic location. You&#x27;ll most likely see this as the number of DevRel roles at a company gets to a point where it&#x27;s possible to justify having North American, EMEA, and APAC regional teams.</p><p>It&#x27;s always important to be collaborative. But there&#x27;s also a lot of value in not having to collaborate on absolutely everything to get something done. Therefore, a team should be <strong>empowered</strong> as much as possible to do everything they need to get stuff done ; equipment, software, skills, authority, budget, and more. If you&#x27;re leading a DevRel team, this most definitely means support. Your role as a leader of a DevRel team - and any empowered team - is to support and enable them, not tell them what to do.</p><h3 id="work-with-customers-partners-and-community">Work with customers, partners, and community</h3><p>When scaling, it&#x27;s essential to think beyond simply adding headcount. That, in itself, isn&#x27;t scaling. You&#x27;re only really scaling a team if further investment increases output more than the increase in input. For example, if a Developer Education team of five people produces five pieces of content a week (one piece per person), adding another person should result in the team producing more than one additional piece of content a week. The additional headcount should help the team be more efficient or create new programs that result in exponentially more content (at least more than one piece per week from the previous example).</p><p>So, how do you scale DevRel? As discussed, a specialized, focused, and efficient team is a step in the right direction. But, the real opportunity to scale is through collaboration with customers, partners, and your broader community. Let&#x27;s use the word &quot;community&quot; to encapsulate customers, partners, and the wider community to simplify things.</p><p>Firstly, you should work for and with your community to create a <a href="https://www.jimcollins.com/concepts/the-flywheel.html">flywheel effect</a>. You should do this in combination with programs that support and enable collaboration. Here are some examples:</p><ul><li><strong>Open-source</strong>: Open-source as much as you can to enable your community to provide feedback and contribute. At a minimum, this should include your documentation, sample code, SDKs, and API specifications. If possible, open-source your whole platform (see <a href="https://en.wikipedia.org/wiki/Open-core_model">open-core</a>).</li><li><strong>Value-add &quot;write for us&quot; program</strong>: &quot;Write for us&quot; programs shouldn&#x27;t be a cheap way to get content. But, they can be effective if they provide genuine value to the author. Beyond payment or a donation to a charity chosen by the author, this means providing detailed feedback on content to help the author improve as a writer and software developer, attributing the content to the author and promoting it with acknowledgement to help them grow their profile.</li><li><strong>Rewards &amp; heroes program</strong>: Have a clear reward structure for contributions, celebrate your MVPs, and when you feel there&#x27;s a large enough community to justify it, create a hero or ambassador program.</li><li><strong>Meetups program</strong>: There are two approaches you can take here:</li></ul><ol><li>If you have a symbiotic alignment with an existing technology trend, it&#x27;s worth reaching out to existing meetup organizers and offering sponsorship. You will initially get out what you put in but, over time, this will create the desired flywheel effect.</li><li>If you&#x27;re fortunate enough to have a large or highly dedicated community, it&#x27;s worth considering creating a mechanism that allows your heroes or ambassadors to organize meetups. Create a meetup organizer package and help your hero set up, run, and support the meetup.</li></ol><p>As with many things in DevRel, these are unlikely to be quick wins. But, as the community grows, engages, and contributes, the velocity of the flywheel increases. As this happens, the community is increasingly responsible for the input and output as you work to scale your DevRel program. A word of caution: do not start too many programs in parallel. Instead, identify the one with the highest value and get that right first. Then, move on to the program with the next highest value.</p><h3 id="change-management">Change management</h3><p>I&#x27;ll admit this sounds very <em>enterprisey</em>, but change management isn&#x27;t something that should only happen in enterprise organizations. I&#x27;ve seen change mismanaged at both startups and enterprises, and because I&#x27;ve felt this pain and managed the fallout, I know it&#x27;s so important.</p><p>The approach <strong>not</strong> to take is:</p><ol><li>Arbitrarily assign a person or team to make a change.</li><li>That team dictates the change with the support of the company executives without asking for any feedback.</li></ol><p>A simple yet much better approach is:</p><ol><li>Identify that a change is required.</li><li>Identify key stakeholders.</li><li>Assign one or more people as responsible for proposing the change. Ideally, include stakeholders within this team.</li><li>Ensure everyone is aware of the change process, share a timeline of events, including when input and feedback is requested, and that the team responsible for the change is responsible for the decision.</li><li>Allow the team to do their work and come up with one or more potential changes.</li><li>Get feedback and iterate. More iterations will mean more time.</li><li>The team should thank everyone for their feedback, share the decision, and explain why they made that decision.</li><li>Everyone gets behind the decision and moves on.</li></ol><p>This process will take a bit more time. But, because everyone has had an opportunity to contribute, they&#x27;re more likely to be bought into the decision. At the very least, they&#x27;ll understand why the decision was made. If you don&#x27;t involve people impacted by the change, you may have made the decision faster, but you&#x27;ll fight inertia and get to the desired destination slower.</p><h3 id="at-posthog-4">At PostHog...</h3><p>It&#x27;s just too early to know if DevRel will need to scale significantly. But I&#x27;ll ensure we approach it as outlined in this section.</p><h2 id="what-function-should-developer-relations-be-part-of">What function should Developer Relations be part of?</h2><p>Developer Relations typically reports into Marketing, Product, or Engineering. However, in smaller companies, DevRel may directly report to a founder.</p><p>Two things should determine what function or who DevRel reports to:</p><ul><li><strong>Goal alignment</strong>: As you&#x27;ve put together the DevRel strategy, you&#x27;ve identified what you expect DevRel to help the company achieve. Which other function shares these goals? If your goals are around Awareness and Acquisition, then Marketing may be the right fit. If it&#x27;s Activation and Product, then Product or Engineering is likely better aligned.</li><li><strong>Supportive leadership</strong>: The person that a DevRel person or team reports to must be supportive of the idea of Developer Relations. Ideally, they&#x27;ve also some experience of either working in DevRel or supporting a team before. If not, you&#x27;re in for a rough ride. Would you have a CTO who hasn&#x27;t written any code before? Have a watch of <a href="https://www.youtube.com/watch?v=BUt77eE5QRI">Get executive buy-in... or else by Jessica West</a>.</li></ul><h3 id="at-posthog-5">At PostHog...</h3><p>At the time of writing this (September 2021), PostHog is around thirty people, so I report to James, our CEO. Has James worked in DevRel before? No. But he can code, is the co-founder of an engineering-lead company, and believes in the power of the developer.</p><p>Will DevRel always report into the CEO? It&#x27;s too early to say. As you&#x27;ll see above, we&#x27;re still iterating, and things will change.</p><h2 id="developer-relations-at-your-company-will-change">Developer Relations at your company will change</h2><p>DevRel at your company will change, and DevRel at PostHog will change (see <a href="https://www.youtube.com/watch?v=Vn4mdEa8f2Q">DevRel: from startup to enterprise</a>). DevRel isn&#x27;t any different to any other role or function in this respect. However, it does feel like there is often some uncertainty about DevRel and that Developer Relations teams have endured more change than traditional functions. I believe this is because &quot;modern Developer Relations&quot; (see <a href="https://www.youtube.com/watch?v=vFGDzaLiAnM">History of Modern Developer Relations by Brandon West</a>) is still a relatively new profession in comparison to the likes of Engineering or Product.</p><p>Developer Relations at some companies, such as Twilio, is seen as a constant. Those who have worked in the industry for a while have seen DevRel teams come and go, which can be unnerving. However, there is no doubt that, when understood, supported, well-executed, and measured correctly, a DevRel team can significantly influence the success of a company and, in some cases, be transformative.</p><p><em>A big thanks to <a href="https://www.linkedin.com/in/martynrdavies/">Martyn Davies</a> for providing feedback on this post. _Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Building the future of game analytics - An interview with PureSkill.gg CTO, Evan Sosenko]]></title><description><![CDATA[Welcome to another episode of PostHog's Community Conversations, where we chat to our contributors and users. This time, we speak to Evan Sosenko, Co…]]></description><link>https://posthog.com/blog/building-the-future-of-game-analytics-pureskill</link><guid isPermaLink="false">6681fea6-5187-565f-8d22-30bc4baeb76e</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 21 Sep 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-game-analytics-pureskill.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p><em>Welcome to another episode of PostHog&#x27;s Community Conversations, where we chat to our contributors and users. This time, we speak to Evan Sosenko, Co-founder and CTO of PureSkill.gg.</em></p></blockquote><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/x1jxCJb9zII" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p><a href="https://pureskill.gg/">PureSkill.gg</a> is an automated coach for Counter-Strike: Global Offensive (CS:GO), one of the most popular multiplayer games in the world. Rather than merely showing you statistics about how you play, PureSkill.gg identifies mistakes you make and teaches you how to overcome them.</p><p>As a Co-founder and CTO, <a href="https://www.linkedin.com/in/evan-sosenko-599b0483/">Evan Sosenko</a> is responsible for all technical aspects of PureSkill.gg’s automated coaching system and spends most of his time using product insights to build features which improve the experience for users. In addition to collecting quantitative insights from PostHog, Evan also engages the community directly to get qualitative feedback.</p><p>Sometimes that qualitative feedback can lead to surprising results. In our conversation with Evan he told us about his favourite experience at PureSkill.gg and how one user on the community Discord went from reporting bugs to becoming an angel investor in the company.</p><p>To people who play a lot of games, the idea of automated games coaching will probably sound a little strange, however Evan is quick to point out how rapidly the eSports and competitive gaming industry is growing.</p><p>“<em>My favourite example is Dota because I’m a Dota fan,</em>” said Evan. “<em>They (game developer Valve Software) host <a href="https://www.dota2.com/international/overview">a tournament every year with the top Dota players</a>. Originally it was just in Seattle, but now it’s truly international. It started with a $1 million dollar prize pool ten years ago, but now it’s almost a $40 million dollar prize pool. So, I feel like we’re really just getting started.</em>”</p><p>This potential to have an impact on such a rapidly growing sport is exciting for Evan, who hopes that tools such as PureSkill.gg will both help competitive players improve and also make games more accessible for new audiences.</p><p>“When we look at a match we’re literally looking at every single action that every player in the match is doing with perfect accuracy” said Evan. “So we should be able to do a much better job [of coaching] than any other sport...we have access to much, much more data.”</p><p>Right now, Evan is focused on using data from tools such as PostHog to improve the experience for users and to develop new features. Some, such as an integration with advanced matchmaking provider <a href="https://www.faceit.com/">FaceIt</a>, are already available to try in beta.</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.28.0]]></title><description><![CDATA[Understand your conversion rates better, PostHog 1.28.0 has launched! Significantly revamped performance for slower queries, advanced engagement cohorts, SAML support, and many more improvements and fixes.]]></description><link>https://posthog.com/blog/the-posthog-array-1-28-0</link><guid isPermaLink="false">db12e054-f7fc-542d-bc00-5b727f109cf4</guid><pubDate>Wed, 15 Sep 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-28-0.png" length="0" type="image/png"/><content:encoded><![CDATA[<blockquote><p>💡 This version contains a patch release (1.28.1), <a href="#posthog-1281-patch">read about it</a> below.</p></blockquote><p>PostHog 1.28.0 has launched to help you understand your conversion rates better! Enjoy significantly revamped performance for slower queries, advanced engagement cohorts, SAML support, and many more improvements and fixes.</p><h2 id="posthog-1281-patch">PostHog 1.28.1 patch</h2><p>This version includes a subsequent patch release (1.28.1) launched on <strong>September 22, 2021</strong>. This patch addresses the following fixes and improvements:</p><ul><li>Bug fix. Fixes a bug where refreshing dashboards could cause a server overload (#5865).</li><li>Bug fix. Fixes a bug where SAML wouldn&#x27;t work correctly on Dockerized installations (#5965).</li><li>Bug fix. Adds more safeguards to prevent incorrect person merges, leading to incorrect user counts (#6023). In addition, we now report an aggregate number to signal if any incorrect data is detected (#6024).</li><li>Improvement. Updates event reporting to enable usaged-based billing for Scale customers.</li></ul><h2 id="posthog-1280-release-notes">PostHog 1.28.0 release notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><p><strong>Release highlights:</strong></p><ul><li><a href="#significantly-revamped-performance">Significantly revamped performance</a>.</li><li><a href="#advanced-engagement-cohorts">Advanced engagement cohorts</a>.</li><li><a href="#saml-support">SAML support</a>.</li><li><a href="#advanced-funnel-building">Advanced funnel building</a>.</li></ul><h3 id="significantly-revamped-performance">Significantly revamped performance</h3><p>When running on OSS ClickHouse, we now automatically create (during the weekends) columns for event and person properties which pre-process some of the heaviest operations when running queries. This can speed up your slower queries 2-25x.</p><h3 id="advanced-engagement-cohorts">Advanced engagement cohorts</h3><p>You can now better analyze engagement among your users by understanding casual and power users in more detail. Create automatic user cohorts based on actions performed by users in the last N days. You can select users who have performed more than, exactly, or less than any given number of actions/events, and customize the time range you care about.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_28_0-engagement-chorts.png" alt=""/><h3 id="saml-support">SAML support</h3><p>Users with a PostHog Scale license can now enable SAML authentication and automatic user provisioning in their instance. If your company uses a centralized identity provider (IdP), this is a great way to reduce IT overhead and improve compliance. Head over to our <a href="/docs/user-guides/sso#saml">SAML docs</a> for details on how to enable this.</p><h3 id="advanced-funnel-building">Advanced funnel building</h3><p>In our <a href="https://posthog.com/blog/the-posthog-array-1-27-0">last release</a> we shipped significant improvements to our funnels experience. We are still on a mission to enable anyone to get a deep understanding of their user conversion rates. In this release, we&#x27;re including even more features to build advanced funnel visualizations to enable deeper diving. Such features include custom step ordering, event exclusions, conversion time range window, and more.</p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/1_28_0-advanced-funnels.png" alt=""/><h3 id="other-improvements--fixes">Other improvements &amp; fixes</h3><ul><li>Significant improvements to apps development experience</li><li>Improved session recording list, particularly when there&#x27;s multiple recordings for a session</li><li>Fixed broken links when sharing dashboards publicly</li><li>Multiple fixes on tooltips</li><li>Fixed bugs around cohort calculation</li><li>Fixed issues around loading and refreshing dashboards</li><li>Multiple UI improvements following our new website brand launch</li><li>Improvements to apps UI</li><li>Preference to disable automatic emails when a new member joins</li><li>Fixes to pie chart that caused some numbers to display confusingly</li><li>300+ other improvements/fixes</li></ul><h3 id="breaking-changes">Breaking changes</h3><p>⚠️ The previously deprecated <code>/api/user</code> endpoint has been removed since this version (1.28.0). Head over to the <a href="/docs/api/user">User API</a> docs if you still need to update this endpoint.</p><p>⚠️ We&#x27;ve dropped support for Python 3.7. You&#x27;ll now need to use Python 3.8 or 3.9. <strong>We recommend using Python 3.9.</strong></p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog News</h2><p>Welcome all our new team members!</p><table><thead><tr><th align="center">Name</th><th align="center">Role</th><th align="center">🍍 on 🍕</th><th align="center">Interesting Fact</th></tr></thead><tbody><tr><td align="center"><a href="/elik">Eli Kinsey</a></td><td align="center">Frontend Developer</td><td align="center">👍 Pineapple gang represent</td><td align="center"><em>&quot;I.... have never had a bloody nose&quot;</em></td></tr><tr><td align="center">Rick Marron</td><td align="center">Full Stack Engineer</td><td align="center">👎</td><td align="center"><em>&quot;I&#x27;m part of the ~1% who can lick their elbow. (Although the ability is slowly going away with age)&quot;</em></td></tr><tr><td align="center"><a href="/paul">Paul D&#x27;Ambra</a></td><td align="center">Full Stack Engineer</td><td align="center">👎 Tasty but forbidden (like drinking in church)</td><td align="center"><em>&quot;I was nearly arrested at a pagan wedding&quot;</em></td></tr><tr><td align="center">Guido Laquinti</td><td align="center">Site Reliability Engineer</td><td align="center">👎 Can&#x27;t say it&#x27;s acceptable without having my passport revoked 🇮🇹</td><td align="center"><em>&quot;When I was a kid, my parents asked me to find a name for our new kitten. We called him &#x27;Password&#x27; 🔐🐕‍🦺&quot;</em></td></tr></tbody></table><h2 id="community">Community</h2><h3 id="community-mvp-">Community MVP 🏆</h3><p>Thanks to all our community members for helping move PostHog forward! This release cycle&#x27;s Community MVP goes to <a href="https://github.com/manish001in">manish001in</a>!</p><p>Manish helped us pushed a PR that ensures tab titles are properly set when navigating between dashboards (PR <a href="https://github.com/PostHog/posthog/pull/5822">#5822</a>) and is also pushing a PR to make it easy to copy properties from the person page (PR <a href="https://github.com/PostHog/posthog/pull/5884">#5884</a>).</p><h3 id="community-shoutouts">Community shoutouts</h3><p>We want to thank each and every community member that contributed to this release of PostHog!</p><ul><li><a href="https://github.com/manish001in">manish001in</a> 🏆</li><li><a href="https://github.com/edhgoose">edhgoose</a></li><li><a href="https://github.com/mjashanks">mjashanks</a></li><li><a href="https://github.com/jmellicker">jmellicker</a></li><li><a href="https://github.com/xahhy">xahhy</a></li><li><a href="https://github.com/julianharty">julianharty</a></li><li><a href="https://github.com/benbz">benbz</a></li><li><a href="https://github.com/bryanyi">bryanyi</a></li><li><a href="https://github.com/juanvasquezreyes">juanvasquezreyes</a></li><li><a href="https://github.com/7MIMIRA">7MIMIRA</a></li><li><a href="https://github.com/purcell3a">purcell3a</a></li><li><a href="https://github.com/Patil2099">Patil2099</a></li><li><a href="https://github.com/jredl-va">jredl-va</a></li></ul><h2 id="open-roles">Open roles</h2><p>Join us in helping make more products successful! We&#x27;re currently hiring for the following roles:</p><ul><li>Technical Content Marketer</li><li>Developer Educator</li><li>Senior Software Engineer</li><li>Staff Software Engineer</li><li>Senior C++/Clickhouse Engineer</li></ul><p>Don&#x27;t see a role for you? We&#x27;re always looking for exceptional people, so reach out to us via our <a href="https://posthog.com/careers">Careers page</a> for more info.</p><hr/><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to choose job titles in your early stage startup]]></title><description><![CDATA[One huge mistake some startups make is using titles to establish and reinforce hierarchy. This is dangerous for two reasons: Iteration and speed…]]></description><link>https://posthog.com/blog/startup-job-titles</link><guid isPermaLink="false">973ed76e-21b1-5c66-976e-e935a6648130</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Tue, 14 Sep 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/titles.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>One huge mistake some startups make is using titles to establish and reinforce hierarchy. This is dangerous for two reasons:</p><ol><li>Iteration and speed largely determine the growth trajectory of most product-led startups. Because of this, it&#x27;s important to eschew managers in favor of &#x27;anti-managers&#x27; - superbly strong individual contributors with a bias towards action, not control.</li><li>Titles can make it harder to <a href="/handbook/people/feedback">give and receive feedback</a> - from both colleagues and customers. Without clear feedback, it&#x27;s harder for individuals to improve, which can limit the whole team.</li></ol><p>At PostHog, we started off completely flat, with everyone reporting to our founders, James and Tim - and everyone getting individual contributor titles such as Software Engineer or Designer. If we’d had Senior Engineer and Junior Engineer titles, for example, that would&#x27;ve indicated that we care about hierarchy, thus discouraging peer-to-peer feedback and capping individual performance at the level of whoever was designated as Senior.</p><p>But we hit a snag.</p><p>When we first found product market fit, we had to step up our game in areas such as product, design, and user experience in order to continue growing. James and Tim also found they were struggling to develop people’s skills properly because they had too many direct reports.</p><p>Towards the end of 2020, we were shipping lots of code but nothing moved the needle for our growth because we&#x27;d reached a talent ceiling.</p><p>So we solved this problem in two ways:</p><ol><li>We introduced <a href="/handbook/company/small-teams">Small Teams</a>: small groups of people who owned specific tasks within the company. We have small teams for marketing, growth, design, product, and more.</li><li>We introduced light <a href="/handbook/company/management">management</a> and tweaked our titles to reflect this.</li></ol><p>These changes have resulted in a huge lift to our product and design competencies - and much happier end users.</p><h2 id="hire-for-the-role-not-the-title">Hire for the role, not the title</h2><p>It’s tempting to give out meaningless but impressive titles to convince early hires to come work for you. After all, we&#x27;ve all met or heard of &#x27;CMOs&#x27; who were essentially a marketing department of one. But doing so is a grave mistake because such candidates won&#x27;t be joining your company for the right reasons. This is also why we don&#x27;t allow new hires to set their own titles - we don&#x27;t need 20 &quot;VPs&quot; on the payroll.</p><p>Ideally, the best team members are willing to start by themselves, set a world-class standard in their area, then grow a team around themselves. That sets a culture of individual contribution.</p><h2 id="internal-vs-external-job-titles-are-they-necessary">Internal vs. external job titles: Are they necessary?</h2><p>We sometimes have a candidate apply for a certain role then suggest a slightly different title upon hiring them. This happens mostly for roles that we’ve never hired for before.</p><p>In engineering, we advertise for “Senior Engineers” mainly because we get so many unqualified or under-experienced applicants - but everyone is referred to as a Software Engineer on our <a href="/people">team page</a>. We pay people more if they have more experience - per our <a href="/handbook/people/compensation">transparent salary calculator</a> - but we don’t use these titles internally.</p><h2 id="should-you-set-requirements-for-your-job-titles">Should you set requirements for your job titles?</h2><p>It&#x27;s impossible to objectively judge someone’s performance and experience enough to determine what title they deserve and what they&#x27;d need to advance from a Junior to Senior role, for example. You have nowhere near enough context from their previous roles to systematize this. We think raw experience makes a difference for the first couple of years, but then quickly tapers off in its impact. In fact, experience can sometimes be a weakness. </p><p>For example, we’d be extra diligent when interviewing someone with an MBA, because MBA programs often teach behavior suitable for companies with wildly different needs to us. We don’t care about control, revenue maximization, or predictability in the slightest. We care about speed, innovation, and building for our end users first.</p><h2 id="the-most-difficult-title-to-spec-out">The most difficult title to spec out</h2><p>It was tough hiring our first Designer.</p><p>We’re big believers in self-serve products and experiences, and our website and docs are our storefront - so we wanted someone that would throw themselves into our website.</p><p>But because we&#x27;re not a design company, we couldn’t figure out if we needed a UX/UI designer, a frontend developer, a website designer, or a general designer. Many folks in the interview process told us we were asking for too much - but sometimes that&#x27;s just what your early-stage startup needs.</p><p>It took lots of iteration in our hiring process to get this right. We ended up hiring <a href="https://www.linkedin.com/in/corywatilo/">Cory</a>, a talented generalist who can take designs from concept to wireframe to execution. He now works across our website, docs, and the app.</p><blockquote><p><em>&quot;Great designers iterate. They don’t magically come up with something brilliant on the first try.&quot;</em> - <a href="https://www.linkedin.com/in/malthe/">Malthe Sigurdsson</a>, former Chief Design Officer at Stripe.</p></blockquote><p>Ex-founders or early employees make for brilliant generalists. They’re less likely to be as deeply skilled in any given area, but if you need a quick uplift in a certain area, they’ll get you there faster and more flexibly. As your company grows and your requirements change, you can specialize your roles and titles. For example, as of writing, we&#x27;re hiring for a Technical Content Marketing Manager and Developer Educator to bolster our content and developer relations efforts. (Check out our <a href="/careers">Career</a> page for more open roles.)</p><h2 id="even-the-ceos-job-changes-over-time">Even the CEO&#x27;s job changes over time</h2><p><a href="https://www.linkedin.com/in/j-hawkins/">James</a>, our CEO, has had to wear many hats over the years. Although his role swings between dealing with customers, recruiting, fundraising, and marketing, he&#x27;s always been focused primarily on selling with a bit of design on the side.</p><p>Before PostHog started, James had to sell to get Tim to join. After the company launched, he had to get early users on board, which meant a mix of selling and building our website. His role then cycled through getting investors to take part in our funding rounds (from seed to <a href="https://twitter.com/posthog/status/1402988140332154888">Series B</a>), hiring people, and talking to customers.</p><p>On the ops and product side, it involves thinking about how the company and our business model should work - including our <a href="/handbook/strategy/roadmap">product</a>, financing, <a href="/docs/self-host">deployment</a>, <a href="/handbook/team-structure">team structure</a>, and <a href="/pricing">pricing</a> strategies.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The importance of dogfooding - Why product managers should use their product as much as their users]]></title><description><![CDATA[Product testing is essential, but your testing won’t always pick up the small sources of friction which build up over time and frustrate your users…]]></description><link>https://posthog.com/blog/dogfooding</link><guid isPermaLink="false">2f2fbbe5-b60f-5270-9f9b-df8e98b713de</guid><dc:creator><![CDATA[Marcus Hyett]]></dc:creator><pubDate>Mon, 13 Sep 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/dogfooding.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Product testing is essential, but your testing won’t always pick up the small sources of friction which build up over time and frustrate your users. This is where ‘dogfooding’ comes in - regularly using your product to get the full picture and build empathy with your users.</p><h2 id="how-empathy-improves-prioritization">How empathy improves prioritization</h2><p>It’s logical to deprioritize a “small UX bug” when you have big strategic new features to implement - but the only way to ensure that “small UX bug” doesn’t lead to high churn for your product is to put yourself in your users’ shoes. Doing this over time leads to better feature prioritization and more effective product decisions.</p><h2 id="dogfooding-puts-you-in-the-right-context">Dogfooding puts you in the right context</h2><p>You might be the product manager for a product that isn’t designed to be used in your office. After all, I used to build mobile apps for people who replaced railway tracks in the middle of the night. Lab testing will still surface problems with your product - but they might lack context. Nothing beats dogfooding a product under real world conditions - if you’re out on the railway at 2am, you’re likely to have a vastly different product experience to a PM using it in their office during daytime. Setting aside 30 mins every day or a few times a week to test a product “in the field” is significantly more valuable than using it in isolation somewhere else.</p><p>I prefer to set myself challenges to achieve with the product that I’ve not tried before. This keeps dogfooding interesting and puts you in the position of someone who’s pushing the boundaries of what’s possible and more likely to come across something frustrating.</p><h2 id="how-to-encourage-your-team-to-dogfood-your-product">How to encourage your team to dogfood your product</h2><p>Every team member should be dogfooding the product - not just the product manager. This improves your collective autonomy when it comes to prioritizing which features to build.</p><p>To get the team into dogfooding, set up regular team dogfooding sessions and “bug bashes” to collaboratively find issues with the product. Also, set challenges that will require the team to use the product in creative ways - this will ensure they’re getting deep into the minds of your users.</p><h2 id="avoid-over-empathizing">Avoid over-empathizing</h2><p>If you use the product every day, you might subconsciously tend towards perfectionism. It’s important to explain problems objectively - i.e. why they would be frustrating or churning users - but don’t file a bug report for every tiny annoyance you see. Rather, seek out the issues that are likely to compound over time and prioritize fixing those ones and preventing them from cropping up in future. Trying to fix every micro-frustration will likely waste of your limited resources.</p><h2 id="always-be-dogfooding">Always be dogfooding</h2><p>Retention is a strong indicator of whether or not your users are getting frustrated with your product. If they’re using the product less over time, it&#x27;s a sign you should probably dogfood your product more to determine why they&#x27;re not returning.</p><p>PostHog offers all the <a href="https://posthog.com/product">tools</a> you need to identify issues with your retention and plan your dogfooding initiatives. <a href="https://app.posthog.com/signup">Deploy PostHog</a> today.</p><p><em>Enjoyed this? Subscribe to our <a href="/newsletter">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Winning from the back - late mover advantage]]></title><description><![CDATA[We are open source  is  literally our top value ... and what better way to be transparent than to share a diary? Late mover advantage Product…]]></description><link>https://posthog.com/blog/ceo-diary-1</link><guid isPermaLink="false">8052baa2-01aa-5d52-a74c-b2641d2841a3</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Wed, 25 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><em>We are open source</em> is <a href="../handbook/company/values">literally our top value</a>... and what better way to be transparent than to share a diary?</p><h2 id="late-mover-advantage">Late mover advantage</h2><p>Product analytics is a busy space. It reminds me of the <em>front</em> entrance to Liverpool Street station in London:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/CEO-diary-1/liverpool-st-station.jpg" alt="Liverpool Street Front Entrance - lots of people"/></p><p>PostHog Fact: Tim (my co-founder) incorrectly believes this is the side entrance - it&#x27;s one of our greatest disagreements.</p><p>There are tons of competitors in product analytics, and they&#x27;ve pretty much all got 300+ person teams, around $100M or more in funding, and years and years of headstart. Yet, we&#x27;re totally confident we can win as a late mover.</p><p>A losing strategy for us would look like this:</p><ol><li>Investing in (even more) sales assets, people, tools, and training</li><li>Building features that the salespeople need to sell to big companies, which makes our product feel like everyone else&#x27;s</li><li>Annoying our users with poor UX since the product was built for selling and not using</li><li>Churning lots of customers which takes us back to step #1</li></ol><p>A winning strategy for us involves:</p><ol><li>Doubling down on investing in our open source project</li><li>Acquiring more users as developers at big companies enjoy using it</li><li>Enjoying wider adoption within each company since the product keeps getting better</li><li>Making more money as big companies happily pay for the value, leading us back to step #1 </li></ol><h2 id="so-what-are-we-doing-about-the-above">So what are we doing about the above?</h2><p>PostHog started off as an open source project. We started getting emails like this one, which is from a 30k employee corporate that you&#x27;ll have heard of:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/CEO-diary-1/extreme-interest.jpg" alt="An email from a potential customer saying they have extreme interest"/></p><p>Weirdly enough, at the time, we felt we provided a <em>worse</em> experience to paying customers like this than to free users.</p><p>Larger companies have a broader range of users than just developers, and these other user profiles (like product managers or growth managers) tend to want more detailed analytics views and lack the same willingness to tolerate bugs.</p><p>We wanted to try selling to companies like this so we could complete the <a href="open-source-business-models">open core business model</a>. We would use this to double down on improvements to our free project, knowing we could delight paid customers when they came our way.</p><p>So we decided to get <a href="../handbook/strategy/overview">Five Reference Customers</a>, despite having &gt;100 subscribers (on top of thousands of open source deployments). &#x27;Reference customers&#x27; are genuinely delighted, use PostHog meaningfully, and pay full price.</p><p>From this exercise, we learned we had to level up our UX around funnels - so we <a href="new-vp-nailing-funnels">nailed funnels</a>. Next up, we&#x27;re working on <a href="../handbook/strategy/roadmap">nailing diagnoses</a>. This is particularly cool as we&#x27;re starting to see how our broad approach with analytics, session recording, and feature flags uniquely lets users visualize their funnels, understand <em>why</em> funnel performance is bad, and release changes to safely improve it.</p><h2 id="a-board-meeting-happened">A board meeting happened</h2><p>This mainly focused on what our reference customers have in common.</p><p>They appeared to be from a wide range of industries, so we thought about the <em>Needs</em> and the <em>Haves</em> they&#x27;ve got in common. </p><p>This is what we&#x27;re seeing:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/CEO-diary-1/customer-dna.jpg" alt="Customer problems they have in common"/></p><h2 id="whats-next">What&#x27;s next</h2><p>We want to get more scores like the above, so we did two things:</p><ol><li><a href="https://github.com/PostHog/posthog.com/pull/1810">We updated the product positioning on the homepage</a>. We&#x27;re working on a simpler, cleaner design, but we wanted to make a handful of changes immediately.</li><li>We&#x27;re launching marketing initiatives to promote PostHog even further to teams that feel like the above scores. The test is: &quot;Can we do this without building any more paid features?&quot;</li></ol><p>More updates coming soon! :)</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Winning from the back - late mover advantage]]></title><description><![CDATA[We are open source  is  literally our top value ... and what better way to be transparent than to share a diary? Late mover advantage Product…]]></description><link>https://posthog.com/founders/ceo-diary-1</link><guid isPermaLink="false">72c00f7c-477e-57d8-9dbf-150cd3f95465</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Wed, 25 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/posthog-ceo-diary-blog.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><em>We are open source</em> is <a href="../handbook/company/values">literally our top value</a>... and what better way to be transparent than to share a diary?</p><h2 id="late-mover-advantage">Late mover advantage</h2><p>Product analytics is a busy space. It reminds me of the <em>front</em> entrance to Liverpool Street station in London:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/CEO-diary-1/liverpool-st-station.jpg" alt="Liverpool Street Front Entrance - lots of people"/></p><p>PostHog Fact: Tim (my co-founder) incorrectly believes this is the side entrance - it&#x27;s one of our greatest disagreements.</p><p>There are tons of competitors in product analytics, and they&#x27;ve pretty much all got 300+ person teams, around $100M or more in funding, and years and years of headstart. Yet, we&#x27;re totally confident we can win as a late mover.</p><p>A <a href="/newsletter/how-startups-lose-their-edge">losing strategy</a> for us would look like this:</p><ol><li>Investing in (even more) sales assets, people, tools, and training</li><li>Building features that the salespeople need to sell to big companies, which makes our product feel like everyone else&#x27;s</li><li>Annoying our users with poor UX since the product was built for selling and not using</li><li>Churning lots of customers which takes us back to step #1</li></ol><p>A winning strategy for us involves:</p><ol><li>Doubling down on investing in our open source project</li><li>Acquiring more users as developers at big companies enjoy using it</li><li>Enjoying wider adoption within each company since the product keeps getting better</li><li>Making more money as big companies happily pay for the value, leading us back to step #1 </li></ol><h2 id="so-what-are-we-doing-about-the-above">So what are we doing about the above?</h2><p>PostHog started off as an open source project. We started getting emails like this one, which is from a 30k employee corporate that you&#x27;ll have heard of:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/CEO-diary-1/extreme-interest.jpg" alt="An email from a potential customer saying they have extreme interest"/></p><p>Weirdly enough, at the time, we felt we provided a <em>worse</em> experience to paying customers like this than to free users.</p><p>Larger companies have a broader range of users than just developers, and these other user profiles (like product managers or growth managers) tend to want more detailed analytics views and lack the same willingness to tolerate bugs.</p><p>We wanted to try selling to companies like this so we could complete the <a href="open-source-business-models">open core business model</a>. We would use this to double down on improvements to our free project, knowing we could delight paid customers when they came our way.</p><p>So we decided to get <a href="../handbook/strategy/overview">Five Reference Customers</a>, despite having &gt;100 subscribers (on top of thousands of open source deployments). &#x27;Reference customers&#x27; are genuinely delighted, use PostHog meaningfully, and pay full price.</p><p>From this exercise, we learned we had to level up our UX around funnels - so we <a href="new-vp-nailing-funnels">nailed funnels</a>. Next up, we&#x27;re working on <a href="../handbook/strategy/roadmap">nailing diagnoses</a>. This is particularly cool as we&#x27;re starting to see how our broad approach with analytics, session recording, and feature flags uniquely lets users visualize their funnels, understand <em>why</em> funnel performance is bad, and release changes to safely improve it.</p><h2 id="a-board-meeting-happened">A board meeting happened</h2><p>This mainly focused on what our reference customers have in common.</p><p>They appeared to be from a wide range of industries, so we thought about the <em>Needs</em> and the <em>Haves</em> they&#x27;ve got in common. </p><p>This is what we&#x27;re seeing:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/CEO-diary-1/customer-dna.jpg" alt="Customer problems they have in common"/></p><h2 id="whats-next">What&#x27;s next</h2><p>We want to get more scores like the above, so we did two things:</p><ol><li><a href="https://github.com/PostHog/posthog.com/pull/1810">We updated the product positioning on the homepage</a>. We&#x27;re working on a simpler, cleaner design, but we wanted to make a handful of changes immediately.</li><li>We&#x27;re launching marketing initiatives to promote PostHog even further to teams that feel like the above scores. The test is: &quot;Can we do this without building any more paid features?&quot;</li></ol><p>More updates coming soon! :)</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Google is about to make it a lot harder to track website and app users without third-party cookies]]></title><description><![CDATA[Google  says  they intend to deprecate the use of third-party cookies in 2023. But why is this important, and how will this affect product analytics…]]></description><link>https://posthog.com/blog/cookieless-analytics</link><guid isPermaLink="false">2d92ee82-e4bc-5ea6-9114-cd15cd4e2c37</guid><dc:creator><![CDATA[Marcus Hyett]]></dc:creator><pubDate>Mon, 23 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/cookieless-analytics.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Google <a href="https://blog.google/products/chrome/updated-timeline-privacy-sandbox-milestones/">says</a> they intend to deprecate the use of third-party cookies in 2023. But why is this important, and how will this affect product analytics?</p><h2 id="what-are-third-party-cookies">What are third-party cookies?</h2><p>Cookies are small files stored on a user’s machine, helping you identify a repeat user to your product or website. This makes things like staying logged in over multiple days possible, but it also makes it possible to track whether the person who followed an ad yesterday came back today to purchase something. </p><p>Third-party cookies are provided by an external service and not your website directly. This external service can be a tool or marketing product that you work with to optimize ads.</p><h2 id="what-happens-when-third-party-cookies-go-away">What happens when third-party cookies go away?</h2><p>When third-party cookies are deprecated, any external tools you use in your product or website to track users - either for analytics or marketing purposes - will stop working correctly. Every visit to your website from the same user will look like a brand new user, making it difficult to attribute outcomes to your ad campaigns or understand whether a single person is avidly using your product or many people use it casually.</p><h2 id="what-are-the-alternative-solutions">What are the alternative solutions?</h2><p>It’s key to note that if people are logged into your product or website - you should still be able to track them (with any tool) - since you’ll be relying on first-party cookies. However, for anonymous or first-time visitors to your product or website, it’s going to be a lot harder. The key solution here is to move away from third-party cookies to using first-party cookies, meaning you’ll need to host the tracking service from your domain.</p><h2 id="what-is-posthogs-approach">What is PostHog’s approach?</h2><p>At PostHog, we’ve built a suite of product analytics tools which you can host on your own domain, enabling you to deploy first-party cookies that let you keep tracking anonymous users effectively.</p><h2 id="2023-is-a-long-way-out---why-should-i-do-something-about-this-today">2023 is a long way out - why should I do something about this today?</h2><p>Safari started blocking third-party cookies back in 2017 and they account for 19% of internet traffic, so you’re likely already having a degraded analytics experience if you rely on third-party cookies for Safari users. It’s better to start putting backup systems in place early to avoid such outcomes. One other benefit of starting early is that ad blockers focus on third-party cookies as a way to restrict ads and tracking, which can significantly corrupt the results you get in your analytics. Moving to a first-party cookie approach lets you continue getting high quality tracking for users who install ad blockers.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[We just made PostHog Open Source 1000x more scalable via ClickHouse]]></title><description><![CDATA[We're excited to announce a major under-the-hood upgrade for PostHog Open Source! Over the past few weeks, our team have been hard at work moving over…]]></description><link>https://posthog.com/blog/clickhouse-announcement</link><guid isPermaLink="false">83d4516a-06b1-515e-980e-29987e3a8511</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Fri, 20 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/clickhouse-announcement.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We&#x27;re excited to announce a major under-the-hood upgrade for PostHog Open Source! Over the past few weeks, our team have been hard at work moving over from Postgres to ClickHouse, the same database that powers PostHog Cloud.</p><p>This means you can now use PostHog Open Source for free without being limited to 10k monthly active users. Read on to find about more about the benefits and how we did this!</p><h2 id="why-clickhouse">Why ClickHouse?</h2><p>ClickHouse is a database designed to enable fast, efficient analytics computations across multiple machines. We are moving <a href="https://github.com/PostHog/posthog">PostHog Open Source</a> from PostgreSQL because it doesn&#x27;t support some features we need and struggles to scale beyond 10k monthly active users. ClickHouse, on the other hand, offers all the functionality we need and offers a much better experience with large volumes of data.</p><p>There are several benefits to using ClickHouse over PostgreSQL, such as:</p><ul><li><p>Speed: ClickHouse is orders of magnitude faster than most other databases, mainly because of how tightly it couples storage and computing power, resulting in significantly quicker query response times.</p></li><li><p>Cost: With more efficient use of processing power, memory, and storage (plus horizontal scaling), you can use cheaper commodity boxes versus having to scale up using specialized (read: costlier) software.</p></li><li><p>Migrations: Moving over from another database? ClickHouse enables you to create materialized versions of your data thanks to its advanced engine, resulting in exponentially faster migrations between deployments. In the future, we&#x27;ll also enable you to more easily migrate between PostHog Cloud and PostHog Self Hosted as both are backed by ClickHouse now.</p></li><li><p>Scalability: Clickhouse features a <a href="https://clickhouse.tech/docs/en/faq/general/columnar-database/">columnnar database structure</a>. Because of this, scaling and maintaining a ClickHouse cluster is pretty easy as long as you’re sharding, replicating, and distributing your tables correctly.</p></li><li><p>Deployment: Other database systems depend on a storage layer, a compute layer, and a resource scheduler (like YARN) to be deployed properly. ClickHouse is just one binary. As such, deployment is a breeze.</p></li><li><p>Documentation - <a href="https://clickhouse.tech/docs/en/">ClickHouse’s documentation</a> has come a long way in the last few years, and Altinity, a company that supports the ecosystem, has excellent <a href="https://docs.altinity.com/">documentation</a> available as well.</p></li><li><p>Fault tolerance - ClickHouse supports native replication, which we use heavily. You can basically have N number of replicas for any given table - all you have to do is name the replica and point it to the metadata location in ZooKeeper.</p></li></ul><h2 id="why-well-continue-using-postgresql-alongside-clickhouse">Why we&#x27;ll continue using PostgreSQL alongside ClickHouse</h2><p>PostgreSQL is great for managing frequently updated data like users, but for telemetry and event data we’ll default to ClickHouse. And while our app updates ClickHouse with data changes, the source of truth remains PostgreSQL. At the same time, we’ll work hard with existing users and early enthusiasts to migrate over to ClickHouse.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to get the first 10 paying customers for your devtool company (and other customer acquisition tips)]]></title><description><![CDATA[Creating a product that people need and are willing to pay for is hard. At PostHog, it took us months to get to 10 paying customers — this after…]]></description><link>https://posthog.com/blog/first-10-paying-customers</link><guid isPermaLink="false">7008bb1f-2e00-5440-b271-9f212ceff5c4</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Wed, 18 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/first-10-customers.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Creating a product that people need and are willing to pay for is hard. At PostHog, it took us months to get to 10 paying customers — this after <a href="https://posthog.com/blog/story-about-pivots">pivoting</a> several times before we finally landed on product analytics. We tried a million things and took some hard knocks, so here are a few shortcuts to get to customer #10 faster.
<em>Tl;dr</em> - talk to a million people, be hard on yourself regarding how much you’re going to put in, and be super selective about who you choose to engage.</p><h2 id="start-with-your-inner-circle">Start with your inner circle</h2><p>The first step was to mine LinkedIn for people with relevant job titles that James had worked with before. He also went through his entire contact list thinking about who could be a good fit and asking them if they wanted to try PostHog out. It’s a small world, and warm relationships are a great way to convert strangers into advocates of your product, so never burn bridges.
Think about your coworkers at previous companies, the people you attended YC with, or even your old dorm room buddy. Anybody who’s ever had tangential contact with you or your work is fair game, and even if they don’t convert, they might know someone who’d be a good fit.</p><h2 id="join-the-right-communities">Join the right communities</h2><p>Next, James looked for communities of people relevant to the roles we were targeting and showed up in real life to sell to them. We’re talking meetups, seminars, conferences, and pitch days in and around the Valley. You want to be present at these spots as much as possible so that you can hone your selling skills and gather vital feedback on how to improve your product.</p><h2 id="be-laser-focused">Be laser-focused</h2><p>The key is to select for only the most relevant prospects. If you sell product analytics as we do, for example, you want to reach out to developers and technically-focused founders that crave insights into their product usage and traffic trends. Those founders live on Twitter, LinkedIn, Openland, Slack groups (like ours), GitHub, and hang out at local conferences. Go to those places, establish a presence, and start engaging. It’s much more effective to talk to 10 targeted prospects at a conference than cold emailing 100 random prospects you got from some shady lead generation agency.</p><h2 id="set-goals">Set goals</h2><p>Also, set manageable goals for this stuff. While he was pounding the streets (and airwaves) of the Bay Area, James set a goal of 2 meetings a day, every day. This sounds minuscule, but that 2-hour daily investment netted him 10 highly targeted prospects in a week, 40 in a month, and 480 a year. Plus, each of those conversations unlocked 2 more people that he could speak to, so the benefits compounded. For a high-ticket product like ours, we only needed to close a handful of each month’s prospects to achieve meaningful growth.</p><p>Set one meeting in the morning and one in the afternoon — or if you’re like Tim, cluster all your meetings around the same time so you can carry the feedback of the first daily meeting into the next. To simplify this process even further, use Calendly and let your prospects pick a time that suits them best.</p><h2 id="frame-each-conversation-properly">Frame each conversation properly</h2><p>Depending on where you are in terms of product/market fit, it’s critically important to frame your conversations with every prospect in the right way. If you frame it as &quot;I have an idea, <a href="/newsletter/how-i-get-good-advice">can I get advice</a>?&quot;, lots of people will respond - but not many will buy. Instead, apply the Mom Test to these calls to figure out if your business idea is a viable one. The basic steps of the Mom test are as follows:</p><ul><li>Ask for specifics. Avoid questions like “Would you buy this product?” Those are vague and unproductive. Instead, ask them how they solved their problems and what other solutions they tried. E.g., <em>“I wanted to touch on your point about struggling to track user flow on a single landing page — could you tell me more about that?”</em></li><li>Find the true motivation behind feature requests. Sure, they want you to add another widget to your app that might solve a problem — but <em>why</em> do they want that specific widget? How else could you accomplish the same task? E.g., “Sure, we can add a Google Analytics integration — but what exactly do you want to see from GA that would move the needle for you?”</li><li>Question the assumptions around your business. If you incorrectly assume something to be a pain point when it’s not, you’re setting yourself up for failure. The reverse is also true — the correct assumptions about a set of problems could prove lucrative for you and your investors. E.g., <em>“I know I mentioned that we solve X, Y, and Z — are these actual problems you’re facing right now? If not, what’s the real issue you’re struggling with?”</em></li><li>Manage customer and product risk. Product risk involves asking: <em>Can I build it? Can I grow it?</em> Customer/market risk involves asking: <em>Do they want it? Will they pay me? Are there lots of them?</em> Trawl sites like ProductHunt and AppSumo to learn which features or products get the most upvotes or engagement - but recognize that desk research will only tell you so much. You still need to go out there and talk to potential customers.</li><li>Segment your customers. Not everybody will want to solve the same set of problems in the same way. A CTO, CMO, and developer all need data — but each of them needs analytics for different reasons. James’ job was to tailor the product experience to each of them. E.g., <em>“What’s the one aspect of your business or role that you wish you had more insight into?”</em> If they indicated they wanted more in-app analytics, he’d show them how to hook their app to PostHog and start collecting that data. If they wanted to track their web traffic instead, there was a way to do that in PostHog - and he’d highlight that instead. Personalization isn’t just a buzzword - it’s absolutely crucial when pitching.</li><li>Follow the money. B2B products require a different sales approach to B2C products, with the former involving several stakeholders and the latter typically just one. Know who controls the money and tailor your pitch to them. <em>E.g., “Who would be the right person to speak to about this at your company? If not, would you be willing to make an intro?”</em></li></ul><h2 id="more-ways-to-get-your-first-few-customers">More ways to get your first few customers</h2><p>We’ve discussed 6 ways we got to customer #10: mining previous workplaces, plumbing the phonebook, joining the right communities, setting daily meeting goals, filtering your prospects, and framing each conversation properly. Here are a few more to add to your toolbox.</p><h3 id="ask-your-friends-and-their-friends-and-their-friends">Ask your friends, and their friends, and their friends</h3><p>Depending on your network, your friends and their friends can be a great source of early customers for your product. Not only can they vouch for you when you’re not in the room, but they’ll essentially act as 24/7 customer acquisition machines for your product due to their proximity to (and hopefully support of) your product and team. Again, build bridges — they come in handy when trying to get a startup off the ground.</p><h3 id="blog-or-create-content">Blog or create content</h3><p>Ads are pushy, but stories are compelling. Published content - whether written or spoken - gives investors and customers insight into how you develop your product, how you hire, how your pricing works, and other pertinent information. This is powerfully effective as good content attracts the kinds of people who <em>want</em> to work with you or for you.</p><p>Traffic is crucial to getting eyeballs on your product and driving subscriptions in the early days, so <a href="https://mohammedshehu.com/2021/02/24/seo-guide/">optimize</a> your website for search and create relevant content that resonates with your users — don’t just write to pad a word count.</p><p>Writing is also a forcing function on your thinking process. Better writing leads to better thinking, which sharpens your communication skills and improves your product planning. Make it a habit for every member of your team (not just the founders) to contribute to your blog, YouTube channel, or online community periodically — once a month is good. They can write about some aspect of their role and share it with their networks to attract new customers and build their individual content portfolios.</p><p>At PostHog, we use our <a href="https://posthog.com/blog">blog</a> to tell our <a href="https://posthog.com/blog/before-yc">company story</a>, announce new Product updates, and talk about startup life and culture - like with this post. Get on social media and connect with other founders in your space and potential customers. We’re on <a href="https://twitter.com/PostHog">Twitter</a> and <a href="https://www.linkedin.com/company/posthog">LinkedIn</a> - connect with us!</p><h3 id="join-the-right-online-communities">Join the right online communities</h3><p>Being active in the right online communities gets you seen by the right crowd. A good rule of thumb is to go where problems are discussed online. Communities include GitHub, StackOverflow, Reddit, Quora, ProductHunt, and Slack communities are all great places to start. Engage with other members, help them solve their problems, and post about your product where appropriate. This is one of the highest-leverage tasks you can perform in the early days. Community visibility pays for itself many-fold down the line.</p><h3 id="send-cold-emails">Send cold emails</h3><p>Yes, it sucks, and you&#x27;ll get rejected a lot - but you&#x27;ll also get a few interested recipients that you can convert into paying users. There are a few ways to improve your odds of landing new customers via cold emails, including:</p><ul><li>Write a killer headline: Your headline is <a href="https://blog.taboola.com/the-headline-is-80-of-the-message/">80%</a> of the entire message. You want to go for a mixture of intrigue + directness + a clear call to action. Use tools like <a href="https://coschedule.com/headline-analyzer">Headline Analyzer</a> to test the best subject lines. E.g. “Verified results: 40% less in-game lag - chat Tuesday?”</li><li>Keep it short and sweet: Nobody wants to read a missive. Get straight to the point.</li><li>Write like a human: The more natural and conversational you sound, the more likely you are to get a response. At PostHog, we see a ton of cold emails each month because all emails sent to <a href="mailto:hey@posthog.com">hey@posthog.com</a> go to the entire team. Take it from us: a clear ask, short email, and good spelling and sentence structure all go a long way toward being taken seriously.</li><li>Tie your pitch to a specific problem they face: The more granular you can get regarding their pain points, the more likely you’ll get a positive response.</li><li>Close with a small, specific ask: This is the crux of the entire email - the action you want them to take. Is it to check out your demo video? Sign up for a free trial? Schedule a call during the week? Be specific - and limit your ask to one thing.</li></ul><p>Cold emails are an art and a science — and you’d do well to master them if you want to scale your user acquisition efforts. Here’s a simple example:</p><blockquote><p><em>Hi {name},</em></p><p><em>My name is James Hawkins, and I’ll keep this quick.</em></p><p><em>I’m the founder of a software tool that gives SaaS teams real-time analytics into every aspect of their product. It’s called PostHog, and I think you’ll like it based on your recent interview with Techcrunch about lacking visibility into user behavior.</em></p><p><em>If this is something your business needs right now, could we schedule a 15-minute demo next Tuesday (3 pm your time) for me to show you the product?</em></p><p><em>— <a href="https://www.linkedin.com/in/j-hawkins/">James H</a></em></p></blockquote><p>The above example is short, sweet, straightforward, and links to both the product’s website and the founder’s LinkedIn page. Those last two are important because the more you build out your online presence, the less you have to describe yourself or what you do in emails. Always let your product and brand speak for themselves.</p><h3 id="give-away-stuff-for-free">Give away stuff for free</h3><p>Free is the 2nd best word in the dictionary (right after ‘paid’) and giveaways can help lower the barrier to entry for new customers. You can offer free beta tester access, free trials, free merch for performing certain actions (like the PH swag we give our <a href="https://posthog.com/contributors">contributors</a>), and free points, usage quotas, or extra features for a limited time. Be generous with your product in the early days — remember that you’re trying to convince strangers to take a chance on you and part with their cash for it. Give them a small taste now to hook them in for the long haul.</p><h3 id="keep-the-beta-signups-limited-and-invite-only">Keep the beta signups limited and invite-only</h3><p>Scarcity is a powerful tool, and limiting access to a product for a limited time can boost signups significantly. Just ask <a href="https://www.joinclubhouse.com/">Clubhouse</a>, the online audio streaming app that crossed <a href="https://www.axios.com/clubhouse-andreessen-horowitz-3a10475a-becd-4483-a81e-9ce76d24e85f.html">2m</a> users as of writing and raised $100m in funding after a protracted invite-only period of user acquisition. You can leverage network effects and virality to grow your early subscriber base in the same way.</p><h3 id="run-ads">Run ads</h3><p>Lastly, you can run paid ads to acquire new users through social media and search channels. Facebook gives you access to <a href="https://www.google.com/search?q=number+of+facebook+users">2.7 billion</a> people, Twitter to <a href="https://www.google.com/search?q=twitter+users&amp;oq=twitter+users">330 million</a> users, Linkedin to <a href="https://about.linkedin.com/">740 million</a> users, and Instagram to <a href="https://www.google.com/search?q=number+of+instagram+users">1.1 billion</a> users. Google is another juggernaut that can expose your brand to new users through search and display ads, and you can run ads on other online websites like Reddit and Quora or offline venues around town. Your success with this approach is limited only by your budget and creativity.</p><h2 id="the-first-10-users-are-the-hardest">The first 10 users are the hardest</h2><p>Unless you’ve magically built a viral product that sells itself, early user acquisition will be challenging. The good news is that the next 10 users get easier to acquire than the first 10. Your efforts compound on themselves, so try as many approaches as you can and watch your customer base grow. </p><p>And because we’d be remiss if we didn’t plug our own product, you can track all that user activity, traffic, and revenue using PostHog’s product analytics suite. See the full list of features on the <a href="https://posthog.com/product-features">product features page</a> and sign up for a free trial today.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing Joe Martin - Our first Product Marketer]]></title><description><![CDATA[Before joining PostHog,   had never owned a Mac. The former tech and games journalist previously did everything on PC, but joining PostHog’s  Apple…]]></description><link>https://posthog.com/blog/joe-martin-intro</link><guid isPermaLink="false">bc115340-d39d-5c47-97df-705ccea23ea4</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Fri, 06 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/joe-martin-intro.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Before joining PostHog, <div name="Joe Martin"></div> had never owned a Mac.</p><p>The former tech and games journalist previously did everything on PC, but joining PostHog’s <a href="https://posthog.com/handbook/people/spending-money#laptop">Apple-dominated</a> culture came with a few… necessary adjustments.</p><blockquote><p><em>”The first thing I did was have to get a new mouse because I couldn&#x27;t cope with the old one, and my other main takeaway is how expensive all the adapters are. But other than that, getting by okay.”</em></p></blockquote><p>Joe isn’t new to adjustments - he’s been making them his whole career ever since he started out as a freelance journalist. Before PostHog, he ran product and content marketing for <a href="https://www.scoro.com/">Scoro</a>, a work management solution for creative and professional services. Prior to Scoro, he was Senior Product Marketing Manager at <a href="https://pollen.co/">Pollen</a>, which curates travel experiences through a global network of partners. </p><p>Before Pollen, Joe held several freelance and full-time content-related jobs, including as Content Marketing Manager at <a href="http://www.laundrapp.com/">Laundrapp</a> (an on-demand laundry and dry cleaning service), as a Lead Copywriter at <a href="http://www.truphone.com/">Truphone</a> (a sim-tech company), and as Games Editor at <a href="http://www.dennis.co.uk/">Dennis Publishing</a> (a London-based media company). He also used to be a professional clown.</p><p>Talk about range.</p><h2 id="what-is-product-marketing">What <em>is</em> product marketing?</h2><p>Product marketing sits at the intersection of marketing, customer advocacy, and product development. It involves two main activities: </p><ul><li>Putting together value propositions and messaging frameworks to inform go-to-market plans, and </li><li>Thinking about the positioning of the brand within the broader market.</li></ul><p>As a collaborative and supportive function, product marketing can involve putting together specific pieces of sales enablement collateral, documentation, case studies and other marketing collateral, and understanding a business’ users as well.</p><blockquote><p><em>”I like to think of [product marketing] as the ‘license to meddle,’ and you get to just talk to everybody in the company - you talk to product, you talk to marketing, you talk to the engineers, you take everything that everyone&#x27;s saying, you mix it all up, and then you find ways to use that information to help each department differently.”</em></p></blockquote><p><strong><code>Product marketing keywords:</code></strong></p><p><strong><code>Positioning:</code></strong> “What’s our position in the market? How do we stand out from the competition?”</p><p><strong><code>Messaging:</code></strong> “How can we translate our positioning into marketing collateral across our different channels? Which benefits should we emphasize?”</p><p>Joe has found his match in PostHog: the company is well-known for <a href="https://posthog.com/blog/story-about-pivots">pivoting</a> frequently, and this has presented him with an interesting challenge regarding his plans for the company.</p><blockquote><p><em>”A quick goal is [to upgrade] some of the pages on our website to communicate product features more clearly and in more depth. The follow-on goal from that [will] be working backwards to create the framework about how we communicate those features across other channels.”</em></p></blockquote><p>Connect with Joe on <a href="https://www.linkedin.com/in/joemartinwords/">LinkedIn</a> and <a href="https://joemartin.work">online</a>, and check out his current read on <a href="https://www.amazon.com/House-Leaves-Mark-Z-Danielewski/dp/0375703764">Amazon</a>.</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Content marketing strategy for devtool companies - How we do it at PostHog]]></title><description><![CDATA[Why you need content Dev tool marketing  is tough. Developers are a selective bunch when it comes to what type of content they consume, and clickbait…]]></description><link>https://posthog.com/blog/running-content-at-posthog</link><guid isPermaLink="false">091b5a96-2acf-5e62-9865-f2f4f8d2f3d6</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Fri, 06 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/running-content.png" length="0" type="image/png"/><content:encoded><![CDATA[<h2 id="why-you-need-content">Why you need content</h2><p><a href="/blog/dev-marketing-for-startups">Dev tool marketing</a> is tough. Developers are a selective bunch when it comes to what type of content they consume, and clickbait-y “Ultimate Guide To X” posts won’t fly with them. Your content needs to be detailed, thoughtful, and relevant to their problems.</p><p>Content at PostHog is meant to accomplish two things: </p><ul><li>Tell our story</li><li>Sell our product</li></ul><p>We sell product analytics tools to help software engineers and product teams make sense of the usage of their apps and build better products. As such, our tutorials need to be detailed enough for a dev to understand, our blog content high-level enough that a non-techie (say, a Product Manager or CEO) can follow, and our content bank varied enough to keep our different audiences coming back.</p><h2 id="where-to-get-content">Where to get content</h2><p>Content isn’t just the job of your marketing team.</p><p>Content, at its core, is merely knowledge transferred from one entity (your company) to another (your audience). If one person’s knowledge is valuable - though filtered, since they’re essentially translating the company’s stance on things - then the whole team’s knowledge is even more leveraged.</p><p>For example, Marketing can create content that waxes lyrical about your product. Engineering can publish posts on how the product is built, HR on how you hire, Finance on how you price it, Product on how you design it, the CEO on its vision, and so on.</p><p>This ultimately lessens the workload on Marketing, giving them more time to think, strategize, and organize the incoming content. It further improves the individual and collective clout of every other department, attracts higher-quality candidates to work for you, impresses VC firms into handing you more money, and sways customers who were concerned about the quality of your product, in your favor.</p><h2 id="types-of-content-you-can-create">Types of content you can create</h2><p>We’ve experimented with a bunch of different content types over the years. Here are some content types you can include in your content mix:</p><ul><li><strong>Blog posts:</strong> These can inform and educate in one go, and are best suited for dense information that a dev can <a href="/blog/writing-for-developers">scan quickly</a>. </li><li><strong>YouTube videos:</strong> For the visually inclined, YouTube provides a place to binge-watch content about different topics related to the product and company. It also gives your audience an opportunity to get to know your team better - from mannerisms and tone to body language and facial expressions.</li><li><strong>Podcast episodes:</strong> Some people prefer consuming content on the go - and podcasts are the perfect format for that. In the beginning, your podcast can simply be an archive of the audio versions of your videos, and you can later invest in better production once you’ve got the time and resources to do so.</li><li><strong>Email newsletters:</strong> Email is still a great way to keep in touch with your customers, and you can bundle your content with your changelogs (or split them if desired). Keep emails short and sweet, add content blurbs to encourage clickthroughs, and speak naturally - nobody likes overly sales-y emails.</li><li><strong>Social media posts:</strong> Social media isn’t necessarily about any one platform, but about where people want to be reached. Beyond Twitter and LinkedIn, you can also reach developers and techies on Facebook, Instagram (yes), Quora, Twitch, Discord, Clubhouse, Reddit, and StackOverflow. “Can some of these be classified as social media platforms?”, I hear you ask. Yes. A good way to find out if a platform counts as “social media” is to ask yourself: “Can I create content on this platform? Can I engage with other people’s comments and posts (and vice versa)? Can I run ads?” If the answer is yes to most of these, it’s a social media platform, and there are likely developers on it. You can post photos, videos, text posts, and run live streams (both audio and video).</li><li><strong>Case studies:</strong> After you’ve acquired a decent number of customers, consider creating case studies that demonstrate what challenges you solved for them and the impact on their business. This builds your credibility and helps you attract and convince more customers.</li><li><strong>Tutorials:</strong> Depending on how complex your product is, tutorials might be a great way to explain its features and reduce the number of customer support tickets you get. You can host tutorials on a separate subdomain of your website or port them to your YouTube channel.</li></ul><h2 id="workflow">Workflow</h2><p>Your content production workflow will depend on what type of content you create, what channels you publish to, and how you source your content.</p><p>Ours is as follows:</p><ul><li><strong>Shoot a video (optional):</strong> This could be an interview, talk, panel discussion, or tutorial recording. We’ll eventually edit this down to about half or a third of its size.<ul><li>Content interviews usually take 40-60 minutes, and we generate 20-30 questions for each interviewee. These questions range from their career history to their current role and product, plus a few personal questions to add flavor to the interview. Here’s <a href="https://www.youtube.com/watch?v=gMYWond64lM">an example</a> of one we did with Eltje.</li><li>We also do intro interviews, which is where we get to know new hires. These can take anywhere from 15-30 minutes and have fewer questions than a content interview.</li><li>HogTalks are Zoom sessions where we invite an expert to speak on a specific topic. We package these videos for upload to our YouTube channel - no blog post required, just a transcript where appropriate. Here’s <a href="https://www.youtube.com/watch?v=JvjK-YA9Ieo">an example</a>. </li><li>The engineering team sometimes creates tutorials that we use to explain certain PostHog features. These can be turned into blog posts in their own right. Here’s <a href="https://www.youtube.com/watch?v=3_yH24Bh0HE">an example</a>. </li></ul></li><li><strong>Get the transcript:</strong> We use <a href="https://rev.com">Rev.com</a> to pull the transcript from the video. Rev also lets you get a quick draft in just a few minutes, though we recommend waiting for the proper version, which can take anywhere from a few hours if ‘rushed’ - which costs extra - to a day or two.</li><li><strong>Write the blog post:</strong> Using the transcript, we write up a concise blog post about the discussion or tutorial. This is where we add more context to the topic and include links to other content for further reading. The length of a blog post can vary wildly depending on how long the video is (which is a function of how thoughtful and in-depth the questions are), but a 60-minute interview usually yields a ~1,500-word blog post. This is also the part where we publish it to GitHub for feedback and request artwork from our design team.</li><li><strong>Extract the audio from the edited video:</strong> This goes into the podcast.</li><li><strong>Post to social media:</strong> After the blog post is complete, we pull snippets from it and schedule them for publishing across your platforms.</li><li><strong>Share it via email:</strong> We bundle our latest posts (as blurbs with links) for addition to our next email newsletter edition.</li></ul><h2 id="cadence-frequency">Cadence (frequency)</h2><p>Aim to publish at least 2 pieces a week: firstly for consistency, secondly to give your audience a reason to keep coming back, and lastly to provide enough content to repurpose across your channels over time. Of course, this isn’t a hard and fast rule - your content publishing cadence will depend on what type of content you’re creating, across which channels, and how in-depth your content is.</p><h2 id="tracking-success">Tracking success</h2><p>Content and analytics go hand in hand. There are several ways/metrics to track the success of your content, including:</p><ul><li><strong>Views, comments, and shares:</strong> The more people seeing your content, the better - but it needs to be paired with <em>some</em> sort of engagement otherwise it’s a weak metric. Shares are the strongest indicator of resonance (more below), as it means your content gets seen outside the immediate networks of your audience.</li><li><strong>Clickthroughs:</strong> You want people clicking on your calls to action (CTAs) to perform some task, whether that’s signing up for your product, subscribing to your newsletter or podcast, or following you on socials.</li><li><strong>Traffic:</strong> The more people visiting your website or app page, the better. You can track this through <a href="https://analytics.google.com/">Google Analytics</a>; or if you use PostHog, by creating a special <a href="https://app.posthog.com">dashboard</a> for all website-related metrics.</li><li><strong>Links:</strong> You can track how often your content is getting linked to through tools like SEMRush, Ahrefs, and Moz. More link-juice = more traffic.</li><li><strong>Resonance:</strong> Think of ‘resonance’ as a catch-all term for the other metrics in ways that aren’t necessarily quantifiable. For example, if you keep getting emails about the accuracy of <a href="https://posthog.com/blog/story-about-pivots">an article you wrote months ago</a>, that’s resonance. If your content or thoughts keep getting brought up at conferences or in conversations with random people, that’s resonance. At all times, strive to create content that resonates - it’ll take care of every other metric.</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Building an open source data science publishing platform - An interview with Datapane CEO, Leo Anthias]]></title><description><![CDATA[(Welcome to another episode of PostHog's Community Conversations where we chat to our contributors and users.) Unlike most tech founders, Leo Anthias…]]></description><link>https://posthog.com/blog/leo-anthias-interview</link><guid isPermaLink="false">f4666ce0-db02-5d45-b755-ed12f805d210</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Fri, 06 Aug 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/leo-anthias.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><em>(Welcome to another episode of PostHog&#x27;s Community Conversations where we chat to our contributors and users.)</em></p><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/dL-GaQlA6bo" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p>Unlike most tech founders, Leo Anthias didn’t study computer science at university. Instead, he took Persian History and Modern American Drama after a chance encounter with a professor who made medieval history fascinating. Despite his non-tech academic background, however, Leo has been coding for years, from early roles as CTO of Kivo, a YC-backed document collaboration start-up, to his current job as CEO and co-founder of Datapane.</p><p>A former YC alumnus, his fondest memory from that time is the absolute focus and discipline that was needed to perfect one’s product strategy, <a href="/newsletter/ideal-customer-profile-framework">ideal customer profile</a>, and marketing and distribution. His strongest productivity tip to date is to focus on optimizing one thing at a time, and this pairs well with his ability to perform well under pressure - especially when running against externally imposed client deadlines.</p><blockquote><p><em>&quot;It&#x27;s really nice to just focus on one thing. For the last two or three days, I&#x27;ve really only focused on our onboarding flows for guides and tutorials for new users. And being able to just focus on that one thing has meant that probably I&#x27;ve gotten a lot more done than if I tried to do that while at the same time running a hiring process, while at the same time having a fundraising process, whatever. Even though all of those things are of equal importance, it&#x27;s really key to just pick one of them at a time.&quot;</em> <strong>- Leo Anthias</strong></p></blockquote><p>After returning to the UK, Leo co-founded another company: a data science model deployment platform. Their goal was to make it easy for engineers to publish a model to the cloud, scale it, and integrate it. Part of that service was a library they built for their customers, which they eventually spun out into a separate product - Datapane. Datapane is an open-source library which makes it easy for data scientists to create interactive data science reports using Python which they can share with their team or community.</p><p><img src="https://user-images.githubusercontent.com/40317687/127475264-c5910fcf-4194-440e-be11-1f72e6f6a093.png" alt="image"/></p><p>Datapane’s birth was inspired by data scientists who didn&#x27;t want to use drag-and-drop tools (like Tableau) and actually wanted to write code for analysis, visualization, and collaboration. Being locked into proprietary software ecosystems makes it hard to publish new research with the world, so Datapane aims to simplify going from coding data in Python to sharing snippets on Medium or in PowerPoint decks. Leo and his team thus optimize for the number of people building and sharing reports.</p><p><img src="https://user-images.githubusercontent.com/40317687/127475218-864bf8ff-ae49-4b12-884a-08421a3c6e7d.png" alt="image"/></p><p>Datapane uses Django as a base, Alpine JS for the frontend, Tailwind CSS for the design, React for highly interactive components, and Kubernetes for handling orchestration, workload execution, and other cloud-based tasks.</p><p><img src="https://user-images.githubusercontent.com/40317687/127475017-0bcd9dc8-d755-42fc-8eb0-cb43c3e15723.png" alt="image"/></p><p>One of Datapane’s best features is being able to create reports in your browser (using a Markdown editor) without needing to go through Python libraries. Leo and his team are also looking to improve the viewing experience on mobile.</p><p><img src="https://user-images.githubusercontent.com/40317687/127475310-f4d03117-b91c-4ee2-9e6d-0f457e5ff422.png" alt="image"/></p><p>Besides the usual founder tasks like admin and hiring, Leo spends most of his time talking to users - especially since open source projects tend to attract engaged communities.</p><blockquote><p><em>&quot;I spend probably the majority of my day talking to users in some kind of capacity. That could be in a sales, support, or evangelism context. But yeah, that&#x27;s pretty much what I do. Maybe I have a bias because that&#x27;s the stuff I enjoy the most.&quot;</em> <strong>- Leo Anthias</strong></p></blockquote><p>Datapane’s product philosophy focuses more on iterating quickly, building on existing work (i.e. not reinventing the wheel), building for their own users first and foremost, and nailing product/market fit.</p><blockquote><p><em>&quot;I think that product/market fit above all else has embodied everything we do from how code is built and written and released, to how we talk to users, to how we work with customers.&quot;</em> <strong>- Leo Anthias</strong></p></blockquote><p>This obsession with fit extends to hiring, too. Leo looks for humility in candidates - being able to admit limited knowledge and work well with others to fill those knowledge gaps. On the flip side, trash-talking one’s previous employers is a huge red flag for him.</p><blockquote><p><em>&quot;Sometimes you&#x27;re interviewing someone and it becomes very obvious that it was everyone else&#x27;s fault every step of their career where something didn&#x27;t go a certain way. It&#x27;s good to have constructive criticism of previous places you&#x27;ve worked, but with some people, it does seem there is a history of them being toxic or negative about previous employers, which isn&#x27;t really what you want to hear in an interview.&quot;</em> <strong>- Leo Anthias</strong></p></blockquote><p>Calling in from his home in <a href="https://www.discoverfrome.co.uk/frome">Frome</a>, about 45 mins away from Bristol, England, Leo is a vintage keyboard enthusiast who struggles to find time to play his instruments. </p><blockquote><p><em>&quot;I would like to play them more, but I find that the more things you have and the more clutter, it&#x27;s actually harder to produce anything useful.&quot;</em> <strong>- Leo Anthias</strong></p></blockquote><p>Andy Grove’s treatise on Intel’s strategy and growth, “<a href="https://www.amazon.com/Only-Paranoid-Survive-Exploit-Challenge/dp/0385483821">Only The Paranoid Survive</a>,” left quite the mark on him - and informs much of his philosophies around pivoting and iteration.</p><blockquote><p><em>&quot;It&#x27;s a pretty old-school book, just on strategy, how Intel moved from being in the semiconductor space and how they decided to move out of that market… It’s really great as a historical reference.&quot;</em> <strong>- Leo Anthias</strong></p></blockquote><p>If he were starting his career all over again, he says he’d focus on just one metric and optimize for that in all his endeavors. In his words, this would have helped him moved much faster in his career and business pursuits. We agree.</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.27.0]]></title><description><![CDATA[PostHog 1.27.0 is here! Completely redesigned funnels experience will help you dive deeper to understand why your users aren't converting. Plus 400+ improvements & fixes.]]></description><link>https://posthog.com/blog/the-posthog-array-1-27-0</link><guid isPermaLink="false">1a4276fd-ac46-5718-b6be-b73c556755db</guid><pubDate>Mon, 26 Jul 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-27-0.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.27.0 is here! </p><p>A completely redesigned funnels experience will help you dive deeper to understand why your users aren&#x27;t converting. Faster and smoother experience to create and filter insights and get more useful results from your graphs. Plus 400+ improvements &amp; fixes across the entire app.</p><h3 id="community-mvp-">Community MVP 🏆</h3><p>Thanks to all our community members for helping move PostHog forward! This release cycle&#x27;s Community MVP goes to... <a href="https://github.com/DimitrisMazarakis">DimitrisMazarakis</a>!</p><p>Dimitris added an option to automatically refresh dashboards every couple of minutes. You can now have your PostHog dashboards in separate monitors or your conference room TV always in sync! Thanks for driving this forward, Dimitris!</p><blockquote><p><em>If you haven&#x27;t seen it yet, we have a <a href="https://posthog.com/contributors">new page</a> dedicated to our contributors. Every contributor gets their own digital card, and we provide a leaderboard with stats on each person&#x27;s contributions. We also have a bot that sends a gift card for <a href="https://merch.posthog.com">PostHog merch</a> to contributors for every PR merged, and we welcome all types of contributions!</em></p></blockquote><h3 id="help-us-improve-posthog">Help Us Improve PostHog</h3><p>We’re working hard to improve the PostHog experience and would love to talk to you! Please join one of our Product, Engineering or Marketing team members in a quick 30-min call to help us understand how to improve. Schedule directly <a href="https://calendly.com/posthog-feedback">on Calendly</a>.</p><p>As a small thank you for your time, we&#x27;re giving away some awesome <a href="https://merch.posthog.com">PostHog merch</a>!</p><p><div></div></p><h2 id="posthog-1270-release-notes">PostHog 1.27.0 Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><p><strong>In this release:</strong></p><ul><li><a href="#new-funnels-experience">Brand-new funnels experience</a>.</li><li><a href="#revamp-of-legend-table--insight-tooltips">Significant revamp on the legend table &amp; tooltips on insights</a>.</li><li><a href="#new-filter-experience">New action, event, cohorts &amp; properties selector</a>.</li><li><a href="#clickhouse-is-now-free-to-use">ClickHouse is now free to use</a>.</li></ul><h3 id="new-funnels-experience">New Funnels Experience</h3><p>Funnels have a new bar-chart visualization and show more comprehensive metrics. You can now choose whether to display conversion rates for the full funnel or from each step to the next.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/funnel-steps.png" alt="Funnel steps"/></p><p>Breakdowns are now supported on funnels! This allows you to identify how user and event properties (for instance, browser or referral source) affect your conversions.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/funnel-breakdowns.png" alt="Funnel breakdowns"/></p><p>Clicking on a funnel step will reveal a list of persons who have continued or dropped off at that step. From there, you can easily view their sessions (provided you have Session Recording enabled) to find unknown problems or opportunities that would otherwise be hidden in the data.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/person-modal-original.png" alt="Persons modal"/></p><p>Going beyond averages, the new <strong>Time to Convert</strong> view shows a distribution of time spent between steps or for the whole funnel.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/funnel-steps.png" alt="Funnel time conversion"/></p><h3 id="revamp-of-legend-table--insight-tooltips">Revamp of legend table &amp; insight tooltips</h3><p>The legend table for Insights has received a major styling revamp, including nicer formatting for dates and numbers and clearer identification of breakdown values.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/insights-table.png" alt="Funnel time conversion"/></p><p>New tooltips allow you to scan and compare multiple values at a glance.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/tooltips.png" alt="Funnel time conversion"/></p><h3 id="new-filter-experience">New filter experience</h3><p>It&#x27;s now easier than ever to find the event, user, or cohort definitions you&#x27;re looking for when adding a filter to a query. This change also causes Insights to load significantly faster.</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/unified-search.png" alt="Funnel time conversion"/></p><h3 id="clickhouse-is-now-free-to-use">ClickHouse is now free to use!</h3><p>A few months after PostHog we started hitting limitations on some operations running on Postgres. We then decided to develop full support for a <a rel="noreferrer noopener" target="_blank" href="https://clickhouse.tech/">ClickHouse</a> backend. ClickHouse is a very powerful OLAP database that works specially well at computing analytics for huge volumes of data. At first this ClickHouse backend was launched as a premium feature requiring an Enterprise license. Some weeks ago we decided to offer a free version with a restriction of 3 team members to serve as trial for the feature.</p><p>Since then, we have ironed out all the details and have now decided to make this feature <strong>fully free</strong> now, no longer requiring a license nor having any additional restrictions. This comes from our commitment to supporting teams and companies of any size, so you can continue using PostHog for free even if your event volume increases significantly.</p><p>ClickHouse is deployed a bit differently than our <a href="/docs/self-host/overview#deploy">traditional deployment options</a>, you can find full deployment instructions here: <a rel="noreferrer noopener" target="_blank" href="https://github.com/PostHog/charts-clickhouse/"><a href="https://github.com/PostHog/charts-clickhouse/">https://github.com/PostHog/charts-clickhouse/</a></a></p><h3 id="improvements--fixes">Improvements &amp; Fixes</h3><ul><li>Domain whitelist to allow self-serve signup with social providers (#5111).</li><li>Better errors &amp; empty states when generating insights.</li><li>Apps UI revamp (#5137, #4871).</li><li>You can now pass a Personal API key to API requests to work with different projects (#5044).</li><li>Your instance can now be multi-org (premium feature) by setting <code>MULTI_ORG_ENABLED</code> environment variable (#5108).</li><li>Performance improvements around insight requests and caching to optimize resource usage.</li><li>Support spaces and brackets when creating actions (#5070).</li><li>Improvements around internal metrics to better track your instance performance.</li><li>Fixes around navigation throughout the app.</li><li>API endpoint to get feature flags for a user, <code>/api/feature_flags/user_status?distinct_id=ID</code>.</li><li>See specific list of matched events when searching sessions.</li><li>Export or create cohorts from list of persons in insights.</li><li>Auto-refresh dashboards every 2 minutes so you can always have them up-to-date in your office screens.</li><li>400+ other improvements &amp; bug fixes.</li></ul><p>In addition to the highlights listed above, we also merged a bunch of PRs to improve PostHog&#x27;s experience, performance and reliability. Plus we fixed a ton of bugs. Check out all our main repos for details:</p><ul><li><a href="https://github.com/PostHog/posthog/commits/master"><code>PostHog/posthog</code></a></li><li><a href="https://github.com/PostHog/plugin-server/commits/master"><code>PostHog/plugin-server</code></a></li><li><a href="https://github.com/PostHog/posthog-python/commits/master"><code>PostHog/posthog-python</code></a></li><li><a href="https://github.com/PostHog/posthog-cloud/commits/master"><code>PostHog/posthog-cloud</code></a></li><li><a href="https://github.com/PostHog/posthog-js/commits/master"><code>PostHog/posthog-js</code></a></li><li><a href="https://github.com/PostHog/plugin-repository/commits/master"><code>PostHog/plugin-repository</code></a></li></ul><h3 id="deprecation-notice">Deprecation Notice</h3><p>⚠️ The <code>/api/user</code> endpoint has <a href="/docs/api/user#user--deprecated">been deprecated</a> for a while and will be removed on the next version (1.28.0).</p><h2 id="posthog-news">PostHog News</h2><p>Welcome Chris Clark! Chris joined our Core Experience Team to help us level up our product experience! You can already see a ton of his work in our new funnels feature. Chris is pro-pinneaple on pizza (🍍 on 🍕) &quot;but generally accepting of all pizza views and requirements&quot;. </p><blockquote><p>I once impulse-purchased a baby goose.</p></blockquote><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="community-shoutouts">Community Shoutouts</h2><p>We want to thank each and every community member that contributed to this release of PostHog!</p><ul><li><a href="https://github.com/DimitrisMazarakis">DimitrisMazarakis</a> 🏆</li><li><a href="https://github.com/alx-a">alx-a</a></li><li><a href="https://github.com/jacobherrington">jacobherrington</a></li><li><a href="https://github.com/Patil2099">Patil2099</a></li><li><a href="https://github.com/tirkarthi">tirkarthi</a></li><li><a href="https://github.com/lharress">lharress</a></li><li><a href="https://github.com/imhmdb">imhmdb</a></li><li><a href="https://github.com/RayBB">RayBB</a></li><li><a href="https://github.com/chidexebere">chidexebere</a></li><li><a href="https://github.com/marcopchen">marcopchen</a></li><li><a href="https://github.com/smallbrownbike">smallbrownbike</a></li><li><a href="https://github.com/pietrodevpiccini">pietrodevpiccini</a></li><li><a href="https://github.com/taobojlen">taobojlen</a></li><li><a href="https://github.com/dbinetti">dbinetti</a></li></ul><h2 id="open-roles">Open Roles</h2><p>Join us in helping make more products successful! We&#x27;re currently hiring for the following roles:</p><ul><li>Senior Software Engineer</li><li>Senior Software Engineer (Backend focus)</li><li>Staff Software Engineer</li></ul><p>Don&#x27;t see a role for you? We&#x27;re always looking for exceptional people, reach out! Check out our <a href="https://posthog.com/careers">Careers page</a> for more info.</p><hr/><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Introducing Phil Leggetter, our new head of Developer Relations]]></title><description><![CDATA[We’re proud to announce a new hire; Phil Leggetter will head up Developer Relations at PostHog. Developer relations sits at the intersection of…]]></description><link>https://posthog.com/blog/intro-phil-leggetter</link><guid isPermaLink="false">dbcdc5a1-bcd1-57ba-8ff9-78d3fb95009a</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Wed, 21 Jul 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/intro-phil.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We’re proud to announce a new hire; Phil Leggetter will head up Developer Relations at PostHog.</p><p>Developer relations sits at the intersection of product development, engineering, and marketing. The role serves communities of core and secondary customers through content, tutorials, events, and sponsorships. At PostHog, we’ve been blessed with a highly engaged community of <a href="https://posthog.com/contributors">contributors</a>, and we hope to improve our product to suit our users’ needs over the long run.</p><p>Before joining PostHog, Phil managed developer relations at <a href="https://tru.id/">tru.ID</a> (a mobile authentication platform), <a href="https://www.vonage.com/">Vonage</a> (a communications API company), Nexmo (later acquired by Vonage), <a href="https://pusher.com/">Pusher</a>, and other tech startups (see <a href="https://www.linkedin.com/in/leggetter/">his LinkedIn profile</a> for a full list). While at Nexmo, he built the developer relations team to 42 diverse, inclusive, and multifunctional individuals who worked everywhere from San Francisco to Singapore. He has also written a book on real-time web sockets, is currently reviewing another book on developer relations, and is now an advisor at several startups.</p><p>Over the next few months, Phil aims to help our users get the most out of PostHog through deeper engagement with external communities, making PostHog even more transparent with regular events, and increasing opportunities for users to connect with the PostHog team. </p><p>The highly organized father of three works out of his color-coordinated shed in <a href="https://en.wikipedia.org/wiki/Dollar,_Clackmannanshire">Dollar</a>, a small town in Clackmannanshire, Scotland, helping savvy companies build engaged communities across the dev world. A consummate gamer and techno-dance fan who admits he once obsessed over NSYNC and the Backstreet Boys, Phil also used to be into soccer, going so far as to create a website in 2006 called ‘Bring Back Beckham’ after David Beckham was dropped from the England squad. On a non-soccer-related front, Phil has also tweaked the popular AARRR framework to ‘<a href="https://www.leggetter.co.uk/aaarrrp/">AAARRRP</a>’, helping companies map their business goals to what dev relations can do for them.</p><p>You can find Phil online on <a href="https://github.com/leggetter">GitHub</a>, <a href="https://twitter.com/leggetter">Twitter</a> and <a href="https://www.linkedin.com/in/leggetter/">LinkedIn</a>, and his <a href="https://leggetter.co.uk">website</a>.</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[YC adds PostHog to top valued companies for July 2021]]></title><description><![CDATA[Y Combinator has  listed  PostHog as number 157 out of its top 159 companies by valuations and exits as of July 2021. "Um… what?" I know, I know. You…]]></description><link>https://posthog.com/blog/yc-top-companies</link><guid isPermaLink="false">28c11b9b-4eef-5591-b573-5061563b8a5c</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Fri, 02 Jul 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/yc-top-companies/yc-top-companies.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Y Combinator has <a href="https://www.ycombinator.com/topcompanies">listed</a> PostHog as number 157 out of its top 159 companies by valuations and exits as of July 2021.</p><h2 id="um-what">&quot;Um… what?&quot;</h2><p>I know, I know. You&#x27;d think we merely post the link and keep it moving. After all, coming third-to-last on a list of over 150 of <em>anything</em> isn&#x27;t really something to brag about, is it?</p><p>It actually is. YC have invested in over 3,000 startups - and they&#x27;re widely seen as the best startup accelerator in the world. At PostHog, we&#x27;ve come a long way. From spending our first few months <a href="https://posthog.com/blog/story-about-pivots">pivoting</a> from one idea to another, to <a href="https://posthog.com/blog/why-we-raised-a-15m-series-b-ahead-of-schedule">raising $15m</a> in our Series B round after just ~1.5 years of operations, to planning to double our headcount to 47 by the end of 2021, our journey has been exhilarating, confusing, and supremely worthwhile. </p><p>As an open-source company, we document everything we do on our <a href="https://posthog.com/blog">blog</a>, in our <a href="https://posthog.com/handbook/company/story">company handbook</a>, and on our <a href="https://github.com/posthog/posthog">GitHub repo</a>. So it was only natural that we&#x27;d also want to document this achievement - as a reminder of how far we&#x27;ve come and where we&#x27;re going.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How PostHog's new VP focused the company on nailing funnels in his first week]]></title><description><![CDATA[Ramping up fast in any senior product role requires understanding as much context as possible across 3 axes (Market, Product and People). I’ll talk…]]></description><link>https://posthog.com/blog/new-vp-nailing-funnels</link><guid isPermaLink="false">38e88e08-9c28-5e4e-9ff2-56b752275c1d</guid><dc:creator><![CDATA[Marcus Hyett]]></dc:creator><pubDate>Thu, 01 Jul 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/new-vp-nailing-funnels/new-vp-nailing-funnels.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Ramping up fast in any senior product role requires understanding as much context as possible across 3 axes (Market, Product and People). I’ll talk you through my process of going from zero understanding in these three areas, to landing a clear, ambitious long-term strategy across the company in just one week.</p><h2 id="phase-1-understanding-context">Phase 1: Understanding context</h2><h3 id="market">Market</h3><p><strong>Customer interviews</strong></p><p>We have a wealth of documented in-depth interviews with existing customers and prospects around their experience with PostHog, and I was able to attend a few live interviews in my first week. I read the transcript of every single interview (some multiple times), pulling out key themes and looking beyond what they were asking for to try and work out <em>why</em> they were asking for it. This created a shortlist of critical needs we must solve for to make our customers successful.</p><p><strong>Competitor research</strong></p><p>When you’re new to a market with existing competitors it’s important to understand who they are and what’s unique about their products. I analyzed the marketing and documentation of a number of our competitors to understand our potential gaps and advantages. It’s key not to get hung up on features our competitors have which we don’t - we must focus on building the best solution to the problems our customers have, which might look different to what our competitors offer.</p><p><strong>Analytics</strong></p><p>PostHog is a product analytics tool, so I was able to get set-up and analyse the behavior of our users within a few hours. I focused on breaking down how our existing product is used across different dimensions to understand which of our capabilities are most valuable to our existing customers and have the biggest growth opportunities.</p><h3 id="product">Product</h3><p><strong>Mission</strong></p><p>PostHog&#x27;s mission to <strong>&quot;Increase the number of successful products in the world&quot;</strong> was a big reason I joined the company, and that phrase provided context to building out a long-term direction.</p><p>Dogfooding</p><p>Every good product manager is one of the world’s top users of their product. I spent over 12 hours in my first week using the product inside and out, identifying bugs, drawbacks and opportunities for the product along the way.</p><p><strong>Tasks and feature requests</strong></p><p>To gather context on how the team prioritizes and what they’re currently working on, I spent a number of hours reading through open GitHub issues. This gave me insight into what our community is expecting and experiencing when they use PostHog.</p><h3 id="people">People</h3><p><strong>Intro interviews and insights</strong></p><p>I attempted to meet with every single person in the company in my first week - a few meetings spilled over into the second week. I introduced myself and got to learn about them, their history, and what they’re passionate about. I asked everyone the same three questions:    </p><ul><li>In your opinion, what&#x27;s the long term direction of PostHog?</li><li>What do you think is the biggest blocker to our success?</li><li>What can I do to help you become more successful?</li></ul><p>The answers to these questions were really enlightening. It was immediately clear that the company had been quite reactive and that a proactive strategy would be welcomed. I also got a great understanding of what the future of PostHog might look like and what I can do to help each individual succeed.</p><h3 id="insights">Insights</h3><p>Based on these interviews, I aggregated the key themes as a collection of insights to share with the team. This also gave me the opportunity to identify and share a number of immediate actions I would be taking to help push the company forward.</p><h2 id="phase-2-building-the-strategy">Phase 2: Building the strategy</h2><h3 id="long-term-direction--audience">Long-term direction &amp; audience</h3><p>The cornerstone of every strategy is having a long-term direction to point everything else towards. It was easy to build a long term vision for 2023 with insights from the intro interviews and leveraging PostHog’s existing mission. We identified a segment that resonated well with our existing successful customers and has a lot of growth potential.</p><h3 id="first-milestone">First milestone</h3><p>With a long term vision, clear focused audience, and a ton of context about our customers, their needs, the market and how our product is used today, we identified one thing we needed to get right before anything else: funnels. </p><h2 id="phase-3-landing-the-strategy">Phase 3: Landing the strategy</h2><h3 id="feedback--iteration">Feedback &amp; iteration</h3><p>To get buy-in, it was crucial for me to share the draft with the entire company and get as much feedback as possible. The feedback was comprehensive and enabled me to quickly iterate on the first version. To make the strategy easy to remember and execute, we came up with a memorable two-word version of our top priority: “nail funnels”.</p><p>But you can&#x27;t just assume everyone will buy into the strategy because you posted it somewhere and they gave it a thumbs up. You have to talk people through it 1:1 and communicate the message via different channels. We discussed the new strategy in all our small team standups, company all-hands, and uploaded it to our website.</p><p>Read more about our strategy in the <a href="/handbook/strategy/overview">strategy overview</a>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[A non-coder's thoughts on an 'Everybody Codes' culture]]></title><description><![CDATA[One of PostHog’s core values is that everybody codes. That doesn’t mean everyone needs previous experience as a developer or engineer, but we…]]></description><link>https://posthog.com/blog/a-non-coders-thoughts-on-everybody-codes-culture</link><guid isPermaLink="false">6bf7f3ce-dfc5-5b73-98c4-cc2875742f92</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Fri, 25 Jun 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/non-coders-thoughts/non-coders-thoughts.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of PostHog’s core values is that everybody codes. That doesn’t mean everyone needs previous experience as a developer or engineer, but we encourage everyone to learn and practice the basics of shipping, no matter their role. </p><p>When we’re hiring developers, this isn’t an issue. However, it can be intimidating for candidates who don’t have coding experience, even if they are otherwise technically literate. This is because our tools are centered around GitHub, so even writing this blog post requires knowing how to submit <a href="https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests">Pull Requests</a>. </p><p>Having recently joined PostHog as a Product Marketer, I definitely fall into this non-coding cohort. My previous experience may have been reasonably technical, but my coding knowledge is limited to a smattering of HTML; product marketers are better known for their presentation decks than their pull requests. Thankfully, there were three things which set me up for success when using these tools and processes for the first time. </p><h2 id="getting-started-early">Getting started early</h2><p>There’s a lot to be done when joining a new company, and intimidating tasks can end up deprioritized - especially if they’d normally fall outside your remit. </p><p>One of the best things PostHog’s team did was to get me started on coding as soon as possible. This included sharing videos about GitHub fundamentals before I started and setting up tools such as <a href="https://code.visualstudio.com/">Visual Studio Code</a> with me.</p><p>I set out to update <a href="https://posthog.com/handbook/people/team">our Team page</a> to test my abilities. It only required editing a single .md file, but doing that first pull request built my confidence. We’ve since added this task to our onboarding process to give future team members a similar experience.</p><h2 id="having-realistic-limits">Having realistic limits</h2><p>Not knowing what is expected of you and when to ask for help can make an ‘everyone codes’ culture intimidating.</p><p>I experienced this when <a href="https://github.com/PostHog/posthog.com/issues/1416#issuecomment-849687634">my next update</a> required working with React. I couldn’t recognize React code so I couldn&#x27;t Google the right questions. It was a total blocker.</p><p>Thankfully, our Engineering team is amazingly communicative and supportive. They helped me understand the problem and, more importantly, when I should be delegating. Setting realistic limits and building a supportive atmosphere are crucial for a successful coding culture.</p><h2 id="making-mistakes">Making mistakes</h2><p>One other element of our culture is our <a href="https://posthog.com/handbook/company/culture">bias for action</a>, but this can be daunting when you’re doing something for the first time. What if you get it wrong? What if you break the website or create a product bug?</p><p>This isn’t the way it works, of course. GitHub has reviews built in to prevent such big mistakes and make it easy to roll back changes where needed. What feels high-risk to a novice isn’t actually risky at all, so we can afford to be bullish.</p><p>I’ve made <a href="https://github.com/PostHog/posthog.com/pull/1475#issuecomment-860511537">many minor mistakes</a>, and each time, someone has stepped in with helpful and timely feedback rather than admonishment. In this way, mistakes reinforce our culture and help everyone to learn faster. </p><p>Ultimately, while I was initially nervous about the ‘everyone codes’ culture at PostHog, it hasn’t taken me long to start seeing benefits. As a team, we can move faster; and as individuals, we can have greater impact with less bureaucracy - as shown when I made <a href="https://github.com/PostHog/posthog/pull/4584">my first product update</a> in only my second week.</p><blockquote><p><a href="https://posthog.com/blog/a-non-coders-thoughts-on-everybody-codes-culture-part-two">Part two of this article is now available!</a></p></blockquote><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe/">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we do customer support at our open source devtool company]]></title><description><![CDATA[Thinner docs, better products The highest priority for support at any company is shortening the feedback loop between your customers and your product…]]></description><link>https://posthog.com/blog/customer-support-at-posthog</link><guid isPermaLink="false">229c570a-fbb0-5647-a647-62ae0ba33536</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Tue, 15 Jun 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/customer-support-at-posthog/customer-support-at-posthog.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="thinner-docs-better-products">Thinner docs, better products</h2><p>The highest priority for support at any company is shortening the feedback loop between your customers and your product team. The fastest way to achieve this is by having your product builders interface directly with your customers (like we do at PostHog). This gives you an idea of the types of problems that keep cropping up and lets you decide how much help content you need to create - but most importantly, it tells you how to improve and simplify the product experience to reduce the need for thicker help docs and extensive tutorials.</p><h2 id="a-little-background">A little background</h2><p>Our very first support staff members were the founders, James and Tim, due to the limited resources and staff we had at the time. Having all hands on deck made a big difference, as you can’t afford to designate customer support to just one person in the early days. </p><p>As of writing, customer support at PostHog happens in <a href="https://posthog.com/handbook/growth/customer-support">“rotas”</a> - pre-planned, one-week cycles where one dev team member drops all development work and handles incoming user queries. Called a ‘Support Hero,’ this team member monitors all our channels - from GitHub and Slack to social media where applicable - and either solves the issues that surface or ropes in other team members for assistance. That last point is important, as having a support hero doesn’t abdicate everyone else from responding to customers. At PostHog, we firmly believe in “stepping on toes”: if you spot a problem that falls under someone else’s purview, just solve it.</p><p>We do not hire support people at PostHog. Instead, support is something that all of our engineers do on a rota basis. Yes, Tim as CTO still does it too.</p><h2 id="removing-friction">Removing friction</h2><p>We don’t offer any special customer support training for our engineers beyond basic communication tips and tool guides. We serve other engineers - people who believe in honest, open communication sans the stifling friction and formality of typical consumer product companies. It’s also why we don’t use chatbots, internal triaging systems, or anything that would add an extra step between the user and our support heroes. In addition, we don’t tier our support based on the product edition you use. <a href="https://posthog.com/pricing">Complex deployments</a> may receive a little extra effort, but we otherwise treat every support ticket with the same urgency.</p><p>Naturally, it would be harder for a company that started with frictional systems to move to a model like ours. Inertia is a powerful force, and stripping a support team of its crutches - fancy chatbot algorithms, ticket queuing systems, a large team - in favor of a smaller, leaner, and more focused team can be disruptive. If you run a devtool company, we recommend starting with the support hero model right from the start and building on from there.</p><h2 id="tools-and-platforms-papercups-slack-email-and-social">Tools and platforms: Papercups, Slack, email, and social</h2><blockquote><p>Since this article was published we&#x27;ve launched a new way to get in touch. We now prefer to <a href="https://app.posthog.com/home#supportModal">handle bug reports, customer support and feedback via the app</a> - but we&#x27;ve left the post below intact for posterity. </p></blockquote><p><a href="https://papercups.io">Papercups</a> is a lightweight customer support tool that we chose for several reasons:
It’s open-source, which aligns with our business philosophy.
Its core UX is delightful and straightforward to use, making it easy to onboard new support heroes.
It syncs all support tickets to Slack so our team can respond directly from the platform. Customer support teams are exempt from our <a href="https://posthog.com/blog/meetings">meeting-free days</a> policy.
It tracks stats around the number and types of tickets we receive (about 30 a day), how long it takes us to close each ticket (about an hour on average, accounting for complexity and time zones), and other useful analytics.</p><p>Beyond Papercups and our <a href="https://posthog.com/slack">external Slack channel</a>, we also receive support queries via email (sent to <a href="mailto:hey@posthog.com">hey@posthog.com</a>), GitHub (where our team spends most of their time), and very rarely via <a href="https://twitter.com/PostHog">social media</a>. We’ve found that within the context of businesses like ours, social media queries are usually a sign that normal communication or helpdesk channels have failed - and startups should avoid this as much as possible.</p><h2 id="are-open-source-support-models-expensive">Are open-source support models expensive?</h2><p>The beauty of open source is that it’s built on a passionate community of contributors who have an innate interest in seeing the product succeed. This voluntary dedication of time and energy means that problems get solved faster than they would with a dedicated team - and <a href="https://github.com/posthog">our repo</a> is an excellent example of that. There’ve been plenty of instances where a user posts a question about the product or a challenge they’re facing, and one of our contributors chimes in to assist. When you’ve effectively generated extra support team members through your GitHub repo or Slack channel, you can spend less time responding to common queries and more time improving your product to prevent those queries cropping up again.</p><p>Would we do things differently if we were starting over? Barely. We might hone in on Slack as our main comms channel earlier in our journey, but we’re otherwise happy with how customer support at PostHog has evolved.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why we raised a $15m Series B ahead of schedule]]></title><description><![CDATA[Last week we proudly announced we’d successfully raised $15 million in a Series B funding round, with support from Y Combinator Continuity Fund and GV…]]></description><link>https://posthog.com/blog/why-we-raised-a-15m-series-b-ahead-of-schedule</link><guid isPermaLink="false">b374c79e-a894-5440-a2ef-324c38c264e2</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Mon, 14 Jun 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/series-b/series-b-baby.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Last week we proudly announced we’d successfully raised $15 million in a Series B funding round, with support from Y Combinator Continuity Fund and GV (formerly Google Ventures). You may have seen <a href="https://venturebeat.com/2021/06/10/open-source-product-analytics-platform-posthog-raises-15m/">the news on VentureBeat</a>.</p><p>What made this funding round different from most is that we hadn’t actually planned to raise a Series B yet. So, why did we?</p><p>Over the last 12 months we’ve made huge improvements to our platform, including <a href="https://posthog.com/blog/the-posthog-array-1-15-0">introducing ClickHouse</a> and <a href="https://posthog.com/blog/the-posthog-array-1-25-0">deciding to give away 100x more free events on PostHog Cloud</a>. This has led to a sustained surge in interest, to the point that we’ve been literally unable to keep up with demand. This is even despite doubling our headcount since the start of the year. </p><p>In some ways this is a nice position to be in. However, when we started to receive interest from investors again we saw an opportunity to address this bottleneck. We didn’t strictly need the money to continue as we were, but we realized raising funds ahead of schedule would enable us to grow quicker, build faster and to better support our growing community.</p><p>In short, we had an opportunity to accelerate, so we decided to take it. </p><p>You may be curious what we’ll spend the money on. Our aim is to double the size of the team to 47 people by the end of the year, then double again in 2022. Right now we’re recruiting for Full Stack Engineers and Front End Developers, but we remain open to speculative applications too. <a href="https://posthog.com/careers">If you’re interested, get in touch!</a></p><p>Other plans for the future include enhancing connectivity with data warehouses and merging improvements from PostHog Free into our open source product. It will take a few months to get there, but we ultimately want to create an open source offering which is free and scalable for everyone from individual hobbyists to enterprise teams. </p><p>We’d like to thank our thousands of users and our community of contributors for their continuing support in helping us reach this milestone, and for joining us in taking this next step. If you’re interested in what else we have planned for the future, <a href="/handbook/strategy/roadmap">check out our roadmap</a>!</p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog raises $15 million Series B for open source product analytics]]></title><description><![CDATA[Jun 10th, 2021  –  PostHog , the open source product analytics company, today announced $15 million in fresh funding and major new free features for…]]></description><link>https://posthog.com/blog/15-million-series-b</link><guid isPermaLink="false">142d3702-37ea-59a2-876f-0a0e273f1312</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 10 Jun 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/series-b/series-b-baby.png" length="0" type="image/png"/><content:encoded><![CDATA[<p><strong>Jun 10th, 2021</strong> – <a href="https://posthog.com">PostHog</a>, the open source product analytics company, today announced $15 million in fresh funding and major new free features for users of data warehouses.</p><p>The company&#x27;s Series B was led by existing investors Y Combinator&#x27;s Continuity Fund, with participation from GV (formerly Google Ventures), and takes PostHog&#x27;s total funding to over $27M, despite the company only recently turning one year old. As part of the round, Ali Rowghani, Managing Partner at YC Continuity, and former COO at Twitter and CFO at Pixar, will join the PostHog board. </p><p>PostHog&#x27;s mission is to increase the number of successful products in the world. Their open-source platform lets developers track product usage, understand the impact of new features on user behavior, and integrate product and user data with data warehouses - all without sending any data to a 3rd party.</p><p>PostHog Scale is now live — a new plan that enables teams with anywhere from thousands to millions of users to track their product usage for free, all in their existing infrastructure.</p><p>James Hawkins, co-founder and CEO, said: &quot;To date, product analytics for those using data warehouses has been painful — developers are between a rock and a hard place. They can either code their own data export libraries and their own SQL, or they&#x27;d have to send user data to a 3rd party and incur massive data transfer charges. Companies want to leverage their data more than ever before, data warehouses are getting cheaper and simpler, and we can support their adoption as they become mainstream. PostHog means data analysts no longer need to lose hours producing simple product usage visualizations.&quot;</p><p>Tim Glaser, co-founder and CTO, said: &quot;Whilst everyone else is focused on product managers, we&#x27;ve believed since Day 1 that product analytics should be developer-led. They&#x27;re the ones building the product. We&#x27;ve now made our more scalable product free, with the goal to move it to open source as soon as possible. This enables an individual developer, in an enterprise or scale-up, to use PostHog on their infrastructure without vendor lock-in and without sending any user data to a 3rd party — at massive scale, for free.&quot;</p><p>Transparency is key to the company. Not only does the company have a public handbook, it&#x27;s possible for anyone in the world to follow along or even contribute to the day-to-day planning and development of the product.</p><p>James, co-founder and CEO said, &quot;Having the conviction to focus on controllable inputs — such as a better experience for developers — is the best long-term way to achieve the outputs you need. Transparency has been a key part of building developer trust, and this has enabled us to build a large community. We&#x27;re now seeing hundreds of people installing the free platform each week, we have over 150 people contributing to our code on top of our own team, and we have thousands of deployments. This has resulted in us getting overwhelmed with requests for our paid product.&quot;</p><p>PostHog will use the funding to focus on another major input — having the best people in the world join the team. This will accelerate improvements to self-hosted deployment at scale, data warehouse integration and tutorials, user experience, marketing, and customer success.</p><h3 id="about-posthog">About PostHog</h3><p>PostHog is an open source, developer platform. PostHog enables software teams to understand user behavior — auto-capturing events, performing product analytics and dashboarding, enabling video replays, and rolling out new features behind feature flags, all based on an open source platform. The product&#x27;s open source approach enables companies to self-host, removing the need to send data externally. </p><p>Founded in 2020 by James Hawkins and Tim Glaser, PostHog was a member of Y Combinator&#x27;s Winter 2020 batch, and has subsequently raised $27m in funding from GV, Y Combinator, and notable angel investors including Jason Warner (CTO, GitHub), Solomon Hykes (Founder, Docker), and others.</p><h3 id="about-y-combinator-continuity-fund">About Y Combinator Continuity Fund</h3><p>YC Continuity is an investment fund dedicated to supporting founders as they scale their companies. Our primary goal is to support YC alumni companies by investing in their subsequent funding rounds, though we occasionally invest in non-YC companies as well.</p><p>Like YC&#x27;s early-stage partners, the entire YC Continuity team has strong operating experience. We work to create opportunities for founders to continue their personal growth and scale their companies successfully.</p><p>We also run the YC Growth Program, which brings together founder-CEOs who are leading rapidly growing companies.</p><h3 id="press-contacts">Press contacts</h3><p><a href="mailto:press@posthog.com">press@posthog.com</a></p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Frontend filters & backend SQL - A chat with Eric Duong, Sam Winslow, James Greenhill, and Buddy Williams]]></title><description><![CDATA[By:  Engineering @ PostHog Eric: I'll just do it on my computer, upload it, and then toss it later. Cool. I guess actually, a good way to start would…]]></description><link>https://posthog.com/blog/frontend-filters-and-backend-sql</link><guid isPermaLink="false">b3820deb-b423-5742-916c-325992744106</guid><pubDate>Fri, 04 Jun 2021 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>By: <a href="https://www.linkedin.com/company/posthog">Engineering @ PostHog</a></p><iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/f__CzGVdtIs" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p><strong>Eric:</strong></p><p>I&#x27;ll just do it on my computer, upload it, and then toss it later. Cool. I guess actually, a good way to start would be, Sam, what is your understanding of setting the filters and properties right now?</p><p><strong>Sam:</strong></p><p>Oh my gosh, where to start. Yeah, I&#x27;ll pull up the UI because I think that is a great jumping off point for kind of understanding it, and I think largely through the lens of the front end and user experience type of stuff. Let me also turn off the feature flag that I&#x27;m currently working on. But basically, there are filters on actions and events and on person properties and things like that, but then even within actions and events, there&#x27;s kind of two levels of filtering going on. There&#x27;s just purely, what is the action key or the event key that identifies it, but then within that, you can add filters on the properties thereof.</p><p><strong>Sam:</strong></p><p>So there&#x27;s just multiple layers to it, and sometimes the logic can be a little hard to know what layer of abstraction you&#x27;re kind of looking at in the code, because there&#x27;s action filters and there&#x27;s property filters. But yeah, those are the two big things, but then also there seems to be some duplicated or different approaches to solving the same kinds of problem. So there&#x27;s many different UIs, I guess, for filtering.</p><p><strong>Eric:</strong></p><p>Yeah. Wait, which screen are you guys seeing right now?</p><p><strong>Sam:</strong></p><p>It&#x27;s both, I think.</p><p><strong>Eric:</strong></p><p>You do you see the code in the app?</p><p><strong>Sam:</strong></p><p>Yeah, the code is tiny though. I&#x27;ll put it on my bigger screen.</p><p><strong>Eric:</strong></p><p>I can zoom in. You see this? You see my mouse here? Am I looking at the right?</p><p><strong>Buddy:</strong></p><p>Zoom in one more time, Eric.</p><p><strong>Eric:</strong></p><p>It&#x27;s going to be tough for me. Is this good?</p><p><strong>Buddy:</strong></p><p>It&#x27;s okay.</p><p><strong>Eric:</strong></p><p>Yeah. This is kind of a giant monitor, 2K or something. Resolution [crosstalk 00:02:26]. All right. So I guess a good thing to start with is, we&#x27;re looking at these filters, right? So there&#x27;s a bunch of filtering here, there&#x27;s a bunch of filtering here. And something that everyone&#x27;s probably noticed by now, if you&#x27;ve used Insight page, is we deal with atrociously long search parameters. We rely pretty heavily on this. It makes copying and pasting easier, and just linking from other places. We might move off of it, but that&#x27;s for the discussion later. The fact is, this is what we use right now. And every time you update anything here, you&#x27;ll see it&#x27;s updated here. I think it&#x27;s right here. And you can see the update is a string. And then every single thing that you add here that will be relevant to the query will essentially be added into that query string.</p><p><strong>Eric:</strong></p><p>That does not work, but yeah. So you have that, that&#x27;s a property filter on the [inaudible 00:03:34], and then if you change any of this, it&#x27;ll update all this. And we also track which one you&#x27;re looking at. So insight trends, sessions. Now, going into the code a little bit, I explained this to Buddy earlier, but there&#x27;s a few things going on here that actually make it a little harder than it has to be, but it&#x27;s just because of how the components are set up. So we&#x27;re looking at a page that controls many different insights, but we also have this component that&#x27;s shared across them. And we want to have the ability to add something to a dashboard. So the way that this thing has kind of grown into, not even super planned, because this page has evolved many times over, and we&#x27;ve basically built logic on top of that over and over and over again.</p><p><strong>Eric:</strong></p><p>But basically what&#x27;s happening right now, is the Insight page itself has a logic. So that&#x27;s called insight logic. And there&#x27;s a lot of related things here, but the only thing regarding the filters is this all filters object and this active view data. So these two pieces of data. So it&#x27;s active view and all filters. And every time you update... So this is the overarching logic. This is insight logic for this entire page. And then actually what&#x27;s related to that is each insight has its own logic, and that&#x27;s where you get trends logic. So when you&#x27;re looking at trends logic, you&#x27;re actually looking at the logic that will handle these filters specifically. And what I mean by specifically is that every time you call, I&#x27;m sorry, every time you add a filter or change any of this stuff, we&#x27;ll call set filters. That&#x27;s the action that this logic exposes.</p><p><strong>Eric:</strong></p><p>And I&#x27;m just showing you the logics. This is just somewhere in the UI, sorry, somewhere in the component where set filters is called, and that will aggregate anything that&#x27;s here and put it into this object. And this is the filters object inside the trends logic. And then you&#x27;ll notice, oops, we have a listener right here. So it&#x27;s a listener, where every time you call set filters, it&#x27;ll actually go to insight logic and call set all filters. And this will just bring a master copy of it back to the insight logic, which I like to think about as the parent logic. And then obviously as a side effect, it&#x27;ll just load results. Yeah. Yeah. We&#x27;re just loading results after every time.</p><p><strong>Eric:</strong></p><p>So right there, what&#x27;s going on is there&#x27;s insight logic, which is like the parent logic, and then each insight itself has a specific logic. So there&#x27;s a funnel logic, session logic, retention logic, path logic. The only thing that&#x27;s slightly different is that stickiness and life cycle reuse trends, because of a refactor that we did. Stickiness and life cycle used to be under trends, but it&#x27;s broken out now. A little bit of refactoring there that can be done. But regardless, they all have their own. And just like this trends logic, they all work slightly differently, but the filtering is very similar here. So set off filters and then it calls your results.</p><p><strong>Eric:</strong></p><p>Now also, when you call set filters, the logic will update the query parameters. And then this is action to URL. So that means anytime there&#x27;s an action, how do we update the URL? And then there&#x27;s also another hook that every insight logic has that controls... Sorry, not a hook, I don&#x27;t want to say hook here because components actually use hooks in a different context. But there&#x27;s another listener that&#x27;s a URL to action. And this will just make sure that if we ever update the URL here, it&#x27;ll actually know how to handle it. So I think you can actually just change it to weak, and then you&#x27;ll see that this is what&#x27;s handling what I just did here. If you change this to weak and enter it, it&#x27;ll hit this listener and then make a change if necessary.</p><p><strong>Eric:</strong></p><p>So that&#x27;s what&#x27;s happening here. It&#x27;ll check the search parameters, and then there&#x27;s some processing obviously, but it&#x27;ll check the search parameters against what the logic knows right now, and if it&#x27;s different, it&#x27;ll set off filters. Otherwise, it&#x27;ll still update our... sorry, it&#x27;ll set the local filters. Otherwise, it&#x27;ll update all filters. So I must [inaudible 00:08:05], I&#x27;ve just been speaking for quite a minute. Does anyone have any clarifications, because Lee and Kunal aren&#x27;t here to speak for them either?</p><p><strong>Buddy:</strong></p><p>Two questions. One is, why isn&#x27;t there just one filters truth, right, versus every insight having its own? Because you end up just pushing it up anyway. So why isn&#x27;t there just one? And then secondly, this URL to action, this is only implemented here once, it&#x27;s not implemented in all the other ones?</p><p><strong>Eric:</strong></p><p>Oh no, no. You mean in funnel logic or?</p><p><strong>Buddy:</strong></p><p>Yeah.</p><p><strong>Eric:</strong></p><p>I know it should be, let me double check.</p><p><strong>Buddy:</strong></p><p>Okay.</p><p><strong>Eric:</strong></p><p>Yeah, you&#x27;ll see the same thing here. This is funnel logic, and then you&#x27;ll see, it&#x27;s just checking the specific parameters here. There&#x27;s a bit of difference in handling in each one, that can be made more uniform. They just rose because of different circumstances. And then your original question was, why are there multiple copies? Why are we going back and forth, right? So there was basically a proposal where when we add properties like this, we want them to persist when you change from trends to stickiness, for example. That&#x27;s what you see here. But these things are being controlled by different logics, so you actually need an overarching logic to show that state. And that just so happened to be insight logic.</p><p><strong>Buddy:</strong></p><p>I guess my question is why do they need a different logic for that one piece of data?</p><p><strong>Eric:</strong></p><p>Oh, okay. I mean, alternatively, what would you suggest? Just putting it into the parameters?</p><p><strong>Buddy:</strong></p><p>No, I mean, there&#x27;s filters, right? And every, say, logic could just update the master filter, right, and use data from it.</p><p><strong>Eric:</strong></p><p>There just be like a filter logic right here?</p><p><strong>Buddy:</strong></p><p>No. Well, because every time you modify these filters, you push it up to the parent, right?</p><p><strong>Eric:</strong></p><p>Yeah.</p><p><strong>Buddy:</strong></p><p>So why not just use the parent?</p><p><strong>Eric:</strong></p><p>Because then that parent would have to handle the separate logic for each one of these. I mean, we could do that. We could just have all of these updates go directly to an insight logic, but then that insight logic would be responsible for everything that happens in all of these.</p><p><strong>Buddy:</strong></p><p>Well, I guess that&#x27;s my question. Why would it have to be responsible for all the business logic when my understanding is that you can just pull in data from other logics?</p><p><strong>Eric:</strong></p><p>Yeah. I mean, given the key&#x27;s flexibility, you could do this 100 different ways. This is just the way that we landed on from the evolving concerns. So I wouldn&#x27;t say there&#x27;s the best justification for how we landed here, if that makes more sense. I could see this where we actually make filter logic its own thing so that it&#x27;s very contained, and then anything that actually needs filter logic will just pull from filter logic and use the data there. But in this case right now, what&#x27;s going on is that insights has filters, and then this one it updates, it&#x27;ll just give it to apparent logic.</p><p><strong>Sam:</strong></p><p>Yeah. I kind feel what Buddy is saying about separating out the concerns a little bit, especially because I don&#x27;t think we have a case where we&#x27;re showing multiple of these things at the same time, right? If trends and funnels are not shown at the same time, they don&#x27;t need to be super decoupled, right? Because if insights owns it and they&#x27;re not... Do you get what I&#x27;m saying?</p><p><strong>Eric:</strong></p><p>Can you go over that again?</p><p><strong>Sam:</strong></p><p>Just thinking, the only reason I would see for having the filter logic be separate for each view, is if you&#x27;re going to be showing those views at the same time and you don&#x27;t want them to clash with each other, right? So you want to isolate out each one, but here, it&#x27;s almost like the filters are... I mean, first of all, the filters closer to the component side of what&#x27;s actually rendered in react, they handle every possible case. So it&#x27;s checking, is this a funnel query, is this a session query, is this whatnot? So that&#x27;s the actual thing that&#x27;s getting rendered. But then the logic is very separated out, but then it all comes back and is rendering the same component at the end of the day.</p><p><strong>Sam:</strong></p><p>So yeah, I would think that would be a reason for centralizing the logic further up in the parent. If there&#x27;s only one set of filters shown at any given time, it&#x27;s a different type of insight, then, yeah, I would think that Insight should just own the whole thing. But this is like... Again, I know how much work it would be to refactor and go in and do all that because I&#x27;ve done a little bit of it, but yeah.</p><p><strong>Eric:</strong></p><p>Yeah. Well, there&#x27;s two things I want to go over in this talk. So I&#x27;m just trying to describe how it works right now. And then as a followup or as the second half of this discussion, we should figure out what would it be a better way to do this, and can we just get that out quickly? I agree this is-</p><p><strong>Sam:</strong></p><p>No, I don&#x27;t mean to derail the discussion here. Like I&#x27;m just-</p><p><strong>Eric:</strong></p><p>Yeah, yeah, no problem. But yeah, we&#x27;ll circle back in like five minutes, I just want to make sure I cover how everything here works. So again, each insight has its logic. You update the filters, it&#x27;ll go to the actual insight parent logic. And that parent logic has this all filters object that I was describing earlier. And this will just contain everything that you&#x27;ve said here. Again, it&#x27;s the same thing as the actual trial logic from each of these. And then this is passed into the component, this button that will actually take it and create it into a dashboard. And the last important thing I need to go over is that when you switch from trends to funnels to sessions, you&#x27;ll notice that this string changes, but it also retains what you had said here.</p><p><strong>Eric:</strong></p><p>So if I said [inaudible 00:15:06] here and I go to funnels, well, I guess that routine&#x27;s not working. Yeah. So if you&#x27;re looking at this trends view and you have something set up here and then you switch to stickiness, for example, it&#x27;ll reset to the defaults that stickiness had, but when you go back to trends, it&#x27;ll save what you had here, and we do that through the query string up here. And that&#x27;s just happening in the insights logic. So right here, when you set active view, it&#x27;ll cache the URL and then save it. But it will actually propagate the properties and the test accounts, which is why you see this persisting across. But this is all handled from the query string.</p><p><strong>Eric:</strong></p><p>Those are the main components, but we can discuss how to make this better now, and I think that&#x27;d be really useful to lay down in a ticket and possibly approach. But again, I&#x27;d say we have to approach in a very sustainable way, so we don&#x27;t just nuke the whole thing. So yeah, Buddy and Sam, could you go over the questions you had earlier again?</p><p><strong>Buddy:</strong></p><p>Yeah. So it&#x27;s actually really instructive to... Well, I guess I have a couple of thoughts. One is, did James have any questions so we don&#x27;t dominate this meeting? So I guess let me start there.</p><p><strong>James:</strong></p><p>Nope, none so far. Because it&#x27;s just educational survey of this.</p><p><strong>Buddy:</strong></p><p>Right. I think if we have time, Eric, a follow up question to me would be how this integrates into the backend and how filters work on the backend. Because I think that&#x27;s probably also complicated. But to answer the basic question that I was trying to get at earlier, the state of insights is really a hybrid combination of the logics and the URL. And so to understand what you&#x27;re looking at or why you&#x27;re looking at it, you need to understand what the filters are in the various logics, but then also what the URL is, because I guess when you go back or you go to a different URL, it looks up some URL cache and pulls data from that to reset the filters that way.</p><p><strong>Eric:</strong></p><p>Yeah. So that&#x27;s actually point number one that we could discuss. Shouldn&#x27;t we just get rid of the search string? Because we could do that. And then it would simplify... A lot of what makes this really hard to work with is that there are these listeners that always just fire every time the URL changes, and that&#x27;s super flimsy because you&#x27;re dealing with updates from the URL and then possible updates from within whatever state changes you make here. So it could be worth thinking about, cool, what if we just got rid of any reliance on the URL? [crosstalk 00:18:30]</p><p><strong>Buddy:</strong></p><p>You would lose a few things if you did that.</p><p><strong>Eric:</strong></p><p>Like?</p><p><strong>Buddy:</strong></p><p>You would lose refresh, hard refreshes. So today if you hard refresh, it understands what your filters are, but if you got rid of that and you did a hard refresh, you&#x27;d clear out your internal JavaScript state and you would lose your existing filters.</p><p><strong>Eric:</strong></p><p>Yeah. There&#x27;s a few things. Okay. So to extend that implementation, what it could look like is that you&#x27;d be like, insights new, and then it might give you an ID. Yeah, it might be like, new, some ID. And then this would basically be a model in the database so that when you update it, it&#x27;ll just keep it synced with this model, sorry, with this line item. So then when you refresh, it&#x27;ll always be showing you whatever 10, 20 [inaudible 00:19:28] is giving. And that will just eliminate query strings. And this will be easy to share. If you&#x27;re working on something and you decide to save it, it would be pretty trivial to save. So there&#x27;s a few benefits we could approach in that direction, or we could-</p><p><strong>Buddy:</strong></p><p>That has a lot of other advantages too. So what you&#x27;re saying is move the state from the query string to the backend, and then because we have that data, suddenly we can do things like look at history really easily, for example.</p><p><strong>Eric:</strong></p><p>Well, what you&#x27;re going to find that&#x27;s really funny is we actually store a lot of this already. You&#x27;ll notice every change that I made stored. So it would be quite trivial to... Okay, now I don&#x27;t want to say trivial, I hate that word. But it wouldn&#x27;t be the biggest thing to convert into what I was just saying. Because if you notice, we actually save everything, but it&#x27;s just-</p><p><strong>Buddy:</strong></p><p>But the backend is already doing it.</p><p><strong>Eric:</strong></p><p>Yeah, we save the filter and populate this.</p><p><strong>Buddy:</strong></p><p>The thing we don&#x27;t do is load from that URL effectively.</p><p><strong>Eric:</strong></p><p>Yeah.</p><p><strong>Buddy:</strong></p><p>Okay.</p><p><strong>Eric:</strong></p><p>And what&#x27;s really cool is, this is kind of the direction we had Lee going up the sharing scope, because we needed to be like its own path, essentially. Because now you can directly go to dashboard item and whatever ID it is, but this is only on saved items, deliberately saved items. But we can basically do that for new items too. So to be clear, when you go to a dashboard and you click on the dashboard item, it&#x27;ll link you to that insight and it&#x27;ll give you this dedicated page to edit it, and it&#x27;ll have this link and then you can change things here. But I don&#x27;t think it saves every time, you have to update the dashboard. My [crosstalk 00:21:20] would be an insight, so you just make this like I said. New, whatever.</p><p><strong>Buddy:</strong></p><p>It would actually... Interesting. Yeah. There&#x27;s a lot of implications to this, some nice benefits.</p><p><strong>Eric:</strong></p><p>Yup. I&#x27;m just going to write some stuff down.</p><p><strong>Sam:</strong></p><p>There would be a way also to do some kind of fancy routing where you&#x27;d still be able to use the browser back and forth buttons without updating the actual URL, right? There should be a way to do that. Or like say, you know what I mean? If you change the-</p><p><strong>Buddy:</strong></p><p>They&#x27;re already doing that, Sam.</p><p><strong>Sam:</strong></p><p>Yeah. Okay.</p><p><strong>Buddy:</strong></p><p>So the reason why, when you click between the tabs, you don&#x27;t get a full page reload is because they&#x27;re using a router to do that. It&#x27;s not actually navigating to that page, it&#x27;s just dating the URL.</p><p><strong>Sam:</strong></p><p>I&#x27;m just thinking, even more fine grains than that, if you go on here and say you... I guess actually that wouldn&#x27;t make sense. No, nevermind. Nevermind.</p><p><strong>Eric:</strong></p><p>I mean, we have to further pro-con this, but at the current moment, would this just be way better?</p><p><strong>Buddy:</strong></p><p>There&#x27;s no con that I can see. My con was just removing it and just not keeping that state, right? But when you&#x27;re suggesting storing the state on the back and not losing it, then you don&#x27;t lose the state. I mean, obviously it&#x27;s more network traffic, more database storage, right? So from that perspective, it&#x27;s a bit more, but this kind of stuff I would assume would pale in comparison to events. So it&#x27;s not like we&#x27;re going to create a billion filters, right?</p><p><strong>Eric:</strong></p><p>I mean, hilariously enough, I showed you, we already store everything. So that data con is already being incurred.</p><p><strong>Buddy:</strong></p><p>Do we store a new one every single time you make any change?</p><p><strong>Eric:</strong></p><p>Yup.</p><p><strong>Buddy:</strong></p><p>So this would actually be a benefit then, because from now on, when you had new and you changed the filters, you would--</p><p><strong>Eric:</strong></p><p>You&#x27;d change that one.</p><p><strong>Buddy:</strong></p><p>...you would be changing the same filter.</p><p><strong>Eric:</strong></p><p>Yeah.</p><p><strong>Buddy:</strong></p><p>And so you&#x27;d actually be storing less data. The only thing that could be a little tricky UX wise is just making sure that users are really clear on how to create a new one, right? There&#x27;s not a new and load type functionality that you would want to put in there.</p><p><strong>Eric:</strong></p><p>Yeah. And I think this would tie into... With the project homepage, I think I was trying to make it more interactive for your own individual experience. So it would be nice to like, when you&#x27;re looking at this and you had a new one and you want to save a draft, it would make a lot more sense now. Because you could just save a draft of this new thing that you&#x27;re working on, and that would just be shown on your homepage. I&#x27;m just thinking about the implications, but that would make a lot more sense than what&#x27;s happening right now. And then the obvious benefit is we&#x27;d be able to nuke a lot of this. I mean, this.</p><p><strong>Sam:</strong></p><p>If we go with the approach of just updating rather than creating a new one every time, then does the history feature remain? How would that change? Do people actually use the history feature?</p><p><strong>Eric:</strong></p><p>Well, that&#x27;s another thing. My guess is no. I haven&#x27;t done the proper analytics on this, but I would guess not a lot of people are using this.</p><p><strong>Buddy:</strong></p><p>It&#x27;s not useful.</p><p><strong>Eric:</strong></p><p>Yeah. Because you can&#x27;t really see what&#x27;s going on here. The saved ones are basically all in the dashboards. So this is an analogy to what you&#x27;re doing here anyway. Yeah. Oh, and there&#x27;s another open ticket that Carl created about top level reports. So if we could... Actually, that&#x27;s not related, I don&#x27;t want to track a different concept in here. It&#x27;s related, but it&#x27;s not in this immediate situation.</p><p><strong>Buddy:</strong></p><p>Eric, can you quickly cover the backend if you have time?</p><p><strong>Eric:</strong></p><p>Yeah. I just want to make sure that we&#x27;re somewhat in agreement here on everything that&#x27;s happening. At least between me, you, and Sam. I know James-</p><p><strong>Buddy:</strong></p><p>I think whatever refactoring we do here is going to be quite tricky. The devil will definitely be in the details on this assignment.</p><p><strong>Eric:</strong></p><p>Yeah.</p><p><strong>Buddy:</strong></p><p>I mean, at least you don&#x27;t have to deal with any of them. I mean, yeah. But yeah.</p><p><strong>Eric:</strong></p><p>Yeah. And this is part of that. It&#x27;s like, when do we pay that debt? And how quickly can we pay it? That&#x27;s just what I always reemphasize. Because we can do this, but like you said, there are some details that even I might&#x27;ve just haven&#x27;t mentioned here. So when you start refactoring you&#x27;ll be like, oh crap, got to consider this, this, and this. And then it turns into a two week refractor rather than what we thought would be a three-day refactor. So we&#x27;ll have to be careful here. I think we all open a ticket following this talk obviously about the proposal, and then we just have to figure out all the [inaudible 00:27:04] before we just dive in.</p><p><strong>Buddy:</strong></p><p>You know what we could also do that could work? Is we basically spin up a new insights folder and put it under a feature flag or something, where we progressively build and reuse. We obviously have the filter component, we have all these other things, right? We basically, instead of trying to refactor it, we just build a new version of it slowly over time. And then we can swap whenever we&#x27;re ready.</p><p><strong>Eric:</strong></p><p>It might be too slow though, right? Because as we change the UX and the logic even of the... Sorry, the UI and the logic of this insights thing is going to keep changing. So if we take, let&#x27;s say four weeks to build it, something&#x27;s going to have been added or kind of botched or sorry, changed, that&#x27;s hard to put over.</p><p><strong>Buddy:</strong></p><p>Yup. That&#x27;s fair.</p><p><strong>Eric:</strong></p><p>Yeah. So it would have to be something on the fly. I want to argue though that it wouldn&#x27;t be the most treacherous thing, we just need to map it out a little bit. Because Lee was able to create this into a distinct URL and remove the dependencies on that pretty quickly. And it&#x27;s actually all built in here. Yeah, she just basically used a different end point, sorry, a different path name. So it&#x27;s possible, but there&#x27;s just a few more considerations we got to make sure of. Well, yeah, I&#x27;ll write in the details and do a little think through, and then we can figure out where to go from there. This is definitely a refactor ticket and we just have to make sure we tackle it efficiently. Yeah, I can go on to the backend now. So [inaudible 00:28:57] the best way to do this. So the filters are set right, and then caller resets up here. This will just send the filters to one of these end points. And I&#x27;ll go show you the end points now.</p><p><strong>Eric:</strong></p><p>Well, I&#x27;m trying to think if I should show you the actual end points or click [inaudible 00:29:23]. So okay, end points are defined here. I think I can back this out now. These are all the shared ones. Shared as in self hosted and cloud both use them. And then you have this E enabled, and you&#x27;ll see this five happen because if E is enabled, instead of registering our usual view sets, we put in ClickHouse new sets. And these are just the controllers for all the ClickHouse related data that might be switched over. Because the logic in these are all handled differently while the logic in views are all shared. Meaning this relies on ClickHouse, this relies on Postgres, these rely on Postgres in both cases, Sophos to nCloud.</p><p><strong>Eric:</strong></p><p>Cool. So I think I&#x27;ll just go right into insights. I&#x27;m going to show you ClickHouse because it&#x27;s more relevant right now, and it&#x27;ll probably be weirder. ClickHouses is in this folder, in E up here. Oh, sorry. I&#x27;m also just doing a general walkthrough, not just on the filters, unless you want a very specific on the filters breakdown.</p><p><strong>Buddy:</strong></p><p>I mean, I think as long as you end up at filters, it&#x27;s fine.</p><p><strong>Eric:</strong></p><p>Yeah. Okay. Yeah, I&#x27;ll give you the whole context. I think this will be useful, especially since we&#x27;re recording the [inaudible 00:30:52]. Cool. So I&#x27;ll just show you that end point here actually. Go to views then insights. This is the ClickHouse insight view set. And that&#x27;s inheriting from insight view set. This is just to get this thing. And these are just end points. They&#x27;re just handling the request. So you&#x27;ll see if you call trend, it&#x27;s just literally insight trend. It&#x27;ll call calculate trends, which is this function here. Now we&#x27;re looking at the Postgres symbol notation right now, but I&#x27;m just showing you that when it inherits, when ClickHouse inherits this one, it&#x27;ll overwrite calculate trends because we want to use ClickHouse logic when we&#x27;re using the ClickHouse view set.</p><p><strong>Eric:</strong></p><p>So cool. You&#x27;ll call trends, it&#x27;ll call calculate trends. Now you&#x27;re looking at this, and I&#x27;ll go through this line by line. So cached function is a decorator, and this handles caching logic. So we&#x27;ll actually generate a cache key from the filter, so that it&#x27;s unique to the makeup of that filter. So it&#x27;ll take, I think all the elements... We can go through that also, but it&#x27;ll take whatever elements we were filtering on, all the parameters, create a key of that, and then basically put it in the key value [inaudible 00:32:34]. And then when we get the result, we&#x27;ll put that into the cache. And then this will basically be hit and return a cache value, which is why sometimes you&#x27;ll see in insights it&#x27;s like computed three hours ago. So that&#x27;s all being handled here.</p><p><strong>Eric:</strong></p><p>But if you hit a hard refresh, it&#x27;ll just ignore that and then it&#x27;ll go through to the actual logic. So here&#x27;s the actual logic. Team is on this view set or whatever, this is just an instance variable filter. So this filter object is what digests the dictionary that we pass back, or that object that we pass back with all of these filters is digested by a filter. So I can go into that right now, which will make more sense.</p><p><strong>Buddy:</strong></p><p>While you&#x27;re doing that, when is the cache invalidated?</p><p><strong>Eric:</strong></p><p>There&#x27;s a timeout on it. I forgot exactly how long it is, but it&#x27;s not that long. So it&#x27;s not a permanent cache.</p><p><strong>Buddy:</strong></p><p>But if I click that refresh button on all the charts, that ignores the cache, right?</p><p><strong>Eric:</strong></p><p>Yup. It&#x27;ll just pass it and then give you a fresh copy, however long this takes. Okay. So this filter object is taking the requests, and it basically just looks for the dictionary there. How do I describe this better? So I broke this down into a lot of mixins so that you could look at each property very specifically, because this class used to just be a giant class that try to every single value in one place, which got really confusing. So now, if we want to look at interval, we can go to the interval mixin, which is mixins common. And that&#x27;s just telling you, from that data object, which is this huge map, just get the interval, this is just some constant, and then default to today if necessary, so that every time now when you call filter interval, it&#x27;ll just give you this key value. Which means when you are... Oh crap, I overwrote my file.</p><p><strong>Eric:</strong></p><p>No, when you&#x27;re here and you do filter, it&#x27;ll just get what I was showing you back here. Okay. So that&#x27;s this. There&#x27;s a decorator here that makes sure that you don&#x27;t recalculate. This is built-in. So actually, we added something to it, but what this does is basically make sure that you don&#x27;t, there&#x27;s a terminology for it, but that you don&#x27;t have to keep recalculating this, especially if there are calculations. Next in this little mixin is included, and this makes sure that when you serialize the filter object, because we do that for the key, for example, right, it&#x27;ll add this to the dictionary properly so that it can serialize just in case. All of these are pretty standard, but sometimes there might be a casting or type change that you have to do.</p><p><strong>Eric:</strong></p><p>And yeah, I know this is a lot of repeated code. There was some meta function that you can create for this, but I couldn&#x27;t figure it out. So that&#x27;s where we&#x27;re at right now. It&#x27;s just a [inaudible 00:36:23] function essentially to make sure when you serialize the filter that this is included in that dictionary,</p><p><strong>Buddy:</strong></p><p>I don&#x27;t think that matters, that it&#x27;s repeated like this. Personally.</p><p><strong>Eric:</strong></p><p>But cool. So that&#x27;s what makes up this whole thing. So this filter can handle properties, intervals, entities, entity ID, they&#x27;re all very similar. Maybe the property one is worth looking at because it&#x27;s probably slightly different. Yup. So you see. And we&#x27;ll load all the properties while we parse it here before we return those properties, and it&#x27;ll just create the property objects. Which is essentially just taking those... I think you all might&#x27;ve seen this, the key value operators and putting them into an actual object. Cool. So that is filters. That is this thing. And now, you just have an object that&#x27;s validated and process all the filters that you passed from here. And now we can go into ClickHouse trends.</p><p><strong>Buddy:</strong></p><p>So essentially, we take their request object and turn it into a filter object.</p><p><strong>Eric:</strong></p><p>Yup. And now we can go into ClickHouse trends, that&#x27;s taking this here. This actually needs to get probably updated. ClickHouse trends. Should I show you this one? Yeah. We essentially have classes for all of our query. So ClickHouse trends handles all the trend query, right? I think that&#x27;d be pretty straight forward. So when you call run, run is essentially the take my filters, take my team ID, give me the result I want. So we have this object, call run. We end up here, right? Now, run starts assembling your query. Let me just make sure I&#x27;m looking at this right. Yeah. We first determine if there&#x27;s any actions that are necessary, and then we will either use that in the actions query, or we just... Sorry, I don&#x27;t actually know why this ended up here.</p><p><strong>Eric:</strong></p><p>There&#x27;s some action checking here to make sure that they exist. But the important part actually of what&#x27;s going on here is you&#x27;re going through each entity, which is these things, and you&#x27;re creating graphs from them. So user signed up would be an entity, which is an event entity. And then if you clicked, this would be an action entity as a user signed up. Yeah, it would be an event. Oops. But they&#x27;re both event entities. And you iterate through them and then create the queries for them. So let&#x27;s say handle compare. This is a wrapper that will make sure that if you do this, it&#x27;ll double up that query in a different time period. So you&#x27;ll get the first time period and then it also make sure that you get the second time period. And then it&#x27;ll pass in the run query function, which is actually where the building happens. So I&#x27;m just going to go right to here.</p><p><strong>Eric:</strong></p><p>And then the run query function will pass in the filters more and you go get the actual SQL, and then the SQL here will decide we&#x27;re looking at a breakdown, lifecycle, or just a regular one. I know this comparison doesn&#x27;t seem categorically the same because it&#x27;s like, why are we looking at a shown as and then a breakdown, by adjusting how some of the queries are built. This is where that line was drawn because it makes the most sense in terms of building the query. So if we look at building normal query, that&#x27;ll be somewhat the most straight forward right now. You can go here. And this is where most of the querying, actually all of the query building happens.</p><p><strong>Eric:</strong></p><p>So you&#x27;ll notice that we have the filter, the team ID, and the entity. Sorry, I need to pull my window down. It was getting glare. Entity is what I was describing up here. That&#x27;s pretty much just this action and maybe the filters that are included, if there are any, and then the filters just that overall object. Doesn&#x27;t need to be split out technically, but it just becomes easier to work with. Because you could actually just do filter entities by whatever index, but this just defines that we&#x27;re specifically working with entity.</p><p><strong>Buddy:</strong></p><p>So every entity is a new query, right?</p><p><strong>Eric:</strong></p><p>Yes.</p><p><strong>Buddy:</strong></p><p>And every time you add a filter, you&#x27;re applying the filter to all the queries or all the entities.</p><p><strong>Eric:</strong></p><p>Do you mean this filter?</p><p><strong>Buddy:</strong></p><p>Yes.</p><p><strong>Eric:</strong></p><p>Yup. And those filters are handled here.</p><p><strong>Buddy:</strong></p><p>Right. And that&#x27;s the separation. You have entity and you have filters.</p><p><strong>Eric:</strong></p><p>Yeah.</p><p><strong>Buddy:</strong></p><p>And then that means that you have to teach every query that you write how to handle our generic filter.</p><p><strong>Eric:</strong></p><p>Yes. Yup. I think if I&#x27;m understanding how you&#x27;re phrasing that, but yeah.</p><p><strong>Buddy:</strong></p><p>Meaning that, so in filters you can say, add blah, blah, blah, right? And then whenever you go to generate that SQL, every single time we have a new SQL that we have to write for some new kind of query, it additionally has to understand how to implement filters as a requirement.</p><p><strong>Eric:</strong></p><p>Yeah, yeah, yeah. Oh yeah, yeah, sorry, keep going. No, this is good.</p><p><strong>Buddy:</strong></p><p>I mean, my thinking is just that this is probably the biggest area for opportunity.</p><p><strong>Eric:</strong></p><p>Yeah. Okay, as context for the call, briefly Buddy and I were messaging about views, I would like to use views, but the problem is that the views, what I&#x27;m pretty sure is how it works, is you create a view and it&#x27;s like, create view using select blah, blah, blah, blah, blah, blah, blah. But the problem with that is, we have very specific filters essentially that need to be per specific per team and then per input by every user on the team. So we could create a view for every team ID, one, two, three, four, five, through 2000, but I wouldn&#x27;t really do anything. And then the problem after that is, for us, for example, we have queries that are like, select blah, blah, blah, from events where team ID equals two. But then we need to add all these dynamic filters that change on every input, so those views become very useless, unless I&#x27;m missing something on how those views work. So that&#x27;s my problem. Well, we can go into the actual SQL problems, but I just want to get through the building of the SQL.</p><p><strong>Buddy:</strong></p><p>No, you&#x27;re totally good. And I didn&#x27;t mean to suggest to use it here, I was just talking about, if you wanted to know where the core complexity of our system is, we&#x27;re in it right now.</p><p><strong>Eric:</strong></p><p>Oh yeah. All right. So there are several helper functions here that just help determine parameters and some of the syntax that needs to be built. Now, again, in normal cases, this would all be abstracted by an ORM, but a lot of our querying needs are quite specific. When you create a retention query, that&#x27;s really hard to do with an ORM, in my opinion, I tried it with the Jenga ORM. It was doable, but after that, you can&#x27;t even read the ORM. So it&#x27;s like, that&#x27;s not even really helping you. Which is why we ended up with writing raw SQL. And I&#x27;ve had a blast writing raw SQL, because it&#x27;s as unreadable as this seems. The Jenga ORM was not readable when you wanted to write complex queries. Especially because they have their custom thing that annotate and all of that. So these are helper functions.</p><p><strong>Sam:</strong></p><p>It writes terrible queries. The queries it writes-</p><p><strong>Eric:</strong></p><p>Oh that&#x27;s true. Yeah.</p><p><strong>Sam:</strong></p><p>It doesn&#x27;t know [inaudible 00:45:29] performances.</p><p><strong>Eric:</strong></p><p>Okay. So there are a bunch of helper functions here. I&#x27;m going to try to do some high level hand-waving first so that you can see how the query is built, and then we can go into each one specifically as needed. But otherwise, we&#x27;ll never get through this because there are so many helper functions. So we get some intervals, get some dates, get some... Oh, shoot. Don&#x27;t want to do that. I guess, yeah, intervals, dates, props. So we have this magical prop function, and this is where the properties like these filters are really getting digested, we pass in props to filters, which is basically anything from the filter.properties, which is this stuff. I know there&#x27;s a little of confusing syntax here, but just bear with me. So filter.properties is this and entity.properties is anything under here.</p><p><strong>Eric:</strong></p><p>And you&#x27;ll notice we&#x27;re combining them here simply because we&#x27;re building a query for a specific entity. So they all just need to be jammed together, and it&#x27;s fine. And then we pass that into this. And then this will give you prop filters like query, and then the parameters to escape in when you run the query. I think you&#x27;ll see these are all the parameters that we need, and then we call it content SQL. Because this actually isn&#x27;t the whole query, if I&#x27;m remembering everything correctly. But anyway, you format all of these after you get the helper functions. Again, these just give you dates, whatever timestamp, some queries do. They&#x27;re just upending, not even subqueries, but just the parts of the query that are needed, and then go to here.</p><p><strong>Eric:</strong></p><p>There&#x27;s a few more statements that control, if you&#x27;re looking for weekly active or monthly active. So that&#x27;s the new feature that we added that changes based on... These are [inaudible 00:47:29], these are total volume as you guys are used to, these are trailing numbers. So you have to handle trailing numbers slightly different. But volume SQL is probably the most straightforward one or the most basic one that fun default always runs. So I can show you that. So that one&#x27;s pretty simple. It&#x27;s just looking for an aggregate operation on the data, changing some timestamps to bucket them, event join this. This is basically, if you&#x27;re looking for just an event, it&#x27;s really easy, because on events it&#x27;s just event equals page view. But if you&#x27;re looking for an action... Oh no, sorry, I jumped the gun. That&#x27;s entity query. Event join is just joining things if necessary. So if you have prod persons or whatnot, you&#x27;ll join them here.</p><p><strong>Eric:</strong></p><p>So team IDs here is parsed in as a parameter. So when you see these, these are direct parameters that will be run and filled in with the query. But when you see these, these are sub chunks of the query that we need to add. So the entity query is what I was talking about. If it&#x27;s an event, you&#x27;ll basically have aware, team ID, blah, blah, blah, and event equals page view, right? Because our data model for events is just, event name, properties, timestamp, whatever, whatever. But if it&#x27;s an action, you have to do all that extra handling to figure out which actions what, so that&#x27;s why it could get complex here. It could be event equals or it could be event is in blah, blah, blah. I can show you more of that, but I&#x27;m just giving you a high level view of what&#x27;s going on.</p><p><strong>Eric:</strong></p><p>Now, filters is more of those conditions. So this would be where properties like current URL matches this, rejects matches this, isn&#x27;t this, whatever. And then parsed date from day two, we use timestamps. And then you group by interval timestamp. This helps bucket stuff. So that&#x27;s what&#x27;s happening here with volume SQL. Oops. And then you have a no SQL. So before, we were handling a lot of this in the server... Sorry, what happens with this is that when you query stuff, when it gives you a zero, unless you specify, SQL row is not going to return to zero when you&#x27;re calculating, just in how this query is written. So I just added a clause that will basically fill in the zeros as necessary.</p><p><strong>Eric:</strong></p><p>So you might get buckets with like, this week has five, this week has two, but the week in between a zero and it doesn&#x27;t show up, so you just add a no and you just fill it in. It&#x27;s like, this is just what this is doing. And then you put them both together and aggregate SQL, which will just collapse them together. It&#x27;ll just count and group by again. That isn&#x27;t really taxing or anything, it&#x27;s just some formality to get the data formatted right. I did this so that we can do everything in SQL at once. I don&#x27;t want to do more processing out here if it&#x27;s not necessary. You guys would like laugh, but in Postgres. Originally, our breakdown was using pandas and everything. So we use SQL to process some data, and then you use pandas to process the second half of the data. And we were just like, okay, this is way too much foolishness.</p><p><strong>Eric:</strong></p><p>So that all got cut. And then when I was rebuilding a lot of the stuff, I wanted everything in SQL because it&#x27;s faster and it&#x27;ll just be cleaner to read, especially, and debug at the end. Cool. And then when you have this, you&#x27;ll send back the query and the parameters to run somewhere else, and then you&#x27;ll pass back also, the parser. So go back up here, get the query. So over here, I just executed here. Capture, send some exceptions if something breaks, and then parse from the parse function, and then serialize. These are basically just post-processing. There&#x27;s not too much magic in here, they&#x27;re just formatting arrays and whatnot. This is different if it&#x27;s cumulative, this is just another handling that&#x27;s slightly different that we added here. And then you just parse back the data. Ends up here, comes out here if it&#x27;s compared, it&#x27;ll obviously run that separately for entities in different time periods.</p><p><strong>Eric:</strong></p><p>Some of this stuff maybe can be mashed together, but in any case, it comes out, you add this to the results, and if that&#x27;s your only entity, then it&#x27;ll return the results, and then obviously some of the data back, but otherwise, you go to the next one. So I&#x27;m going to stop there, because we did a pass through of trends. I think there&#x27;s probably hell of questions. So feel free.</p><p><strong>Buddy:</strong></p><p>So from a computational perspective, this looks pretty nice because all it&#x27;s really doing is a bunch of string concatenation. And it&#x27;s not really doing much number crunching really. There&#x27;s probably some memory stuff that happens because you have to serialize, deserialize, that sort of thing, but it&#x27;s all pretty computationally nice. So the expensive part, I see two expensive parts. This isn&#x27;t a criticism, more just an observation.</p><p><strong>Eric:</strong></p><p>Yeah.</p><p><strong>Buddy:</strong></p><p>Which is, the speed at which this stuff executes is going to depend on how well formed those queries are, right, and what indexes are in place, things like that. And then the secondary thing I think would be expensive is I could see how you could go from writing raw SQL in your, I don&#x27;t know, database tool of choice to code like this. But then to go backwards out of code like this to debugging feels like it could be quite hard. So do you have any tools in place to help you with that? Such as, okay, we had an issue with this query, so here&#x27;s the query that was ran, and then you could do the same process by working from the query back to the code. Because I think going from the code to try and figure out what&#x27;s wrong would be quite difficult.</p><p><strong>Eric:</strong></p><p>Yeah. So what I have to say about that is, when you see these large chunks of queries, what&#x27;s interesting is that because we laid down so much, the lifecycle is notoriously long, so don&#x27;t be triggered by this. But when you look at how much we leave inside the query, this is actually really important because it seems really chaotic right now, what I showed you and all that code, but that&#x27;s formatting very basic stuff. So like parse timestamp, this is literally timestamp equals blah, blah, blah. That&#x27;s just wrapped in a utility function because there&#x27;s some dates that need to be formatted properly or whatever. And then same with interval, right? This is literally just getting like... Sorry, even aggregate operation, this is literally just maybe adding distinct or we&#x27;re adding the 50 percentile or 99 percentile function. These are all really, really basic statements.</p><p><strong>Eric:</strong></p><p>And then there are one or two places that get kind of hairy like entity query and event join. But even these, like I said, it&#x27;s either event equals or it might give you a slightly longer statement that just finds actions. But otherwise, any problematic logic in my experience has always just been me looking at what ran, going to Metabase or going to DataGrip or something, running it, figuring out what&#x27;s wrong, experimenting, changing the query a little bit, and then coming in here and figuring out, okay, this needs to be changed, we&#x27;re joining on the-</p><p><strong>Buddy:</strong></p><p>Perfect. Yeah.</p><p><strong>Eric:</strong></p><p>Does that make sense? It&#x27;s-</p><p><strong>Buddy:</strong></p><p>It&#x27;s exactly how I was imagining that. Basically you get your hands on the raw SQL query somewhere, figure out what went wrong, and then trace where it is in the code. How do you get your hands on the raw query?</p><p><strong>Eric:</strong></p><p>Oh yeah, that&#x27;s what I was describing earlier. Sam had this funny thing that I was kind of a few weeks late on this, but when you run a query this...</p><p><strong>Sam:</strong></p><p>I love this by the way, this is so good.</p><p><strong>Eric:</strong></p><p>...you can just go and debug, wait.</p><p><strong>Buddy:</strong></p><p>How do you open up the tools, even?</p><p><strong>Eric:</strong></p><p>Command K. We don&#x27;t advertise this that much, but this was something we built, me, Paolo, and Michael built actually for the hackathon we had in October at our offsite. So this was built in maybe a week. How many days we had, five days? We like to expand a little bit. And then we just add some hidden goodies in here. So you can see the query that&#x27;s run.</p><p><strong>Sam:</strong></p><p>So good.</p><p><strong>Buddy:</strong></p><p>Okay. And this is the last query that was ran?</p><p><strong>Eric:</strong></p><p>Yeah. This is a retention query. So we can just take this.</p><p><strong>Sam:</strong></p><p>You guys are all in Metabase, right?</p><p><strong>Buddy:</strong></p><p>No, never heard of it.</p><p><strong>Sam:</strong></p><p>Okay. I&#x27;ll send you an invite.</p><p><strong>Eric:</strong></p><p>And then we can just run this and then you can see, this is how... Am I looking at it? No, sorry. This might be a stale. Here&#x27;s some trends I think. But in any case, you just run the query and see, okay, here&#x27;s this, here&#x27;s the data. And then you can highlight and run specific things. This is pretty usual for a database editor. Or sorry, database-</p><p><strong>Sam:</strong></p><p>Yeah, query client, whatever you want to call it. Query editor. Query builder. All right. I&#x27;ve got to run. This is really educational though. Thanks, Eric.</p><p><strong>Eric:</strong></p><p>Cool.</p><p><strong>Buddy:</strong></p><p>I agree. Very educational. I&#x27;m glad I&#x27;m getting an invite to Metabase. I didn&#x27;t know that was a thing.</p><p><strong>Eric:</strong></p><p>But yeah, we can keep bashing on this. I don&#x27;t mind. I think it&#x27;s good that you guys get an idea of what&#x27;s going on here.</p><p><strong>Buddy:</strong></p><p>No, I sent you a message actually in slack, which said that this is really impressive work in queries. So I think I&#x27;m just processing what&#x27;s happened, what is, and what the thinking is behind it. And so don&#x27;t take anything I&#x27;m saying as criticism.</p><p><strong>Eric:</strong></p><p>[inaudible 00:58:18]. I think any comments you have, feel free. This is super useful.</p><p><strong>James:</strong></p><p>Good stuff, Eric. Thanks again.</p><p><strong>Eric:</strong></p><p>Yeah, no problem. And well, it&#x27;s funny because we did superlatives ironically, but mine wrote the most queries last year.</p><p><strong>James:</strong></p><p>Yeah, yeah, these-</p><p><strong>Buddy:</strong></p><p>I mean, these queries are very large.</p><p><strong>Eric:</strong></p><p>I wouldn&#x27;t want them to be, but again, there&#x27;s some things that we just couldn&#x27;t avoid.</p><p><strong>Buddy:</strong></p><p>Well, it&#x27;s the whole nature of being able to see data the way that you want to see it, right? So it&#x27;s not your fault, it&#x27;s the fact that we have a tool that allows you to... You know what I mean?</p><p><strong>Eric:</strong></p><p>Yeah. Yeah.</p><p><strong>Buddy:</strong></p><p>It&#x27;s a feature, right?</p><p><strong>Eric:</strong></p><p>Well, because it&#x27;s like, basically you have this thing, and what this is literally, is a query builder. What we&#x27;re looking at here is pretty much a query builder and it&#x27;s like, you&#x27;re trying to balance a really concise query on your backend, but then you have to give users the flexibility to [inaudible 00:59:21] how they want. So then you&#x27;re at odds, looking in your backend and looking into this black hole. But yeah, I can dissect all this for you to explain what&#x27;s going on. It doesn&#x27;t end. And this is by no means, perfect. There&#x27;s probably quite a few caches and efficiencies that can be changed, but you&#x27;ll just see, when you start clicking through this, there&#x27;s just endless amounts of queries.</p><p><strong>Buddy:</strong></p><p>So now I think I understand how you guys are debugging production issues. Somebody is getting their hands on a query that&#x27;s been ran and basically working backwards.</p><p><strong>Eric:</strong></p><p>Yeah.</p><p><strong>Buddy:</strong></p><p>And so the question will be, where does that information come from? And that&#x27;s probably a cause for another talk, a different meeting.</p><p><strong>Eric:</strong></p><p>Yeah. In terms of any performance issues that come up, we generally just try to get the query and then run it. Yeah, I think in terms of the backend code quality, there&#x27;s just a bunch of stuff that could be fixed for sure. But yeah, I mean anything regarding the queries, it&#x27;s basically in this SQL. And most of it is pretty clear because we&#x27;ve kind of just prioritized keeping blocks of SQL together so that you can see it all at once. I thought this would look really dirty at first, but actually James G brought it up and I thought it ended up being really good.</p><p><strong>Eric:</strong></p><p>Because again, when we were first on Postgres and we wrote a lot of those analytics, it would actually be really hard to debug. Because you&#x27;d be looking at the ORM and not even understand what query is being built. And I mean, you looked at the funnel SQL, right? That one was actually a hybrid, which I don&#x27;t know for better or for worse, but that was really hard to read because it tried to use some ORM and then some not, and you just got this collision. But there are other areas where even if it&#x27;s just ORM, you&#x27;re like, what actually happens from this query?</p><p><strong>Buddy:</strong></p><p>No, exactly. In fact, when I was looking at it, what I ended up doing was printing out the SQL that was generating.</p><p><strong>Eric:</strong></p><p>Yeah. And that&#x27;s why I did...</p><p><strong>James:</strong></p><p>That&#x27;s been my experience with ORMs also, it&#x27;s like with building teen stock and having this social network functionality, it was even worse in a way, because there&#x27;s really networks, hyper-connected stuff. And I should have just built something with GraphQL and stuff like that, but I had this really janky node JS that just, all it did was add a layer of obfuscation between me and the SQL.</p><p><strong>Eric:</strong></p><p>Yeah. So it feels like-</p><p><strong>Buddy:</strong></p><p>That&#x27;s a-</p><p><strong>Eric:</strong></p><p>Yes. Go ahead.</p><p><strong>Buddy:</strong></p><p>Sorry. I was going to go off tangent and talk about GraphQL for a second. We can do that another time as well. What&#x27;s that?</p><p><strong>Eric:</strong></p><p>No-</p><p><strong>James:</strong></p><p>I&#x27;m curious to hear your take on it. Well, yeah.</p><p><strong>Buddy:</strong></p><p>Well, if you think about it, did you have something you want to cover, Eric? Because this is completely off topic.</p><p><strong>Eric:</strong></p><p>No, go ahead. I&#x27;m just looking at some stuff.</p><p><strong>Buddy:</strong></p><p>And you can stop recording if you want, or you can keep recording. But the-</p><p><strong>Eric:</strong></p><p>Oh, I&#x27;m actually going to stop so I don&#x27;t run out of space.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How to turn your engineers into product people]]></title><description><![CDATA[Great engineers will either get autonomy at your company, or they'll get it somewhere else. Our engineers are encouraged to think about the  what  and…]]></description><link>https://posthog.com/blog/turning-engineers-into-product-people</link><guid isPermaLink="false">3b1ccbf9-823a-5711-8989-fa66740cbd53</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Fri, 28 May 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/turning-engineers-into-product-people/turning-engineers-into-product-people.png" length="0" type="image/png"/><content:encoded><![CDATA[<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/Kz4aX1NIzUQ" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p>Great engineers will either get autonomy at your company, or they&#x27;ll get it somewhere else. Our engineers are encouraged to think about the <em>what</em> and <em>why</em> of what they&#x27;re building - not just the <em>how</em>.</p><p>At PostHog, new people are usually surprised by the lack of <a href="https://posthog.com/handbook/company/management">micromanagement</a>, onerous KPIs, and <a href="https://posthog.com/blog/meetings">death by meetings</a>. Rather, we run two-week sprints where everyone decides what they’re going to work on for the next 14 days following a retrospective at the end of each sprint. </p><p>New problems are usually discovered and solved during each sprint that weren’t originally planned for, such as two of our main features - <a href="/product/session-recording">session recording</a> and <a href="/product/feature-flags">feature flags</a> - which were ideated during one of our hackathons.</p><p>When you give engineers the freedom to play around with new ideas, magical things happen.</p><iframe src="https://giphy.com/embed/xT5LMqQREdsCvyYcsE" width="480" height="366" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><h2 id="speed-is-more-important-than-perfect-planning">Speed is more important than perfect planning</h2><p>At PostHog, your speed of iteration is key - we’d rather you move fast and break things (and fix them just as quickly) than spend eons working on the perfect solution to a problem. Product thinking means accepting shipping small changes frequently will get you to the best result.</p><p>We also believe that the best way to learn is by doing. Hence we don’t give any special product training to new devs before they start. However, we have a <a href="https://posthog.com/handbook/people/spending-money">generous budget</a> for books, conferences, and outside training if someone wants further support.</p><iframe src="https://giphy.com/embed/DCj3Fg7MsO29nRGjJ6" width="480" height="480" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><h2 id="hiring-product-minded-engineers">Hiring product-minded engineers</h2><p>Many companies harm their hiring prospects with their engineering job descriptions. Because autonomy is so critical, engineers are sensitive to certain keywords in job descriptions. For example, ‘close collaboration with product’ might give off the idea that product runs the show and that engineering merely exists to do the PM’s bidding. Calling the engineering team ‘IT’ is another red flag - no engineer wants to be treated like a second-rate citizen.</p><p>You can get a sense of project ownership during the hiring phase. At PostHog, we select for entrepreneurial candidates - people who’ve founded companies or worked on side projects in the past. Such people more likely to be <a href="https://www.investopedia.com/terms/i/intrapreneur.asp">intrapreneurs</a> - out-of-the-box problem solvers who generate profitable solutions with the full backing of their company. </p><p>We also don&#x27;t care whether they’ve worked at only one company or job-hopped - just that they learned new stuff, grew continuously, and built better products. Likewise, we don’t care whether you dropped out of college or attained a PhD - experience and entrepreneurship are not tied to qualifications. Most people underestimate the four-year head-start one gets by skipping college, especially for a field like computer science where everything you need to know is a Google search away.</p><p>Beyond iteration speed, risk-taking, and problem-solving, we’re also looking for <em>curiosity</em> - being willing to ask endless questions about the problem and the solution. For example, is there another way we could structure the dashboard? Do we really need three buttons here or is one enough? Do our users actually care about this feature? These are the types of questions we expect from <a href="/product-engineer/what-is-a-product-engineer">product-minded engineers</a>.</p><iframe src="https://giphy.com/embed/3o7btZ1Gm7ZL25pLMs" width="480" height="270" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p>As of writing, we’ve got 12 engineers and are looking to double that number within a year. Expanding your engineering team introduces all sorts of interesting challenges, from the kind of work each person does to how we distribute ownership of output. We’ve introduced <a href="https://posthog.com/handbook/company/small-teams">Small Teams</a> at PostHog over the past few months and have enjoyed immense success with it. More work gets done faster and more problems are spotted early and fixed. Every Small Team has its own leader, and top management provides support and direction.</p><h2 id="do-you-need-a-vp-of-product">Do you need a VP of Product?</h2><p>When you’re turning all your engineers into product people, it can be hard to justify hiring a VP of Product. But we’ve got a good reason for that. At the moment, our product is built for (and loved by) engineers, but we’ve only got shallow product/market fit - and that&#x27;s actually pretty great for our current age.</p><p>We&#x27;re young, aren&#x27;t struggling for finance and we&#x27;ve the team needed to deepen our fit. The challenge we have today is that those less technical than an engineer (e.g., a product manager) often struggle to use our product fully. This hampers wider adoption within our client companies. Our new VP of Product will bring a sense of direction and long-term vision to the product in line with our current short term goal to delight five core customers (yes, even though we have thousands of users - we&#x27;re focussing on just five key companies at a time, more on that in another post...). The VP Product will dig into what makes those Big Five tick, their <a href="https://thefmp.io/articles/jobs-to-be-done">Jobs To Be Done</a>, and what new features they’d like to see added or nixed. They’ll also continue to turn our engineers into product people, providing training and coaching where needed.</p><h2 id="tap-into-talent">Tap into talent</h2><p>Engineers are becoming increasingly mission-driven creators who want to understand what the user struggles with and how to alleviate those struggles. During our hiring process, many engineers reveal that they’re leaving their current companies because there’s simply no room to create stuff - either because they’re not given the autonomy to do so or because the product(s) they work on lack sufficient usage to track trends and test new features. Good engineers are scarce, and if you’re lucky enough to snag a few bright stars, give them the keys to the kingdom and watch what they build with it. You’ll be pleasantly surprised.</p><h3 id="further-reading">Further reading</h3><ul><li><a href="/blog/product-engineer-vs-software-engineer">The difference between product engineers and software engineers</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Why we're giving away 100 times more cloud usage, free]]></title><description><![CDATA[Today, we're announcing that we're giving away 1 million ingested events/month on  Cloud , for free. That's up from 10k/month that we were offering…]]></description><link>https://posthog.com/blog/100-times-more-events</link><guid isPermaLink="false">1c73a668-a667-5797-9e82-6206d0703704</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Mon, 17 May 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/100x/100x.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Today, we&#x27;re announcing that we&#x27;re giving away 1 million ingested events/month on <a href="https://app.posthog.com/signup">Cloud</a>, for free. That&#x27;s up from 10k/month that we were offering before.</p><h2 id="more-free-stuff-youre-already-pretty-generous">More free stuff?! You&#x27;re already pretty generous!</h2><p>Gee, thanks subtitle!</p><p>The magic of an <a href="https://www.youtube.com/watch?v=L1Ovbzs7vyo">open core business model</a> is that giving away stuff for free often <em>helps</em> us make money.</p><p>Behold the virtuous circle:</p><ol><li>Create a valuable free product and a community around it. Collaborate with the community. The free product gets more valuable and more popular as a result. The community grows faster and faster.</li><li>Larger companies using the free product think the paid product looks valuable. They email asking to buy <a href="/pricing">PostHog Scale</a> or they increase their usage to 10s or 100s of millions of events/month.</li><li>Get money from paid product, to get <a href="raising-3m-for-os">even</a> <a href="posthog-announces-9-million-dollar-series-A">more</a> money from venture capitalists, go to step 1.</li></ol><h2 id="who-we-made-this-change-for">Who we made this change for</h2><p>We noticed in user interviews that a subset of our user base were self-hosting product analytics <em>purely</em> for cost reasons. Typically:</p><ul><li>Small startups/hobby projects/charities</li><li>Up to a few thousand users monthly</li><li>Very little budget for product analytics or hosting product analytics</li><li>No need to self-host product analytics for privacy reasons</li></ul><p>If the above is you, you can of course keep going with PostHog Open Source.</p><p>However, for most users that fit the above criteria, we&#x27;d recommend <a href="https://app.posthog.com/signup">Cloud</a> because:</p><ul><li>No need to run updates</li><li>No hosting costs at all</li><li>You&#x27;re likely to get an experience with fewer bugs if your usage is a little bit higher/grows</li></ul><h2 id="whats-the-catch">What&#x27;s the catch?</h2><p>If we&#x27;re doing our jobs right, <em>your</em> (!) product may get really popular. Oh no!</p><p>We sell to you when you get to this &quot;champagne problem&quot;. Word of caution: it qualifies as humble bragging if you come to us because you&#x27;re getting too popular ;)</p><p>When your product is successful, you&#x27;ll usually have more event volume, and a larger team - you will need features around collaboration or even compliance if you become a big enterprise one day. At that point, you&#x27;ll want <a href="/pricing">PostHog Scale</a>.</p><p>Serious sidenote: we don&#x27;t lock you in - we&#x27;re working on making our Open-Source product much more scalable, so you can at least do the basic analytics even with very high usage, without spending anything. That&#x27;ll come later in the year.</p><h2 id="card-needed-why">Card needed, why?</h2><p>We require a card to unlock the full 1m events/month.</p><p>It costs quite a bit to provide this free usage to people, so this felt fair to us. A little friction here ensures people place some value on product analytics so we don&#x27;t end up with very poorly engaged users - this would create a lot of noise for us in judging how our own retention is performing, which makes it hard to judge what to build. Some users will go past 1m events/month in which case we don&#x27;t want extra friction in our own sales process, although really for PostHog - we focus on PostHog Scale to drive revenue.</p><h2 id="how-easy-is-it-to-move-from-one-edition-of-posthog-to-another">How easy is it to move from one edition of PostHog to another?</h2><h3 id="current-open-source-user---posthog-cloud">Current open source user -&gt; PostHog Cloud?</h3><p>If you are currently hosting PostHog Open Source and having read this would rather use PostHog Cloud for greater simplicity and enhanced reliability, then it may make sense to move. First of all, check above if you are one of the users we are targeting with this change.</p><p>We <em>haven&#x27;t</em> built a way to automatically migrate your data over - that would have been non-trivial to build, and we didn&#x27;t want to bottleneck releasing this change. However, after talking with many of you - our recommended way to migrate is this:</p><ul><li><a href="https://app.posthog.com/signup">Set up</a> PostHog Cloud now</li><li>Send events to <a href="https://app.posthog.com/signup">PostHog Cloud</a> and your self-hosted instance in parallel</li><li>Switch off your self-hosted instance once you&#x27;ve enough data built up to be useful in Cloud (around 3 months is what most people do)</li></ul><h3 id="posthog-cloud---posthog-open-source-in-future">PostHog Cloud -&gt; PostHog Open Source in future</h3><p>In future, you may want to self-host your analytics again as your product takes off - when increased volume and privacy needs both drive you to want to self host.</p><p>We don&#x27;t have plans in the immediate future to build a feature for this as we&#x27;ve other urgent items to get built first that will benefit more users. You could use our APIs, but in reality - we&#x27;d recommend running both systems in parallel for a couple of months then switching one off.</p><p>The exception is if you wish to move to <a href="/pricing">PostHog Scale</a> (paid), in which case we provide extra support to migrate your data.</p><h3 id="posthog-cloud---posthog-scale">PostHog Cloud -&gt; PostHog Scale</h3><p>You can do this - we provide a little manual support in this case. Just <a href="/talk-to-a-human">contact us</a>.</p><h2 id="does-this-mean-posthog-is-focusing-more-on-cloud-then">Does this mean PostHog is focusing more on cloud then?</h2><p>Oh subtitle, you couldn&#x27;t be more wrong.</p><p>A key goal is to provide a more reliable PostHog for <em>all</em> users.</p><p>We view <a href="https://app.posthog.com/signup">Cloud</a> as a way of generating awareness (charging high volume cloud users to cover its hosting costs) and improving scalability, and Self-Host as a way of generating high volume users that we retain very well and who may end up paying one day.</p><p>For those that self-host, we are putting a ton of engineering work into enabling ClickHouse in our open source product. That means users that self-host will be able to use PostHog at much greater scale, bug free, for free or paid depending on which features they need.</p><p>For teams with smaller volume and less of a focus on user privacy, this is where today&#x27;s change comes in.</p><h2 id="existing-paying-cloud-customer-weve-got-your-back">Existing paying Cloud customer? We&#x27;ve got your back</h2><p>Existing customers should get treated just as well (or better, from time to time!) than new customers.</p><p>We&#x27;ve therefore already applied this increase to any customers who are paying per event on <a href="https://app.posthog.com/signup">Cloud</a>. Yep, that cost us a bunch of money. But it&#x27;s the right thing to do.</p><p>After all, PostHog&#x27;s mission is to increase the number of successful products in the world.</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.25.0]]></title><description><![CDATA[PostHog 1.25.0 is here! Read about our new features, why we're giving 1M events for free to everyone, and find out who are the 6 new team members we've onboarded.]]></description><link>https://posthog.com/blog/the-posthog-array-1-25-0</link><guid isPermaLink="false">d453f288-ce81-5999-809f-7e3c845b6cfa</guid><pubDate>Thu, 13 May 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-25-0.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.25.0 is here!</p><p>Since the last release, we&#x27;ve now onboarded 6 new team members, all of them awesome.</p><p>For our users, what this means is:</p><pre><code>Awesome new team members == Better product
</code></pre><h3 id="100x-more-for-free">100x more, for free</h3><p>We have increased our free volume on <a href="https://app.posthog.com">PostHog Cloud</a> to 1 million events per month for free, instead of the previous 10k.</p><p>That means your next PostHog bill will be up to 225$/month cheaper!</p><p>It&#x27;s important to us that you have enough room to determine if PostHog is the right fit for you, before committing to the platform.</p><p>This change is also retroactive, so existing PostHog users have already had this change applied to their accounts.</p><p>Enjoy!</p><h3 id="community-mvp-">Community MVP 🏆</h3><p>This release cycle&#x27;s Community MVP goes to...</p><p><a href="https://github.com/Rajakavitha1">Rajakavitha1</a>!</p><p>Rajakavitha dug into our codebase and helped us document 2 new API endpoints, as well as submitting other suggestions and changes to our documentation pages.</p><p>Thanks a lot for all your help - hope you&#x27;re enjoying your PostHog merch!</p><blockquote><p>If you haven&#x27;t seen it yet, we have a <a href="/contributors">new page dedicated to our contributors</a>. Every contributor gets their own digital card, and we provide a leaderboard with stats on the contributions made by each contributor. We also have a bot that sends a gift card for PostHog merch to contributors for every PR merged, and we welcome all types of contributions!</p></blockquote><p><strong>In this release:</strong></p><ul><li><strong>New:</strong> App logs</li><li><strong>New:</strong> &#x27;Trends&#x27; legends</li><li><strong>New:</strong> Lifecycle toggles</li><li><strong>New:</strong> Resizable table columns</li><li><strong>New:</strong> Job queues for apps</li><li><strong>Improvement:</strong> Fuzzy search for properties</li></ul><p><div></div></p><h2 id="posthog-1250-release-notes">PostHog 1.25.0 Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="legends-for-charts-in-trends"><a href="https://github.com/PostHog/posthog/pull/3434">Legends for charts in &#x27;Trends&#x27;</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/legends.png" alt="Legends"/></p><p>This feature isn&#x27;t new to all of you, because we&#x27;ve been testing it out with a <a href="/manual/feature-flags">feature flag</a>. However, legends for charts in &#x27;Trends&#x27; are now enabled for everyone!</p><p>With legends, you&#x27;re able to determine with more clarity the different sections/lines you see on a graph, see the exact values for each datapoint, and disable sections with one click. You can find them under your graph in &#x27;Trends&#x27;.</p><h3 id="app-logs"><a href="https://github.com/PostHog/posthog/pull/3482">App Logs</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/plugin-logs.png" alt="App Logs"/></p><p>Apps are now able to use the JavaScript <code>console</code> API to specify errors that will be shown to users in the PostHog UI. This makes it easier to both debug your own plugins as a developer, and understand what&#x27;s wrong about your configuration as a user.</p><h3 id="lifecycle-toggles"><a href="https://github.com/PostHog/posthog/pull/3961">Lifecycle Toggles</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/lifecycle-toggles.png" alt="Lifecycle Toggles"/></p><p>Li joined us this cycle and started making an impact from day 1!</p><p>As a result of her work, you can now toggle different sections of lifecycle graphs on and off, in order to dig into the metrics that matter most to you.</p><p>This change also came with an addition of more in-product hints about the lifecycle functionality.</p><h3 id="resizable-table-columns"><a href="https://github.com/PostHog/posthog/pull/3927">Resizable Table Columns</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/resizable-columns.png" alt="Resizable Columns"/></p><p>Sam is another one of our new team members who&#x27;s been smashing it from the moment he joined!</p><p>This cycle, in addition to picking up a variety of product fixes and improvements, he also shipped resizable columns for our tables, allowing you to easily get more details from an event, session, or feature flag without having to click on it.</p><h3 id="job-queues-for-apps"><a href="https://github.com/PostHog/plugin-server/pull/325">Job queues for apps</a></h3><p>Apps keep getting more and more powerful every new release, and this cycle was no exception.</p><p>App developers can now leverage job queues to implement a variety of asynchronous tasks, including retry mechanisms.</p><p>In addition, apps can now leverage have two more functions: <code>onEvent</code> and <code>onSnapshot</code>.</p><p>These are read-only functions that run on processed events and are particularly useful for export apps. <code>onSnapshot</code> handles session recording events while <code>onEvent</code> handles all other events.</p><p>For more information about this, check our <a href="/docs/plugins/build"><em>Building Your Own Plugin</em> page</a>.</p><h3 id="fuzzy-search-for-properties"><a href="https://github.com/PostHog/posthog/pull/4091">Fuzzy search for properties</a></h3><p>In addition to making significant changes to improve the experience of users with massive amounts of event names and properties, we have also implemented fuzzy search for properties.</p><p>This means that to find a property on a filter, you no longer have to type an exact subset of its name, as our search mechanism will still be able to identify what you mean even if you have a few typos or forgot the <em>exact</em> name of the property.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog News</h2><p>We onboarded so many people this cycle that it makes sense to make a table for it!</p><h3 id="new-joiners">New joiners</h3><table><thead><tr><th align="center">Name</th><th align="center">Role</th><th align="center">🍍 on 🍕?</th><th align="center">Interesting Fact</th></tr></thead><tbody><tr><td align="center">Buddy</td><td align="center">Fullstack Developer</td><td align="center">🤮</td><td align="center"><em>&quot;I practice AcroYoga.&quot;</em></td></tr><tr><td align="center">Li</td><td align="center">Fullstack Developer</td><td align="center">😍</td><td align="center"><em>&quot;I&#x27;m in the top 3% of all North American League of Legends players.&quot;</em></td></tr><tr><td align="center">Mo</td><td align="center">Content Marketer</td><td align="center">😍</td><td align="center"><em>&quot;I was a radio presenter in a previous life. A producer walked past me at a career fair, heard me speak, asked me to follow her to the studio, and put a mic in front of me. The rest is history.&quot;</em></td></tr><tr><td align="center">Neil</td><td align="center">Fullstack Developer</td><td align="center">🤮</td><td align="center"><em>&quot;There was a time I travelled using nothing but paper maps for directions. As a result, I developed excellent sense of direction and photographic memory for maps. Now I subconsciously try to figure out which way is North, wherever I am, so I can navigate using the map in my brain. Thanks to this I never get confused between taking an Eastbound or Westbound tube 😂&quot;</em></td></tr><tr><td align="center">Sam</td><td align="center">Fullstack Developer</td><td align="center">😍</td><td align="center"><em>&quot;In my apartment, I have a self-sustaining compost bin with worms inside. It keeps food scraps out of the landfill and makes excellent soil!&quot;</em></td></tr><tr><td align="center">Tiina</td><td align="center">Fullstack Developer</td><td align="center">😍</td><td align="center"><em>&quot;I spent a summer selling books door-to-door in Utah. I appreciate sales/customer service folks much more since then - their job is so hard.&quot;</em></td></tr></tbody></table><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/Rajakavitha1">Rajakavitha1</a></li><li><a href="https://github.com/leggetter">leggetter</a></li><li><a href="https://github.com/gesposito">gesposito</a></li><li><a href="https://github.com/adrienbrault">adrienbrault</a></li><li><a href="https://github.com/sankalpdomore">sankalpdomore</a></li><li><a href="https://github.com/gagantrivedi">gagantrivedi</a></li><li><a href="https://github.com/thedeveloperr">thedeveloperr</a></li><li><a href="https://github.com/bard">bard</a></li><li><a href="https://github.com/swong194">swong194</a></li><li><a href="https://github.com/afterwind-io">afterwind-io</a></li><li><a href="https://github.com/kevinhu">kevinhu</a></li><li><a href="https://github.com/j-fuentes">j-fuentes</a></li><li><a href="https://github.com/daviddanielarch">daviddanielarch</a></li><li><a href="https://github.com/angelahuang89">angelahuang89</a></li><li><a href="https://github.com/akshayagarwal">akshayagarwal</a></li><li><a href="https://github.com/JeffreyQ">JeffreyQ</a></li></ul><h2 id="open-roles">Open Roles</h2><p>If you&#x27;d love to help us build PostHog, we have a lot of openings available!</p><p>We&#x27;re looking for:</p><ul><li>Customer Success Lead</li><li>VP Customer Success</li><li>Ex-Founders (Engineering)</li><li>Front End Developer (Remote)</li><li>Senior Full Stack Engineer</li><li>Senior Full Stack Engineer - EMEA</li><li>Senior Mobile Engineer</li><li>Site Reliability Engineer</li><li>Recruitment &amp; Operations Manager</li><li>Senior Product Designer</li><li>Any role you think you&#x27;d be a great fit for</li></ul><p>Check out our <a href="https://posthog.com/careers">Careers page</a> for more info.</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs. Here are some of the highlights:</p><ul><li><code>PostHog/posthog</code>: <a href="https://github.com/PostHog/posthog/commits/master">228 PRs merged / commits</a></li><li><code>PostHog/plugin-server</code>: <a href="https://github.com/PostHog/plugin-server/commits/master">66 PRs merged / commits</a></li><li><code>PostHog/posthog-python</code>: <a href="https://github.com/PostHog/posthog-python/commits/master">13 PRs merged / commits</a></li><li><code>PostHog/posthog-cloud</code>: <a href="https://github.com/PostHog/posthog-cloud/commits/master">7 PRs merged / commits</a></li><li><code>PostHog/posthog-js</code>: <a href="https://github.com/PostHog/posthog-js/commits/master">7 PRs merged / commits</a></li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.26.0]]></title><description><![CDATA[PostHog 1.26.0 is here! Read about our Series B raise, our new features, and find out who are the 4 new team members we've onboarded.]]></description><link>https://posthog.com/blog/the-posthog-array-1-26-0</link><guid isPermaLink="false">b92df1c9-8c83-5b8f-94ed-42e64c5dd7c6</guid><pubDate>Thu, 13 May 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/1-26-0.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.26.0 is here! </p><p>We&#x27;ve raised another $15M, our libraries have leveled up, and we&#x27;ve brought on even more great people. Not bad if you ask me. </p><h3 id="weve-raised-a-15m-series-b"><a href="/blog/15-million-series-b">We&#x27;ve raised a $15M Series B</a></h3><p>Some exciting news in PostHog land! <a href="https://posthog.com/blog/15-million-series-b">Read our blog post about this latest round</a>.</p><h3 id="community-mvp-">Community MVP 🏆</h3><p>This release cycle&#x27;s Community MVP goes to...</p><p><a href="https://github.com/imhmdb">imhmdb</a>!</p><p>Mohamad submitted a <a href="https://github.com/PostHog/posthog-php/pull/12">500+ line PR</a> implementing feature flags in our <a href="/docs/integrate/server/php">PHP library</a>. The PR is still under review but we anticipate it&#x27;ll be merged soon.</p><p>Awesome work and thanks again Mohamad!</p><blockquote><p>If you haven&#x27;t seen it yet, we have a <a href="/contributors">new page dedicated to our contributors</a>. Every contributor gets their own digital card, and we provide a leaderboard with stats on each person&#x27;s contributions. We also have a bot that sends a gift card for PostHog merch to contributors for every PR merged, and we welcome all types of contributions! </p></blockquote><p><strong>In this release:</strong></p><ul><li><strong>New:</strong> Feature flags for Node.js and Go</li><li><strong>New:</strong> CSV download for users in a datapoint</li><li><ul><li><strong>New:</strong> Funnel trends for analyzing conversion over time</li></ul></li><li><strong>New:</strong> Request retries for posthog-js</li><li><strong>New:</strong> New plugins for Redshift, PostgreSQL, and PagerDuty</li><li><strong>Improvement:</strong> New querying experience</li></ul><p><div></div></p><h2 id="posthog-1260-release-notes">PostHog 1.26.0 Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="feature-flags-for-nodejs-and-go">Feature flags for Node.js and Go</h3><ul><li><a href="https://github.com/PostHog/posthog-node/pull/29">Node.js</a></li><li><a href="https://github.com/PostHog/posthog-go/pull/2">Go</a></li></ul><p>You requested and we delivered! </p><p><code>posthog-node</code> and <code>posthog-go</code> now both support feature flags. <a href="https://github.com/PostHog/posthog-ruby/pull/6">Ruby</a> and <a href="https://github.com/PostHog/posthog-php/pull/12">PHP</a> are coming next.</p><p>We&#x27;re making our libraries world-class, and this cycle also saw significant improvements to <code>posthog-python</code>, <code>posthog-js</code>, and <code>posthog-flutter</code>. We now have a dedicated team responsible for our libraries, so expect development to speed up!</p><p>Thank you to everyone in the community for supporting us with feature requests and PRs. </p><h3 id="funnel-trends"><a href="https://github.com/PostHog/posthog/pull/4419">Funnel trends</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/funnel-trends.png" alt="Funnel Trends"/></p><p>Following a few refactors, funnel trends are now available in beta for Cloud and self-hosted <a href="/pricing">Scale</a> users. </p><p>Funnel trends let you see how conversion in a funnel changes over time, as well as specify the time taken between steps for a conversion to be counted.</p><h3 id="csv-download-for-users-in-a-datapoint"><a href="https://github.com/PostHog/posthog/pull/4175">CSV download for users in a datapoint</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/csvexport.png" alt="CSV Download"/></p><p>If you didn&#x27;t already know, almost all datapoints in PostHog&#x27;s &#x27;Insights&#x27; section are clickable and reveal the users that make up that datapoint.</p><p>Well, now those users can be exported in CSV format, so you can use them in other tools or even create a static PostHog cohort from them.</p><p>Thanks a lot for building this <a href="https://github.com/c3ho">c3ho</a>!</p><h3 id="request-retries-for-posthog-js"><a href="https://github.com/PostHog/posthog-js/issues/199">Request retries for posthog-js</a></h3><p>Continuing on the libraries theme, a much-requested feature is now live for <code>posthog-js</code>: retries!</p><p>Requests that fail because of for example, the client&#x27;s network connection, will now be retried up to 10 times within an hour, making sure you miss as few events as possible. So if your user&#x27;s internet goes down and comes back up, you&#x27;ll still receive the events that happened when they were offline.</p><p>Also, Neil fixed a bug that sent requests to a wrong endpoint (with no impact on tracking). You can read about how Neil solved this issue on his <a href="https://neilkakkar.com/debugging-open-source.html">blog</a>.</p><h3 id="new-apps-for-redshift-postgresql-salesforce-and-pagerduty">New apps for Redshift, PostgreSQL, Salesforce, and PagerDuty</h3><p>We&#x27;ve just released 4 new integrations with major platforms to enhance your PostHog experience. </p><p>Export data to Redshift, Postgres, and Salesforce, and leverage the PagerDuty app to get alerts when metrics in PostHog cross thresholds you specify.</p><h3 id="new-querying-experience">New querying experience</h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/new-querying.png" alt="New querying experience"/></p><p>We&#x27;ve redesigned and significantly improved the performance of the query builder in PostHog &#x27;Trends&#x27;! </p><p><a href="https://app.posthog.com/home#supportModal">Let us know what you think about it</a>.</p><h3 id="user-interviews"><a href="https://calendly.com/posthog-feedback">User Interviews</a></h3><p>We’re working hard to improve PostHog and would love to talk to you about your experience with the product.</p><p>If you&#x27;re interested in helping us out, you can schedule a quick 30 min call with us <a href="https://calendly.com/posthog-feedback">on Calendly</a>.</p><p>To thank you for your time, we&#x27;re giving away some awesome <a href="https://merch.posthog.com">PostHog merch</a>!</p><h2 id="posthog-news">PostHog News</h2><p>We onboarded so many people this cycle that we decided to make a table for it!</p><h3 id="new-joiners">New joiners</h3><table><thead><tr><th align="center">Name</th><th align="center">Role</th><th align="center">🍍 on 🍕?</th><th align="center">Interesting Fact</th></tr></thead><tbody><tr><td align="center">Joe</td><td align="center">Product Marketer</td><td align="center">😍</td><td align="center"><em>&quot;Jobs I had before I moved into marketing include (in order): clown, waiter, hospital &amp; morgue cleaner, chainsaw salesman, and videogame journalist.&quot;</em></td></tr><tr><td align="center">Marcus</td><td align="center">VP of Product</td><td align="center">🤮</td><td align="center"><em>&quot;Jointly hold the world record for Most People Dressed As Santa Doing A Zip Line In One Hour.&quot;</em></td></tr><tr><td align="center">Alex</td><td align="center">Fullstack Developer</td><td align="center">😍</td><td align="center"><em>&quot;I&#x27;ve visited all of NYC&#x27;s secret subway stations without getting caught (yet).&quot;</em></td></tr><tr><td align="center">Phil</td><td align="center">Developer Relations</td><td align="center">😍</td><td align="center"><em>&quot;I made national press coverage (The Times, The Sun, The Mirror, Radio 5 Live... The Gainsborough Today :smirk:) in 2006 after creating a David Beckham website called &#x27;Bring Back Beckham.&#x27;&quot;</em></td></tr></tbody></table><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/imhmdb">imhmdb</a> 🏆</li><li><a href="https://github.com/tobiastornros">tobiastornros</a></li><li><a href="https://github.com/adrienbrault">adrienbrault</a></li><li><a href="https://github.com/sankalpdomore">sankalpdomore</a></li><li><a href="https://github.com/gesposito">gesposito</a></li><li><a href="https://github.com/taobojlen">taobojlen</a></li><li><a href="https://github.com/pietrodevpiccini">pietrodevpiccini</a></li><li><a href="https://github.com/weyert">weyert</a></li><li><a href="https://github.com/lharress">lharress</a></li><li><a href="https://github.com/bard">bard</a></li><li><a href="https://github.com/avorio">avorio</a></li><li><a href="https://github.com/DimitrisMazarakis">DimitrisMazarakis</a></li><li><a href="https://github.com/abhijitghate">abhijitghate</a></li><li><a href="https://github.com/c3ho">c3ho</a></li><li><a href="https://github.com/joesaunderson">joesaunderson</a></li><li><a href="https://github.com/mands">mands</a></li><li><a href="https://github.com/Rajakavitha1">Rajakavitha1</a></li><li><a href="https://github.com/lutangar">lutangar</a></li><li><a href="https://github.com/jonataslaw">jonataslaw</a></li></ul><h2 id="open-roles">Open Roles</h2><p>If you&#x27;d love to help us build PostHog, we&#x27;re currently hiring for the following roles:</p><ul><li>Front End Developer</li><li>Senior Full Stack Engineer</li><li>Staff Engineer - Fullstack</li><li>Any role you think you&#x27;d be a great fit for</li></ul><p>Check out our <a href="https://posthog.com/careers">Careers page</a> for more info.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs. Here are some highlights:</p><ul><li><a href="https://github.com/PostHog/posthog/commits/master"><code>PostHog/posthog</code></a></li><li><a href="https://github.com/PostHog/plugin-server/commits/master"><code>PostHog/plugin-server</code></a></li><li><a href="https://github.com/PostHog/posthog-python/commits/master"><code>PostHog/posthog-python</code></a></li><li><a href="https://github.com/PostHog/posthog-cloud/commits/master"><code>PostHog/posthog-cloud</code></a></li><li><a href="https://github.com/PostHog/posthog-js/commits/master"><code>PostHog/posthog-js</code></a></li><li><a href="https://github.com/PostHog/plugin-repository/commits/master"><code>PostHog/plugin-repository</code></a></li></ul><hr/><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we monetized our open source devtool]]></title><description><![CDATA[So, you’ve decided to build an open-source product. While your choice is highly commendable, the resounding applause from devs on GitHub and Hacker…]]></description><link>https://posthog.com/blog/open-source-business-models</link><guid isPermaLink="false">1b95c669-fff2-51c6-865f-1f70c04b1ee7</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Fri, 30 Apr 2021 00:00:00 GMT</pubDate><content:encoded><![CDATA[<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/L1Ovbzs7vyo" title="YouTube video player" frameBorder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe><p>So, you’ve decided to build an open-source product.</p><p>While your choice is highly commendable, the resounding applause from devs on GitHub and Hacker News won’t pay the bills. At some point, you’ll need to monetize your product to sustain its development (and your team) in the long run.</p><p>Just one thing: <strong>you need to build a community.</strong></p><iframe src="https://giphy.com/embed/OF0yOAufcWLfi" width="480" height="238" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p>Open-source requires a decently-sized, highly engaged community for any business model to work. People have to believe in your solution enough to contribute code, comments, or cash to it. If money is a priority for your business, open-source might not be the path for you.</p><p>At PostHog, we’ve been fortunate enough to build an engaged community of contributors over the years, and we celebrate our top contributors with each new release. You can check out our <a href="https://posthog.com/contributors">contributor page</a>, see our <a href="http://github.com/PostHog/">GitHub repo</a>, and join our <a href="https://posthog.com/slack">Slack community</a> of users.</p><p>Let’s now look at how we’ve managed to turn a buck with PostHog over the past few months — plus 3 other business models to explore for your own product.	</p><h2 id="option-1-support">Option #1: Support</h2><p>Support involves helping large companies deploy, use, maintain, and upgrade your software. These companies usually lack the time, expertise, or inclination to do all that by themselves, and as the developer, you’re in a better position to tailor the deployment to their specific situation, deploy updates as needed, and extract a lot of value.</p><p>The downside is that support-based open source business models tend to return lower margins. This is fine if you’re bootstrapping, but trying to raise VC money becomes a <a href="https://www.google.com/search?q=schlep">schlep</a> as VC firms generally prefer high-margin startups.</p><p>At PostHog, we started with the support model before running into one problem: developers typically want to wrangle your software themselves before paying for help or maintenance. </p><iframe src="https://giphy.com/embed/pVsn5LJEgMKxa" width="480" height="269" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p>This makes it a hard sell, but you can overcome this if you have more ‘clout’ by being a large project with hundreds of contributions and thousands of commits. <a href="https://www.redhat.com/en">RedHat</a> is a good example of a support-based open source company.</p><h2 id="option-2-hosted-vs-self-hosted">Option #2: Hosted vs. Self-Hosted</h2><p>With this option, you offer users the option to either host your product on their own servers or host it on yours. The value prop is similar to that of the support model: companies don’t want the hassle of hosting your product themselves and are willing to pay you for it. The benefit here is that you only have to maintain one edition of your product, which makes it easier and more financially feasible to plan your roadmap and hire a smaller team.</p><p>The downside of the hosted model is that it’s not very defensible. You’ll likely face competition from hosting providers who simply host your free edition and charge their users for extra value-adds, cutting you out of the deal completely. </p><iframe src="https://giphy.com/embed/j4ksBQ70a3ECh2VObN" width="480" height="270" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p>The hosting business model is also much harder to pull off without a solid, popular product. <a href="https://www.mongodb.com/">MongoDB</a> and <a href="/blog/posthog-vs-sentry">Sentry</a> are two examples of products that lets you self-host or host with a 3rd party provider.</p><h2 id="option-3-open-core">Option #3: Open core</h2><p>This option requires you to build and maintain two editions of your product: the open-source edition (under an MIT or Apache-type license), and a ‘source-available’ edition with features designed for larger businesses. Your customers can deploy the source-available edition on their own infrastructure, but they need to pay you to use those added features. This is the approach that PostHog uses; you can access our <a href="http://github.com/PostHog/">community edition</a> on GitHub.</p><p>The major advantage of this approach — and one of our biggest selling points — is that you don’t need to process user data through 3rd parties. This makes it easier to gain adoption in larger companies that hold data privacy as a core part of their ethos.</p><iframe src="https://giphy.com/embed/3HELB2Qwfu9dV1ZGYY" width="480" height="282" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p>The downside is that you have to build and maintain two editions of your product: the community edition and the source-available edition. This means hiring a larger, costlier engineering team and possibly raising venture capital at the start to fund your operations. Due to these factors, it might take longer for you to get to revenue. And because you’re maintaining two editions of your product, you’ll need to clearly indicate which features contributors can work on and which ones are off-limits.</p><p>At PostHog, we launched a (paid) hosted edition first before moving to an open-core model and allowing self-hosting. Many other companies are experimenting with the concept of ‘buyer-based open core,’ which means that you <a href="https://www.heavybit.com/library/video/commercial-open-source-business-strategies/">charge differently</a> for features depending on who cares the most about them. Company executives always want more functionality and tend to be less price-sensitive than, say, a developer or individual contributor, so there’s more room to expand your codebase and make money. The downside is that it takes a lot of work to separate your open-source code from your proprietary code.</p><iframe src="https://giphy.com/embed/9Y74y9h95QBizsNfd8" width="480" height="480" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><h2 id="option-4-donations">Option #4: Donations</h2><p>This approach is great if you created your product as a hobby and are fine with earning a minimal amount of money each month to cover small expenses. It quickly becomes unfeasible if you want to maintain an entire engineering team on donations. You can enjoy quite a bit of success going the donation route if you have a stellar product, but these are outliers and shouldn’t be used as revenue benchmarks. Besides, if you already have a great product that’s raking in donations, you probably shouldn’t be reading this post.</p><iframe src="https://giphy.com/embed/3o6Zt3OhbsQ5VLPmBW" width="480" height="338" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><h2 id="pick-what-works-for-you">Pick what works for you</h2><p>There are many ways to monetize open-source software, and the approach you choose will depend on how much maintenance you’d like to take on, how large a team you’d like to assemble, and how much money you’re looking to raise — whether in organic revenue or through venture capital. Whichever approach you take, focus on building an outstanding product and an engaged community at all times, as those advantages accrue to you indefinitely.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[An engineer's guide to picking a cofounder]]></title><description><![CDATA[What could be worse than handing out 50% of your company's equity to a co-founder who doesn't understand the product as much as you do, and all they…]]></description><link>https://posthog.com/blog/pick-cofounder</link><guid isPermaLink="false">b8add1cf-241d-5321-9c28-8f1e4694d684</guid><dc:creator><![CDATA[Mo Shehu]]></dc:creator><pubDate>Wed, 28 Apr 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/how-to-pick-cofounder.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>What could be worse than handing out 50% of your company&#x27;s equity to a co-founder who doesn&#x27;t understand the product as much as you do, and all they seem to bring is the ability to talk?</p><p>Likewise, a sales-focused founder may be struggling to know what makes you great, or - worse - may not appreciate the importance of development.</p><iframe src="https://giphy.com/embed/1dJVNSn8u3BSGftyVm" width="480" height="480" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p><a href="https://giphy.com/gifs/alan-sugar-lord-1dJVNSn8u3BSGftyVm">via GIPHY</a></p><h2 id="do-i-need-a-co-founder">Do I need a co-founder?</h2><p>At PostHog, Tim <a href="inflated-risk-seems-riskier">didn&#x27;t even know</a> he wanted to start a company, so the answer here was yes!</p><p>For introverts, your inclination might be to retain complete control and to hire someone to handle the business side of things. This leads itself to a standard failure mode - not talking to users. You&#x27;ll find it easy to build, but you&#x27;ll have a hard time building something people want.</p><p>With a true co-founder, you can bounce major decisions off a sounding board before going live. At PostHog, James is responsible for bringing in new customers (among his other CEO duties), while Tim is responsible for overseeing engineering as CTO. They both hold each other accountable, ensuring that any off-course outcomes are corrected swiftly.</p><iframe src="https://giphy.com/embed/Dnt2VnWFknFNm" width="480" height="360" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p><a href="https://giphy.com/gifs/fist-bump-Dnt2VnWFknFNm">via GIPHY</a></p><p>Longer term, running a company is stressful - you&#x27;re creating something out of nothing, and that inherently means you&#x27;ll question yourself. Perhaps the most basic thing that has worked well at PostHog is James and Tim have managed to continuously rationalize what we&#x27;re doing - taking it one problem at a time. We <a href="story-about-pivots">pivoted five times</a> in the early days, and we&#x27;d not be here today without two people pushing each other to get over each hurdle.</p><h2 id="how-do-i-know-if-this-salesy-cofounder-is-any-good">How do I know if this salesy cofounder is any good?</h2><p>As a salesperson, watching a developer feels like magic. A whirr of terminal windows then suddenly a product makes its way into real life. Likewise, to a developer, the instant relationship-building skill a good salesperson has is critical to getting a product off the ground.</p><p>Don&#x27;t get sold too soon - relationship-building for a salesy cofounder is <em>table stakes</em>. In addition to these respective skills, you&#x27;ll also need this person to have:</p><ul><li>The ability to get stuff done</li><li>A product-focused mentality</li><li>The ability to adapt</li></ul><p>And, crucially, you need to like working with each other.</p><iframe src="https://giphy.com/embed/3ohzdEM30dysPGuHFm" width="480" height="270" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p><a href="https://giphy.com/gifs/nickelodeon-hunter-street-3ohzdEM30dysPGuHFm">via GIPHY</a></p><h2 id="isnt-two-devs-better">Isn&#x27;t two devs better?</h2><p>If you&#x27;re comfortable talking with strangers that often do not want to talk to you, then two developers is probably the best possible setup. One of the things that was noticeable during <a href="moving-to-sf">PostHog&#x27;s time at Y Combinator</a> was how outgoing many of the technical founders were.</p><p>It has been <em>very</em> important that James can do the basics of development. Optimally, both would be kick-ass developers, but that has been less important than selling and <a href="/blog/ceo-diary-6">communication skills</a> with external parties - users, customers, employees, and investors.</p><h2 id="optimize-for-not-breaking-up">Optimize for not breaking up</h2><p>Cofounder breakup is a key way for your startup to fail.</p><p>There are a few things PostHog did to guard against this:</p><ul><li>Equal equity between cofounders - even if you didn&#x27;t start on the same day. This can otherwise cause resentment.</li><li>A culture of direct feedback. James and Tim tell each other when they get frustrated and have <a href="https://twitter.com/PostHog/status/1385543414511542273">encouraged the team</a> to do this too.</li><li>Clear individual goals for each week. There was a ton of stuff to build in the early days, so James&#x27; job was <em>everything</em> else: getting user meetings, making wireframes, working out how to do taxes and payroll, raising money, or buying food. He even did some paid consultancy to make some money to pay for ads early on. Meanwhile, Tim focused on coding. This is how we got so far so quickly.</li><li>Both cofounders are involved in key decisions. To stereotype - salesy types tend to be more extroverted and can dominate the direction of a company. James and Tim, even with a team of 20, double up their one-on-ones to 2 hours each week to stay close and remain aligned on key decisions.</li><li>Work out what you both want out of life. Are you trying to retire early or is it the pure challenge? Go deep to figure out what the company and startup journey means to each of you.</li></ul><h2 id="bottom-line">Bottom line</h2><p>Having a co-founder is great - but it&#x27;s far better to have no co-founder than to have the wrong one. Getting this right is perhaps the most crucial decision you&#x27;ll take on your road to startup success.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we do meetings at PostHog]]></title><description><![CDATA[Best practices for productive meetings at your startup Ever had one of those days where you do nothing but hop into one meeting after another? Even…]]></description><link>https://posthog.com/blog/meetings</link><guid isPermaLink="false">922773d9-dbd5-5333-a843-5368b21f22a1</guid><pubDate>Mon, 19 Apr 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/how-we-do-meetings/how-we-do-meetings.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Best practices for productive meetings at your startup</strong></p><p>Ever had one of those days where you do nothing but hop into one meeting after another? Even worse is the 30-minute break between meetings which seems like enough time to squeeze in some work — but is an illusion.</p><iframe src="https://giphy.com/embed/xbH6UeGdW2LzksnNay" width="480" height="400" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p><a href="https://giphy.com/gifs/theoffice-the-office-tv-episode-816-xbH6UeGdW2LzksnNay">via GIPHY</a></p><p>Meetings are necessary, as they can speed up collaboration and build team rapport — especially in a remote work setting where giving people different ways to communicate is better for diversity.</p><p>But there are severe drawbacks when meeting culture takes over. Not only do meetings disrupt flow, but they also allow unprepared attendees to &quot;think on your time&quot; instead of arriving prepared to share concrete ideas. The numbers support this, too:</p><blockquote><p>Poorly organized meetings cost U.S. businesses <a href="https://meeting-report.com/financial-impact-of-meetings/0" target="_blank" rel="noopener noreferrer nofollow">$399 billion a year</a>. (Doodle State of Meetings Report, 2019)</p></blockquote><p>Let me share with you how PostHog does meetings. We’re constantly improving our process and would love to hear how your team tackles meetings.</p><h2 id="limit-meeting-days">Limit meeting days</h2><p>Meeting-free days allow more deep work to get done. At PostHog, we&#x27;ve mandated Tuesdays and Thursdays as meeting-free days, which has had a significant impact on our team’s productivity. Mondays are reserved for company updates and Wednesdays for team updates. Every 2nd Friday, we do a retrospective planning session with life stories in between. We also use meetings for <a href="https://posthog.com/handbook/people/hiring-process/">SuperDays</a>, one-to-one coffee breaks (one every two weeks), or optional group socials (once per week).</p><blockquote><p>&quot;Meeting-free Tuesdays &amp; Thursdays have increased the number of high-value tasks I get done than I did previously. If I were starting another company, I&#x27;d do exactly what we&#x27;re doing here.&quot; — <a href="/charles">Charles Cook</a>, Head of Business Ops @ PostHog</p></blockquote><p>Our meeting-free days create a natural cadence for the week, with everyone knowing they will alternate between ‘light’ and ‘heavy’ days with plenty of time in between to get good work done. In practice, while Monday, Wednesday, and Friday are meeting days, only a few people will use up that time for important work, such as <a href="/james">James</a> or Yakko; or Eltje, our People Ops &amp; Talent Manager, speaking to candidates.</p><blockquote><p>&quot;I think PostHog’s meeting policy is a good setup and that we have the right balance with an extra day towards meetings.&quot; — Kunal Pathak, Growth Engineer @ PostHog</p></blockquote><h2 id="keep-meetings-short-and-to-the-point">Keep meetings short and to the point</h2><p>At PostHog, we do an average of 30 minutes for internal meetings and slightly longer for interviews so that candidates have fewer meetings overall. By design, shorter meetings force you to align your thoughts before you get on the call, ensuring that you make the most of your allocated time.</p><p>For anything longer than a 30-minute call, write your points down in advance so that the other attendees can respond in detail. Not only does this asynchronous approach improve everyone&#x27;s workflow, but it also leaves a paper trail that all parties can reference as needed. At PostHog, we have a culture of writing things down — but this is because we prefer GitHub and Slack for communications, both of which lend themselves better to the written word. We also maintain an extensive, publicly accessible <a href="https://posthog.com/handbook">company handbook</a> as part of our open-source DNA.</p><p>A lot of our discussions take place on GitHub to account for the team’s different time zones. This allows for more carefully thought out — rather than quickly spoken — ideas.</p><h2 id="invite-essential-people-only">Invite essential people only</h2><p>You&#x27;ve probably been in meetings where you wondered why you’re there. Due to our rapid growth — a team of 20 in a year — we unintentionally landed up in this area. This is one of the reasons James introduced <a href="https://posthog.com/handbook/company/structure">Small Teams</a>, to help everyone focus and feel like a small team again.</p><iframe src="https://giphy.com/embed/sMjmhaWPuzFHa" width="480" height="360" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe><p><a href="https://giphy.com/gifs/help-comments-explained-sMjmhaWPuzFHa">via GIPHY</a></p><p>If your meetings are turning into a crowd of listeners, set some hard rules on the number of attendees and if you want to dig deeper, think about who is accountable for the work being discussed and only invite them. Time spent &#x27;showing face&#x27; could be better spent on more productive tasks.</p><h2 id="implement-your-teams-feedback">Implement your team’s feedback</h2><p>Regularly ask your team if their meeting process is working and whether they need support with their workload. While meetings might be the primary way managers get work done, <a href="http://www.paulgraham.com/makersschedule.html" target="_blank" rel="noopener noreferrer nofollow">Makers</a> need more time and space to focus on their work and are not as productive in meetings.</p><p>It&#x27;s essential to strike the right balance between moments of team communication vs. optimizing for individual productivity. At PostHog, a lot of feedback went into changing our work model to move to Small Teams with more focused meetings, and you can view the rest of our company policies in our handbook.</p><h2 id="practice-what-you-preach">Practice what you preach</h2><p>Building a positive and productive meeting culture must be modeled from the top. While many companies have different policies around meetings, things on the ground might be different. For example, a company could declare Tuesdays as meeting-free days and still have a manager set up a meeting during that protected time because their calendars are full. This erodes trust in the system and fosters resentment.</p><p>Part of our magic here at PostHog is that we practice what we preach. <a href="/james">James</a> and <a href="/tim">Tim</a>, PostHog’s co-founders, publicly model a low internal meeting culture. This sets the tone for the rest of the company and leads to high trust in management. It also assures everyone that they’ll always have plenty of non-meeting time to get work done.</p><h2 id="the-best-meeting-policy-for-your-startup">The best meeting policy for your startup</h2><p>Your company’s needs may be different, but there are key foundations you can build your meeting policy on. Firstly, respect people’s time. If you can shorten meetings either through scheduling or by ending them early, do so. We have a hard stop on meetings!</p><p>Secondly, optimize for productivity, not presence. Instead of having people come to the meeting to discuss line items on the agenda, have them mull over those items beforehand to arrive prepared. At PostHog, we present our key metrics every Monday to the company, with goals front and center and no vanity metrics celebrated.</p><p>Thirdly, it starts from the top. Your company’s leadership has to set and stick to the rules around meetings at all times. This builds trust and ensures accountability. Lastly, feel free to iterate your meeting policy. Play around with different approaches to meetings to see what works, and poll your team regularly for feedback. It goes a long way toward building a more inclusive culture.</p><p>Liked this post or noticed something we missed? Let us know on <a href="https://twitter.com/PostHog" target="_blank" rel="noopener noreferrer nofollow">Twitter</a> or <a href="https://www.linkedin.com/company/posthog/" target="_blank" rel="noopener noreferrer nofollow">LinkedIn</a>. Subscribe to our newsletter for more content around startups, growth, and analytics.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.24.0]]></title><description><![CDATA[Welcome to The PostHog Array 1.24.0! Quite a lot has changed since we last talked... Community MVP 🏆 This release cycle's Community MVP goes to…]]></description><link>https://posthog.com/blog/the-posthog-array-1-24-0</link><guid isPermaLink="false">5fb06b72-e0f1-5dbd-9365-2ca705f66013</guid><pubDate>Wed, 14 Apr 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Welcome to The PostHog Array 1.24.0! Quite a lot has changed since we last talked...</p><h3 id="community-mvp-">Community MVP 🏆</h3><p>This release cycle&#x27;s Community MVP goes to...</p><p><a href="https://github.com/adrienbrault">adrienbrault</a>!</p><p>Adrien has been submitting PRs left and right, helping us improve the core PostHog platform, as well as our libraries and documentation!</p><p>As of writing, Adrien is by far the top contributor to PostHog in April, with 11 PRs merged over these first two weeks:</p><p><a href="/contributors"><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/adrien.png" alt="Contributors Stats"/></a></p><p>Thank you so much Adrien! Hope you&#x27;ve been enjoying the PostHog merch you accumulated.</p><blockquote><p>If you haven&#x27;t seen it yet, we have a <a href="/contributors">new page dedicated to our contributors</a>. Every contributor gets their own digital card, and we provide a leaderboard with stats on the contributions made by each contributor. We also have a bot that sends a gift card for PostHog merch to contributors for every PR merged, and we welcome all types of contributions!</p></blockquote><p><strong>In this release:</strong></p><ul><li><strong>New:</strong> IP location data available to all PostHog users</li><li><strong>New:</strong> Display a list of cohorts a given user is in on their person page</li><li><strong>New:</strong> Custom data attributes support for the toolbar</li><li><strong>New:</strong> Advanced dashboard collaboration features</li><li><strong>New:</strong> S3 export plugin</li><li><strong>New:</strong> Snowflake export app</li><li><strong>Improvement:</strong> Session recording support for heavy websites</li><li><strong>Improvement:</strong> Multiple new configuration options for <code>posthog-js</code></li><li><strong>Improvement:</strong> First Time Event Tracker plugin now tracks session starts</li></ul><p><div></div></p><h2 id="posthog-1240-release-notes">PostHog 1.24.0 Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="geoip-for-all"><a href="https://github.com/PostHog/posthog/pull/3894">GeoIP for all</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/geoip.png" alt="GeoIP"/></p><p>Apps are now live on PostHog Cloud, and, as a bonus, we have now added out-of-the-box support for the PostHog GeoIP enricher, which adds location properties to your events, such as country and city, as well as a dozen other values!</p><p>The app works on both cloud and self-hosted installations (<code>1.24.0</code> minimum).</p><h3 id="new-cohorts-tab-on-person-pages"><a href="https://github.com/PostHog/posthog/pull/3744">New &#x27;Cohorts&#x27; tab on person pages</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/person-cohorts.png" alt="Cohorts tab"/></p><p>When viewing a person&#x27;s page in PostHog, you can now toggle between a view of their properties and a view of the cohorts this person is in, giving you a lot more context on the user you&#x27;re looking at.</p><h3 id="toolbar-support-for-custom-data-attributes"><a href="https://github.com/PostHog/posthog/pull/3761">Toolbar support for custom data attributes</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/data-attr.png" alt="Data attr"/></p><p>To make the experience of using the PostHog toolbar better, we have recommended that you set <code>data-attr</code> on your elements, so that the toolbar can leverage it for finding elements. However, since a lot of our users already used their own data attributes, we now support adding a list of your own data attributes for the toolbar to look for.</p><p>You can configure this in &#x27;Project Settings&#x27;.</p><h3 id="dashboard-collaboration-features"><a href="https://github.com/PostHog/posthog/pull/3756">Dashboard collaboration features</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/dashboard-collab.png" alt="Dashboard collab"/></p><p>Our dashboards keep getting better with every new release, and this one is no different!</p><p>Dashboards now support descriptions and tags, making it easier for teams to collaborate when creating internal analytics reports.</p><p>These are enterprise features available to our paying Cloud customers, and to enterprise self-hosted users.</p><p>If you&#x27;re interested in having these features on your self-hosted PostHog instance, <a href="/talk-to-a-human">contact us</a>.</p><h3 id="s3-and-snowflake-export-apps"><a href="/plugins">S3 and Snowflake export apps</a></h3><p>We have new apps to send PostHog events to <a href="/plugins/s3-export">S3 buckets</a> and <a href="/plugins/snowflake-export">Snowflake</a> instances!</p><p>You have Marius to thank for these - and you really should. Our resident progressive urbanite had to work hard to get around <a href="https://github.com/PostHog/snowflake-export-plugin#temporary-tables">all sorts of hurdles</a> to get these out.</p><p>The apps work on both PostHog Cloud and self-hosted installations (<code>1.24.0</code> minimum) - <a href="/plugins/s3-export">check it out here</a>.</p><h3 id="session-recording-for-heavy-websites"><a href="https://github.com/PostHog/posthog/pull/3705">Session recording for heavy websites</a></h3><p>If you tell Karl you found an issue with session recording, he will fix it.</p><p>Such was the case with session recording for heavy websites (e.g. those with a lot of images/CSS). We were failing to process large snapshots, leading users of these websites unable to get many session recordings.</p><p>This is now fixed - expect a lot more recordings available to you from now on!</p><h3 id="new-configuration-options-for-posthog-js"><a href="https://github.com/PostHog/posthog-js/pull/209">New configuration options for posthog-js</a></h3><p>Following user requests, there are now 10 new config options for <code>posthog-js</code>, allowing you to use autocapture with greater privacy for your users, as well as tailor session recording configuration.</p><p>The new options are:</p><ul><li><code>mask_all_text</code>: Specifies if PostHog should capture the <code>textContent</code> of autocaptured elements</li><li><code>mask_all_attributes</code>: Specifies if PostHog should capture the attributes of autocaptured elements</li><li><code>session_recording</code>: Accepts an object that lets you configure the following <code>rrweb</code> options:<ul><li><code>blockClass</code></li><li><code>blockSelector</code></li><li><code>ignoreClass</code></li><li><code>maskAllInputs</code></li><li><code>maskInputOptions</code></li><li><code>maskInputFn</code></li><li><code>slimDOMOptions</code></li><li><code>collectFonts</code></li><li><code>recordCanvas</code></li></ul></li></ul><p>See our <a href="/docs/integrate/client/js">JS library page</a> for more details.</p><h3 id="track-session-starts"><a href="/plugins/first-time-event-tracker">Track session starts</a></h3><p>Our First Time Event Tracker now also tracks session starts. By enabling it you will get <code>session_started</code> events in PostHog, as well as events that started a session will be tagged with property <code>is_first_event_in_session</code> set to <code>true</code>.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/adrienbrault">adrienbrault</a></li><li><a href="https://github.com/jeduden">jeduden</a></li><li><a href="https://github.com/leggetter">leggetter</a></li><li><a href="https://github.com/rethab">rethab</a></li><li><a href="https://github.com/lharress">lharress</a></li><li><a href="https://github.com/jeduden">jeduden</a></li><li><a href="https://github.com/bard">bard</a></li><li><a href="https://github.com/jonathanclarke">jonathanclarke</a></li><li><a href="https://github.com/shogunpurple">shogunpurple</a></li><li><a href="https://github.com/samcaspus">samcaspus</a></li><li><a href="https://github.com/well-balanced">well-balanced</a></li><li><a href="https://github.com/gempain">gempain</a></li><li><a href="https://github.com/bronsonavila">bronsonavila</a></li><li><a href="https://github.com/joesaunderson">joesaunderson</a></li><li><a href="https://github.com/wushaobo">wushaobo</a></li></ul><h2 id="open-roles">Open Roles</h2><p>If you&#x27;d love to help us build PostHog, we have a lot of openings available!</p><p>We&#x27;re looking for:</p><ul><li>Full Stack Engineers</li><li>Senior Full Stack Engineers</li><li>Sales Engineer</li><li>Senior Mobile Engineer</li><li>Senior Product Designer</li><li>Product Marketer</li><li>Any role you think you&#x27;d be a great fit for</li></ul><p>Check out our <a href="https://posthog.com/careers">Careers page</a> for more info.</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Update plugin server to 0.16.10 <a href="https://github.com/PostHog/posthog/pull/3976">#3976</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Rename redefined variables <a href="https://github.com/PostHog/posthog/pull/3975">#3975</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Three small UX fixes <a href="https://github.com/PostHog/posthog/pull/3972">#3972</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix persons search <a href="https://github.com/PostHog/posthog/pull/3971">#3971</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update plugin server to 0.16.9 <a href="https://github.com/PostHog/posthog/pull/3970">#3970</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Fix display of plugin error seconds <a href="https://github.com/PostHog/posthog/pull/3965">#3965</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin server to 0.16.8 <a href="https://github.com/PostHog/posthog/pull/3959">#3959</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.16.7 <a href="https://github.com/PostHog/posthog/pull/3958">#3958</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Remove fixed typescript errors <a href="https://github.com/PostHog/posthog/pull/3956">#3956</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.16.6 <a href="https://github.com/PostHog/posthog/pull/3955">#3955</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.16.5 <a href="https://github.com/PostHog/posthog/pull/3954">#3954</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Fixes project settings not loading <a href="https://github.com/PostHog/posthog/pull/3950">#3950</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.16.4 <a href="https://github.com/PostHog/posthog/pull/3945">#3945</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.16.3 <a href="https://github.com/PostHog/posthog/pull/3944">#3944</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Remove &#x27;string, parsable as datetime&#x27; <a href="https://github.com/PostHog/posthog/pull/3942">#3942</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Use default axes on line graphs <a href="https://github.com/PostHog/posthog/pull/3940">#3940</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Bump cryptography to 3.4.7 and add macosx_arm64 install script <a href="https://github.com/PostHog/posthog/pull/3935">#3935</a> (<a href="https://github.com/samwinslow">samwinslow</a>)</li><li>Update posthog-js to 1.9.7 <a href="https://github.com/PostHog/posthog/pull/3933">#3933</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.16.2 <a href="https://github.com/PostHog/posthog/pull/3932">#3932</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Renames Active users to Unique users <a href="https://github.com/PostHog/posthog/pull/3930">#3930</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix navigation to insights from dashboards <a href="https://github.com/PostHog/posthog/pull/3928">#3928</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Resizable table columns in Sessions <a href="https://github.com/PostHog/posthog/pull/3927">#3927</a> (<a href="https://github.com/samwinslow">samwinslow</a>)</li><li>Update autocapture label to be more descriptive <a href="https://github.com/PostHog/posthog/pull/3925">#3925</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Log to sentry when migrations are out of date <a href="https://github.com/PostHog/posthog/pull/3924">#3924</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Update plugin server to 0.16.1 <a href="https://github.com/PostHog/posthog/pull/3920">#3920</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Run Automerge as posthog-bot <a href="https://github.com/PostHog/posthog/pull/3919">#3919</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Are migrations safe to run on cloud? <a href="https://github.com/PostHog/posthog/pull/3917">#3917</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Minimum PostHog version in plugins <a href="https://github.com/PostHog/posthog/pull/3916">#3916</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add cypress dependency installation <a href="https://github.com/PostHog/posthog/pull/3914">#3914</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Increase Element model varchar limits <a href="https://github.com/PostHog/posthog/pull/3912">#3912</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix commandpallet test <a href="https://github.com/PostHog/posthog/pull/3911">#3911</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix action with same name <a href="https://github.com/PostHog/posthog/pull/3909">#3909</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Always show event stats and add warnings <a href="https://github.com/PostHog/posthog/pull/3908">#3908</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update plugin server to 0.16.0 (AKA plugins no longer opt-in) <a href="https://github.com/PostHog/posthog/pull/3903">#3903</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Fix events with spaces and only add URL for pageviews <a href="https://github.com/PostHog/posthog/pull/3902">#3902</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix Continent Name property description <a href="https://github.com/PostHog/posthog/pull/3900">#3900</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Support GeoLite2 City event properties in UI (AKA GeoIP out of the box with our new plugin) <a href="https://github.com/PostHog/posthog/pull/3894">#3894</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix property popover arrow placement on cohorts page <a href="https://github.com/PostHog/posthog/pull/3893">#3893</a> (<a href="https://github.com/adrienbrault">adrienbrault</a>)</li><li>Fix Cypress tests on forks <a href="https://github.com/PostHog/posthog/pull/3892">#3892</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Make docker apt version pinning less strict <a href="https://github.com/PostHog/posthog/pull/3889">#3889</a> (<a href="https://github.com/adrienbrault">adrienbrault</a>)</li><li>Fix shared dashboard rendering with multiline descriptions <a href="https://github.com/PostHog/posthog/pull/3885">#3885</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.15.5 <a href="https://github.com/PostHog/posthog/pull/3884">#3884</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Round table rows in system status <a href="https://github.com/PostHog/posthog/pull/3883">#3883</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix cypress dependencies <a href="https://github.com/PostHog/posthog/pull/3881">#3881</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Reduce visual weight for dashboard placeholders <a href="https://github.com/PostHog/posthog/pull/3880">#3880</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Fix 0143 migration unique index <a href="https://github.com/PostHog/posthog/pull/3876">#3876</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>set platform when footer chosen <a href="https://github.com/PostHog/posthog/pull/3875">#3875</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Don&#x27;t render Signup component if logged in <a href="https://github.com/PostHog/posthog/pull/3874">#3874</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Get rid of DATABASE_URL and REDIS_URL construction in bin/plugin-server <a href="https://github.com/PostHog/posthog/pull/3873">#3873</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add filters to lifecycle <a href="https://github.com/PostHog/posthog/pull/3870">#3870</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>User V2 Part II - Frontend changes <a href="https://github.com/PostHog/posthog/pull/3866">#3866</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix feature flags insight link <a href="https://github.com/PostHog/posthog/pull/3865">#3865</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Format label property key <a href="https://github.com/PostHog/posthog/pull/3864">#3864</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server in ee/docker-compose.* to 0.15.4 <a href="https://github.com/PostHog/posthog/pull/3863">#3863</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix charts in dashboards <a href="https://github.com/PostHog/posthog/pull/3862">#3862</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix docker dev environment <a href="https://github.com/PostHog/posthog/pull/3861">#3861</a> (<a href="https://github.com/adrienbrault">adrienbrault</a>)</li><li>Ingestion - framework grid <a href="https://github.com/PostHog/posthog/pull/3860">#3860</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Fix cached trends on dashboards not loading <a href="https://github.com/PostHog/posthog/pull/3856">#3856</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>User V2 API endpoint <a href="https://github.com/PostHog/posthog/pull/3855">#3855</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Resolves #3801 - Test users filters <a href="https://github.com/PostHog/posthog/pull/3854">#3854</a> (<a href="https://github.com/samwinslow">samwinslow</a>)</li><li>New env: UPDATE_CACHED_DASHBOARD_ITEMS_INTERVAL_SECONDS <a href="https://github.com/PostHog/posthog/pull/3853">#3853</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Release remove-shownas <a href="https://github.com/PostHog/posthog/pull/3851">#3851</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Release trend-legend <a href="https://github.com/PostHog/posthog/pull/3850">#3850</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Improve clarity of main nav hotkeys <a href="https://github.com/PostHog/posthog/pull/3849">#3849</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Clarify &quot;Filter Out ...&quot; settings copy <a href="https://github.com/PostHog/posthog/pull/3847">#3847</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix Team.data_attributes default <a href="https://github.com/PostHog/posthog/pull/3846">#3846</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Make <code>.text-muted</code> half opacity black instead of solid light gray <a href="https://github.com/PostHog/posthog/pull/3845">#3845</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Remove IS_DOCKER env var <a href="https://github.com/PostHog/posthog/pull/3843">#3843</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Delete docker-preview script <a href="https://github.com/PostHog/posthog/pull/3842">#3842</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Clarify project settings filter wording <a href="https://github.com/PostHog/posthog/pull/3839">#3839</a> (<a href="https://github.com/leggetter">leggetter</a>)</li><li>Update plugin server to 0.15.4 <a href="https://github.com/PostHog/posthog/pull/3838">#3838</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Add PostHog version to system status <a href="https://github.com/PostHog/posthog/pull/3837">#3837</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Minor improvements to persons <a href="https://github.com/PostHog/posthog/pull/3834">#3834</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix apt-get install error when building docker images <a href="https://github.com/PostHog/posthog/pull/3833">#3833</a> (<a href="https://github.com/adrienbrault">adrienbrault</a>)</li><li>Fix API/HTTP instructions json syntax <a href="https://github.com/PostHog/posthog/pull/3832">#3832</a> (<a href="https://github.com/adrienbrault">adrienbrault</a>)</li><li>Swap out person_distinct_id in queries with subquery <a href="https://github.com/PostHog/posthog/pull/3828">#3828</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Bump y18n from 4.0.0 to 4.0.1 <a href="https://github.com/PostHog/posthog/pull/3827">#3827</a> (<a href="https://github.com/apps/dependabot">dependabot[bot]</a>)</li><li>Less dancing in dashboards <a href="https://github.com/PostHog/posthog/pull/3824">#3824</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix 2K0 <a href="https://github.com/PostHog/posthog/pull/3823">#3823</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Allow math filter on $time property <a href="https://github.com/PostHog/posthog/pull/3821">#3821</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>change created_at to _timestamp <a href="https://github.com/PostHog/posthog/pull/3820">#3820</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>add test account filter to people endpoints <a href="https://github.com/PostHog/posthog/pull/3815">#3815</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add descriptions of insights in menu <a href="https://github.com/PostHog/posthog/pull/3814">#3814</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>added redirection to posthogs website <a href="https://github.com/PostHog/posthog/pull/3812">#3812</a> (<a href="https://github.com/samcaspus">samcaspus</a>)</li><li>Update plugin server to 0.15.3 <a href="https://github.com/PostHog/posthog/pull/3810">#3810</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Env for async event property usage calculation interval <a href="https://github.com/PostHog/posthog/pull/3809">#3809</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Bumped cffi so that pip will install deps for M1 chip <a href="https://github.com/PostHog/posthog/pull/3808">#3808</a> (<a href="https://github.com/buwilliams">buwilliams</a>)</li><li>Default set debug=1 to bin/start <a href="https://github.com/PostHog/posthog/pull/3807">#3807</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix skip ci for bot <a href="https://github.com/PostHog/posthog/pull/3806">#3806</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update posthog-js to 1.9.6 <a href="https://github.com/PostHog/posthog/pull/3804">#3804</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Add localhost:3000 into excluded urls <a href="https://github.com/PostHog/posthog/pull/3803">#3803</a> (<a href="https://github.com/well-balanced">well-balanced</a>)</li><li>Display when actions were last calculated <a href="https://github.com/PostHog/posthog/pull/3796">#3796</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix POSTHOG-DW <a href="https://github.com/PostHog/posthog/pull/3794">#3794</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Reply to inviting user on invite emails <a href="https://github.com/PostHog/posthog/pull/3792">#3792</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Skip CI for posthog-contributions-bot <a href="https://github.com/PostHog/posthog/pull/3789">#3789</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix .all-contributorsrc <a href="https://github.com/PostHog/posthog/pull/3788">#3788</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>3589 breakdown <a href="https://github.com/PostHog/posthog/pull/3782">#3782</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Hide login link from signup if instance is not initiated <a href="https://github.com/PostHog/posthog/pull/3781">#3781</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add warning to breakdown that we only show top 20 values <a href="https://github.com/PostHog/posthog/pull/3779">#3779</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update app favicon <a href="https://github.com/PostHog/posthog/pull/3778">#3778</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>removed app.posthog.com for the url <a href="https://github.com/PostHog/posthog/pull/3777">#3777</a> (<a href="https://github.com/samcaspus">samcaspus</a>)</li><li>Update plugin server to 0.15.2 <a href="https://github.com/PostHog/posthog/pull/3776">#3776</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Backend tests refactor <a href="https://github.com/PostHog/posthog/pull/3774">#3774</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.15.1 <a href="https://github.com/PostHog/posthog/pull/3772">#3772</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Make sure the proper math is applied when calculating top elements for breakdown <a href="https://github.com/PostHog/posthog/pull/3771">#3771</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Misc instrumentation &amp; tiny tweaks <a href="https://github.com/PostHog/posthog/pull/3769">#3769</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix multiple people same distinct id <a href="https://github.com/PostHog/posthog/pull/3768">#3768</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add index to events.created_at <a href="https://github.com/PostHog/posthog/pull/3767">#3767</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Support multiple entries for selector and tag_name filter for EE <a href="https://github.com/PostHog/posthog/pull/3766">#3766</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Don&#x27;t show legend if nothing to show <a href="https://github.com/PostHog/posthog/pull/3763">#3763</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Custom Data Attributes in the toolbar <a href="https://github.com/PostHog/posthog/pull/3761">#3761</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix get_available_timezones_with_offsets DST change edge case <a href="https://github.com/PostHog/posthog/pull/3760">#3760</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.15.0 <a href="https://github.com/PostHog/posthog/pull/3758">#3758</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Hotkeys UI Improvement <a href="https://github.com/PostHog/posthog/pull/3757">#3757</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Description &amp; tagging on dashboards <a href="https://github.com/PostHog/posthog/pull/3756">#3756</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Handle event capture edge cases <a href="https://github.com/PostHog/posthog/pull/3755">#3755</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix TestAccountFiltersConfig description <a href="https://github.com/PostHog/posthog/pull/3754">#3754</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix boolean breakdown on postgres <a href="https://github.com/PostHog/posthog/pull/3752">#3752</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Another null check for persons <a href="https://github.com/PostHog/posthog/pull/3750">#3750</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix #3747 <a href="https://github.com/PostHog/posthog/pull/3748">#3748</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix feature flags default rollout <a href="https://github.com/PostHog/posthog/pull/3745">#3745</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add &#x27;cohorts&#x27; tab to Person page <a href="https://github.com/PostHog/posthog/pull/3744">#3744</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add some data-attr for plugins <a href="https://github.com/PostHog/posthog/pull/3742">#3742</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update plugin server to 0.14.8 <a href="https://github.com/PostHog/posthog/pull/3741">#3741</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Global hotkey navigation <a href="https://github.com/PostHog/posthog/pull/3740">#3740</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add element matching for multiple values on text/href <a href="https://github.com/PostHog/posthog/pull/3739">#3739</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add setup for contributions bot <a href="https://github.com/PostHog/posthog/pull/3738">#3738</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update plugin server to 0.14.7 <a href="https://github.com/PostHog/posthog/pull/3737">#3737</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.14.6 <a href="https://github.com/PostHog/posthog/pull/3736">#3736</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Dockerfile non-root user in production <a href="https://github.com/PostHog/posthog/pull/3735">#3735</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>reduce width so button isn&#x27;t covered <a href="https://github.com/PostHog/posthog/pull/3734">#3734</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Clarify test accounts → internal users <a href="https://github.com/PostHog/posthog/pull/3733">#3733</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Allow for non-plugin config-keyed plugin attachments <a href="https://github.com/PostHog/posthog/pull/3732">#3732</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>[retention table] Use utc on dates without hours for consistency <a href="https://github.com/PostHog/posthog/pull/3731">#3731</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add &quot;test account filters&quot; filter to trends <a href="https://github.com/PostHog/posthog/pull/3729">#3729</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix filtering breakdown queries <a href="https://github.com/PostHog/posthog/pull/3727">#3727</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Bump lxml from 4.6.2 to 4.6.3 <a href="https://github.com/PostHog/posthog/pull/3725">#3725</a> (<a href="https://github.com/apps/dependabot">dependabot[bot]</a>)</li><li>Update plugin server to 0.14.5 <a href="https://github.com/PostHog/posthog/pull/3724">#3724</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Increment version <a href="https://github.com/PostHog/posthog/pull/3721">#3721</a> (<a href="https://github.com/jaredsilver">jaredsilver</a>)</li><li>Update changelog for 1.23.1 <a href="https://github.com/PostHog/posthog/pull/3719">#3719</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix linting-breaking import <a href="https://github.com/PostHog/posthog/pull/3718">#3718</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Async event action mapping to 5 min, add warning <a href="https://github.com/PostHog/posthog/pull/3717">#3717</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin server to 0.14.3 <a href="https://github.com/PostHog/posthog/pull/3716">#3716</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.14.2 <a href="https://github.com/PostHog/posthog/pull/3715">#3715</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update react-rrweb-player <a href="https://github.com/PostHog/posthog/pull/3714">#3714</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix hotkeys in textarea <a href="https://github.com/PostHog/posthog/pull/3713">#3713</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix unmounted logic bug on shared dashboards <a href="https://github.com/PostHog/posthog/pull/3712">#3712</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Temporarily bring back individual refresh in dashboard items <a href="https://github.com/PostHog/posthog/pull/3708">#3708</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Speed up filtering by events in sessions <a href="https://github.com/PostHog/posthog/pull/3707">#3707</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Solidify plugins on Cloud rollout <a href="https://github.com/PostHog/posthog/pull/3706">#3706</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Chunk session recording events <a href="https://github.com/PostHog/posthog/pull/3705">#3705</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>add beta tag to trends, center title <a href="https://github.com/PostHog/posthog/pull/3704">#3704</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Better plugin globalization UX <a href="https://github.com/PostHog/posthog/pull/3702">#3702</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>New login &amp; signup (React) <a href="https://github.com/PostHog/posthog/pull/3701">#3701</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Lower the bar to report bugs in plugins <a href="https://github.com/PostHog/posthog/pull/3699">#3699</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Timezone handling UX <a href="https://github.com/PostHog/posthog/pull/3698">#3698</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>bump version, update changelog <a href="https://github.com/PostHog/posthog/pull/3697">#3697</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Plugins page tiny fixes <a href="https://github.com/PostHog/posthog/pull/3694">#3694</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.14.1 <a href="https://github.com/PostHog/posthog/pull/3693">#3693</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>3682 Various annotation fixes <a href="https://github.com/PostHog/posthog/pull/3689">#3689</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update plugin server to 0.14.0 <a href="https://github.com/PostHog/posthog/pull/3687">#3687</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>funnel trend fix white screen and remove description <a href="https://github.com/PostHog/posthog/pull/3686">#3686</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Enable PLUGIN_SERVER_INGESTION <a href="https://github.com/PostHog/posthog/pull/3684">#3684</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.13.1 <a href="https://github.com/PostHog/posthog/pull/3683">#3683</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.13.0 <a href="https://github.com/PostHog/posthog/pull/3681">#3681</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Different async action mapping approach <a href="https://github.com/PostHog/posthog/pull/3678">#3678</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Feature Flags Revamp (UX &amp; Code) <a href="https://github.com/PostHog/posthog/pull/3675">#3675</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Use the correct boolean on cohort update <a href="https://github.com/PostHog/posthog/pull/3673">#3673</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Shared dashboards fix <a href="https://github.com/PostHog/posthog/pull/3672">#3672</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.12.0 <a href="https://github.com/PostHog/posthog/pull/3669">#3669</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Dashboard empty &amp; error states + mobile support <a href="https://github.com/PostHog/posthog/pull/3666">#3666</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix rounding for weekly and monthly intervals <a href="https://github.com/PostHog/posthog/pull/3665">#3665</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Enable event property usage env vars <a href="https://github.com/PostHog/posthog/pull/3664">#3664</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Lint Dockerfiles <a href="https://github.com/PostHog/posthog/pull/3663">#3663</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Expire Celery tasks after 4 days instead of 1 <a href="https://github.com/PostHog/posthog/pull/3662">#3662</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix system status page plugin metrics <a href="https://github.com/PostHog/posthog/pull/3658">#3658</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Default event property usage to false <a href="https://github.com/PostHog/posthog/pull/3655">#3655</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix proxy config <a href="https://github.com/PostHog/posthog/pull/3654">#3654</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>fixed y axis color issue <a href="https://github.com/PostHog/posthog/pull/3653">#3653</a> (<a href="https://github.com/samcaspus">samcaspus</a>)</li><li>Add support for SOCIAL_AUTH_REDIRECT_IS_HTTPS <a href="https://github.com/PostHog/posthog/pull/3652">#3652</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.11.9 <a href="https://github.com/PostHog/posthog/pull/3651">#3651</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update docker compose dev port <a href="https://github.com/PostHog/posthog/pull/3650">#3650</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Notice in toolbar if could not get a unique selector for the element <a href="https://github.com/PostHog/posthog/pull/3635">#3635</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Dashboard hotkeys <a href="https://github.com/PostHog/posthog/pull/3623">#3623</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Improve formulas UI/input <a href="https://github.com/PostHog/posthog/pull/3620">#3620</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Explain premium feature in upgrade modal <a href="https://github.com/PostHog/posthog/pull/3619">#3619</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Automatically enable debug mode for posthog-js on SELF_CAPTURE <a href="https://github.com/PostHog/posthog/pull/3613">#3613</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Dashboard Improvements I <a href="https://github.com/PostHog/posthog/pull/3608">#3608</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Make events search more prominent <a href="https://github.com/PostHog/posthog/pull/3587">#3587</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Insight session entities <a href="https://github.com/PostHog/posthog/pull/3582">#3582</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Support custom identifier for person name <a href="https://github.com/PostHog/posthog/pull/3581">#3581</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Show toast on API errors <a href="https://github.com/PostHog/posthog/pull/3561">#3561</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Enable plugins for everyone <a href="https://github.com/PostHog/posthog/pull/3557">#3557</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Introduce Dayjs <a href="https://github.com/PostHog/posthog/pull/3490">#3490</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Plugins access control <a href="https://github.com/PostHog/posthog/pull/3486">#3486</a> (<a href="https://github.com/Twixes">Twixes</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.23.0]]></title><description><![CDATA[In this edition of the PostHog Array: Release 1.23 is out, and our 🔥 new  PostHog.com homepage  is live - amazing work from PostHoggers Cory, Lottie…]]></description><link>https://posthog.com/blog/the-posthog-array-1-23-0</link><guid isPermaLink="false">d6da919e-fcd6-5e0a-9374-829a54811234</guid><pubDate>Thu, 18 Mar 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>In this edition of the PostHog Array: Release 1.23 is out, and our 🔥 new <a href="/">PostHog.com homepage</a> is live - amazing work from PostHoggers Cory, Lottie, and Mike!</p><h3 id="community-mvp">Community MVP</h3><p>The PostHog 1.23.0 community MVP is Sandeep (<a href="https://github.com/samcaspus">samcaspus</a>) - a frequent contributor to PostHog. If you open a new issue, there&#x27;s a high change Sandeep will jump on it!</p><p>Anyone can contribute to PostHog and open source, whether it&#x27;s code, copy, design or discussion. We&#x27;re delighted that our community are so passionate that they even <a href="https://github.com/PostHog/posthog.com/issues/1036#issuecomment-788732593">share PostHog with their family</a> ;)</p><p>Thank you Sandeep, we look forward to collaborating with you more!</p><p><strong>In this release:</strong></p><ul><li><strong>New:</strong> Date filter for heatmaps</li><li><strong>New:</strong> Automatic filtering of test accounts</li><li><strong>New:</strong> Gravatar support</li><li><strong>New:</strong> Plugin for tracking first time events</li><li><strong>Improvement:</strong> Webhooks on FOSS are back and better</li></ul><p><div></div></p><h2 id="important-announcement-for-self-hosted-users">Important Announcement for Self-Hosted Users</h2><p>If you&#x27;re self hosting PostHog, make sure you have your app server up and running by looking at the color of the middle circle on the top left of the PostHog UI.</p><p>If it is running, you&#x27;ll see a green checkmark, and hovering over it will give the message &quot;All systems operational&quot;, like so:</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/plugin-server.png" alt="App server"/></p><p>From this release (1.23.0) onwards, you <strong>will not be able to ingest events</strong> if your app server isn&#x27;t running.</p><h3 id="special-note-for-cloudformation-deployments">Special Note for CloudFormation Deployments</h3><p>If you&#x27;ve deployed PostHog via CloudFormation, make sure to check your memory limits, as they may be set too low by default (512MB).</p><p>To run the server, we recommend having <em>at least</em> 1024MB of memory, or you might run the risk of running out of it.</p><h2 id="posthog-1230-release-notes">PostHog 1.23.0 Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="date-filter-for-heatmaps"><a href="https://github.com/PostHog/posthog/pull/3586">Date Filter for Heatmaps</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/toolbar-date.png" alt="Toolbar Date Filter"/></p><p>Following a fierce battle with Webpack, Marius developed our new Heatmap date filters allowing you to now select any date range rather than been fixed to only the last week.</p><h3 id="automatic-filtering-of-test-accounts"><a href="https://github.com/PostHog/posthog/pull/3492">Automatic Filtering of Test Accounts</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/filter-test-accounts.png" alt="Filter test accounts"/></p><p>Have you ever wondered what effect your team&#x27;s usage is having on your analytics data? Well your wondering days are over. You can now toggle events from internal accounts to be automatic filtered out when viewing Insights. We&#x27;ve provided some convenient filtering defaults, which can customized further in &#x27;Settings&#x27;.</p><h3 id="webhooks-are-back---and-theyre-better"><a href="https://github.com/PostHog/posthog/pulls?q=is%3Apr+is%3Aclosed+webhook">Webhooks Are Back - And They&#x27;re Better</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/webhooks.png" alt="Webhooks"/></p><p>We made a big improvement to webhooks, you can now access all event properties in your webhook messages. This change opens up a whole new world of possibilities for creating useful alerts and notifications.</p><p>A big thank you to diligent members of our community who reported and helped us debug and fix issues with webhooks on certain self-hosted FOSS setups.</p><h3 id="organization-settings--gravatar-support"><a href="https://github.com/PostHog/posthog/pull/3584">Organization Settings &amp; Gravatar Support</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/gravatar.png" alt="Gravatars"/></p><p>We&#x27;ve added an &#x27;Organization Settings&#x27; page that lets you rename and delete your organization, as well as manage invites.</p><p>If you have a Gravatar associated with your email, PostHog will now display it on your profile and the &#x27;Organization Settings&#x27; page.</p><h3 id="first-time-event-tracker">First Time Event Tracker</h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/first-time-plugin.png"/></p><p>Based on user requests, we have now built a app that adds two boolean properties to your events:</p><ul><li><code>is_event_first_ever</code>: tells you if the event if the first event of its kind</li><li><code>is_event_first_for_user</code>: tells you if the event is the first event of its kind for the user</li></ul><p>By enabling the app, you can filter for those properties on all your analytics, to determine things like conversion rates from first touch.</p><blockquote><p><strong>Important:</strong> This app will only work on events ingested after the app was enabled. This means it will register events as being the first if there were events that occurred before it was enabled.</p></blockquote><h3 id="user-interviews"><a href="https://calendly.com/posthog-feedback">User Interviews</a></h3><p>We’re working hard to improve PostHog and would love to talk to you about your experience with the product.</p><p>If you&#x27;re interested in helping us out, you can schedule a quick 30-min call with us <a href="https://calendly.com/posthog-feedback">on Calendly</a>.</p><p>Oh, and we&#x27;re giving away some awesome <a href="https://merch.posthog.com">PostHog merch</a> as a thank you!</p><h2 id="favorite-issue-banter">Favorite <del>Issue</del> Banter</h2><p>Are PR reviews putting you to sleep? Not at PostHog, it&#x27;s all excitement! Here&#x27;s a snippet of a PR review from our M² team (Michael &amp; Marius):</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/pr-review.png" alt="M2 PR Review"/></p><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/samcaspus">samcaspus</a></li><li><a href="https://github.com/RedFrez">RedFrez</a></li><li><a href="https://github.com/Skchoudhary">Skchoudhary</a></li></ul><h2 id="open-roles">Open Roles</h2><p>Are you a Fullstack Engineer, Senior Engineer, Site Reliability Engineer, Sales Engineer, Product Marketer, or Content Marketer?</p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog?</p><p><a href="https://posthog.com/careers">We want you!</a></p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Default event property usage to false <a href="https://github.com/PostHog/posthog/pull/3655">#3655</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>fixed y axis color issue <a href="https://github.com/PostHog/posthog/pull/3653">#3653</a> (<a href="https://github.com/samcaspus">samcaspus</a>)</li><li>Add support for SOCIAL_AUTH_REDIRECT_IS_HTTPS <a href="https://github.com/PostHog/posthog/pull/3652">#3652</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.11.9 <a href="https://github.com/PostHog/posthog/pull/3651">#3651</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update docker compose dev port <a href="https://github.com/PostHog/posthog/pull/3650">#3650</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update plugin server to 0.11.8 <a href="https://github.com/PostHog/posthog/pull/3649">#3649</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Revert &quot;Disable PLUGIN_SERVER_INGESTION&quot; <a href="https://github.com/PostHog/posthog/pull/3648">#3648</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Disable PLUGIN_SERVER_INGESTION <a href="https://github.com/PostHog/posthog/pull/3645">#3645</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix organization settings <a href="https://github.com/PostHog/posthog/pull/3643">#3643</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix Funnel rendering on dashboards <a href="https://github.com/PostHog/posthog/pull/3641">#3641</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Update posthog-js to 1.9.5 <a href="https://github.com/PostHog/posthog/pull/3640">#3640</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Notice in toolbar if could not get a unique selector for the element <a href="https://github.com/PostHog/posthog/pull/3635">#3635</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin server to 0.11.7 <a href="https://github.com/PostHog/posthog/pull/3634">#3634</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Support all event properties in webhook message <a href="https://github.com/PostHog/posthog/pull/3629">#3629</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update plugin server to 0.11.6 <a href="https://github.com/PostHog/posthog/pull/3625">#3625</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.11.5 <a href="https://github.com/PostHog/posthog/pull/3624">#3624</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Dashboard hotkeys <a href="https://github.com/PostHog/posthog/pull/3623">#3623</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix 500 on enabling plugins <a href="https://github.com/PostHog/posthog/pull/3617">#3617</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Improve Plugins page UX <a href="https://github.com/PostHog/posthog/pull/3614">#3614</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Automatically enable debug mode for posthog-js on SELF_CAPTURE <a href="https://github.com/PostHog/posthog/pull/3613">#3613</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add action titles to CodeSnippet <a href="https://github.com/PostHog/posthog/pull/3612">#3612</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Dashboard Improvements I <a href="https://github.com/PostHog/posthog/pull/3608">#3608</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add updated_at to plugins/plugin configs <a href="https://github.com/PostHog/posthog/pull/3607">#3607</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Handle webhooks better <a href="https://github.com/PostHog/posthog/pull/3605">#3605</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Remove of needless space in properties table <a href="https://github.com/PostHog/posthog/pull/3603">#3603</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix funnels loading message <a href="https://github.com/PostHog/posthog/pull/3598">#3598</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add ph-no-capture to relevant sections pt. 2 <a href="https://github.com/PostHog/posthog/pull/3596">#3596</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update posthog-js to 1.9.1 <a href="https://github.com/PostHog/posthog/pull/3594">#3594</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Fix funnels with only events <a href="https://github.com/PostHog/posthog/pull/3593">#3593</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Filter disappearing bug + more <a href="https://github.com/PostHog/posthog/pull/3590">#3590</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Build and push dev image in docker-image-publish.yml <a href="https://github.com/PostHog/posthog/pull/3588">#3588</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add missing param to retention payload <a href="https://github.com/PostHog/posthog/pull/3585">#3585</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Clean up command palette style <a href="https://github.com/PostHog/posthog/pull/3583">#3583</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix session tests <a href="https://github.com/PostHog/posthog/pull/3580">#3580</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Event property calculation bugfix <a href="https://github.com/PostHog/posthog/pull/3579">#3579</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add <code>\&lt;wbr /\&gt;</code> to allow very long strings to split nicely <a href="https://github.com/PostHog/posthog/pull/3578">#3578</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Calculate properties hourly <a href="https://github.com/PostHog/posthog/pull/3577">#3577</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix edge condition in PR description check <a href="https://github.com/PostHog/posthog/pull/3575">#3575</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>bump version <a href="https://github.com/PostHog/posthog/pull/3571">#3571</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix long person properties UI <a href="https://github.com/PostHog/posthog/pull/3570">#3570</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.11.4 <a href="https://github.com/PostHog/posthog/pull/3569">#3569</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Remove ioredis debug <a href="https://github.com/PostHog/posthog/pull/3568">#3568</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update posthog-js to 1.9.0 and @posthog/plugin-server to 0.11.3 <a href="https://github.com/PostHog/posthog/pull/3565">#3565</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Add $device_type tooltip text <a href="https://github.com/PostHog/posthog/pull/3564">#3564</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update tracking for Retention &amp; Paths <a href="https://github.com/PostHog/posthog/pull/3563">#3563</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Remove unnecessary groupbys in session queries <a href="https://github.com/PostHog/posthog/pull/3562">#3562</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add JSON view for events <a href="https://github.com/PostHog/posthog/pull/3560">#3560</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix cloud tests on main repo <a href="https://github.com/PostHog/posthog/pull/3559">#3559</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update posthog-js to 1.8.10 <a href="https://github.com/PostHog/posthog/pull/3558">#3558</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Add calculate funnel event <a href="https://github.com/PostHog/posthog/pull/3556">#3556</a> (<a href="https://github.com/kpthatsme">kpthatsme</a>)</li><li>Update posthog-js to 1.8.9 <a href="https://github.com/PostHog/posthog/pull/3555">#3555</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Clean up copyToClipboard <a href="https://github.com/PostHog/posthog/pull/3553">#3553</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>docker-compose.ch(.test).yml files for plugin server <a href="https://github.com/PostHog/posthog/pull/3552">#3552</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Clean up PR bot workflow <a href="https://github.com/PostHog/posthog/pull/3546">#3546</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Bump pytz from 2019.3 to 2021.1 <a href="https://github.com/PostHog/posthog/pull/3545">#3545</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Bump celery-redbeat from 0.13.0 to 2.0.0 <a href="https://github.com/PostHog/posthog/pull/3544">#3544</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Bump psycopg2-binary from 2.8.4 to 2.8.6 <a href="https://github.com/PostHog/posthog/pull/3543">#3543</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Bump parso from 0.6.1 to 0.8.1 <a href="https://github.com/PostHog/posthog/pull/3542">#3542</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Soften shame message <a href="https://github.com/PostHog/posthog/pull/3541">#3541</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix bin/tests <a href="https://github.com/PostHog/posthog/pull/3540">#3540</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Bump fakeredis from 1.4.4 to 1.4.5 <a href="https://github.com/PostHog/posthog/pull/3539">#3539</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Bump whitenoise from 5.0.1 to 5.2.0 <a href="https://github.com/PostHog/posthog/pull/3538">#3538</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Bump django-deprecate-fields from 0.1.0 to 0.1.1 <a href="https://github.com/PostHog/posthog/pull/3536">#3536</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Bump asgiref from 3.2.7 to 3.3.1 <a href="https://github.com/PostHog/posthog/pull/3535">#3535</a> (<a href="https://github.com/apps/dependabot-preview">dependabot-preview[bot]</a>)</li><li>Closes #3520 fix custom date filter dashboards <a href="https://github.com/PostHog/posthog/pull/3533">#3533</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Post-release 1694-dashboards <a href="https://github.com/PostHog/posthog/pull/3513">#3513</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Plugins access control <a href="https://github.com/PostHog/posthog/pull/3486">#3486</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Release Persons V2 (persons-2353) <a href="https://github.com/PostHog/posthog/pull/3461">#3461</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Plugins secret config fields <a href="https://github.com/PostHog/posthog/pull/3341">#3341</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add organization settings <a href="https://github.com/PostHog/posthog/pull/3324">#3324</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add docker hub build &amp; push task to github actions <a href="https://github.com/PostHog/posthog/pull/3277">#3277</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.22.0]]></title><description><![CDATA[PostHog 1.22 is out with awesome new features, usability and performance improvements, and the usual bug squashing. Community MVP The community MVP…]]></description><link>https://posthog.com/blog/the-posthog-array-1-22-0</link><guid isPermaLink="false">84cd082c-e408-56ea-ba1a-ddb75c07ed9a</guid><pubDate>Wed, 03 Mar 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>PostHog 1.22 is out with awesome new features, usability and performance improvements, and the usual bug squashing.</p><h3 id="community-mvp">Community MVP</h3><p>The community MVP for PostHog 1.22.0 is <a href="https://github.com/oshura3">oshura3</a>, who did a <a href="https://github.com/PostHog/posthog.com/pull/1045">thorough review and edit of our website content</a> and continues to be active in design and marketing discussions.</p><p>Anyone can contribute to PostHog and open source, whether it&#x27;s code, copy, design or discussion. We&#x27;re delighted that our community are so passionate that they even <a href="https://github.com/PostHog/posthog.com/issues/1036#issuecomment-788732593">share PostHog with their family</a> ;)</p><p>Thank you oshura3, we look forward to collaborating with you more!</p><p><strong>In this release:</strong></p><ul><li><strong>New:</strong> Support for bar charts by value</li><li><strong>New:</strong> UTM tags now get automatically set as user properties</li><li><strong>New:</strong> Equality filters now allow the selection of multiple values</li><li><strong>New:</strong> Two more apps!</li><li><strong>New:</strong> API Key autofill on our Docs</li><li><strong>Improvement:</strong> All events can now set properties on a user</li><li><strong>Improvement:</strong> Better tooling for updating data in dashboards</li><li><strong>Improvement:</strong> A whole new UX for individual person pages</li></ul><br/><div class="flex items-center justify-center"><div to="https://app.posthog.com/signup">Try PostHog Cloud Now</div></div><br/><h2 id="important-announcement-for-self-hosted-users">Important Announcement for Self-Hosted Users</h2><p>If you&#x27;re self hosting PostHog, make sure you have your app server up and running by looking at the color of the middle circle on the top left of the PostHog UI.</p><p>If it is running, you&#x27;ll see a green checkmark, and hovering over it will give the message &quot;All systems operational&quot;, like so:</p><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/plugin-server.png" alt="Plugin server"/></p><p>From this release (1.22.0) onwards, if your app server is not running, this circle will turn amber. You can click on the server to verify if your app server is indeed the problem.</p><p><strong>Important:</strong> next release we will move all our event ingestion to the app server, meaning that you <strong>will not be able to ingest events</strong> if your app server isn&#x27;t running.</p><h2 id="posthog-1220-release-notes">PostHog 1.22.0 Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="bar-charts-by-graph-seriesvalue"><a href="https://github.com/PostHog/posthog/pull/3457">Bar Charts by Graph Series/Value</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/bar-value.png" alt="Bar chart by values"/></p><p>Before this release bar charts were time-based, which meant that if you had multiple graph series (values), they would all be stacked into one bar for each time period.</p><p>We now support two different types of bar charts! When selecting a chart type, you will see the options &#x27;Time&#x27; and &#x27;Value&#x27; under &#x27;Bar Chart&#x27;. Selecting &#x27;Value&#x27; will give you the view from the image above, where each graph series is represented in a separate bar, with the value consisting of the aggregate value for the time period specified.</p><h3 id="utm-tags-automatically-set-as-user-properties"><a href="https://github.com/PostHog/plugin-server/pull/214">UTM Tags Automatically Set as User Properties</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/utm-tags.png" alt="UTM Tags"/></p><p>PostHog now automatically sets user properties from <a href="https://en.wikipedia.org/wiki/UTM_parameters">UTM tags</a>. You can now filter and create cohorts of users much more easily based on what campaign, source, or medium brought them to your product or landing page. This is a big feature for us as it gives our users an automatic way of connecting marketing and product to have a more complete view of your business. We&#x27;re very excited for our community to start using this feature and extending it through <a href="/docs/plugins/overview">apps</a>.</p><h3 id="multiple-value-selector-for-equality-filters"><a href="https://github.com/PostHog/posthog/pull/3422">Multiple Value Selector for Equality Filters</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/multiple-selector.png" alt="Multiple equality selector"/></p><p>Writing complex filters is now easier than ever before. You can now select multiple values for Equality Filters instead of just one - this will simplify filter creation and debugging and just save people a lot of time!</p><h3 id="refreshing-dashboards-and-updating-time-range-for-all-panels"><a href="https://github.com/PostHog/posthog/pull/3363">Refreshing Dashboards and Updating Time Range for All Panels</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/dashboards-ux.png" alt="Dashboards New UX"/></p><p>It&#x27;s now easier to work through your key metrics in Dashboards:</p><ul><li>All dashboard panels can be refreshed at the same time to ensure you&#x27;re not seeing cached results</li><li>Time ranges for all dashboard panels can be changed at the same time</li><li>The dashboard author and creation time are displayed below the title</li></ul><h3 id="a-much-better-ui-for-person-pages"><a href="https://github.com/PostHog/posthog/pull/3461">A Much Better UI for Person Pages</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/persons-v2.png" alt="Persons New UX"/></p><p>The UI of our person pages just got a whole lot better! As is often the case with our larger features, this isn&#x27;t news to all of you. We had this behind a feature flag and have now decided to roll it out for everyone.</p><p>Now you can visualize user properties alongside a user&#x27;s events, and most of the context you need on a person is available to you in a sleek UI without you needing to scroll.</p><p>Oh, and the code got much better as a result too...</p><h3 id="exposing-set-and-set_once-on-all-events"><a href="https://github.com/PostHog/posthog/pull/3363">Exposing $set and $set_once on all events</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/%24set.png" alt="Set properties on any event"/></p><p>The event properties <code>$set</code> and <code>$set_once</code> can now be used on any event to set properties directly to the user associated with that event.</p><p>Previously, this would only work on <code>$identify</code> events, making it so that you needed to call multiple methods in order to send an event and set user properties based on the same data. But now, you can do it all in one, as shown in the image above.</p><h3 id="event-sequence-timer"><a href="https://posthog.com/plugins/event-sequence-timer-plugin">Event Sequence Timer</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/time-events.png" alt="Event Sequence Timer"/></p><p>Our users requested a way to measure the time passed between certain events, and this is it!</p><p>By installing the Event Sequence Timer, you can specify as many sets of events as you want and the app will track the time between them, either using a first touch or last touch mechanism.</p><p>It will then add a property to your events that allows you to easily build visualizations in PostHog of the average, minimum, and maximum time between events, as well as all the other mathematical operations we support.</p><h3 id="property-flattener"><a href="https://posthog.com/plugins/property-flattener">Property Flattener</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/flattener.png" alt="Property Flattener"/></p><p>The new Property Flattener allows you to convert event properties contained in a nested structure into a flat structure, allowing you to set filters based on the nested properties.</p><h3 id="project-token-autofill-in-docs-for-cloud-users"><a href="https://github.com/PostHog/posthog.com/pull/998">Project Token Autofill in Docs for Cloud Users</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/token-autofill.png" alt="Docs Token Autofill"/></p><p>If you&#x27;re a user of PostHog Cloud, we now autofill your Project Token and API Host automatically in the Docs for you, meaning you can copy-paste snippets and use them directly with no manual changes!</p><p>This key will be based on the last project you used in PostHog, and you can check what project that is by simply hovering your cursor over the highlighted key.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="favorite-issue-banter">Favorite <del>Issue</del> Banter</h2><p>On the rare occasions that our M² team (Michael &amp; Marius) is not found working hard (and oftentimes late) on our app server, they can be found taking the names of Pull Requests out of context:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/polish-1.png" alt="Polish 1"/>
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/polish-2.png" alt="Polish 2"/></p><h2 id="posthog-news">PostHog News</h2><p>Kunal has joined us as our first Growth Engineer, and he&#x27;s already been making a solid impact. Kunal is a startup vet, who started out as a developer and now works on growth, being passionate about building the right product experience to drive the most value.</p><p>He sent shockwaves across the company by claiming that pineapple belongs on pizza... sometimes? Never before has the entire company disagreed with someone&#x27;s stance on this sensitive topic.</p><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/ungps">ungps</a></li><li><a href="https://github.com/Skchoudhary">Skchoudhary</a></li><li><a href="https://github.com/oshura3">oshura3</a></li><li><a href="https://github.com/Abo7atm">Abo7atm</a></li><li><a href="https://github.com/andrewm4894">andrewm4894</a></li></ul><h2 id="open-roles">Open Roles</h2><p>Are you a Fullstack Engineer, Senior Engineer, Site Reliability Engineer, Sales Engineer, Product Marketer, or Content Writer?</p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog?</p><p><a href="https://posthog.com/careers">We want you!</a></p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Closes #3520 fix custom date filter dashboards <a href="https://github.com/PostHog/posthog/pull/3533">#3533</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Closes #3524 filters do not reset <a href="https://github.com/PostHog/posthog/pull/3532">#3532</a> (<a href="https://github.com/ungps">ungps</a>)</li><li>Random fixes Mar 1 <a href="https://github.com/PostHog/posthog/pull/3530">#3530</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>fix plugin invalid config error <a href="https://github.com/PostHog/posthog/pull/3529">#3529</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add explanation for clipboard not working on remote HTTP <a href="https://github.com/PostHog/posthog/pull/3528">#3528</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Parse retention timestamps to local time <a href="https://github.com/PostHog/posthog/pull/3522">#3522</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Disable unnecessary chart filters on retention <a href="https://github.com/PostHog/posthog/pull/3521">#3521</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix minor UI issue with funnel loading <a href="https://github.com/PostHog/posthog/pull/3519">#3519</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix cannot read property 0 of undefined <a href="https://github.com/PostHog/posthog/pull/3518">#3518</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add no-PR-description-shaming workflow <a href="https://github.com/PostHog/posthog/pull/3517">#3517</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Instrument person properties management <a href="https://github.com/PostHog/posthog/pull/3511">#3511</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Make PLUGIN_SERVER_INGESTION True by default <a href="https://github.com/PostHog/posthog/pull/3485">#3485</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add ability to add person props on the UI <a href="https://github.com/PostHog/posthog/pull/3394">#3394</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Use plugin-server container in containerized deploys <a href="https://github.com/PostHog/posthog/pull/3515">#3515</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix debug toolbar sql panel <a href="https://github.com/PostHog/posthog/pull/3507">#3507</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Don&#x27;t recalculate deleted cohorts <a href="https://github.com/PostHog/posthog/pull/3506">#3506</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix limit of events in CSV export <a href="https://github.com/PostHog/posthog/pull/3503">#3503</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.11.1 <a href="https://github.com/PostHog/posthog/pull/3502">#3502</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Fix getting earliest timestamp on EE with no events <a href="https://github.com/PostHog/posthog/pull/3501">#3501</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix filtering sessions by action with property filters <a href="https://github.com/PostHog/posthog/pull/3500">#3500</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update plugin server to 0.10.3 <a href="https://github.com/PostHog/posthog/pull/3498">#3498</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Run all connections through clickhouse connection pooler <a href="https://github.com/PostHog/posthog/pull/3495">#3495</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Reduce calls to api/action <a href="https://github.com/PostHog/posthog/pull/3493">#3493</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>e2e-test-runner: Only start webpack if not already running <a href="https://github.com/PostHog/posthog/pull/3484">#3484</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix: funnels &amp; retention person links, funnel calculations <a href="https://github.com/PostHog/posthog/pull/3483">#3483</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update plugin server to 0.10.1 <a href="https://github.com/PostHog/posthog/pull/3481">#3481</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Fix &quot;unseen sessions&quot; filter <a href="https://github.com/PostHog/posthog/pull/3478">#3478</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Reload our feature flags after changing them <a href="https://github.com/PostHog/posthog/pull/3477">#3477</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add test for bar charts <a href="https://github.com/PostHog/posthog/pull/3474">#3474</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix &quot;password&quot; on invite page <a href="https://github.com/PostHog/posthog/pull/3473">#3473</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Create a connection every time a query is run <a href="https://github.com/PostHog/posthog/pull/3467">#3467</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix invite being inaccessible for users without org or project <a href="https://github.com/PostHog/posthog/pull/3466">#3466</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Alert if plugin server down <a href="https://github.com/PostHog/posthog/pull/3465">#3465</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Earlier IP anonymization <a href="https://github.com/PostHog/posthog/pull/3464">#3464</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix webhooks specifity <a href="https://github.com/PostHog/posthog/pull/3463">#3463</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Don&#x27;t null IPs for teams who toggled an ancient field <a href="https://github.com/PostHog/posthog/pull/3462">#3462</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Rename posthog-production to posthog-cloud <a href="https://github.com/PostHog/posthog/pull/3460">#3460</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.9.29 <a href="https://github.com/PostHog/posthog/pull/3459">#3459</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Bar chart by value <a href="https://github.com/PostHog/posthog/pull/3457">#3457</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update plugin server to 0.9.28 <a href="https://github.com/PostHog/posthog/pull/3456">#3456</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Send all events to plugin server <a href="https://github.com/PostHog/posthog/pull/3452">#3452</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix setting up test databases on clickhouse <a href="https://github.com/PostHog/posthog/pull/3451">#3451</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update plugin server to 0.9.26 <a href="https://github.com/PostHog/posthog/pull/3450">#3450</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.9.25 <a href="https://github.com/PostHog/posthog/pull/3447">#3447</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>change frequency of cohort calculation <a href="https://github.com/PostHog/posthog/pull/3446">#3446</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update plugin server to 0.9.24 <a href="https://github.com/PostHog/posthog/pull/3445">#3445</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Add telemetry for the hooks task <a href="https://github.com/PostHog/posthog/pull/3442">#3442</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add : in front of password for ioredis <a href="https://github.com/PostHog/posthog/pull/3439">#3439</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Send 20% of events to plugin server <a href="https://github.com/PostHog/posthog/pull/3437">#3437</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin server to 0.9.23 <a href="https://github.com/PostHog/posthog/pull/3436">#3436</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Update plugin server to 0.9.22 <a href="https://github.com/PostHog/posthog/pull/3435">#3435</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>935 trend legend <a href="https://github.com/PostHog/posthog/pull/3434">#3434</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix authenticated invite signup <a href="https://github.com/PostHog/posthog/pull/3433">#3433</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.9.21 <a href="https://github.com/PostHog/posthog/pull/3430">#3430</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Fix find_key_with_source (2231571657) <a href="https://github.com/PostHog/posthog/pull/3429">#3429</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix clicking datapoint with multiple entities <a href="https://github.com/PostHog/posthog/pull/3428">#3428</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Support POSTHOG_REDIS_* vars in bin/plugin-server <a href="https://github.com/PostHog/posthog/pull/3426">#3426</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Separate stricter team model migration into two <a href="https://github.com/PostHog/posthog/pull/3424">#3424</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Rename DAU -&gt; Active Users <a href="https://github.com/PostHog/posthog/pull/3420">#3420</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update plugin server to 0.9.20 <a href="https://github.com/PostHog/posthog/pull/3419">#3419</a> (<a href="https://github.com/posthog-bot">posthog-bot</a>)</li><li>Run tests via pytest <a href="https://github.com/PostHog/posthog/pull/3417">#3417</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix &quot;Finish setup&quot; button in billing <a href="https://github.com/PostHog/posthog/pull/3416">#3416</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Finish the purge on curly-less if statements <a href="https://github.com/PostHog/posthog/pull/3414">#3414</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Improve reordering funnel steps <a href="https://github.com/PostHog/posthog/pull/3412">#3412</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Improve django admin for organizations <a href="https://github.com/PostHog/posthog/pull/3405">#3405</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix tooltips over property type icons <a href="https://github.com/PostHog/posthog/pull/3404">#3404</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Plugin server 0.9.14 <a href="https://github.com/PostHog/posthog/pull/3403">#3403</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Plugin server 0.9.12 <a href="https://github.com/PostHog/posthog/pull/3401">#3401</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin server to 0.9.11 <a href="https://github.com/PostHog/posthog/pull/3400">#3400</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.9.7 <a href="https://github.com/PostHog/posthog/pull/3398">#3398</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>10% to plugin server <a href="https://github.com/PostHog/posthog/pull/3397">#3397</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin server to 0.9.6 <a href="https://github.com/PostHog/posthog/pull/3396">#3396</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Plugin server 0.9.5 <a href="https://github.com/PostHog/posthog/pull/3395">#3395</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin server to 0.9.4 <a href="https://github.com/PostHog/posthog/pull/3393">#3393</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Order distinct ids by anonymous <a href="https://github.com/PostHog/posthog/pull/3392">#3392</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix loading billing plans on self-hosted <a href="https://github.com/PostHog/posthog/pull/3389">#3389</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update plugin server to 0.9.3 <a href="https://github.com/PostHog/posthog/pull/3388">#3388</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Change 10% to 1% ingestion via the plugin server <a href="https://github.com/PostHog/posthog/pull/3385">#3385</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Str the UUID <a href="https://github.com/PostHog/posthog/pull/3383">#3383</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Ingest 10% of events via plugin server <a href="https://github.com/PostHog/posthog/pull/3382">#3382</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Plugin server ingestion again <a href="https://github.com/PostHog/posthog/pull/3381">#3381</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add plugin server version to System Status <a href="https://github.com/PostHog/posthog/pull/3380">#3380</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Reuse Postgres connections in Celery <a href="https://github.com/PostHog/posthog/pull/3379">#3379</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Auto log in for e2e tests and review apps <a href="https://github.com/PostHog/posthog/pull/3377">#3377</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Plugin server 0.9.1 <a href="https://github.com/PostHog/posthog/pull/3376">#3376</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix breaking down by &quot;all&quot; cohorts when no other cohorts <a href="https://github.com/PostHog/posthog/pull/3374">#3374</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add some missing team_id filters <a href="https://github.com/PostHog/posthog/pull/3372">#3372</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Bump version <a href="https://github.com/PostHog/posthog/pull/3371">#3371</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix path for demo data generation <a href="https://github.com/PostHog/posthog/pull/3369">#3369</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Prefilter post_event_to_webhook_ee more <a href="https://github.com/PostHog/posthog/pull/3368">#3368</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add created by tag to individual dashboards <a href="https://github.com/PostHog/posthog/pull/3367">#3367</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix hidden plugin config field <a href="https://github.com/PostHog/posthog/pull/3364">#3364</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Dashboards: allow changing date filters &amp; refresh <a href="https://github.com/PostHog/posthog/pull/3363">#3363</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Bump rrweb 0.9.14 <a href="https://github.com/PostHog/posthog/pull/3361">#3361</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Support client-side compact number formatting &amp; instrumentation <a href="https://github.com/PostHog/posthog/pull/3360">#3360</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>retention dashboard item refresh bug <a href="https://github.com/PostHog/posthog/pull/3359">#3359</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>3293 retention hourly bug <a href="https://github.com/PostHog/posthog/pull/3358">#3358</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix filtering on elements clickhouse <a href="https://github.com/PostHog/posthog/pull/3354">#3354</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Clean-up post-migration of invite signup <a href="https://github.com/PostHog/posthog/pull/3353">#3353</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix unselecting fields in action <a href="https://github.com/PostHog/posthog/pull/3352">#3352</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix /demo feature flags loading issue <a href="https://github.com/PostHog/posthog/pull/3350">#3350</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update launch toolbar CTA for new nav <a href="https://github.com/PostHog/posthog/pull/3347">#3347</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Bulk invite the Polish <a href="https://github.com/PostHog/posthog/pull/3346">#3346</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add Invite Team Member to top bar user dropdown <a href="https://github.com/PostHog/posthog/pull/3343">#3343</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix/replace setTimeout in logics <a href="https://github.com/PostHog/posthog/pull/3337">#3337</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix formula query parsing <a href="https://github.com/PostHog/posthog/pull/3336">#3336</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Migrate team invite signup to React - Part II (Front-end) <a href="https://github.com/PostHog/posthog/pull/3300">#3300</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Remove statsd logspam <a href="https://github.com/PostHog/posthog/pull/3299">#3299</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Trend component test <a href="https://github.com/PostHog/posthog/pull/3278">#3278</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Stricter Team model <a href="https://github.com/PostHog/posthog/pull/3252">#3252</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Change graphs to ts <a href="https://github.com/PostHog/posthog/pull/3181">#3181</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Static cohort on person modal <a href="https://github.com/PostHog/posthog/pull/2952">#2952</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.21.0]]></title><description><![CDATA[Release 1.21 is a big one, on top of exciting new features and improvements, we put extra time into the overall stability of PostHog squashing dozens…]]></description><link>https://posthog.com/blog/the-posthog-array-1-21-0</link><guid isPermaLink="false">c92bf1a6-c132-5c33-af22-b415b4f93573</guid><pubDate>Wed, 17 Feb 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Release 1.21 is a big one, on top of exciting new features and improvements, we put extra time into the overall stability of PostHog squashing dozens of issues. Some highlights of this release:</p><ul><li>New: Our new navigation is out of beta and available to all</li><li>New: assign Feature Flags to multiple groups of users</li><li>New: Apps UI and new Taxonomy app</li><li>Improvement: to Insight query caching</li><li>Improvement: to Session Recording filters</li></ul><p>We received a lot of great feedback and issue reports and over this release cycle we fixed hundreds of issues, polishing our UI, squashing bugs, and significantly improving our performance.</p><p>Make sure to upgrade to get the new features, improvements and fixes.</p><br/><div class="flex items-center justify-center"><div to="/docs/deployment">Install PostHog</div></div><br/><h2 id="release-notes">Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience and new features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="new-navigation-for-all"><a href="https://github.com/PostHog/posthog/pull/3167">New Navigation For All</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/new-navigation.png" alt="New Nav"/></p><p>While this might not be news to all of you, we have now released our new navigation to everyone.</p><p>We had this behind a feature flag, but now all our users have access to our fresh &quot;spaceship-like&quot; navigation. What do you think? 🚀</p><h3 id="refreshing-insights"><a href="https://github.com/PostHog/posthog/pull/3144">Refreshing Insights</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/refreshing-insights.png" alt="Refreshing Insights"/></p><p>To provide a smooth user experience, we cache query results so that you don&#x27;t have to wait for a query to run every time you view a chart.</p><p>This has the side effect that sometimes you&#x27;ll be looking at slightly outdated results. We made improvements to clearly indicate when you&#x27;re looking at a cached result, when it was computed, and allow you to refresh.</p><h3 id="session-recording-filters"><a href="https://github.com/PostHog/posthog/pull/2993">Session Recording Filters</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/session-filters.png" alt="Session filters"/></p><p>Our session recording filters just got <strong>so much more powerful</strong>. Filter by session duration, user properties, unseen recordings, actions performed in a session, and so much more.</p><p>You can now get a lot more out of your session recording sessions by tailoring the recordings to specific areas of your product you&#x27;re looking into.</p><h3 id="multiple-groups-in-feature-flags"><a href="https://github.com/PostHog/posthog/pull/3030">Multiple Groups in Feature Flags</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/feature-flag-groups.png" alt="Feature Flag Multiple Groups"/></p><p>Feature flags can now be rolled out to multiple different groups that use distinct settings, unlocking a whole new world of opportunities for your A/B testing and feature rollout processes.</p><p>For example, you can now roll out feature flags like this:</p><ul><li>100% of users in the &#x27;Beta Testers&#x27; cohort</li><li>40% of all your users</li><li>All users in a specific team that requested the feature from you</li></ul><p>The filters and rollout percentages can be adjusted per group, giving you greater control degree of how you build and test your products.</p><h3 id="a-new-plugins-ui-with-brand-new-features"><a href="https://github.com/PostHog/posthog/pull/2774">A New Plugins UI with Brand New Features</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/plugins-ui.png" alt="Apps UI"/></p><p>A lot has happened to our apps feature since the last release, including:</p><ul><li>An improved UI</li><li>The ability to reorder apps</li><li>The ability to upgrade apps (and see exactly what changed between versions)</li><li>Autofill on commonly used app configuration fields</li><li>A new app configuration field type, letting app builders specify pre-determined choices for the user to select from</li><li>A ton of performance improvements</li></ul><h3 id="taxonomy-standardizer"><a href="https://posthog.com/plugins/taxonomy-standardizer">Taxonomy Standardizer</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/taxonomy-plugin.png" alt="Taxonomy Standardizer"/></p><p>Standardize your event names into a single naming pattern by converting the names of your events that don&#x27;t match your desired pattern into the chosen format, such as <code>camelCase</code> or <code>snake_case</code>.</p><h3 id="bitbucket-release-tracker-beta"><a href="https://posthog.com/plugins/bitbucket-release-tracker">Bitbucket Release Tracker (Beta)</a></h3><p><img src="https://github.com/PostHog/bitbucket-release-tracker/raw/main/readme-assets/release-tracker.png" alt="Bitbucket App"/></p><p>Get your Bitbucket release tags into PostHog as annotations on your graphs, so you can track the impact of releases on your metrics.</p><h3 id="user-interviews"><a href="https://calendly.com/posthog-feedback">User Interviews</a></h3><p>We’re working hard to improve PostHog and would love to talk to you about your experience with the product.</p><p>If you&#x27;re interested in helping us out, you can schedule a quick 30-min call with us <a href="https://calendly.com/posthog-feedback">on Calendly</a>.</p><p>Oh, and we&#x27;re giving away some awesome <a href="https://merch.posthog.com">PostHog merch</a> as a thank you!</p><h2 id="favorite-issue">Favorite Issue</h2><h3 id="darkmode-design--ux"><a href="https://github.com/PostHog/posthog.com/issues/993">Darkmode Design + UX</a></h3><p>We&#x27;re redesigning Dark Mode for our Docs - <em>can ya dig it?</em></p><h2 id="posthog-news">PostHog News</h2><p>Sean has joined us to lead our marketing efforts and we&#x27;re super excited.</p><p>He is a developer with an impressive background in open source software and game development and believes (correctly) that pineapple and pizza must not commingle.</p><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/FUSAKLA">FUSAKLA</a></li><li><a href="https://github.com/cpankajr">cpankajr</a></li><li><a href="https://github.com/zegl">zegl</a></li><li><a href="https://github.com/reicolina">reicolina</a></li><li><a href="https://github.com/evoxmusic">evoxmusic</a></li><li><a href="https://github.com/anandvc">anandvc</a></li><li><a href="https://github.com/leggetter">leggetter</a></li><li><a href="https://github.com/tmilicic">tmilicic</a></li></ul><h2 id="community-mvp">Community MVP</h2><p>A special shoutout goes to <a href="https://github.com/cpankajr">cpankajr</a>, our Community MVP for this release cycle, for <a href="https://github.com/PostHog/posthog/pull/2997">helping us say goodbye to the <code>pandas</code> and <code>numpy</code> bloat</a> in our images.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="open-roles">Open Roles</h2><p>Are you a Fullstack Engineer, Senior Engineer, Site Reliability Engineer, Customer Success Lead, or Content Writer?</p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog?</p><p><a href="https://posthog.com/careers">We want you!</a></p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Prefilter post_event_to_webhook_ee more <a href="https://github.com/PostHog/posthog/pull/3368">#3368</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix hidden plugin config field <a href="https://github.com/PostHog/posthog/pull/3364">#3364</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Bump rrweb 0.9.14 <a href="https://github.com/PostHog/posthog/pull/3361">#3361</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>retention dashboard item refresh bug <a href="https://github.com/PostHog/posthog/pull/3359">#3359</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>3293 retention hourly bug <a href="https://github.com/PostHog/posthog/pull/3358">#3358</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix filtering on elements clickhouse <a href="https://github.com/PostHog/posthog/pull/3354">#3354</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix /demo feature flags loading issue <a href="https://github.com/PostHog/posthog/pull/3350">#3350</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update launch toolbar CTA for new nav <a href="https://github.com/PostHog/posthog/pull/3347">#3347</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add Invite Team Member to top bar user dropdown <a href="https://github.com/PostHog/posthog/pull/3343">#3343</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix/replace setTimeout in logics <a href="https://github.com/PostHog/posthog/pull/3337">#3337</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix formula query parsing <a href="https://github.com/PostHog/posthog/pull/3336">#3336</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix funnel people not showing <a href="https://github.com/PostHog/posthog/pull/3335">#3335</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>add try catch to persons in retention <a href="https://github.com/PostHog/posthog/pull/3332">#3332</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix first time retention people query <a href="https://github.com/PostHog/posthog/pull/3331">#3331</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Bump plugin server to 0.8.3 <a href="https://github.com/PostHog/posthog/pull/3329">#3329</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Plugin server 0.8.2 <a href="https://github.com/PostHog/posthog/pull/3327">#3327</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>fix more formula errors <a href="https://github.com/PostHog/posthog/pull/3326">#3326</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Bump plugin server to 0.8.1 <a href="https://github.com/PostHog/posthog/pull/3325">#3325</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix infinites in formula <a href="https://github.com/PostHog/posthog/pull/3323">#3323</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix breaking down by property with no value(s) <a href="https://github.com/PostHog/posthog/pull/3322">#3322</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add try except back to trend class <a href="https://github.com/PostHog/posthog/pull/3320">#3320</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix nans in counts formula <a href="https://github.com/PostHog/posthog/pull/3319">#3319</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add smarter settings getenv helper function for safety <a href="https://github.com/PostHog/posthog/pull/3317">#3317</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Enable plugin server parallel ingestion <a href="https://github.com/PostHog/posthog/pull/3316">#3316</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Return 404 instead of 500 when person to be deleted is not found <a href="https://github.com/PostHog/posthog/pull/3314">#3314</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Move breakpoints around <a href="https://github.com/PostHog/posthog/pull/3313">#3313</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Set Cloud PLUGIN_SERVER_INGESTION to false <a href="https://github.com/PostHog/posthog/pull/3312">#3312</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update posthog-js to 1.8.7 <a href="https://github.com/PostHog/posthog/pull/3310">#3310</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix invalid funnel insights <code>display</code> filter <a href="https://github.com/PostHog/posthog/pull/3309">#3309</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Plugin server to 0.8.0 <a href="https://github.com/PostHog/posthog/pull/3307">#3307</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Bump webhook_url limit to 500 chars <a href="https://github.com/PostHog/posthog/pull/3306">#3306</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Ingest all teams via the plugin server <a href="https://github.com/PostHog/posthog/pull/3305">#3305</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Allow viewing sessions/recordings on persons page <a href="https://github.com/PostHog/posthog/pull/3302">#3302</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Remove statsd logspam <a href="https://github.com/PostHog/posthog/pull/3299">#3299</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Don&#x27;t set is calculating for static cohorts <a href="https://github.com/PostHog/posthog/pull/3297">#3297</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Rework sessions list query to account for pagination <a href="https://github.com/PostHog/posthog/pull/3296">#3296</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix instance status page <a href="https://github.com/PostHog/posthog/pull/3292">#3292</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix retention linear chart in dashboards <a href="https://github.com/PostHog/posthog/pull/3290">#3290</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix ints saved as strings clickhouse <a href="https://github.com/PostHog/posthog/pull/3289">#3289</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Misc plugin improvements <a href="https://github.com/PostHog/posthog/pull/3288">#3288</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix filtering by user property in CH sessions list <a href="https://github.com/PostHog/posthog/pull/3285">#3285</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Plugin server info on system status page <a href="https://github.com/PostHog/posthog/pull/3284">#3284</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Bump cryptography from 3.2 to 3.3.2 <a href="https://github.com/PostHog/posthog/pull/3281">#3281</a> (<a href="https://github.com/apps/dependabot">dependabot[bot]</a>)</li><li>Remove CH Pool as dependency <a href="https://github.com/PostHog/posthog/pull/3279">#3279</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Trend component test <a href="https://github.com/PostHog/posthog/pull/3278">#3278</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix non-anonymous ids <a href="https://github.com/PostHog/posthog/pull/3276">#3276</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Formulas <a href="https://github.com/PostHog/posthog/pull/3275">#3275</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Use elements_chain in EE webhook <a href="https://github.com/PostHog/posthog/pull/3273">#3273</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix non-anonymous distinct id first <a href="https://github.com/PostHog/posthog/pull/3272">#3272</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>REST/webhook optimizations <a href="https://github.com/PostHog/posthog/pull/3267">#3267</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Persons component test <a href="https://github.com/PostHog/posthog/pull/3266">#3266</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update clickhouse-driver <a href="https://github.com/PostHog/posthog/pull/3265">#3265</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix mutating process_event_ee bug <a href="https://github.com/PostHog/posthog/pull/3263">#3263</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Serialize/deserialize elements_chain on webhooks_ee <a href="https://github.com/PostHog/posthog/pull/3262">#3262</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Don&#x27;t show &quot;save&quot; if user has not yet entered all cohort group data. <a href="https://github.com/PostHog/posthog/pull/3261">#3261</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Cloud billing trial period &amp; free plan <a href="https://github.com/PostHog/posthog/pull/3259">#3259</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix update indicator on top navigation <a href="https://github.com/PostHog/posthog/pull/3258">#3258</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Show toast if signup fails <a href="https://github.com/PostHog/posthog/pull/3257">#3257</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Updated Go installation instructions <a href="https://github.com/PostHog/posthog/pull/3256">#3256</a> (<a href="https://github.com/zegl">zegl</a>)</li><li>Improve entity rows layout <a href="https://github.com/PostHog/posthog/pull/3255">#3255</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Capture EE webhook task sending error <a href="https://github.com/PostHog/posthog/pull/3254">#3254</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Always show non-anonymous distinct id first <a href="https://github.com/PostHog/posthog/pull/3251">#3251</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Plugin server 0.7.5 <a href="https://github.com/PostHog/posthog/pull/3250">#3250</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Return no data for invalid regexes <a href="https://github.com/PostHog/posthog/pull/3248">#3248</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Make page not jumpy on initial load <a href="https://github.com/PostHog/posthog/pull/3246">#3246</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add capture exception cohorts <a href="https://github.com/PostHog/posthog/pull/3245">#3245</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Separate Jest from frontend code quality job <a href="https://github.com/PostHog/posthog/pull/3241">#3241</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Enhance Project settings <a href="https://github.com/PostHog/posthog/pull/3240">#3240</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Ellipsis for long action names <a href="https://github.com/PostHog/posthog/pull/3239">#3239</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Instrumentation Feb-8 <a href="https://github.com/PostHog/posthog/pull/3238">#3238</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix <code>Cannot read property &#x27;sessionsPlayLogic&#x27; of undefined</code> <a href="https://github.com/PostHog/posthog/pull/3235">#3235</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Improve project deletion <a href="https://github.com/PostHog/posthog/pull/3234">#3234</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>React component tests with cypress <a href="https://github.com/PostHog/posthog/pull/3233">#3233</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Improve invites <a href="https://github.com/PostHog/posthog/pull/3232">#3232</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Clean up query timeout notice <a href="https://github.com/PostHog/posthog/pull/3231">#3231</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add selection option to plugin config <a href="https://github.com/PostHog/posthog/pull/3229">#3229</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Upgrade plugin server to 0.7.4 <a href="https://github.com/PostHog/posthog/pull/3226">#3226</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Upgrade plugin server to 0.7.3 <a href="https://github.com/PostHog/posthog/pull/3225">#3225</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>add type and null check before reporting <a href="https://github.com/PostHog/posthog/pull/3224">#3224</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Make action null safe <a href="https://github.com/PostHog/posthog/pull/3223">#3223</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Don&#x27;t blow up if funnel has no steps <a href="https://github.com/PostHog/posthog/pull/3222">#3222</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Try catch property <a href="https://github.com/PostHog/posthog/pull/3221">#3221</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Remove any loaders errors <a href="https://github.com/PostHog/posthog/pull/3220">#3220</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update posthog-js 1.8.6 <a href="https://github.com/PostHog/posthog/pull/3219">#3219</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add breakpoint() calls to cohortLogic <a href="https://github.com/PostHog/posthog/pull/3217">#3217</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add missing <code>await</code>s to breakpoint(X) calls <a href="https://github.com/PostHog/posthog/pull/3216">#3216</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Avoid erroring when loading dashboards with no active project <a href="https://github.com/PostHog/posthog/pull/3214">#3214</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Return 1 week of data when choosing &#x27;all time&#x27; with no event data <a href="https://github.com/PostHog/posthog/pull/3212">#3212</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix SelectBox keyboard navigation <a href="https://github.com/PostHog/posthog/pull/3211">#3211</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix more z-index wonkiness <a href="https://github.com/PostHog/posthog/pull/3210">#3210</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Emit timing gauge to statsd for sync_execute on clickhouse <a href="https://github.com/PostHog/posthog/pull/3209">#3209</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>str(team.organization_id) in PLUGINS_CLOUD_WHITELISTED_ORG_IDS check <a href="https://github.com/PostHog/posthog/pull/3208">#3208</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Handle navigation race in insights logic <a href="https://github.com/PostHog/posthog/pull/3207">#3207</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Flip PLUGIN_SERVER_INGESTION on <a href="https://github.com/PostHog/posthog/pull/3206">#3206</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Bump plugin server to 0.7.2 <a href="https://github.com/PostHog/posthog/pull/3205">#3205</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update plugin server to 0.7.1 <a href="https://github.com/PostHog/posthog/pull/3204">#3204</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Alltime compare sentry error <a href="https://github.com/PostHog/posthog/pull/3203">#3203</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix numerical person properties turning to strings on save <a href="https://github.com/PostHog/posthog/pull/3202">#3202</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add clickhouse connection envs for plugin server <a href="https://github.com/PostHog/posthog/pull/3201">#3201</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Grab all events and properties even if job hasn&#x27;t run yet <a href="https://github.com/PostHog/posthog/pull/3200">#3200</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update @sentry/browser <a href="https://github.com/PostHog/posthog/pull/3199">#3199</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix mobile menu z-index <a href="https://github.com/PostHog/posthog/pull/3198">#3198</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Return a 400 when /decide called with invalid token <a href="https://github.com/PostHog/posthog/pull/3197">#3197</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix stickiness comparison <a href="https://github.com/PostHog/posthog/pull/3195">#3195</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix LinkButton component <a href="https://github.com/PostHog/posthog/pull/3194">#3194</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Billing page improvements <a href="https://github.com/PostHog/posthog/pull/3192">#3192</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Avoid <code>TypeError</code> when assets have been regenerated loading a scene <a href="https://github.com/PostHog/posthog/pull/3188">#3188</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix bug introduced by typing trendsLogic <a href="https://github.com/PostHog/posthog/pull/3186">#3186</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Remove broken copy-pasted code <a href="https://github.com/PostHog/posthog/pull/3184">#3184</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix recursion problems caused by sessionsTableLogic <a href="https://github.com/PostHog/posthog/pull/3183">#3183</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Remove proj settings tests <a href="https://github.com/PostHog/posthog/pull/3179">#3179</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Handle empty content-type from IE11 in capture endpoint <a href="https://github.com/PostHog/posthog/pull/3178">#3178</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix axis labels color on bar charts <a href="https://github.com/PostHog/posthog/pull/3176">#3176</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Release onboarding #2822 &amp; final tweaks <a href="https://github.com/PostHog/posthog/pull/3174">#3174</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Extra test features for posthog-js E2E test <a href="https://github.com/PostHog/posthog/pull/3173">#3173</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Make migration for person_email index only if not exists <a href="https://github.com/PostHog/posthog/pull/3172">#3172</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Wrap saved funnel name smarterly <a href="https://github.com/PostHog/posthog/pull/3171">#3171</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Type path logic <a href="https://github.com/PostHog/posthog/pull/3170">#3170</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Handle corrupted cache <a href="https://github.com/PostHog/posthog/pull/3169">#3169</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix broken url in paths <a href="https://github.com/PostHog/posthog/pull/3168">#3168</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Simplify cohort queries <a href="https://github.com/PostHog/posthog/pull/3165">#3165</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix key error in capture <a href="https://github.com/PostHog/posthog/pull/3164">#3164</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Do not open people modal on retention panel in dashboard <a href="https://github.com/PostHog/posthog/pull/3162">#3162</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Clean up EE settings.py and fix Google auth whitelisted domains <a href="https://github.com/PostHog/posthog/pull/3159">#3159</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update contributor avatars <a href="https://github.com/PostHog/posthog/pull/3158">#3158</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Make pies listen to color changes and update <a href="https://github.com/PostHog/posthog/pull/3157">#3157</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Autofocus on email instead of first name on signup <a href="https://github.com/PostHog/posthog/pull/3155">#3155</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Improve Saved Funnels UX <a href="https://github.com/PostHog/posthog/pull/3153">#3153</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Type trend logic <a href="https://github.com/PostHog/posthog/pull/3152">#3152</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update plugin server to 0.6.11 <a href="https://github.com/PostHog/posthog/pull/3151">#3151</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix FOSS copyright formatting <a href="https://github.com/PostHog/posthog/pull/3146">#3146</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update copyright years and use MIT license in posthog-foss <a href="https://github.com/PostHog/posthog/pull/3145">#3145</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Bulk invite team members (setup section II) <a href="https://github.com/PostHog/posthog/pull/3143">#3143</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Chart above fold <a href="https://github.com/PostHog/posthog/pull/3142">#3142</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Improve handling of .git* files/dirs <a href="https://github.com/PostHog/posthog/pull/3141">#3141</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix Person page loading by email under persons-2353 <a href="https://github.com/PostHog/posthog/pull/3139">#3139</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Remove clickhouse pooler from sync execute path <a href="https://github.com/PostHog/posthog/pull/3138">#3138</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Setup Section II &amp; General State <a href="https://github.com/PostHog/posthog/pull/3129">#3129</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>add null check to eventusage logic <a href="https://github.com/PostHog/posthog/pull/3125">#3125</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix condition for disabled compare filter when all time is selected <a href="https://github.com/PostHog/posthog/pull/3123">#3123</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Revamp and optimize hooks on EE <a href="https://github.com/PostHog/posthog/pull/3119">#3119</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add person email index <a href="https://github.com/PostHog/posthog/pull/3116">#3116</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>2794 retention people <a href="https://github.com/PostHog/posthog/pull/3108">#3108</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Enable PLUGIN_SERVER_INGESTION <a href="https://github.com/PostHog/posthog/pull/3107">#3107</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>1269 funnel trends 2 <a href="https://github.com/PostHog/posthog/pull/3079">#3079</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Remove Stats from Toolbar <a href="https://github.com/PostHog/posthog/pull/3040">#3040</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Added new functionality to readme <a href="https://github.com/PostHog/posthog/pull/2963">#2963</a> (<a href="https://github.com/jamesefhawkins">jamesefhawkins</a>)</li><li>Migrate team invite signup to React - Part I (Backend) <a href="https://github.com/PostHog/posthog/pull/2734">#2734</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Make social login work with new Onboarding logic <a href="https://github.com/PostHog/posthog/pull/3131">#3131</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Onboarding: Populate a sample session recording <a href="https://github.com/PostHog/posthog/pull/3128">#3128</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Onboarding: Save personalization data <a href="https://github.com/PostHog/posthog/pull/3126">#3126</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Make PluginConfig.order mandatory <a href="https://github.com/PostHog/posthog/pull/3122">#3122</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Apply type and optional checks to billing var <a href="https://github.com/PostHog/posthog/pull/3121">#3121</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update demo data warning styles <a href="https://github.com/PostHog/posthog/pull/3120">#3120</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Onboarding personalisation adjustments (retention#9) <a href="https://github.com/PostHog/posthog/pull/3117">#3117</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Remove emails from csv <a href="https://github.com/PostHog/posthog/pull/3115">#3115</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add team filter to cohort query to speed up <a href="https://github.com/PostHog/posthog/pull/3112">#3112</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Improve demo data <a href="https://github.com/PostHog/posthog/pull/3111">#3111</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix unbound plugin update response <a href="https://github.com/PostHog/posthog/pull/3106">#3106</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add action filter button on remove-shownas flag <a href="https://github.com/PostHog/posthog/pull/3105">#3105</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Onboarding setup page (continues #2822) <a href="https://github.com/PostHog/posthog/pull/3104">#3104</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Onboarding: Create demo data, show demo alert at top, route directly to dashboard <a href="https://github.com/PostHog/posthog/pull/3103">#3103</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix API incompatibility with old feature flags code <a href="https://github.com/PostHog/posthog/pull/3102">#3102</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix multi-group feature flags <a href="https://github.com/PostHog/posthog/pull/3101">#3101</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Plugin order <a href="https://github.com/PostHog/posthog/pull/3100">#3100</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add whitelists for domains on Google OAuth <a href="https://github.com/PostHog/posthog/pull/3098">#3098</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Move adding feature flags to event to capture endpoint 2: This Time It&#x27;s Personal <a href="https://github.com/PostHog/posthog/pull/3096">#3096</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Only show tooltips when you can actually click <a href="https://github.com/PostHog/posthog/pull/3093">#3093</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Retention logic types <a href="https://github.com/PostHog/posthog/pull/3091">#3091</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Move adding feature flags to event to capture endpoint <a href="https://github.com/PostHog/posthog/pull/3090">#3090</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix paths background color in dashboard <a href="https://github.com/PostHog/posthog/pull/3089">#3089</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Milestone P1 - #2822 implementation <a href="https://github.com/PostHog/posthog/pull/3088">#3088</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Reduce axes logspam <a href="https://github.com/PostHog/posthog/pull/3086">#3086</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Make feature flag query faster <a href="https://github.com/PostHog/posthog/pull/3084">#3084</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Plugins required in preflight check <a href="https://github.com/PostHog/posthog/pull/3083">#3083</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>3072 retention person modal fix <a href="https://github.com/PostHog/posthog/pull/3080">#3080</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix retention &quot;load more&quot; people <a href="https://github.com/PostHog/posthog/pull/3075">#3075</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Allow configuring session recording retention period <a href="https://github.com/PostHog/posthog/pull/3074">#3074</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Private token support for GitHub and npm URLs <a href="https://github.com/PostHog/posthog/pull/3070">#3070</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Hotfix for missing session recording events <a href="https://github.com/PostHog/posthog/pull/3069">#3069</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix exception when using a bad selector to select actions <a href="https://github.com/PostHog/posthog/pull/3067">#3067</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Closes #3065 resolve sessions by distinct ID error <a href="https://github.com/PostHog/posthog/pull/3066">#3066</a> (<a href="https://github.com/stevenphaedonos">stevenphaedonos</a>)</li><li>Remove bulk events gen <a href="https://github.com/PostHog/posthog/pull/3061">#3061</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Various fixes 210122 <a href="https://github.com/PostHog/posthog/pull/3058">#3058</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Plugin upgrades <a href="https://github.com/PostHog/posthog/pull/3057">#3057</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add missing logic for action days in cohort calculating <a href="https://github.com/PostHog/posthog/pull/3056">#3056</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Use KAFKA_HOSTS instead of KAFKA_URL in ECS dockerized plugin server <a href="https://github.com/PostHog/posthog/pull/3054">#3054</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix plugin server task definition rendering <a href="https://github.com/PostHog/posthog/pull/3053">#3053</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Run independently dockerized plugin server in Cloud <a href="https://github.com/PostHog/posthog/pull/3052">#3052</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Run typescript with strict in CI, allow no new errors <a href="https://github.com/PostHog/posthog/pull/3050">#3050</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Some typescript fixes <a href="https://github.com/PostHog/posthog/pull/3049">#3049</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Kea TypeGen types in the same folder as logic <a href="https://github.com/PostHog/posthog/pull/3048">#3048</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix session recording breakage <a href="https://github.com/PostHog/posthog/pull/3045">#3045</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Plugin Server 0.6.8 <a href="https://github.com/PostHog/posthog/pull/3043">#3043</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add try statement for deleting persons in case the table is distributed <a href="https://github.com/PostHog/posthog/pull/3042">#3042</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add refresh param to retention and paths <a href="https://github.com/PostHog/posthog/pull/3039">#3039</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Hide plugins from nav in Cloud <a href="https://github.com/PostHog/posthog/pull/3038">#3038</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Patch DNE in sessionsplaylogic <a href="https://github.com/PostHog/posthog/pull/3037">#3037</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Plugin server 0.6.6 <a href="https://github.com/PostHog/posthog/pull/3035">#3035</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Don&#x27;t install unused pandas and numpy <a href="https://github.com/PostHog/posthog/pull/3034">#3034</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Plugin unique url with different private tokens &amp; improve privacy <a href="https://github.com/PostHog/posthog/pull/3033">#3033</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Exclude health from ip block <a href="https://github.com/PostHog/posthog/pull/3027">#3027</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Don&#x27;t include materialized columns in kafka table <a href="https://github.com/PostHog/posthog/pull/3026">#3026</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Add user param for clickhouse if provided <a href="https://github.com/PostHog/posthog/pull/3025">#3025</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Setup logging to system.text_log in dev environment <a href="https://github.com/PostHog/posthog/pull/3024">#3024</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Only aggregate breakdown if it&#x27;s a table or pie chart <a href="https://github.com/PostHog/posthog/pull/3023">#3023</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>feat: set event root logger severity using the DJANGO_LOG_LEVEL env variable <a href="https://github.com/PostHog/posthog/pull/3016">#3016</a> (<a href="https://github.com/FUSAKLA">FUSAKLA</a>)</li><li>feat: allow setting Sentry environment by using the SENTRY_ENVIRONMENT env variable <a href="https://github.com/PostHog/posthog/pull/3015">#3015</a> (<a href="https://github.com/FUSAKLA">FUSAKLA</a>)</li><li>Delete omni_person.proto <a href="https://github.com/PostHog/posthog/pull/3014">#3014</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix multiple actions in funnel <a href="https://github.com/PostHog/posthog/pull/3011">#3011</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add denormalized prop config <a href="https://github.com/PostHog/posthog/pull/3009">#3009</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Plugins page UX improvement <a href="https://github.com/PostHog/posthog/pull/3006">#3006</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Upgrade to plugin server 0.6.5 <a href="https://github.com/PostHog/posthog/pull/3003">#3003</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Change suggestion and save cypress test <a href="https://github.com/PostHog/posthog/pull/3002">#3002</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Bump version to 1.20.0, update changelog <a href="https://github.com/PostHog/posthog/pull/3001">#3001</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Allow filtering by unseen recordings <a href="https://github.com/PostHog/posthog/pull/3000">#3000</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Use utc moment for retention dates and fix modal title <a href="https://github.com/PostHog/posthog/pull/2998">#2998</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>2248 remove pandas numpy <a href="https://github.com/PostHog/posthog/pull/2997">#2997</a> (<a href="https://github.com/cpankajr">cpankajr</a>)</li><li>Show progress in retention table <a href="https://github.com/PostHog/posthog/pull/2995">#2995</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix interval persons bug for trends <a href="https://github.com/PostHog/posthog/pull/2992">#2992</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Support for installing plugins from private GitLab repositories <a href="https://github.com/PostHog/posthog/pull/2991">#2991</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Standardize created at and by table columns <a href="https://github.com/PostHog/posthog/pull/2961">#2961</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Highlight filtered events in events table and in session recording <a href="https://github.com/PostHog/posthog/pull/2954">#2954</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Refactor web ingestion onboarding &amp; add bookmarklet <a href="https://github.com/PostHog/posthog/pull/2953">#2953</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Round sessions value <a href="https://github.com/PostHog/posthog/pull/2925">#2925</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Denormalize clickhouse props <a href="https://github.com/PostHog/posthog/pull/2903">#2903</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add handing off event ingestion to plugin server <a href="https://github.com/PostHog/posthog/pull/2898">#2898</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add timeout and error messages <a href="https://github.com/PostHog/posthog/pull/2876">#2876</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add autofill for posthog props in plugin config <a href="https://github.com/PostHog/posthog/pull/2838">#2838</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Enable SSL PostgreSQL configuration through env variables <a href="https://github.com/PostHog/posthog/pull/2967">#2967</a> (<a href="https://github.com/tmilicic">tmilicic</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.20.0]]></title><description><![CDATA[We're back! 2020 was a hectic year for us and our team put in a whole lot of effort to get PostHog to where it is now. As such, we shut down PostHog…]]></description><link>https://posthog.com/blog/the-posthog-array-1-20-0</link><guid isPermaLink="false">f78984c8-ead8-516d-a856-d3f5ba513a67</guid><pubDate>Tue, 19 Jan 2021 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We&#x27;re back! 2020 was a hectic year for us and our team put in a whole lot of effort to get PostHog to where it is now. As such, we shut down PostHog for 2 weeks to give everyone a chance to recharge (with a rotation in place to make sure nothing burned down). </p><p>2021 is now here and we&#x27;re kicking off with some awesome new features. Behold...</p><h2 id="release-notes">Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience with nicer features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="apps-apps-and-more-apps"><a href="/plugins">Apps, Apps, and more Apps</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/plugin-library.png" alt="Plugin Library Screenshot"/></p><p>A lot has been happening on our Apps front. </p><p>Besides a whole bunch work to deliver performance improvements and mature the PostHog Apps ecosystem, we have two major changes being introduced with this new PostHog version:</p><p><strong>A shiny new apps library</strong></p><p>We have released a <a href="/product">apps library</a> where you can browse through all the apps built by our core team and community, and made sure the library is populated with apps! Thus, we now have integrations that support getting data from GitHub and GitLab, or sending data over to BigQuery and Hubspot, for example. </p><p>We&#x27;re working to make apps available on Cloud, but, in the meanwhile, if you&#x27;re self-hosting, do check out our apps and let us know what you think!</p><p><strong>Apps can now access persistent storage</strong></p><p>Up until now, app builders would have noticed that the <code>cache</code> could have been used to store data in-memory using Redis, but we now also support <code>storage</code>, which allows apps to store data in a persistent form, opening up a lot of new use cases for you to explore.</p><h3 id="static-cohorts"><a href="https://github.com/PostHog/posthog/pull/2932">Static Cohorts</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/static-cohorts.png" alt="Static Cohorts Screenshot"/></p><p>In addition to our standard dynamic cohorts (periodically updated based on the definition), PostHog now support static cohorts - groups of users that don&#x27;t update. </p><p>To create a static cohort, head over to &#x27;People&#x27; -&gt; &#x27;Cohorts&#x27; and, when creating a new cohort, select &#x27;Upload CSV&#x27;. This CSV file should have a single column with either the user&#x27;s <code>distinct_id</code> or <code>email</code>. </p><p>This way, you can import data from outside sources into a PostHog cohort more easily, as well as turn your dynamic cohorts into static ones by first exporting them. You could, for example, add your Mailchimp subscribers list as a static cohort.</p><h3 id="sortable-funnel-steps"><a href="https://github.com/PostHog/posthog/pull/2862">Sortable Funnel Steps</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/funnel-step-reordering.png" alt="Sortable Funnels Screenshot"/></p><p>As of this new release, when you head over to Funnels in PostHog, you will see 3 dots next to each funnel step. By dragging these 3 dots up and down you can now re-order your funnel&#x27;s steps, for example if you made a mistake, or want to explore different funnel structures. </p><p>This was a feature that was consistently requested by the PostHog community, and we&#x27;d like to also shoutout <a href="https://github.com/glmaljkovich">@glmaljkovich</a> for helping us build it!</p><h3 id="posthog-bookmarklet"><a href="https://github.com/PostHog/posthog/pull/2774">PostHog Bookmarklet</a></h3><p><img src="https://posthog-static-files.s3.us-east-2.amazonaws.com/Website-Assets/Array/bookmarklet.gif" alt="Bookmarklet Gif"/></p><p>To try out the PostHog snippet without having to update anything on your codebase, you can make use of our bookmarklet, which you can find over in &#x27;Project Settings&#x27;.</p><p>This lets you capture events in your website without any code, and we&#x27;ve been using it actively during our demos!</p><h3 id="sessions-list-now-loads-10x-faster"><a href="https://github.com/PostHog/posthog/pull/2934">Sessions List now loads 10x faster</a></h3><p>Since joining us, Karl has been submitting performance improvement after performance improvement.</p><p>This time, as session recordings are being used more and more by our users, it was time to speed up the loading of the sessions list, which now loads 10x faster!</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="share-your-feedback-1">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="favorite-issue">Favorite Issue</h2><h3 id="posthog-development-on-apple-silicon"><a href="https://github.com/PostHog/posthog/issues/2916">PostHog Development on Apple Silicon</a></h3><p>Are you a person that likes to operate at the bleeding edge of technology? Follow Marius&#x27; adventures working with PostHog on an Apple M1 laptop.</p><h2 id="posthog-news">PostHog News</h2><p>Cory has joined us as a Lead Designer and has already started working on some jaw-dropping designs! Cory lives in an RV with his wife and child, boasting greater home square footage than many apartments in New York or San Francisco. </p><p>He believes pineapple belongs on pizza, and we&#x27;re now questioning whether we indeed know how to hire.</p><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/glmaljkovich">glmaljkovich</a></li><li><a href="https://github.com/tmilicic">tmilicic</a></li><li><a href="https://github.com/c3ho">c3ho</a></li><li><a href="https://github.com/Tbhesswebber">Tbhesswebber</a></li><li><a href="https://github.com/stevenphaedonos">stevenphaedonos</a></li><li><a href="https://github.com/moonrailgun">moonrailgun</a></li><li><a href="https://github.com/Somtom">Somtom</a></li></ul><h2 id="open-roles">Open Roles</h2><p>Are you a Fullstack Engineer, Senior Engineer, Marketing Lead, Growth Engineer, or Customer Success Lead? </p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog? </p><p><a href="https://posthog.com/careers">We want you!</a> </p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Sessions filters design <a href="https://github.com/PostHog/posthog/pull/2987">#2987</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add Community tag to plugins <a href="https://github.com/PostHog/posthog/pull/2982">#2982</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix prop operator not changing <a href="https://github.com/PostHog/posthog/pull/2981">#2981</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix options not loaded <a href="https://github.com/PostHog/posthog/pull/2973">#2973</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Set Once <a href="https://github.com/PostHog/posthog/pull/2972">#2972</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Support plugins installed from GitLab <a href="https://github.com/PostHog/posthog/pull/2970">#2970</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix muted text color <a href="https://github.com/PostHog/posthog/pull/2969">#2969</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Lessen the language in the plugin opt-in warning <a href="https://github.com/PostHog/posthog/pull/2968">#2968</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Enable SSL PostgreSQL configuration through env variables <a href="https://github.com/PostHog/posthog/pull/2967">#2967</a> (<a href="https://github.com/tmilicic">tmilicic</a>)</li><li>Order tooltip by volume <a href="https://github.com/PostHog/posthog/pull/2960">#2960</a> (<a href="https://github.com/c3ho">c3ho</a>)</li><li>Add &quot;AND&quot; indicator to feature flag filters &amp; update visuals <a href="https://github.com/PostHog/posthog/pull/2959">#2959</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Capture rageclicks (via posthog-js) <a href="https://github.com/PostHog/posthog/pull/2957">#2957</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Trends: small fixes <a href="https://github.com/PostHog/posthog/pull/2956">#2956</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Only cache new items for 1 day <a href="https://github.com/PostHog/posthog/pull/2949">#2949</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Make flag explicit <a href="https://github.com/PostHog/posthog/pull/2947">#2947</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Support multiple action filters in sessions <a href="https://github.com/PostHog/posthog/pull/2946">#2946</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add missing feature flags <a href="https://github.com/PostHog/posthog/pull/2944">#2944</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add sharded tables to health checks for app <a href="https://github.com/PostHog/posthog/pull/2938">#2938</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Refactor &amp; extend backend user identify <a href="https://github.com/PostHog/posthog/pull/2937">#2937</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add link to plugin troubleshooting if server offline <a href="https://github.com/PostHog/posthog/pull/2936">#2936</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Simplify plugin server service definitions <a href="https://github.com/PostHog/posthog/pull/2929">#2929</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Remove unnecessary action properties iterating on sessionsparams <a href="https://github.com/PostHog/posthog/pull/2926">#2926</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Switch user prompt location <a href="https://github.com/PostHog/posthog/pull/2924">#2924</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>restore path custom events <a href="https://github.com/PostHog/posthog/pull/2923">#2923</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Change datepicker to rangepicker <a href="https://github.com/PostHog/posthog/pull/2922">#2922</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Change color variable for bar color <a href="https://github.com/PostHog/posthog/pull/2921">#2921</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Event must be a string <a href="https://github.com/PostHog/posthog/pull/2920">#2920</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix clearRetention <a href="https://github.com/PostHog/posthog/pull/2919">#2919</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update plugin repository URL <a href="https://github.com/PostHog/posthog/pull/2918">#2918</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update to renamed @posthog/plugin-server package <a href="https://github.com/PostHog/posthog/pull/2917">#2917</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Support nodejs 15 <a href="https://github.com/PostHog/posthog/pull/2915">#2915</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Posthog-js 1.8.3 <a href="https://github.com/PostHog/posthog/pull/2913">#2913</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Sessions filtering system <a href="https://github.com/PostHog/posthog/pull/2912">#2912</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix dashboard colors with non-white backgrounds <a href="https://github.com/PostHog/posthog/pull/2911">#2911</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix errors on demo <a href="https://github.com/PostHog/posthog/pull/2909">#2909</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Hotfix - Papercups chat collision <a href="https://github.com/PostHog/posthog/pull/2908">#2908</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add pinned dashboards to new navigation <a href="https://github.com/PostHog/posthog/pull/2906">#2906</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Proper interval rounding on normal trends <a href="https://github.com/PostHog/posthog/pull/2901">#2901</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Remove shownas filter and move stickiness/lifecycle into separate insight tabs <a href="https://github.com/PostHog/posthog/pull/2899">#2899</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Upgrade to plugin server 0.6.4 <a href="https://github.com/PostHog/posthog/pull/2897">#2897</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update simmer to version without installation warnings <a href="https://github.com/PostHog/posthog/pull/2896">#2896</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix REST hook firing <a href="https://github.com/PostHog/posthog/pull/2894">#2894</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix REST hook deletion <a href="https://github.com/PostHog/posthog/pull/2893">#2893</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Refactor properties_to_Q to not be tied to Filter objects <a href="https://github.com/PostHog/posthog/pull/2890">#2890</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Adds backend instrumentation to actions &amp; cohorts <a href="https://github.com/PostHog/posthog/pull/2887">#2887</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Bump lxml from 4.6.1 to 4.6.2 <a href="https://github.com/PostHog/posthog/pull/2886">#2886</a> (<a href="https://github.com/apps/dependabot">dependabot[bot]</a>)</li><li>Separate math aggregates <a href="https://github.com/PostHog/posthog/pull/2885">#2885</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix missing action when returning from dashboard <a href="https://github.com/PostHog/posthog/pull/2884">#2884</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix sessions length distribution dataindex <a href="https://github.com/PostHog/posthog/pull/2883">#2883</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix path loading var name <a href="https://github.com/PostHog/posthog/pull/2882">#2882</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Updated where our enterprise terms are found <a href="https://github.com/PostHog/posthog/pull/2881">#2881</a> (<a href="https://github.com/piemets">piemets</a>)</li><li>Re-enable source maps in production.Dockerfile <a href="https://github.com/PostHog/posthog/pull/2879">#2879</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update posthog-plugin-server <a href="https://github.com/PostHog/posthog/pull/2878">#2878</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Remove ancient &quot;.map&quot; redirect <a href="https://github.com/PostHog/posthog/pull/2875">#2875</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add deployment environment variables <a href="https://github.com/PostHog/posthog/pull/2874">#2874</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Try to fix bgbouncer error in django admin in production <a href="https://github.com/PostHog/posthog/pull/2873">#2873</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Don&#x27;t show events in future <a href="https://github.com/PostHog/posthog/pull/2871">#2871</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Really fix event limit <a href="https://github.com/PostHog/posthog/pull/2870">#2870</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fixes email from address <a href="https://github.com/PostHog/posthog/pull/2869">#2869</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Limit events correctly <a href="https://github.com/PostHog/posthog/pull/2867">#2867</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Improve action select box - fix css <a href="https://github.com/PostHog/posthog/pull/2865">#2865</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Only grab recent events in Events list <a href="https://github.com/PostHog/posthog/pull/2864">#2864</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add session recording stats to instance status page <a href="https://github.com/PostHog/posthog/pull/2861">#2861</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add missing event name to demo data <a href="https://github.com/PostHog/posthog/pull/2860">#2860</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Instrument toolbar <a href="https://github.com/PostHog/posthog/pull/2859">#2859</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add missing paths viz condition <a href="https://github.com/PostHog/posthog/pull/2858">#2858</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix bug from query-selector-shadow-dom update <a href="https://github.com/PostHog/posthog/pull/2856">#2856</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>ClickHouse caching <a href="https://github.com/PostHog/posthog/pull/2855">#2855</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Custom NPM packages under @posthog <a href="https://github.com/PostHog/posthog/pull/2854">#2854</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Index session recording events by team_id, timestamp <a href="https://github.com/PostHog/posthog/pull/2853">#2853</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Plugin storage model <a href="https://github.com/PostHog/posthog/pull/2852">#2852</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Tests, fix for createActionFromEvent, clean up sessions query <a href="https://github.com/PostHog/posthog/pull/2851">#2851</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Kill N+1 in sessions_list <a href="https://github.com/PostHog/posthog/pull/2850">#2850</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Support different Reply-To header for most emails <a href="https://github.com/PostHog/posthog/pull/2846">#2846</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Quick fix to limit time range on event prop query <a href="https://github.com/PostHog/posthog/pull/2844">#2844</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix relative dates filters <a href="https://github.com/PostHog/posthog/pull/2843">#2843</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Refactor useEventListener to TypeScript <a href="https://github.com/PostHog/posthog/pull/2841">#2841</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Bump node-notifier from 8.0.0 to 8.0.1 <a href="https://github.com/PostHog/posthog/pull/2837">#2837</a> (<a href="https://github.com/apps/dependabot">dependabot[bot]</a>)</li><li>Fix retention entity selection <a href="https://github.com/PostHog/posthog/pull/2825">#2825</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Allow * in action selector <a href="https://github.com/PostHog/posthog/pull/2820">#2820</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Upgrade Plugin Server <a href="https://github.com/PostHog/posthog/pull/2816">#2816</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix retention filter dashboard items <a href="https://github.com/PostHog/posthog/pull/2815">#2815</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix disabling server-side cursors <a href="https://github.com/PostHog/posthog/pull/2814">#2814</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>More key feature instrumentation <a href="https://github.com/PostHog/posthog/pull/2811">#2811</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Make filtering by actions/events in sessions possible <a href="https://github.com/PostHog/posthog/pull/2808">#2808</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Do not use SessionsFilter for insights sessions <a href="https://github.com/PostHog/posthog/pull/2807">#2807</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Clean up prod dockerfile, remove dupe calls <a href="https://github.com/PostHog/posthog/pull/2806">#2806</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Verbose Yarn build on plugin server build <a href="https://github.com/PostHog/posthog/pull/2805">#2805</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Make building with yarn more verbose for debugging <a href="https://github.com/PostHog/posthog/pull/2804">#2804</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>plugins debug <a href="https://github.com/PostHog/posthog/pull/2803">#2803</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Ignore plugins optional deps <a href="https://github.com/PostHog/posthog/pull/2801">#2801</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Make testing using docker a bit easier with docker-compose for ee <a href="https://github.com/PostHog/posthog/pull/2800">#2800</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Feature flag Papercups <a href="https://github.com/PostHog/posthog/pull/2799">#2799</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix Docker Build <a href="https://github.com/PostHog/posthog/pull/2797">#2797</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Generate event_uuid slightly earlier for plugin server idempotency <a href="https://github.com/PostHog/posthog/pull/2796">#2796</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>WIP: Try to fix error with DAU breakdown of user properties <a href="https://github.com/PostHog/posthog/pull/2793">#2793</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Whitelist plugins per organization on Cloud <a href="https://github.com/PostHog/posthog/pull/2791">#2791</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Allow going from insights -&gt; sessions (on cloud) <a href="https://github.com/PostHog/posthog/pull/2790">#2790</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>CHANGELOG fixes <a href="https://github.com/PostHog/posthog/pull/2788">#2788</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Insights data instrumentation <a href="https://github.com/PostHog/posthog/pull/2787">#2787</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fixes for differences between terraform and GA task-definition <a href="https://github.com/PostHog/posthog/pull/2786">#2786</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix breakdown aggregated value <a href="https://github.com/PostHog/posthog/pull/2785">#2785</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Remove event properties from session filters <a href="https://github.com/PostHog/posthog/pull/2784">#2784</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Allow Plugins on Cloud <a href="https://github.com/PostHog/posthog/pull/2783">#2783</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix pie aggregate value <a href="https://github.com/PostHog/posthog/pull/2781">#2781</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Release 1.19.0 <a href="https://github.com/PostHog/posthog/pull/2780">#2780</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Hide bar from retention <a href="https://github.com/PostHog/posthog/pull/2770">#2770</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Optimize breaking down by event property value <a href="https://github.com/PostHog/posthog/pull/2767">#2767</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>MV -&gt; View for events_with_array_props_view and remove EVENT_PROP_TABLE_SQL <a href="https://github.com/PostHog/posthog/pull/2766">#2766</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Move lifecycle tests to separate file <a href="https://github.com/PostHog/posthog/pull/2765">#2765</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Navigation 1775 improvements &amp; fixes <a href="https://github.com/PostHog/posthog/pull/2763">#2763</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Honor next URL when logged out <a href="https://github.com/PostHog/posthog/pull/2757">#2757</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Deploy Plugins to AWS <a href="https://github.com/PostHog/posthog/pull/2755">#2755</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add abstract test classes <a href="https://github.com/PostHog/posthog/pull/2754">#2754</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Improved insights history <a href="https://github.com/PostHog/posthog/pull/2745">#2745</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Not-so-big play button <a href="https://github.com/PostHog/posthog/pull/2744">#2744</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Major filter refactor <a href="https://github.com/PostHog/posthog/pull/2736">#2736</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix total aggregate values <a href="https://github.com/PostHog/posthog/pull/2723">#2723</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Zapier updates <a href="https://github.com/PostHog/posthog/pull/2686">#2686</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Issue templates plus <a href="https://github.com/PostHog/posthog/pull/2681">#2681</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Make Jest tests work better with TypeScript <a href="https://github.com/PostHog/posthog/pull/2558">#2558</a> (<a href="https://github.com/Twixes">Twixes</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog raises $12 million in funding led by GV and Y Combinator]]></title><description><![CDATA[(Dec 17, 2020) – PostHog, the open source product analytics company, today announced $12 million in funding and major new features - including plugins…]]></description><link>https://posthog.com/blog/posthog-announces-9-million-dollar-series-A</link><guid isPermaLink="false">f1964531-2c42-5f80-9fa7-f2fec72a54c6</guid><pubDate>Thu, 17 Dec 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/12-million-series-a.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>(Dec 17, 2020) – PostHog, the open source product analytics company, today announced $12 million in funding and major new features - including plugins, session recordings and  feature flags. The company’s Series A was led by GV (formerly Google Ventures), with participation from Y Combinator’s Continuity Fund. PostHog also brings on board Jason Warner (CTO, GitHub) as an investor, joining Solomon Hykes (Founder, Docker) and others who participated in the company’s seed round. </p><p>Since February 2020, there have been 3,000 deployments of PostHog’s software, ranging from startups to some of the world’s largest institutions. PostHog was originally conceived during Y Combinator’s Winter 2020 batch, where co-founders James Hawkins (CEO) and Tim Glaser (CTO) had been working on a different product at the time, but were frustrated at having to send user data to third parties to understand which features of their software were being used. </p><p>On learning how enterprises self-build a data pipeline, data lake, and analytics stack, the pair quickly realized they could build something much easier to use for large teams of developers or product managers, that would help anyone answer simple product questions without writing any code or sending any data to a third party.</p><p>Today, PostHog enables software teams to understand user behavior – auto-capturing events, performing product analytics and dashboarding, enabling video replays, and rolling out new features behind feature flags, all based on its single open source platform. </p><p>James Hawkins, co-founder and CEO, said: “Our goal is to increase the number of successful products in the world. That starts with empowering engineers to improve a business’ metrics and consolidating the disparate set of tools out there today to understand user behavior. We also now offer PostHog Enterprise, which is a more scalable version of our platform, designed to support tens of thousands to tens of millions of users.”</p><p>PostHog raised an initial $3M seed round in March 2020, as COVID-19 caused many parts of the U.S. to go into lockdown. Unimpeded by the shift to remote work, the company then closed a $9M Series A from GV and Y Combinator’s Continuity Fund in July. The latest round, led by GV, has enabled PostHog to further build the team, expand the breadth of use cases, and to launch a scalable enterprise version.</p><p>Tyson Clark, General Partner at GV said: “PostHog’s approach to open source product analytics for developers addresses a large market opportunity in product analytics. PostHog has seen strong early traction from the developer community, and we continue to be impressed with the execution and vision of the co-founding team.” </p><p>Hawkins added: “We’ve been designed to be all-remote and open source from scratch. Anyone in the world can view all our policies or even suggest changes to them. Having public discussions and policies written down avoids the need for most meetings, so we can work across multiple time zones, and lets us easily onboard our team much more rapidly than a traditional organization.”</p><p>PostHog will use the funding to continue building out its product and engineering teams, accelerate the delivery of new platform features, and enhance its PostHog Enterprise offering.</p><p><strong>About PostHog</strong></p><p>PostHog is an open source developer platform. PostHog enables software teams to understand user behavior – auto-capturing events, performing product analytics and dashboarding, enabling video replays, and rolling out new features behind feature flags, all based on their single open source platform. The product’s open source approach enables companies to self-host, removing the need to send data externally. </p><p>Founded in 2020 by James Hawkins and Tim Glaser, PostHog was a member of Y Combinator’s Winter 2020 batch, and has subsequent raised $12m in funding from GV, Y Combinator and notable angel investors including Jason Warner (CTO, GitHub), Solomon Hykes (Founder, Docker) and David Cramer (Founder, Sentry).</p><p><strong>About Y Combinator Continuity Fund</strong></p><p>YC Continuity is an investment fund dedicated to supporting founders as they scale their companies. Our primary goal is to support YC alumni companies by investing in their subsequent funding rounds, though we occasionally invest in non-YC companies as well.</p><p>Like YC’s early-stage partners, the entire YC Continuity team has strong operating experience. We work to create opportunities for founders to continue their personal growth and scale their companies successfully.</p><p>We also run the YC Growth Program, which brings together founder-CEOs who are leading rapidly growing companies.</p><p>Press contacts
<a href="mailto:press@posthog.com">press@posthog.com</a></p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.19.0]]></title><description><![CDATA[This new release is a great mix between old and new, with significant improvements to both our newer features, as well as our core analytics stack…]]></description><link>https://posthog.com/blog/the-posthog-array-1-19-0</link><guid isPermaLink="false">e2c4791d-5bba-5748-b3f9-ff0964c84b79</guid><pubDate>Tue, 15 Dec 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>This new release is a great mix between old and new, with significant improvements to both our newer features, as well as our core analytics stack. </p><p>Once again, we were heavily driven by feedback, having done a bunch of calls with our users and actively engaging with the PostHog community on Slack and GitHub. Keep the feedback coming!</p><h2 id="release-notes">Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience with nicer features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="scheduled-apps-and-editor"><a href="https://github.com/PostHog/posthog/pull/2743">Scheduled Apps and Editor</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/plugin-editor.png" alt="App Editor Screenshot"/></p><p>We now support scheduled apps that run periodically on a specified time cycle (e.g. minute, hour, day), as well as have a built-in code editor for apps right into the PostHog UI.</p><p>With the ability to run tasks in specified time intervals, you can now setup apps that, for example, keep track of external metrics and add this data to PostHog via new events. This is possible because we now <a href="https://github.com/PostHog/posthog-plugin-server/pull/67">support <code>posthog.capture</code> calls inside apps as well</a>. </p><p>Some metrics you might want to keep track of are, for example, server performance, GitHub activities (e.g. stars ⭐ ), engagement with your project&#x27;s social media profiles, and anything else you can think of!</p><p>Here&#x27;s an example to give you an idea:</p><pre><code class="language-js">async function runEveryMinute({ config }) {
    const url = `https://api.github.com/repos/PostHog/posthog`
    const response = await fetch(url)
    const metrics = await response.json()

    posthog.capture(&#x27;github metrics&#x27;, {
        stars: metrics.stargazers_count,
        open_issues: metrics.open_issues_count,
        forks: metrics.forks_count,
        subscribers: metrics.subscribers_count
    })
}
</code></pre><p>You can learn more about scheduled apps on the <a href="https://github.com/PostHog/posthog-plugin-server/pull/63">PR that created them</a>, as well as our docs for <a href="/docs/plugins/build">building your own app</a>.</p><blockquote><p><strong>Note:</strong> Apps are a Beta feature currently and only available on self-hosted instances. We are working to make it available on PostHog Cloud soon.</p></blockquote><h3 id="lifecycle-analysis"><a href="https://github.com/PostHog/posthog/pull/2460">Lifecycle Analysis</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/lifecycle.png" alt="Lifecycle Screenshot"/></p><p>Our &#x27;Trends&#x27; tab just got an awesome new feature: lifecycle graphs!</p><p>Lifecycle analysis digs deeper into your events and shows you a breakdown of the users who performed the event into new, returning, and resurrecting users. In addition, it also shows you the churn on for the specified time period. </p><p>To use it, select &#x27;Shown As&#x27; -&gt; &#x27;Lifecycle&#x27; when in the &#x27;Trends&#x27; tab.  </p><h3 id="new-session-recording-compression-scheme"><a href="https://github.com/PostHog/posthog/pull/2578">New Session Recording Compression Scheme</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/session-recording-gzip.png" alt="Gzip Session Recording Screenshot"/></p><p>See the image above? That&#x27;s our event processing time before and after the new compression scheme!</p><p>By using gzip-based compression, we have now significantly improved performance both on the client and server, making event processing faster, as well as decreasing the number of session recordings that are lost. Be on the lookout for more green play buttons on your &#x27;Sessions&#x27; page now.</p><p>Also, while on the topic of session recording, have you been keeping up with the <a href="#session-recording-player-ux-improvements">updates to our player</a>?</p><blockquote><p>If you installed <code>posthog-js</code> via <code>npm</code>, you should update to version 1.8.0 to get access to this update. Snippet users have access to the latest version by default.</p></blockquote><h3 id="new-actions-ux"><a href="https://github.com/PostHog/posthog/pull/2615">New Actions UX</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/actions-ux.png" alt="New Actions UX Screenshot"/></p><p>This might not be news to all of you, since we have been experimenting with our actions UX using <a href="/docs/user-guides/feature-flags">feature flags</a>. However, we&#x27;re now rolling out a new UX for creating actions to all PostHog users, so try it out let us know what you think!</p><h3 id="new-operations-for-numerical-properties"><a href="https://github.com/PostHog/posthog/pull/2630">New operations for numerical properties</a></h3><p>In addition to the average, sum, maximum, and minimum operations available to numerical properties in trends, we now also support median, and 90th, 95th, and 99th percentiles.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="favorite-issue">Favorite Issue</h2><h3 id="session-recording-player-ux-improvements"><a href="https://github.com/PostHog/posthog/issues/2548">Session recording player ux improvements</a></h3><p>Our session recording feature is getting better by the day! The latest improvements to our player have made the UX much smoother, and you can keep up-to-date and supply feedback about the player on the issue above.</p><h2 id="posthog-news">PostHog News</h2><p>Eltje has joined us to lead our efforts on the People &amp; Talent front, bringing some much-needed experience as we grow our team. Like James, she was a professional cyclist before venturing into talent, and she is (unfortunately) a lover of pineapple on pizza.</p><h2 id="share-your-feedback-1">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/samcaspus">samcaspus</a></li><li><a href="https://github.com/nrickles3">nrickles3</a></li><li><a href="https://github.com/suresh1999">suresh1999</a></li><li><a href="https://github.com/girlProg">girlProg</a></li></ul><h2 id="open-roles">Open Roles</h2><p>Are you a Fullstack Engineer, Marketing Lead, or Growth Engineer? </p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog? </p><p><a href="https://posthog.com/careers">We want you!</a> </p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Hide bar from retention <a href="https://github.com/PostHog/posthog/pull/2770">#2770</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Optimize breaking down by event property value <a href="https://github.com/PostHog/posthog/pull/2767">#2767</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix Identified persons pagination <a href="https://github.com/PostHog/posthog/pull/2756">#2756</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Showcase Feature Flag in HogFlix <a href="https://github.com/PostHog/posthog/pull/2750">#2750</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Update to <a href="mailto:posthog-js@1.8.0">posthog-js@1.8.0</a> <a href="https://github.com/PostHog/posthog/pull/2749">#2749</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Insights link on event list <a href="https://github.com/PostHog/posthog/pull/2748">#2748</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Monitor clickhouse parts counts by table <a href="https://github.com/PostHog/posthog/pull/2747">#2747</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Revert &quot;Add autocapture to selection properties&quot; <a href="https://github.com/PostHog/posthog/pull/2746">#2746</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Plugin editor <a href="https://github.com/PostHog/posthog/pull/2743">#2743</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Make active feature flags more obvious <a href="https://github.com/PostHog/posthog/pull/2742">#2742</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Bump ini from 1.3.5 to 1.3.7 <a href="https://github.com/PostHog/posthog/pull/2741">#2741</a> (<a href="https://github.com/apps/dependabot">dependabot[bot]</a>)</li><li>Update to <a href="mailto:posthog-js@1.8.0.beta-1">posthog-js@1.8.0.beta-1</a> <a href="https://github.com/PostHog/posthog/pull/2740">#2740</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>New Person Page (V2) <a href="https://github.com/PostHog/posthog/pull/2738">#2738</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fixes to Persons page 201210 <a href="https://github.com/PostHog/posthog/pull/2737">#2737</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Plugin server ingestion base <a href="https://github.com/PostHog/posthog/pull/2732">#2732</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix persons page V2 edge case <a href="https://github.com/PostHog/posthog/pull/2731">#2731</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Don&#x27;t calculate broken cohorts <a href="https://github.com/PostHog/posthog/pull/2730">#2730</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Capture plugin installation events <a href="https://github.com/PostHog/posthog/pull/2729">#2729</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Sessions filtering postgres support <a href="https://github.com/PostHog/posthog/pull/2728">#2728</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Sessions filtering: improve UX <a href="https://github.com/PostHog/posthog/pull/2726">#2726</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Allow filtering sessions by recording duration <a href="https://github.com/PostHog/posthog/pull/2721">#2721</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Restart plugins on error <a href="https://github.com/PostHog/posthog/pull/2719">#2719</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Report billing usage cron job <a href="https://github.com/PostHog/posthog/pull/2716">#2716</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Deprecate dashboard item type and move to display <a href="https://github.com/PostHog/posthog/pull/2715">#2715</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Kill /api/event/sessions <a href="https://github.com/PostHog/posthog/pull/2714">#2714</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update posthog-js to 1.7.3-beta.11 <a href="https://github.com/PostHog/posthog/pull/2713">#2713</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix prop filtering when action has props <a href="https://github.com/PostHog/posthog/pull/2711">#2711</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Removes legacy stuff from #2709 <a href="https://github.com/PostHog/posthog/pull/2710">#2710</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Refactor /api/signup to Organization <a href="https://github.com/PostHog/posthog/pull/2709">#2709</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Revert &quot;Update posthog-js to 1.7.3-beta.10&quot; <a href="https://github.com/PostHog/posthog/pull/2707">#2707</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update posthog-js to 1.7.3-beta.10 <a href="https://github.com/PostHog/posthog/pull/2704">#2704</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Set right concurrency for plugin server on Heroku <a href="https://github.com/PostHog/posthog/pull/2703">#2703</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add caching support for recorder.js <a href="https://github.com/PostHog/posthog/pull/2702">#2702</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Support gzip encoding from posthog-js <a href="https://github.com/PostHog/posthog/pull/2701">#2701</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Remove legacy funnel code <a href="https://github.com/PostHog/posthog/pull/2700">#2700</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix webpack-dev-server inside Docker <a href="https://github.com/PostHog/posthog/pull/2699">#2699</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Purge Porter <a href="https://github.com/PostHog/posthog/pull/2698">#2698</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add autocapture to selection properties <a href="https://github.com/PostHog/posthog/pull/2696">#2696</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Quick fix to migrations <a href="https://github.com/PostHog/posthog/pull/2695">#2695</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>1842 link to edit cohort <a href="https://github.com/PostHog/posthog/pull/2694">#2694</a> (<a href="https://github.com/girlProg">girlProg</a>)</li><li>Add all time support for lifecycle <a href="https://github.com/PostHog/posthog/pull/2693">#2693</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Actually set env var for DISABLE_SERVER_SIDE_CURSORS to True <a href="https://github.com/PostHog/posthog/pull/2692">#2692</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Add trailing slash to record endpoint <a href="https://github.com/PostHog/posthog/pull/2689">#2689</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Zapier updates <a href="https://github.com/PostHog/posthog/pull/2686">#2686</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Cleaned up system status page <a href="https://github.com/PostHog/posthog/pull/2682">#2682</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add command palette badge to new TopNavigation <a href="https://github.com/PostHog/posthog/pull/2678">#2678</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>DISABLE_SERVER_SIDE_CURSORS to false for pgbouncer friendship <a href="https://github.com/PostHog/posthog/pull/2677">#2677</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix cypress projectSettings <a href="https://github.com/PostHog/posthog/pull/2674">#2674</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix #2632 (save dashboards modal) <a href="https://github.com/PostHog/posthog/pull/2673">#2673</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix 404 <a href="https://github.com/PostHog/posthog/pull/2671">#2671</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Actions Table filtering, search and sorting <a href="https://github.com/PostHog/posthog/pull/2670">#2670</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add clickhouse query for people breakdown <a href="https://github.com/PostHog/posthog/pull/2669">#2669</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>New Persons Page <a href="https://github.com/PostHog/posthog/pull/2667">#2667</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Debug CH queries <a href="https://github.com/PostHog/posthog/pull/2666">#2666</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix nan values <a href="https://github.com/PostHog/posthog/pull/2665">#2665</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix ee webhook <a href="https://github.com/PostHog/posthog/pull/2664">#2664</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix search set when clicking person <a href="https://github.com/PostHog/posthog/pull/2663">#2663</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>update url env var for ECS containers <a href="https://github.com/PostHog/posthog/pull/2660">#2660</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix sessions player scrolling issue <a href="https://github.com/PostHog/posthog/pull/2659">#2659</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix: fixes command palette scrolling issue <a href="https://github.com/PostHog/posthog/pull/2658">#2658</a> (<a href="https://github.com/suresh1999">suresh1999</a>)</li><li>Fix lifecycle date rounding <a href="https://github.com/PostHog/posthog/pull/2657">#2657</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update posthog-js to 1.7.3-beta.9 <a href="https://github.com/PostHog/posthog/pull/2655">#2655</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update posthog-js to 1.7.3-beta.8 <a href="https://github.com/PostHog/posthog/pull/2653">#2653</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update posthog-js to 1.7.3-beta.7 <a href="https://github.com/PostHog/posthog/pull/2652">#2652</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Separate tooltips for lifecycle <a href="https://github.com/PostHog/posthog/pull/2649">#2649</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Support capturing json event data with content-type text/plain <a href="https://github.com/PostHog/posthog/pull/2648">#2648</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Merge person modal <a href="https://github.com/PostHog/posthog/pull/2644">#2644</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Spy on feature flags 🕵️ <a href="https://github.com/PostHog/posthog/pull/2643">#2643</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Command palette missing routes &amp; fix <a href="https://github.com/PostHog/posthog/pull/2641">#2641</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Sessions table improvements 1202 <a href="https://github.com/PostHog/posthog/pull/2639">#2639</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Stickiness improvement and filter refactor <a href="https://github.com/PostHog/posthog/pull/2638">#2638</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Proposal: When clicking &#x27;add action/event&#x27;, populate the generated event with last event data <a href="https://github.com/PostHog/posthog/pull/2635">#2635</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Lifecycle prop filtering <a href="https://github.com/PostHog/posthog/pull/2634">#2634</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add support for median, p90, p95 and p99 math functions <a href="https://github.com/PostHog/posthog/pull/2630">#2630</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Use select for numerical properties <a href="https://github.com/PostHog/posthog/pull/2628">#2628</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Access config to unlock after 15 mins and template <a href="https://github.com/PostHog/posthog/pull/2624">#2624</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update posthog-js to 1.7.3-beta.6 <a href="https://github.com/PostHog/posthog/pull/2623">#2623</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update HogFlix style <a href="https://github.com/PostHog/posthog/pull/2622">#2622</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add flags to <code>bin/docker-worker-celery</code> <a href="https://github.com/PostHog/posthog/pull/2621">#2621</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update posthog-js to next beta <a href="https://github.com/PostHog/posthog/pull/2618">#2618</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Make personal API key capture and decide work with multiple projects <a href="https://github.com/PostHog/posthog/pull/2617">#2617</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add /api/projects/:project_id/actions/ <a href="https://github.com/PostHog/posthog/pull/2616">#2616</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Release actions-ux-201012 <a href="https://github.com/PostHog/posthog/pull/2615">#2615</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fixes Link component default behavior <a href="https://github.com/PostHog/posthog/pull/2612">#2612</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Improved session player navigation <a href="https://github.com/PostHog/posthog/pull/2611">#2611</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Don&#x27;t run preview docker build with debug flags <a href="https://github.com/PostHog/posthog/pull/2610">#2610</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Update session recording settings <a href="https://github.com/PostHog/posthog/pull/2609">#2609</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Link back to insights from actions <a href="https://github.com/PostHog/posthog/pull/2608">#2608</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Added pre tag to stop the over lay <a href="https://github.com/PostHog/posthog/pull/2606">#2606</a> (<a href="https://github.com/samcaspus">samcaspus</a>)</li><li>Update to <a href="mailto:posthog-js@1.7.3-beta.3">posthog-js@1.7.3-beta.3</a> <a href="https://github.com/PostHog/posthog/pull/2601">#2601</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Show all items at date when hovering a LineGraph <a href="https://github.com/PostHog/posthog/pull/2600">#2600</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Log exceptions in production <a href="https://github.com/PostHog/posthog/pull/2593">#2593</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Use last selected dashboard when clicking &#x27;save to dashboard&#x27; <a href="https://github.com/PostHog/posthog/pull/2591">#2591</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add <code>event \(sum of event\_property\)</code> to event labels on graphs <a href="https://github.com/PostHog/posthog/pull/2583">#2583</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Issue #2573, Add django-axes <a href="https://github.com/PostHog/posthog/pull/2582">#2582</a> (<a href="https://github.com/nrickles3">nrickles3</a>)</li><li>Remove flake filter by event cypress test <a href="https://github.com/PostHog/posthog/pull/2580">#2580</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>1936 retention graph <a href="https://github.com/PostHog/posthog/pull/2578">#2578</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Revert &quot;Retention graph and multiple event fix&quot; <a href="https://github.com/PostHog/posthog/pull/2577">#2577</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Cohort table improvements <a href="https://github.com/PostHog/posthog/pull/2576">#2576</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>DAU breakdown and filter bug <a href="https://github.com/PostHog/posthog/pull/2575">#2575</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update changelog with events box <a href="https://github.com/PostHog/posthog/pull/2574">#2574</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix unclickable prop filter <a href="https://github.com/PostHog/posthog/pull/2572">#2572</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Bump version 1.18.0 <a href="https://github.com/PostHog/posthog/pull/2570">#2570</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Webhook warning adjustment <a href="https://github.com/PostHog/posthog/pull/2568">#2568</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Modified drop down <a href="https://github.com/PostHog/posthog/pull/2567">#2567</a> (<a href="https://github.com/samcaspus">samcaspus</a>)</li><li>Update posthog-js to 1.7.3-beta.2 <a href="https://github.com/PostHog/posthog/pull/2566">#2566</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add device type icons to session player page <a href="https://github.com/PostHog/posthog/pull/2565">#2565</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Hover on new navigation menu items <a href="https://github.com/PostHog/posthog/pull/2563">#2563</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Update posthog-js to latest, use (undocumented) option _capture_metrics <a href="https://github.com/PostHog/posthog/pull/2561">#2561</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Show resolution + duration/date on session player <a href="https://github.com/PostHog/posthog/pull/2550">#2550</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Retention graph and multiple event fix <a href="https://github.com/PostHog/posthog/pull/2534">#2534</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Rolling retention widget <a href="https://github.com/PostHog/posthog/pull/2522">#2522</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Make Google login an Enterprise/Cloud feature <a href="https://github.com/PostHog/posthog/pull/2501">#2501</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Lifecycle Graph <a href="https://github.com/PostHog/posthog/pull/2460">#2460</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Setup ecs configs for worker process <a href="https://github.com/PostHog/posthog/pull/2458">#2458</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Remove signup process from cypress <a href="https://github.com/PostHog/posthog/pull/2264">#2264</a> (<a href="https://github.com/timgl">timgl</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.18.0]]></title><description><![CDATA[Our primary goals for this release were to iron out bugs and improve the user experience of our Beta features. As a result, we fixed  a whole lot of…]]></description><link>https://posthog.com/blog/the-posthog-array-1-18-0</link><guid isPermaLink="false">bd141f27-9145-5e65-b853-060fd50963c8</guid><pubDate>Mon, 30 Nov 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Our primary goals for this release were to iron out bugs and improve the user experience of our Beta features.</p><p>As a result, we fixed <strong>a whole lot of stuff</strong>. We merged dozens of PRs with session recording fixes and improvements, and a dozen more with updates to our apps functionality. We also improved things like event ingestion, the UX for feature flags, and our settings for both organizations and projects. You can read through the entire list of fixes <a href="#bug-fixes-and-performance-improvements">later in this post</a>, but beware: it&#x27;s quite long.</p><p>Finally, thank you to everyone who helped us out with feedback and contributions during this release cycle, you help us make PostHog better every day.</p><h2 id="release-notes">Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience with nicer features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="new-event-selection-box"><a href="https://github.com/PostHog/posthog/pull/2394">New Event Selection Box</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/events-box.png" alt="Events Box Screenshot"/></p><p>We upgraded our event selection box to include actions and events in one, as well as provide smarter recommendations of events and actions you might want to use of based frequently used in queries by you or your team.</p><h3 id="improvements-to-posthog-js"><a href="https://github.com/PostHog/posthog-js">Improvements to posthog-js</a></h3><p>A new version of <code>posthog-js</code> is available and we recommend you to update if you&#x27;ve installed it via <code>npm</code>. Snippet users have access to the latest version by default.</p><p>The new version includes a lot of bugfixes that improve our session recording feature, as well as is significantly lighter, having had <a href="https://github.com/PostHog/posthog-js/pull/128">a lot of legacy code removed</a>. </p><p>R.I.P. to the hundreds of lines of JavaScript that were removed - you will not be missed.</p><h3 id="apps-are-now-available-on-kubernetes-deployments"><a href="https://github.com/PostHog/charts/pull/24">Apps are now available on Kubernetes deployments</a></h3><p>Following feedback from a user, we have now added support for <a href="/docs/plugins/overview">PostHog Apps</a> to our Helm chart. </p><p>If you&#x27;re using the chart to deploy PostHog, upgrading to the latest version will give you access to the new app server (Beta).</p><h3 id="session-recording-improvements"><a href="https://github.com/PostHog/posthog/pulls?q=is%3Apr+is%3Aclosed+session">Session Recording Improvements</a></h3><p>Out of the many improvements to session recording, there are some worth mentioning specifically:</p><ul><li>Keyboard shortcuts for the session recording player (<code>spacebar</code> to pause/play, <code>f</code> to open player in full screen)</li><li>Ability to jump back/forward 8 seconds with the keyboard arrows (or player button)</li><li>Full-screen support for the session recording player without losing the controls bar</li><li>Pause/Play recording when clicking on the video</li><li>Skipping inactivity made clearer with an overlay over the player</li><li>The session recording player is now responsive to the client&#x27;s screen size</li><li>Incomplete session recordings (i.e. &quot;blank screens&quot;) are now hidden from the list </li></ul><h3 id="honorary-mention-requiring-curly-brackets"><a href="https://github.com/PostHog/posthog/pull/2505">Honorary Mention: Requiring Curly Brackets</a></h3><p>Our codebase now disallows bracket-less control structures, enforcing curly brackets on <code>if</code> statements for unbeatable readability. </p><p>As described by Michael, one of our engineers:</p><p><em>&quot;They don&#x27;t do anything, yet we thank them for their existence.&quot;</em></p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="favorite-issue">Favorite Issue</h2><h3 id="release-1180"><a href="https://github.com/PostHog/posthog/issues/2366">Release 1.18.0</a></h3><p>If you didn&#x27;t already know, in the interest of transparency, we plan our next releases openly on GitHub, so you can always keep up with what we&#x27;re up to during a release cycle.</p><h2 id="community-shoutouts">Community Shoutouts</h2><p>Big thanks to the following members of our community who have contributed to PostHog over this release cycle:</p><ul><li><a href="https://github.com/samcaspus">samcaspus</a></li><li><a href="https://github.com/satheesh1997">satheesh1997</a></li><li><a href="https://github.com/jessethegame">jessethegame</a></li><li><a href="https://github.com/adamb70">adamb70</a></li><li><a href="https://github.com/ngonik">ngonik</a></li><li><a href="https://github.com/hgezim">hgezim</a></li><li><a href="https://github.com/cpankajr">cpankajr</a></li><li><a href="https://github.com/brianetaveras">brianetaveras</a></li></ul><h2 id="open-roles">Open Roles</h2><p>Are you a Lead Designer or Fullstack Engineer? </p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog? </p><p><a href="https://posthog.com/careers">We want you!</a> </p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Update posthog-js to latest, use (undocumented) option _capture_metrics <a href="https://github.com/PostHog/posthog/pull/2561">#2561</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Cohort search bar fix <a href="https://github.com/PostHog/posthog/pull/2557">#2557</a> (<a href="https://github.com/samcaspus">samcaspus</a>)</li><li>Bump posthog-js 1.7.2 <a href="https://github.com/PostHog/posthog/pull/2555">#2555</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix posthog identify <a href="https://github.com/PostHog/posthog/pull/2552">#2552</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update posthog-js <a href="https://github.com/PostHog/posthog/pull/2551">#2551</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Show resolution + duration/date on session player <a href="https://github.com/PostHog/posthog/pull/2550">#2550</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix non-null assertion in SessionsPlayerDrawer.tsx <a href="https://github.com/PostHog/posthog/pull/2549">#2549</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Don&#x27;t show session recording play button if no FullSnapshot rrweb events <a href="https://github.com/PostHog/posthog/pull/2547">#2547</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Don&#x27;t toggle rows when viewing player <a href="https://github.com/PostHog/posthog/pull/2546">#2546</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Closes #2542 remove send event overlay and replace with warning <a href="https://github.com/PostHog/posthog/pull/2544">#2544</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Closes #2508 Fix cohort days <a href="https://github.com/PostHog/posthog/pull/2543">#2543</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Move away from ewap to speed up queries <a href="https://github.com/PostHog/posthog/pull/2540">#2540</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix Not all users have names <a href="https://github.com/PostHog/posthog/pull/2539">#2539</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>UI improvements to sessions page <a href="https://github.com/PostHog/posthog/pull/2538">#2538</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Removes legacy cloud billing from EE <a href="https://github.com/PostHog/posthog/pull/2537">#2537</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix redirecting to /persons after deleting user <a href="https://github.com/PostHog/posthog/pull/2533">#2533</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix flaky demo data test <a href="https://github.com/PostHog/posthog/pull/2530">#2530</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix linting errors broken on master <a href="https://github.com/PostHog/posthog/pull/2529">#2529</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Return person data together with session recording <a href="https://github.com/PostHog/posthog/pull/2528">#2528</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix /bin/tests <a href="https://github.com/PostHog/posthog/pull/2527">#2527</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Show which heroku processes are optional <a href="https://github.com/PostHog/posthog/pull/2526">#2526</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix celery heartbeat bug, Add redis &amp; apps to preflight <a href="https://github.com/PostHog/posthog/pull/2520">#2520</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Move redis status closer to other fields <a href="https://github.com/PostHog/posthog/pull/2519">#2519</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update posthog-js and posthog-react-rrweb-player <a href="https://github.com/PostHog/posthog/pull/2518">#2518</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Show session player icons as greyed out if visited <a href="https://github.com/PostHog/posthog/pull/2517">#2517</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Disable celery heartbeat, gossip and mingle <a href="https://github.com/PostHog/posthog/pull/2513">#2513</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Closes #2508 Fix cohorts sessions <a href="https://github.com/PostHog/posthog/pull/2512">#2512</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Increase sentry max string length by a lot <a href="https://github.com/PostHog/posthog/pull/2510">#2510</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix entity.py comment <a href="https://github.com/PostHog/posthog/pull/2507">#2507</a> (<a href="https://github.com/jessethegame">jessethegame</a>)</li><li>Update posthog-js to 1.7.0 beta-1 <a href="https://github.com/PostHog/posthog/pull/2506">#2506</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Require curly brackets around if statements <a href="https://github.com/PostHog/posthog/pull/2505">#2505</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>typo fix in changelog <a href="https://github.com/PostHog/posthog/pull/2504">#2504</a> (<a href="https://github.com/jamesefhawkins">jamesefhawkins</a>)</li><li>Hotfix: fix session recordings <a href="https://github.com/PostHog/posthog/pull/2502">#2502</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Make Plugins page a bit nicer <a href="https://github.com/PostHog/posthog/pull/2500">#2500</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Health endpoint to reflect migration status <a href="https://github.com/PostHog/posthog/pull/2498">#2498</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix various caching issues <a href="https://github.com/PostHog/posthog/pull/2496">#2496</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update PR template style and add Jest checklist item <a href="https://github.com/PostHog/posthog/pull/2495">#2495</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Disallow inviteless signup on initiated self-hosted instances <a href="https://github.com/PostHog/posthog/pull/2489">#2489</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Enhance webhook integration UX <a href="https://github.com/PostHog/posthog/pull/2488">#2488</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Refactor camelCase util with Jest tests <a href="https://github.com/PostHog/posthog/pull/2487">#2487</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add Table rowKey where missing and unify style <a href="https://github.com/PostHog/posthog/pull/2486">#2486</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Nest endpoints of project-based models under /api/project/ – LITE <a href="https://github.com/PostHog/posthog/pull/2485">#2485</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix organization/project creation when organization-/project-less <a href="https://github.com/PostHog/posthog/pull/2484">#2484</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Project Settings cleanup <a href="https://github.com/PostHog/posthog/pull/2483">#2483</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Reworked Teammates page <a href="https://github.com/PostHog/posthog/pull/2482">#2482</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Allow for duplicate invites <a href="https://github.com/PostHog/posthog/pull/2481">#2481</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>2094 too many distinct <a href="https://github.com/PostHog/posthog/pull/2480">#2480</a> (<a href="https://github.com/GalDayan">GalDayan</a>)</li><li>Session player page <a href="https://github.com/PostHog/posthog/pull/2479">#2479</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Refactor scene configuration logic <a href="https://github.com/PostHog/posthog/pull/2478">#2478</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Make note that webhook integration is unavailable for Cloud now <a href="https://github.com/PostHog/posthog/pull/2476">#2476</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix Heroku worker, part 2 <a href="https://github.com/PostHog/posthog/pull/2475">#2475</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>env variable for parallel cohorts <a href="https://github.com/PostHog/posthog/pull/2472">#2472</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Decrease parallel cohorts <a href="https://github.com/PostHog/posthog/pull/2471">#2471</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Use our own session recording player <a href="https://github.com/PostHog/posthog/pull/2470">#2470</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix Password Change <a href="https://github.com/PostHog/posthog/pull/2467">#2467</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix My Settings <a href="https://github.com/PostHog/posthog/pull/2465">#2465</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix cohort calculation <a href="https://github.com/PostHog/posthog/pull/2464">#2464</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix Feature Flags typo <a href="https://github.com/PostHog/posthog/pull/2463">#2463</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix feature flag not getting created with same team and key after deleting it <a href="https://github.com/PostHog/posthog/pull/2461">#2461</a> (<a href="https://github.com/satheesh1997">satheesh1997</a>)</li><li>Fix invalid date format for labels on Windows <a href="https://github.com/PostHog/posthog/pull/2456">#2456</a> (<a href="https://github.com/adamb70">adamb70</a>)</li><li>Don&#x27;t record session player <a href="https://github.com/PostHog/posthog/pull/2455">#2455</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Create DATABASE_URL if none found <a href="https://github.com/PostHog/posthog/pull/2454">#2454</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Show gradient on scrollable Select elements <a href="https://github.com/PostHog/posthog/pull/2453">#2453</a> (<a href="https://github.com/adamb70">adamb70</a>)</li><li>Docker nodejs support for plugins <a href="https://github.com/PostHog/posthog/pull/2452">#2452</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix plugin server url <a href="https://github.com/PostHog/posthog/pull/2451">#2451</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Remove <code>posthog.json</code> plugin support <a href="https://github.com/PostHog/posthog/pull/2449">#2449</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Feature flag table improvements <a href="https://github.com/PostHog/posthog/pull/2448">#2448</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix small typo on Project Settings view <a href="https://github.com/PostHog/posthog/pull/2443">#2443</a> (<a href="https://github.com/ngonik">ngonik</a>)</li><li>Fix cohorts stuck on empty querysets <a href="https://github.com/PostHog/posthog/pull/2441">#2441</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Use posthog-js 1.7.0-alpha.1 <a href="https://github.com/PostHog/posthog/pull/2440">#2440</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Hide Billing Toolbar from PostHog team <a href="https://github.com/PostHog/posthog/pull/2439">#2439</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix fetch single event clickhouse <a href="https://github.com/PostHog/posthog/pull/2436">#2436</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix filtering is not bool <a href="https://github.com/PostHog/posthog/pull/2435">#2435</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Redirect to manage billing view on app <a href="https://github.com/PostHog/posthog/pull/2434">#2434</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix aggregates clickhouse <a href="https://github.com/PostHog/posthog/pull/2432">#2432</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix StatsD errors on Windows <a href="https://github.com/PostHog/posthog/pull/2430">#2430</a> (<a href="https://github.com/adamb70">adamb70</a>)</li><li>Session recording: only check permitted domains if defined <a href="https://github.com/PostHog/posthog/pull/2429">#2429</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Bump posthog-js <a href="https://github.com/PostHog/posthog/pull/2427">#2427</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Create task definition for ECS <a href="https://github.com/PostHog/posthog/pull/2424">#2424</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Persons list refactor II <a href="https://github.com/PostHog/posthog/pull/2423">#2423</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add ee to docker ignore <a href="https://github.com/PostHog/posthog/pull/2422">#2422</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>create docker build action <a href="https://github.com/PostHog/posthog/pull/2419">#2419</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Persons list refactor <a href="https://github.com/PostHog/posthog/pull/2418">#2418</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Release 1.17.0 <a href="https://github.com/PostHog/posthog/pull/2417">#2417</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Remove unused dependencies <a href="https://github.com/PostHog/posthog/pull/2416">#2416</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix cohorts <a href="https://github.com/PostHog/posthog/pull/2415">#2415</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Refactor people &amp; users to persons <a href="https://github.com/PostHog/posthog/pull/2413">#2413</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix empty actions in cohorts <a href="https://github.com/PostHog/posthog/pull/2411">#2411</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Last 7 days instead of last week, closes #2408 <a href="https://github.com/PostHog/posthog/pull/2410">#2410</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add alt_host for graceful failover to our secondary clickhouse node <a href="https://github.com/PostHog/posthog/pull/2407">#2407</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Retention graph and multiple event fix <a href="https://github.com/PostHog/posthog/pull/2405">#2405</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix cohorts not being calculated <a href="https://github.com/PostHog/posthog/pull/2404">#2404</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix emojis with lz64 encoding <a href="https://github.com/PostHog/posthog/pull/2403">#2403</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add actions to sidebar <a href="https://github.com/PostHog/posthog/pull/2402">#2402</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix navigation with actions &amp; events <a href="https://github.com/PostHog/posthog/pull/2401">#2401</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Separate endpoint for session recording <a href="https://github.com/PostHog/posthog/pull/2398">#2398</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Use isoformat() for dates in Kafka WAL <a href="https://github.com/PostHog/posthog/pull/2396">#2396</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Combine events and actions into select box <a href="https://github.com/PostHog/posthog/pull/2394">#2394</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Event usage split clickhouse queries <a href="https://github.com/PostHog/posthog/pull/2388">#2388</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add feature flag filters and roll out percentage to main table <a href="https://github.com/PostHog/posthog/pull/2387">#2387</a> (<a href="https://github.com/GalDayan">GalDayan</a>)</li><li>Fix prop filter not formatting properly <a href="https://github.com/PostHog/posthog/pull/2386">#2386</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Organize logic <a href="https://github.com/PostHog/posthog/pull/2358">#2358</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Improve docker-compose-config experience <a href="https://github.com/PostHog/posthog/pull/2266">#2266</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Allow logged in users to join from invite <a href="https://github.com/PostHog/posthog/pull/2244">#2244</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix sessions on dashboard <a href="https://github.com/PostHog/posthog/pull/2214">#2214</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Separate Plugins dyno for Heroku <a href="https://github.com/PostHog/posthog/pull/2213">#2213</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Org/projects UX enhancements <a href="https://github.com/PostHog/posthog/pull/2145">#2145</a> (<a href="https://github.com/Twixes">Twixes</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.17.0]]></title><description><![CDATA[Having launched  major  features in our  previous release  such as  Session Recording  and  apps , over the past two weeks we worked extremely hard to…]]></description><link>https://posthog.com/blog/the-posthog-array-1-17-0</link><guid isPermaLink="false">a78679f2-5d0f-53f6-a945-12cbee5f6bb4</guid><pubDate>Tue, 17 Nov 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Having launched <strong>major</strong> features in our <a href="/blog/the-posthog-array-1-16-0">previous release</a> such as <a href="/docs/user-guides/recordings">Session Recording</a> and <a href="/apps">apps</a>, over the past two weeks we worked extremely hard to improve PostHog&#x27;s UX, enhance the new Beta features, and fix a bunch of bugs.  </p><p>You&#x27;ll notice PostHog feels much nicer to use and that&#x27;s largely in part to all the feedback we&#x27;ve received from our users, so thank you and keep the suggestions coming!</p><h2 id="release-notes">Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience with nicer features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="sentry-integration"><a href="https://github.com/PostHog/posthog/pull/1833">Sentry Integration</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/sentry.png" alt="Sentry Screenshot"/></p><p>An important part of developing a great user experience is identifying, tracking, and fixing bugs. </p><p>With our new <a href="https://sentry.io/">Sentry</a> integration, you can leverage PostHog data to help your debugging, and Sentry exception data to track relevant UX metrics. As a two-way integration, it:</p><ul><li>Adds a direct link in Sentry to the profile of the person affected in PostHog</li><li>Sends an <code>$exception</code> event to PostHog with a direct link to Sentry</li></ul><p>If you&#x27;re unfamiliar with Sentry, we highly recommend you to check it out - it is an awesome application monitoring platform of which we&#x27;re avid users at PostHog.</p><p><em>Update Aug 4, 2025: This integration has been deprecated.</em></p><h3 id="rudderstack-integration"><a href="https://docs.rudderstack.com/destinations/posthog">RudderStack Integration</a></h3><p>RudderStack is an open-source, warehouse-first, customer data platform for developers. It allows you to collect and deliver customer event data to a variety of destinations such as data warehouses and analytics platforms.</p><p>As of last week, PostHog is now available as a destination on RudderStack, allowing you to send your event data from various sources into PostHog for performing product analytics. </p><p>You can read more about RudderStack on <a href="https://rudderstack.com/">their website</a>, and learn how to integrate PostHog through their <a href="https://docs.rudderstack.com/destinations/posthog">comprehensive integration docs</a>. </p><h3 id="app-attachments-and-geoip-plugin"><a href="https://github.com/PostHog/posthog/pull/2263">App Attachments and GeoIP Plugin</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/maxmind-plugin.png" alt="MaxMind App Page Screenshot"/></p><p>Over the past two weeks, our <a href="/docs/plugins/overview">Apps</a> feature was extensively worked on to improve the experience of using and developing apps for PostHog. </p><p>One of the main changes was the addition of app attachments, which allow you to upload files that are used in the configuration of the app, vastly expanding the realm of possibilities of what apps can do. </p><p>As a result of this, we built the <a href="https://github.com/PostHog/maxmind-plugin">PostHog MaxMind App</a>, leveraging attachments to allow GeoIP data to be used for enriching your events. Once configured, the app adds IP-based location information as properties on your events, such as what country and city your users are located in, making it possible to create charts and tables filtered based on the location of your users.</p><blockquote><p><strong>Note:</strong> Apps are currently only available on self-hosted instances. If you&#x27;re self-hosting and want to use the PostHog MaxMind App, please follow <a href="https://github.com/PostHog/maxmind-plugin">these instructions</a>. If you want to build your own apps, check out our <a href="/docs/apps/build">fresh new guide</a> on how to do so.</p></blockquote><h3 id="retentions--paths-dashboard-panels"><a href="https://github.com/PostHog/posthog/pull/2201">Retentions &amp; Paths Dashboard Panels</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/retention-panel.png" alt="Retention Panel Screenshot"/></p><p>Dashboards are a key part of PostHog, so it&#x27;s important to us that you can have an overview of as many as possible of your metrics in them.</p><p>As such, the user paths graph and the retention table can now be added as panels on dashboards, making it so that every single chart, table, funnel, and graph you create in PostHog can make it to your dashboards now. </p><h3 id="first-time-retention"><a href="https://github.com/PostHog/posthog/pull/2325">First Time Retention</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/first-time-retention.png" alt="First Time Retention Screenshot"/></p><p>Following some feedback from our own Growth Engineer on what functionality we need for ourselves at PostHog, we have now extended the functionality of our &#x27;Retention&#x27; view, adding first time retention and differentiating between &#x27;Cohortizing&#x27; and &#x27;Retaining&#x27; events.</p><p>In short, first time retention cohortizes users based on when they did an event for the <strong>first time</strong>, rather than adding a user to each cohort they had the event in. Additionally, by being able to have different target events for the cohort and the retention, you are able to track the impact of &#x27;Event A&#x27; on the retention of &#x27;Event B&#x27;, exploring hypotheses such as how users who read your documentation retain on product pageviews when compared to other users.</p><h3 id="new-events--actions-view"><a href="https://github.com/PostHog/posthog/pull/2319">New Events &amp; Actions View</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/manage-events.png" alt="Manage Events View Screenshot"/></p><p>In an effort to make it easier to filter through your events in PostHog and tag events that you find useful, we have now consolidated &#x27;Events&#x27; and &#x27;Actions&#x27; into one single view, found on the left sidebar as &#x27;Events &amp; Actions&#x27;.</p><p>On this page, you&#x27;ll be able to manage everything related to your events, from inspecting their properties, to tagging them as actions. In addition, we have also added stats for your event and property volumes, so you can dig deeper into your analytics data collection, and optimize it to your needs.</p><h3 id="improved-aws-cloudformation-deployment"><a href="https://github.com/PostHog/deployment/pulls?q=is%3Apr+is%3Aclosed">Improved AWS CloudFormation Deployment</a></h3><p>Following a lot of great user feedback, we have now significantly improved our <a href="/docs/self-host/deploy/aws">AWS CloudFormation Deployment</a>.</p><p>We have now added configuration for relevant alerts and RDS disk size, as well as improved the setup flow and added automatic <code>SECRET_KEY</code> generation. If you&#x27;re happy with the standard config, deploying with AWS is now just a matter of &quot;click, click, click&quot;, as described by Karl, one of our engineers.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="favorite-issue">Favorite Issue</h2><h3 id="epic-retention"><a href="https://github.com/PostHog/posthog/issues/2228">EPIC: Retention</a></h3><p>A roadmap for various retention improvements that will significantly increase the power of PostHog&#x27;s retention functionality.</p><h2 id="posthog-news">PostHog News</h2><p>Our community continues to be as awesome as ever, providing valuable feedback and helping out with issues, pull requests, and discussions on <a href="/posts">our community page</a>.</p><p>This week, we want to give a special shoutout to <a href="https://github.com/adamb70">Adam</a>, who got 2 PRs merged and wrote an article about integrating PostHog on their website. </p><p>Check it out: <a href="https://boaler.uk/posts/valuing-user-privacy-posthog/">Valuing user privacy — PostHog Analytics</a></p><h2 id="open-roles">Open Roles</h2><p>Are you a Lead Designer, Fullstack Engineer, or Recruiter? </p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog? </p><p><a href="https://posthog.com/careers">We want you!</a> </p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the highlights listed above, we also merged a bunch of PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Fix Cohorts <a href="https://github.com/PostHog/posthog/pull/2145">#2415</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix heroku image <a href="https://github.com/PostHog/posthog/pull/2414">#2414</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix cohorts not being calculated <a href="https://github.com/PostHog/posthog/pull/2404">#2404</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix navigation with actions &amp; events <a href="https://github.com/PostHog/posthog/pull/2401">#2401</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Minor fix: remove repeated code <a href="https://github.com/PostHog/posthog/pull/2399">#2399</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Toolbar .less styles fix <a href="https://github.com/PostHog/posthog/pull/2392">#2392</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Use cloud billing engine <a href="https://github.com/PostHog/posthog/pull/2379">#2379</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Remove crontab manage events <a href="https://github.com/PostHog/posthog/pull/2372">#2372</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Increase action step url max length. Closes #2348 <a href="https://github.com/PostHog/posthog/pull/2369">#2369</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Refactor sceneLogic to TypeScript and add dynamic page title <a href="https://github.com/PostHog/posthog/pull/2361">#2361</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Watch person and person_distinct_id tables for lag <a href="https://github.com/PostHog/posthog/pull/2360">#2360</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Persist database after docker-compose down <a href="https://github.com/PostHog/posthog/pull/2359">#2359</a> (<a href="https://github.com/adamb70">adamb70</a>)</li><li>Adds features to cloud plans <a href="https://github.com/PostHog/posthog/pull/2357">#2357</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add missing copy over in dev.dockerfile for new config <a href="https://github.com/PostHog/posthog/pull/2356">#2356</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Added Revenue Data Generator <a href="https://github.com/PostHog/posthog/pull/2355">#2355</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Closes #2347 Fix shared dashboards <a href="https://github.com/PostHog/posthog/pull/2351">#2351</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Run E2E tests without celery <a href="https://github.com/PostHog/posthog/pull/2344">#2344</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add events table row count to metrics <a href="https://github.com/PostHog/posthog/pull/2343">#2343</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix doubled up slack hook <a href="https://github.com/PostHog/posthog/pull/2340">#2340</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Trends consolidation <a href="https://github.com/PostHog/posthog/pull/2339">#2339</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Implement missing person datapoint on breakdown <a href="https://github.com/PostHog/posthog/pull/2338">#2338</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix &#x27;Found 99 users&#x27; when there are more <a href="https://github.com/PostHog/posthog/pull/2330">#2330</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix day interval for people <a href="https://github.com/PostHog/posthog/pull/2328">#2328</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix Hidden Properties Display State <a href="https://github.com/PostHog/posthog/pull/2326">#2326</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix OR generation and deletion in cohort page <a href="https://github.com/PostHog/posthog/pull/2324">#2324</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix gray bar under preflight <a href="https://github.com/PostHog/posthog/pull/2323">#2323</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix local static file host on Windows <a href="https://github.com/PostHog/posthog/pull/2321">#2321</a> (<a href="https://github.com/adamb70">adamb70</a>)</li><li>Handle intervals don&#x27;t rely on date_to for people <a href="https://github.com/PostHog/posthog/pull/2317">#2317</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Cache cohorts from clickhouse / make /decide fast <a href="https://github.com/PostHog/posthog/pull/2316">#2316</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Make sure properties filter on breakdown <a href="https://github.com/PostHog/posthog/pull/2315">#2315</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix: Add default to params <a href="https://github.com/PostHog/posthog/pull/2314">#2314</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Closes #2283 fix heatmap <a href="https://github.com/PostHog/posthog/pull/2309">#2309</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fixes email invite link <a href="https://github.com/PostHog/posthog/pull/2307">#2307</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Closes #2286 remove restrict signups <a href="https://github.com/PostHog/posthog/pull/2304">#2304</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Remove Live Actions Altogether <a href="https://github.com/PostHog/posthog/pull/2303">#2303</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Add option to print clickhouse SQL to terminal <a href="https://github.com/PostHog/posthog/pull/2302">#2302</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Basic caching for ClickHouse to redis <a href="https://github.com/PostHog/posthog/pull/2300">#2300</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix cohort query missing filters <a href="https://github.com/PostHog/posthog/pull/2299">#2299</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix person created at <a href="https://github.com/PostHog/posthog/pull/2288">#2288</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Updated rrweb block class <a href="https://github.com/PostHog/posthog/pull/2279">#2279</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix Asterisk in action selector <a href="https://github.com/PostHog/posthog/pull/2277">#2277</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix actions grouping by OR <a href="https://github.com/PostHog/posthog/pull/2276">#2276</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add tooltip to session recording, kill feature flag <a href="https://github.com/PostHog/posthog/pull/2275">#2275</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Add data-attr to session recording toggle <a href="https://github.com/PostHog/posthog/pull/2272">#2272</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Improve instance status report <a href="https://github.com/PostHog/posthog/pull/2271">#2271</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Optimize @cached_function <a href="https://github.com/PostHog/posthog/pull/2270">#2270</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Make debug bar tricolor again and fix its text color outside of SPA <a href="https://github.com/PostHog/posthog/pull/2269">#2269</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Possibly optimize action finding <a href="https://github.com/PostHog/posthog/pull/2267">#2267</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix people filtering with entity filters <a href="https://github.com/PostHog/posthog/pull/2265">#2265</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Don&#x27;t reload sessions on closing player <a href="https://github.com/PostHog/posthog/pull/2261">#2261</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Invite team member on sidebar <a href="https://github.com/PostHog/posthog/pull/2259">#2259</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix team leakge in count <a href="https://github.com/PostHog/posthog/pull/2257">#2257</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Make local events table work with proto from kafka <a href="https://github.com/PostHog/posthog/pull/2254">#2254</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Add ee webhooks to celery paths <a href="https://github.com/PostHog/posthog/pull/2250">#2250</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>1999 improve feature flag ux <a href="https://github.com/PostHog/posthog/pull/2243">#2243</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Maximize resuability between ch retention and pg retention <a href="https://github.com/PostHog/posthog/pull/2241">#2241</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update changelog, mention npm requirement for session recording <a href="https://github.com/PostHog/posthog/pull/2240">#2240</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Update rrweb, posthog-js dependencies <a href="https://github.com/PostHog/posthog/pull/2239">#2239</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Navigation 1775 <a href="https://github.com/PostHog/posthog/pull/2238">#2238</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Make sure instance status page loads on AWS <a href="https://github.com/PostHog/posthog/pull/2237">#2237</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix actions count clickhouse <a href="https://github.com/PostHog/posthog/pull/2234">#2234</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Make tiny adjustments to the changelog <a href="https://github.com/PostHog/posthog/pull/2233">#2233</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Log web access in docker <a href="https://github.com/PostHog/posthog/pull/2230">#2230</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Disable server side cursors for PGBouncer <a href="https://github.com/PostHog/posthog/pull/2229">#2229</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Avoid running cronjobs many times a day <a href="https://github.com/PostHog/posthog/pull/2226">#2226</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Monitor clickhouse lag on cloud <a href="https://github.com/PostHog/posthog/pull/2225">#2225</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Enable email on localhost by default <a href="https://github.com/PostHog/posthog/pull/2222">#2222</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Fix flaky person test <a href="https://github.com/PostHog/posthog/pull/2221">#2221</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Updated readme with heatmaps mention <a href="https://github.com/PostHog/posthog/pull/2218">#2218</a> (<a href="https://github.com/jamesefhawkins">jamesefhawkins</a>)</li><li>Prettier write instead of check <a href="https://github.com/PostHog/posthog/pull/2215">#2215</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix sessions on dashboard <a href="https://github.com/PostHog/posthog/pull/2214">#2214</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Remove feature flags on clickhouse endpoints <a href="https://github.com/PostHog/posthog/pull/2212">#2212</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add timing for event endpoint <a href="https://github.com/PostHog/posthog/pull/2211">#2211</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Skip celery for ee path <a href="https://github.com/PostHog/posthog/pull/2210">#2210</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix: improve the accessibility <a href="https://github.com/PostHog/posthog/pull/2206">#2206</a> (<a href="https://github.com/weyert">weyert</a>)</li><li>Optionally log to Kafka for WAL <a href="https://github.com/PostHog/posthog/pull/2205">#2205</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Plugins via NPM <a href="https://github.com/PostHog/posthog/pull/2204">#2204</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>ClickHouse dont run caching/cohort <a href="https://github.com/PostHog/posthog/pull/2200">#2200</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Possibly fix org signup by fixing analytics <a href="https://github.com/PostHog/posthog/pull/2199">#2199</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Optimize commandPaletteLogic <a href="https://github.com/PostHog/posthog/pull/2193">#2193</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Remove some seemingly unused requirements and use pip-compile <a href="https://github.com/PostHog/posthog/pull/2192">#2192</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix suggestion loading error <a href="https://github.com/PostHog/posthog/pull/2191">#2191</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Update Django from 3.0.7 to 3.0.11 (and Django-related packages) <a href="https://github.com/PostHog/posthog/pull/2190">#2190</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Center align retention values <a href="https://github.com/PostHog/posthog/pull/2189">#2189</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update sentry-sdk from 0.16.5 to 0.19.2 <a href="https://github.com/PostHog/posthog/pull/2188">#2188</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Handle ChunkLoadError better <a href="https://github.com/PostHog/posthog/pull/2187">#2187</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Restore slack hook <a href="https://github.com/PostHog/posthog/pull/2186">#2186</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Update local dev to use proto for events <a href="https://github.com/PostHog/posthog/pull/2181">#2181</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix Sentry issue POSTHOG-13K <a href="https://github.com/PostHog/posthog/pull/2180">#2180</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Ignore sentry error about mis-matched timezones for now <a href="https://github.com/PostHog/posthog/pull/2174">#2174</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix feature flags clickhouse <a href="https://github.com/PostHog/posthog/pull/2170">#2170</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Simplify action queries <a href="https://github.com/PostHog/posthog/pull/2167">#2167</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>New UI <a href="https://github.com/PostHog/posthog/pull/2114">#2114</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Send invite over email if possible <a href="https://github.com/PostHog/posthog/pull/2112">#2112</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Save session player speed in localstorage <a href="https://github.com/PostHog/posthog/pull/2110">#2110</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Improve weekly report testing <a href="https://github.com/PostHog/posthog/pull/2014">#2014</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Run posthog-production CI in a way testing migration continuity <a href="https://github.com/PostHog/posthog/pull/1863">#1863</a> (<a href="https://github.com/Twixes">Twixes</a>)</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.16.0]]></title><description><![CDATA[Following our largest release to date, we are now back on a more regular release schedule. And, given that scalability was the focus of the previous…]]></description><link>https://posthog.com/blog/the-posthog-array-1-16-0</link><guid isPermaLink="false">bfcb6657-e737-5b43-96c3-ea6dbcdf1b76</guid><pubDate>Wed, 04 Nov 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Following our largest release to date, we are now back on a more regular release schedule. And, given that scalability was the focus of the previous release, we thought it was time for some fresh new features. </p><p>So, without further ado, here they are:</p><h2 id="release-notes">Release Notes</h2><blockquote><p>If you&#x27;re self-hosting and want to upgrade for a better experience with nicer features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p></blockquote><h3 id="session-recording-beta"><a href="https://github.com/PostHog/posthog/issues/1846">Session Recording (Beta)</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/session-recording.png" alt="Session Recording Page Screenshot"/></p><p>Given that our mission at PostHog is to increase the number of successful projects in the world, session recording felt like a feature that fits in perfectly with that goal.</p><p>PostHog already provides various features to help you understand and improve your UX - but watching real users use your product is a <em>whole other ball game</em>. </p><p>With PostHog&#x27;s session recording, you are able to truly feel the pain points of your users first-hand, seeing where they get stuck, debugging exceptions faster, and making your UX smoother. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/session-recording-ss.png" alt="Session Recording Screenshot"/></p><p>Additionally, you can do so while still preserving the privacy of your users, by determining what shouldn&#x27;t be captured, as well as being able to turn session recording on and off as you wish.</p><p>However, please note that our session recording feature is in <strong>Beta</strong> at the moment. This means that it can be unstable and have bugs. To report bugs you find while using it, please <a href="https://github.com/PostHog/posthog/issues">open an issue for us on GitHub</a>. </p><h3 id="apps-beta"><a href="https://github.com/PostHog/posthog/issues/1896">Apps (Beta)</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/plugins.png" alt="Apps Screenshot"/></p><p>Apps is another <strong>Beta</strong> feature that we&#x27;re extremely excited for. Currently only available for self-hosted instances, apps allow you to add additional logic to your event processing pipeline, in order to do things like enrich your data or send it somewhere else, like a data warehouse. </p><p>At the moment, we have created a few example apps for you to test out the functionality, and have the intention of launching more for the next release. We will also be launching tutorials on how to make your own apps, so stay tuned for that.</p><p>As of right now, if you&#x27;re on a self-hosted instance, you should head over to &#x27;Project&#x27; -&gt; &#x27;Apps&#x27; to enable the functionality. You can start testing it out with our &quot;Hello World&quot; app, which adds a property to your events called <code>foo</code> with a value that is up to you to decide in setup. </p><p>We also have built apps for currency normalization and GeoIP data, allowing you to convert currency values in events according to up-to-date exchange rates and determine the location of an event based on the user&#x27;s IP.</p><p>Our overall vision for apps is to enable seamless integration with other relevant developer platforms, as well as allow users to more easily customize PostHog&#x27;s functionality by adding their own logic and data to the event pipeline.</p><p>Finally, as is the case with session recording, please report any bugs in the functionality on <a href="https://github.com/PostHog/posthog/issues">GitHub</a>.</p><h3 id="multiple-projects"><a href="https://github.com/PostHog/posthog/pull/1562">Multiple Projects</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/org-project.png" alt="Multiple Projects Screenshot"/></p><p>You asked and we delivered!</p><p>As per feedback from many in our community, PostHog now offers support for managing multiple projects under one &quot;umbrella&quot; organization. </p><p>This allows you to segregate concerns, such as keeping tracking for your dev and prod environments separately, as well as track multiple domains and apps without mixing data.  </p><p>In addition, we also enhanced our invite and permissioning system as a by-product of this feature. </p><p>As this is an Enterprise Edition feature, please <a href="/talk-to-a-human">contact us</a>_ if you are interested in using it.</p><h3 id="dashboard-templates"><a href="https://github.com/PostHog/posthog/pull/1942">Dashboard Templates</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/dashboard-template.png" alt="Dashboard Templates Screenshot"/></p><p>In order to make it easier to create valuable dashboards to keep track of your business metrics, PostHog now offers the option to create new dashboards based on a template. We will be expanding the power of dashboard templates, but, as of right now, you can already create a dashboard using our web app dashboard template, which provides you with a good starting point for determining and tracking relevant metrics.</p><h3 id="setup-improvements"><a href="https://github.com/PostHog/posthog/pull/1990">Setup Improvements</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/google-login.png" alt="Google Login Screenshot"/></p><p>In addition to GitHub and GitLab authentication, PostHog now supports signup and login with Google accounts! </p><p>We also improved our setup process by better structuring our settings pages, allowing you to <a href="https://github.com/PostHog/posthog/pull/2015">change your project&#x27;s token</a>, and <a href="https://github.com/PostHog/posthog/pull/2068">enhancing the UX for empty states on dashboards</a>.</p><h3 id="documentation-level-up"><a href="https://github.com/PostHog/posthog.com">Documentation Level Up</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/docs.png" alt="Docs Screenshot"/></p><p>We have been working hard to improve our product documentation and had a few big upgrades recently:</p><ul><li>Our Docs now have a Dark Mode option</li><li>You can search our entire documentation without ever using your mouse</li><li>We are actively releasing new tutorials on how to use PostHog to track key metrics and improve your product</li><li>Our Docs pages now load faster</li><li>New screenshots have been added throughout the Docs, as well as functionality walkthrough videos</li></ul><p>...and a lot more!</p><p>If you have any suggestions for new tutorials or improvements to our documentation, <a href="https://github.com/PostHog/posthog.com/issues">do not hesitate to let us know!</a></p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the main features mentioned above, we also merged multiple PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Retention UX fixes <a href="https://github.com/PostHog/posthog/pull/2168">#2168</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Simplify action queries <a href="https://github.com/PostHog/posthog/pull/2167">#2167</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Prune person materialized <a href="https://github.com/PostHog/posthog/pull/2166">#2166</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Switch to the official Heroku Python buildpack <a href="https://github.com/PostHog/posthog/pull/2151">#2151</a> (<a href="https://github.com/edmorley">edmorley</a>)</li><li>Slim down dev docker image <a href="https://github.com/PostHog/posthog/pull/2147">#2147</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>ClickHouse binary capture <a href="https://github.com/PostHog/posthog/pull/2146">#2146</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix funnel loading and other UX issues <a href="https://github.com/PostHog/posthog/pull/2134">#2134</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix elements chain with bad classes <a href="https://github.com/PostHog/posthog/pull/2133">#2133</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix social auth account creation <a href="https://github.com/PostHog/posthog/pull/2123">#2123</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Flatten array and check length for actions <a href="https://github.com/PostHog/posthog/pull/2120">#2120</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>[ClickHouse] speed up sessions list <a href="https://github.com/PostHog/posthog/pull/2118">#2118</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix for action/event dropdown <a href="https://github.com/PostHog/posthog/pull/2117">#2117</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Make DELETE synchronous in clickhouse tests / make tests less flaky <a href="https://github.com/PostHog/posthog/pull/2116">#2116</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Capture social_create_user exception with Sentry <a href="https://github.com/PostHog/posthog/pull/2115">#2115</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Clarify invite creation <a href="https://github.com/PostHog/posthog/pull/2113">#2113</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>[ClickHouse] More speed optimizations for funnels <a href="https://github.com/PostHog/posthog/pull/2109">#2109</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix changelog images <a href="https://github.com/PostHog/posthog/pull/2105">#2105</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Debug redis leak <a href="https://github.com/PostHog/posthog/pull/2102">#2102</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>ClickHouse improve funnel speed <a href="https://github.com/PostHog/posthog/pull/2100">#2100</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Reduce Heroku worker thread count <a href="https://github.com/PostHog/posthog/pull/2092">#2092</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Wire up the length to the proto message <a href="https://github.com/PostHog/posthog/pull/2089">#2089</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Start with a new topic <a href="https://github.com/PostHog/posthog/pull/2088">#2088</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Provide required proto message length for our clickhouse overlords <a href="https://github.com/PostHog/posthog/pull/2087">#2087</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>ClickHouse window funnel <a href="https://github.com/PostHog/posthog/pull/2086">#2086</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Protobufize events to protect from malformed JSON <a href="https://github.com/PostHog/posthog/pull/2085">#2085</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>#2083 Ignore result <a href="https://github.com/PostHog/posthog/pull/2084">#2084</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add CH Person Sessions By Day <a href="https://github.com/PostHog/posthog/pull/2082">#2082</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix bin/tests too many files watching error <a href="https://github.com/PostHog/posthog/pull/2078">#2078</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix retention label and add tests <a href="https://github.com/PostHog/posthog/pull/2076">#2076</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Make possible CI optimizations <a href="https://github.com/PostHog/posthog/pull/2074">#2074</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Attempt to speed up 3.9 tests <a href="https://github.com/PostHog/posthog/pull/2073">#2073</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix cypress tests <a href="https://github.com/PostHog/posthog/pull/2070">#2070</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Give staff users superuser permissions <a href="https://github.com/PostHog/posthog/pull/2069">#2069</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix loading people and stickiness <a href="https://github.com/PostHog/posthog/pull/2067">#2067</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Improved settings for session recording <a href="https://github.com/PostHog/posthog/pull/2066">#2066</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix History button layout in Insights <a href="https://github.com/PostHog/posthog/pull/2065">#2065</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fixes bad timerange for retentino <a href="https://github.com/PostHog/posthog/pull/2064">#2064</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Autoimport celery tasks <a href="https://github.com/PostHog/posthog/pull/2062">#2062</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Limit ingestion for teams <a href="https://github.com/PostHog/posthog/pull/2060">#2060</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>ClickHouse never calculate action <a href="https://github.com/PostHog/posthog/pull/2059">#2059</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Bump cryptography from 2.9 to 3.2 <a href="https://github.com/PostHog/posthog/pull/2058">#2058</a> (<a href="https://github.com/apps/dependabot">dependabot[bot]</a>)</li><li>ClickHouse move to JSON extract for all filters <a href="https://github.com/PostHog/posthog/pull/2056">#2056</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix cohorts clickhouse <a href="https://github.com/PostHog/posthog/pull/2052">#2052</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix flaky test <a href="https://github.com/PostHog/posthog/pull/2048">#2048</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Upgrade kea-router and typegen <a href="https://github.com/PostHog/posthog/pull/2044">#2044</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Use jsonextract for steps in funnel query <a href="https://github.com/PostHog/posthog/pull/2040">#2040</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Use uuids in funnels for consistency <a href="https://github.com/PostHog/posthog/pull/2036">#2036</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>[ClickHouse] fix events for action with no steps <a href="https://github.com/PostHog/posthog/pull/2035">#2035</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix funnels with multiple property filters <a href="https://github.com/PostHog/posthog/pull/2034">#2034</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Restore original retention query <a href="https://github.com/PostHog/posthog/pull/2029">#2029</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Filter person_distinct_id table further before joining <a href="https://github.com/PostHog/posthog/pull/2028">#2028</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix typescript errors #1 <a href="https://github.com/PostHog/posthog/pull/2027">#2027</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Remove useless User.is_superuser <a href="https://github.com/PostHog/posthog/pull/2026">#2026</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Get rid of Py 3.7-incompatible typing.Literal <a href="https://github.com/PostHog/posthog/pull/2025">#2025</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update person property filtering <a href="https://github.com/PostHog/posthog/pull/2024">#2024</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add eslint rule for empty JSX elements <a href="https://github.com/PostHog/posthog/pull/2023">#2023</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Fix click outside spam &amp; public paths <a href="https://github.com/PostHog/posthog/pull/2022">#2022</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>[ClickHouse] Fix action filtering on events <a href="https://github.com/PostHog/posthog/pull/2013">#2013</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add types to window.posthog <a href="https://github.com/PostHog/posthog/pull/2012">#2012</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Rename existing projects to &quot;Default Project&quot; <a href="https://github.com/PostHog/posthog/pull/2009">#2009</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Enable compatibility with old Team signup links <a href="https://github.com/PostHog/posthog/pull/2007">#2007</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add tests to important query builders <a href="https://github.com/PostHog/posthog/pull/2006">#2006</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Put organization switcher under user <a href="https://github.com/PostHog/posthog/pull/2005">#2005</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix links <a href="https://github.com/PostHog/posthog/pull/2004">#2004</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Cohorts Test <a href="https://github.com/PostHog/posthog/pull/2003">#2003</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Patch broken link from changed path <a href="https://github.com/PostHog/posthog/pull/2002">#2002</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix cohort page link <a href="https://github.com/PostHog/posthog/pull/2000">#2000</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Break down feature_flag_response and add to propertykeyinfo <a href="https://github.com/PostHog/posthog/pull/1991">#1991</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Make PostHog compatible with Python 3.9 <a href="https://github.com/PostHog/posthog/pull/1987">#1987</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Use posthog.js correctly in userLogic <a href="https://github.com/PostHog/posthog/pull/1975">#1975</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>[ClickHouse] Fix grabbing by person <a href="https://github.com/PostHog/posthog/pull/1960">#1960</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add new person materialized <a href="https://github.com/PostHog/posthog/pull/1944">#1944</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li></ul><h2 id="favorite-issue">Favorite Issue</h2><h3 id="apps-epic"><a href="https://github.com/PostHog/posthog/issues/1896">Apps Epic</a></h3><p>Originally built over the span of a few days at an internal hackathon, our apps feature has since undergone massive refactors and improvements. </p><p>As a result, the linked issue has the following gem, as well as an in-depth discussion (AKA monologue) about the implementation, which is extremely informative:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/gallery-failed.png" alt="Gallery Failed Apps"/></p><h2 id="posthog-news">PostHog News</h2><p>Charles joined our ops team to fix anything and everything that has ever been broken at PostHog. Akin to a mythical creature, he puts out fires on our ops roadmap, handles our Fax division, and even submits pull requests.</p><p>Even more importantly, pineapples are 404 on Charles&#x27; pizzas, making him an illustrious member of the &quot;common sense&quot; group of the PostHog core team. The number of people who appreciate a good pizza has now decidedly surpassed the number of Estonians in the company (3-2).</p><h2 id="open-roles">Open Roles</h2><p>Are you a Designer or Fullstack Engineer? </p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog? </p><p><a href="https://posthog.com/careers">We want you!</a> </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.15.0]]></title><description><![CDATA[Hey there! It's been a while... With our last release being over a month ago, this new release has the largest changelog to date, with 175 PRs merged…]]></description><link>https://posthog.com/blog/the-posthog-array-1-15-0</link><guid isPermaLink="false">971bbe8b-ee33-56bc-af6d-75292598ebef</guid><pubDate>Thu, 15 Oct 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Hey there! It&#x27;s been a while...</p><p>With our last release being over a month ago, this new release has the largest changelog to date, with 175 PRs merged to <code>master</code> since the last time you heard from us.</p><p>However, there is method to the madness: PostHog is now <strong>super scalable</strong>. </p><p>We&#x27;ve been working hard on making PostHog faster and more efficient, and we&#x27;re happy to announce that our Enterprise Edition is now able to handle massive volumes without breaking a sweat. </p><p>So let&#x27;s get into it: what does super scalable mean and what else did we do since the last release?</p><h2 id="release-notes">Release Notes</h2><h3 id="clickhouse-"><a href="https://github.com/PostHog/posthog/pulls?page=1&amp;q=is%3Apr+clickhouse+is%3Aclosed">ClickHouse 👆🏠</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/clickhouse.png" alt="ClickHouse Screenshot"/></p><small class="centered">_A ClickHouse query completing in a fifth of a second (Click image to expand)_</small><p>If you&#x27;ve followed our progress on GitHub over the past months, you&#x27;ll know that ClickHouse has been the talk of the town.</p><p>In their own words, ClickHouse is &quot;a column-oriented database management system (DBMS) for online analytical processing of queries (OLAP)&quot;. </p><p>Or, in simple terms: it&#x27;s a <strong>very fast database</strong>.</p><p>As you may know, we have been using the well-established and reliable PostgreSQL until now, but from here on out our Enterprise Edition will be using ClickHouse instead. PostgreSQL remains a great option for lower volumes, but, for companies that handle huge event volumes, ClickHouse is a much better choice. </p><p>On our cloud version we handle event numbers in the nine figures, and implementing ClickHouse has drastically reduced the execution time for all of our queries. </p><p>If you&#x27;re interested in using PostHog with ClickHouse, send us an email at <a href="/talk-to-a-human">contact us</a> to find out more.</p><h3 id="command-palette"><a href="https://github.com/PostHog/posthog/pull/1819">Command Palette</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/command-palette.png" alt="Command Palette Screenshot"/></p><br/><p>We&#x27;re super excited about this. </p><p>Last week we did an internal hackathon and the command palette was one of the awesome projects to come out of it.</p><p>Now, when using PostHog, you can press <code>⌘K</code> (Mac) or <code>Ctrl + K</code> (Windows) to reveal a Spotlight or Superhuman-like command palette that lets you navigate around PostHog mouse-less. In addition to navigation, the command palette also has page-specific commands that let you, for example, change the time range on charts, as well as a way to quickly share feedback with the PostHog team, create an API key, or even do some math with the built-in calculator. </p><p>Eric, Michael, and Paolo got this done in just a few days, and we love it. </p><p>Stay tuned for more exciting features that were built during the hackathon.</p><h3 id="backend-feature-flags"><a href="https://github.com/PostHog/posthog-python/pull/9">Backend Feature Flags</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/backend-flags.png" alt="Backend Feature Flags Code"/></p><p>Based on community feedback, we made it easier for feature flags to be integrated with your backend, in addition to our frontend JavaScript implementation.</p><p>We&#x27;ve added feature flag support to our <a href="https://github.com/PostHog/posthog-python/pull/9">Python Library</a>, as well as <a href="https://github.com/PostHog/posthog/pull/1592">improved the <code>/flags</code> endpoint</a> used by feature flags to make the API experience better.</p><p>We have ourselves been using feature flags with the Python Library to slowly roll out some exciting new features. </p><h3 id="weekly-report-email"><a href="https://github.com/PostHog/posthog/pull/1700">Weekly Report Email</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/array/weekly-email.png" alt="Weekly Email Screenshot"/></p><p>To help users keep up with their key metrics in a simple way, we have introduced a weekly email that gives you an overview of your active and churned users over the previous week.</p><p>This is in Beta mode and we&#x27;re expanding its capabilities, but it already gives you a good sense of your performance in terms of users. </p><p>Have you gotten your weekly report yet? </p><h3 id="were-taking-part-in-hacktoberfest-2020"><a href="/blog/hacktoberfest-2020">We&#x27;re Taking Part in Hacktoberfest 2020</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hacktoberfest/hacktoberfest.png" alt="Hacktoberfest Banner"/></p><p>We&#x27;re happy to announce that PostHog has joined <a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest 2020</a>.</p><p>For those who don&#x27;t know, Hacktoberfest is an initiative led by DigitalOcean to promote open source projects and foster the overall open
source community. </p><p>As a result, we have now <a href="https://github.com/PostHog/posthog/labels/Hacktoberfest">tagged some good first issues</a> on our <a href="https://github.com/PostHog/posthog/">main repo</a> with the <code class="hacktoberfest">Hacktoberfest</code> tag, as these should be suitable issues for first-time contributors. We have also made an effort to document those issues better, so that their scope is clearly defined. </p><p>By submitting a pull request that gets merged for one of these issues (or any other issues on our <a href="https://github.com/PostHog/posthog">main repo</a>), we will send you some <a href="https://merch.posthog.com">PostHog merch</a> and you&#x27;ll be able to count that contribution towards the 4 PRs you need to get the Hacktoberfest shirt.</p><h3 id="user-interviews"><a href="https://calendly.com/posthog-feedback">User Interviews</a></h3><p>We’re working hard to improve PostHog and would love to talk to you about your experience with the product. </p><p>If you&#x27;re interested in helping us out, you can schedule a quick 30-min call with us <a href="https://calendly.com/posthog-feedback">on Calendly</a>. </p><p>Oh, and we&#x27;re giving away some awesome <a href="https://merch.posthog.com">PostHog merch</a> as a thank you!</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><p>In addition to the main features mentioned above, we also merged over 100 PRs improving PostHog&#x27;s performance and fixing bugs:</p><ul><li>Add overflow to card body <a href="https://github.com/PostHog/posthog/pull/1878">#1878</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Pinning the dev Dockerfile PostgreSQL and Redis to the production version <a href="https://github.com/PostHog/posthog/pull/1877">#1877</a> (<a href="https://github.com/ahtik">ahtik</a>)</li><li>Fix path loading spinner <a href="https://github.com/PostHog/posthog/pull/1876">#1876</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix session label hover erroring <a href="https://github.com/PostHog/posthog/pull/1874">#1874</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add check to event serializer <a href="https://github.com/PostHog/posthog/pull/1873">#1873</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Upgrade cypress, fix and stabilize tests <a href="https://github.com/PostHog/posthog/pull/1872">#1872</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fix small util bugs <a href="https://github.com/PostHog/posthog/pull/1871">#1871</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Mark js_posthog_host as safe <a href="https://github.com/PostHog/posthog/pull/1868">#1868</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Destroy lodash <a href="https://github.com/PostHog/posthog/pull/1864">#1864</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Use official react-grid-layout <a href="https://github.com/PostHog/posthog/pull/1862">#1862</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix feature flags test <a href="https://github.com/PostHog/posthog/pull/1858">#1858</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Remove redis warning <a href="https://github.com/PostHog/posthog/pull/1856">#1856</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Trim quotes on event properties <a href="https://github.com/PostHog/posthog/pull/1852">#1852</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Reset user session after logging in as another user <a href="https://github.com/PostHog/posthog/pull/1850">#1850</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Fill in person filtering and reintegrate tests <a href="https://github.com/PostHog/posthog/pull/1848">#1848</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Try running review apps in production mode <a href="https://github.com/PostHog/posthog/pull/1847">#1847</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Bump drf-exceptions-hog to 0.0.3 <a href="https://github.com/PostHog/posthog/pull/1845">#1845</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Experiment: Improving actions UX? <a href="https://github.com/PostHog/posthog/pull/1841">#1841</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>When DEBUG, include posthog.js with local posthog host <a href="https://github.com/PostHog/posthog/pull/1840">#1840</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Trim retention query <a href="https://github.com/PostHog/posthog/pull/1839">#1839</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Add per entity filtering <a href="https://github.com/PostHog/posthog/pull/1838">#1838</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Disable web snippet on DEBUG instances <a href="https://github.com/PostHog/posthog/pull/1837">#1837</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix distinct id too long <a href="https://github.com/PostHog/posthog/pull/1831">#1831</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Get rid of caching in /flags endpoint <a href="https://github.com/PostHog/posthog/pull/1829">#1829</a> (<a href="https://github.com/macobo">macobo</a>)</li><li>Improve event properties display <a href="https://github.com/PostHog/posthog/pull/1825">#1825</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix tsconfig.json lib property <a href="https://github.com/PostHog/posthog/pull/1818">#1818</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Update dockerfile for dev-ing <a href="https://github.com/PostHog/posthog/pull/1817">#1817</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix email test <a href="https://github.com/PostHog/posthog/pull/1814">#1814</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix status report period <a href="https://github.com/PostHog/posthog/pull/1810">#1810</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Toolbar Shadow Root Support <a href="https://github.com/PostHog/posthog/pull/1805">#1805</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Change session query to not collect events <a href="https://github.com/PostHog/posthog/pull/1802">#1802</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Fix person querying <a href="https://github.com/PostHog/posthog/pull/1797">#1797</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add python version to posthog for automated deploys <a href="https://github.com/PostHog/posthog/pull/1795">#1795</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Always limit events <a href="https://github.com/PostHog/posthog/pull/1794">#1794</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix ambiguous timestamp ordering <a href="https://github.com/PostHog/posthog/pull/1792">#1792</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix dev docker build <a href="https://github.com/PostHog/posthog/pull/1791">#1791</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Create CODE_OF_CONDUCT.md <a href="https://github.com/PostHog/posthog/pull/1790">#1790</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Make shared_dashboards endpoint exempt from x-frame-options header <a href="https://github.com/PostHog/posthog/pull/1789">#1789</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Retention date filtering <a href="https://github.com/PostHog/posthog/pull/1788">#1788</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Search for cohorts that contain the given distinctIDs for feature flags <a href="https://github.com/PostHog/posthog/pull/1780">#1780</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Report all non-DRF exceptions to sentry <a href="https://github.com/PostHog/posthog/pull/1773">#1773</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Bump posthoganalytics requirement for feature flag bugfixes <a href="https://github.com/PostHog/posthog/pull/1772">#1772</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Set heroku python runtime to python 3.8.6 <a href="https://github.com/PostHog/posthog/pull/1769">#1769</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix sessions team filtering <a href="https://github.com/PostHog/posthog/pull/1766">#1766</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add option to delete feature flags <a href="https://github.com/PostHog/posthog/pull/1761">#1761</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Test if any filters exist and if they do make sure there are properties to filter on for decide endpoint <a href="https://github.com/PostHog/posthog/pull/1759">#1759</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Fix demo urls <a href="https://github.com/PostHog/posthog/pull/1757">#1757</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Change h1 of Live Actions page to &quot;Live Actions&quot; instead of &quot;Events&quot; <a href="https://github.com/PostHog/posthog/pull/1756">#1756</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix toolbar fade container click block <a href="https://github.com/PostHog/posthog/pull/1753">#1753</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Bump posthog analytics version <a href="https://github.com/PostHog/posthog/pull/1751">#1751</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add personal api key <a href="https://github.com/PostHog/posthog/pull/1747">#1747</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>1684 allow ip override <a href="https://github.com/PostHog/posthog/pull/1744">#1744</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Remove Toolbar Dock Mode <a href="https://github.com/PostHog/posthog/pull/1733">#1733</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Use drf-exceptions-hog package <a href="https://github.com/PostHog/posthog/pull/1732">#1732</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Disable weekly status report on PostHog Cloud <a href="https://github.com/PostHog/posthog/pull/1730">#1730</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Use Django now for tz aware timestamps <a href="https://github.com/PostHog/posthog/pull/1728">#1728</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Use utcnow(). Always default to UTC <a href="https://github.com/PostHog/posthog/pull/1727">#1727</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Replace uuid4 and uuid1_macless with UUIDT <a href="https://github.com/PostHog/posthog/pull/1726">#1726</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Onboarding improvements <a href="https://github.com/PostHog/posthog/pull/1723">#1723</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Self-serve billing enrollment &amp; management <a href="https://github.com/PostHog/posthog/pull/1721">#1721</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Improve Django commands for development <a href="https://github.com/PostHog/posthog/pull/1720">#1720</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Do not shadow Kafka default columns _timestamp and _offset <a href="https://github.com/PostHog/posthog/pull/1718">#1718</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Small insights type update <a href="https://github.com/PostHog/posthog/pull/1717">#1717</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Don&#x27;t assume that each user belongs to a team <a href="https://github.com/PostHog/posthog/pull/1715">#1715</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix migration issue <a href="https://github.com/PostHog/posthog/pull/1711">#1711</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Update 0085_org_models.py <a href="https://github.com/PostHog/posthog/pull/1710">#1710</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix compatibility with posthog-production <a href="https://github.com/PostHog/posthog/pull/1708">#1708</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Random improvements (merge people, analytics) <a href="https://github.com/PostHog/posthog/pull/1706">#1706</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Make production docker-compose.yml generated <a href="https://github.com/PostHog/posthog/pull/1704">#1704</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Added docker-compose proxy file <a href="https://github.com/PostHog/posthog/pull/1703">#1703</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix Master EE code <a href="https://github.com/PostHog/posthog/pull/1701">#1701</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Send a weekly instance status report (resolves #1509) <a href="https://github.com/PostHog/posthog/pull/1683">#1683</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Materialize Views to wrap data coming in from Kafka for Events, Elements, People <a href="https://github.com/PostHog/posthog/pull/1678">#1678</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>refactor how we grab kafka_host to make it reusable for migrations <a href="https://github.com/PostHog/posthog/pull/1677">#1677</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Test if person exists before getting from it <a href="https://github.com/PostHog/posthog/pull/1676">#1676</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Make get_is_identified more tolerant of missing person <a href="https://github.com/PostHog/posthog/pull/1675">#1675</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Organizations – models <a href="https://github.com/PostHog/posthog/pull/1674">#1674</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix table view sessions <a href="https://github.com/PostHog/posthog/pull/1672">#1672</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Use cached results for funnels <a href="https://github.com/PostHog/posthog/pull/1671">#1671</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Remove default json serializer from kafka_helper <a href="https://github.com/PostHog/posthog/pull/1669">#1669</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Put process_event_ee back on celery with delay <a href="https://github.com/PostHog/posthog/pull/1667">#1667</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Show underlying property value type <a href="https://github.com/PostHog/posthog/pull/1666">#1666</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Add detailed label to actionstable <a href="https://github.com/PostHog/posthog/pull/1653">#1653</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Added warning for changing feature flag key <a href="https://github.com/PostHog/posthog/pull/1646">#1646</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix a few &quot;Unchanged files with check annotations&quot; issues <a href="https://github.com/PostHog/posthog/pull/1641">#1641</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Add &quot;is_simple_flag&quot; to Feature flags <a href="https://github.com/PostHog/posthog/pull/1639">#1639</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix Cypress tests <a href="https://github.com/PostHog/posthog/pull/1635">#1635</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Upgrade Kea and TypeGen to latest versions <a href="https://github.com/PostHog/posthog/pull/1634">#1634</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Nicer API Failure Errors <a href="https://github.com/PostHog/posthog/pull/1633">#1633</a> (<a href="https://github.com/mariusandra">mariusandra</a>)</li><li>Added password strength bar <a href="https://github.com/PostHog/posthog/pull/1632">#1632</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Fix optional trailing slash routing <a href="https://github.com/PostHog/posthog/pull/1631">#1631</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Remove function call to see impact on performance <a href="https://github.com/PostHog/posthog/pull/1627">#1627</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Refactor get_or_create_person function in process_event <a href="https://github.com/PostHog/posthog/pull/1626">#1626</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Migrate process_event shared functions to be public <a href="https://github.com/PostHog/posthog/pull/1625">#1625</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Make hash elements public function on element_group <a href="https://github.com/PostHog/posthog/pull/1622">#1622</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Remove Trailing Spaces in Selector Box <a href="https://github.com/PostHog/posthog/pull/1621">#1621</a> (<a href="https://github.com/J0">J0</a>)</li><li>Convert private functions to public for ee access <a href="https://github.com/PostHog/posthog/pull/1618">#1618</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Core action tracking I <a href="https://github.com/PostHog/posthog/pull/1612">#1612</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Bugfix: Remove celerybeat.pid before starting docker worker <a href="https://github.com/PostHog/posthog/pull/1608">#1608</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Skip some tests on multitenancy <a href="https://github.com/PostHog/posthog/pull/1607">#1607</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Add tests for FOSS <a href="https://github.com/PostHog/posthog/pull/1600">#1600</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Typo in licenses.tsx <a href="https://github.com/PostHog/posthog/pull/1599">#1599</a> (<a href="https://github.com/jonhyde-legl">jonhyde-legl</a>)</li><li>Fix: Do not load debug_toolbar when testing <a href="https://github.com/PostHog/posthog/pull/1598">#1598</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Bump posthog-js 1.4.5 <a href="https://github.com/PostHog/posthog/pull/1597">#1597</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Add statsd to celery tasks and add task to monitor queue size <a href="https://github.com/PostHog/posthog/pull/1595">#1595</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Papercups identify user <a href="https://github.com/PostHog/posthog/pull/1593">#1593</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Make /flags endpoint more flexible (pt. 2) <a href="https://github.com/PostHog/posthog/pull/1592">#1592</a> (<a href="https://github.com/yakkomajuri">yakkomajuri</a>)</li><li>Revert &quot;Add monitoring of celery queue size to statsd (#1589)&quot; <a href="https://github.com/PostHog/posthog/pull/1591">#1591</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Add monitoring of celery queue size to statsd <a href="https://github.com/PostHog/posthog/pull/1589">#1589</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Noop on celery worker if ee is not enabled <a href="https://github.com/PostHog/posthog/pull/1587">#1587</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Use celery defaults for concurrency, bumping workers only increased latency of event processing <a href="https://github.com/PostHog/posthog/pull/1584">#1584</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Increase number of concurrent celery workers in production <a href="https://github.com/PostHog/posthog/pull/1583">#1583</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Handle the case of invalid json gracefully <a href="https://github.com/PostHog/posthog/pull/1581">#1581</a> (<a href="https://github.com/weyert">weyert</a>)</li><li>#724: Export Events to CSV <a href="https://github.com/PostHog/posthog/pull/1580">#1580</a> (<a href="https://github.com/michlsemn">michlsemn</a>)</li><li>Fix and test Team.event_properties_numerical <a href="https://github.com/PostHog/posthog/pull/1572">#1572</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Explicitly use python-statsd as statsd lib <a href="https://github.com/PostHog/posthog/pull/1570">#1570</a> (<a href="https://github.com/fuziontech">fuziontech</a>)</li><li>Remove statsd <a href="https://github.com/PostHog/posthog/pull/1568">#1568</a> (<a href="https://github.com/EDsCODE">EDsCODE</a>)</li><li>Downgrade react dom <a href="https://github.com/PostHog/posthog/pull/1559">#1559</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Identify email in frontend <a href="https://github.com/PostHog/posthog/pull/1558">#1558</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Improve API routing <a href="https://github.com/PostHog/posthog/pull/1557">#1557</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Fix multiple elementgroup returned <a href="https://github.com/PostHog/posthog/pull/1549">#1549</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix team uuid migration <a href="https://github.com/PostHog/posthog/pull/1548">#1548</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Fix property filtering null values <a href="https://github.com/PostHog/posthog/pull/1546">#1546</a> (<a href="https://github.com/timgl">timgl</a>)</li><li>Only allow using aggregate functions on numerical properties <a href="https://github.com/PostHog/posthog/pull/1536">#1536</a> (<a href="https://github.com/Twixes">Twixes</a>)</li><li>Signup improvements <a href="https://github.com/PostHog/posthog/pull/1535">#1535</a> (<a href="https://github.com/paolodamico">paolodamico</a>)</li><li>Changes to make person editable (resolves #89) <a href="https://github.com/PostHog/posthog/pull/1491">#1491</a> (<a href="https://github.com/cr33dx">cr33dx</a>)</li></ul><h2 id="favorite-issue">Favorite Issue</h2><h3 id="strategy---open-questions"><a href="https://github.com/PostHog/posthog.com/issues/444">Strategy - open questions</a></h3><p>Our team has been actively engaged in discussions about company strategy, culture, and values over the past few weeks. </p><p>And, since we value transparency, most of that is openly available for anyone to read, such as our <a href="https://posthog.com/handbook/strategy/overview">public strategy</a>.</p><h2 id="posthog-news">PostHog News</h2><p>Karl joined our Engineering team last week and hit the ground running from the start, squashing bugs left and right, while helping us build cool new functionality. </p><p>He believes pineapple belongs on pizza, which has further increased the divide within our team.</p><h2 id="open-roles">Open Roles</h2><p>Are you a Fullstack Engineer or Frontend Developer? </p><p>Or perhaps you&#x27;re not either but think you&#x27;d still be a good fit for PostHog? </p><p><a href="https://posthog.com/careers">We want you!</a> </p><h2 id="bonus-clickhouse-in-a-nutshell">Bonus: ClickHouse in a Nutshell</h2><p>If you&#x27;re still a little confused about ClickHouse, this might help:</p><h3 id="before">Before</h3><span class="center"><iframe src="https://giphy.com/embed/hDMJjUNxLhIjK" width="400" height="400" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe></span><h3 id="after">After</h3><span class="center"><iframe src="https://giphy.com/embed/XmBwOQ9YpXNoCzaPOE" width="400" height="300" frameBorder="0" class="giphy-embed" allowfullscreen=""></iframe></span><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog Joins Hacktoberfest 2020]]></title><description><![CDATA[Let the pull requests come in! We're happy to announce that PostHog has joined  Hacktoberfest 2020 . For those who don't know, Hacktoberfest is an…]]></description><link>https://posthog.com/blog/hacktoberfest-2020</link><guid isPermaLink="false">32bdf510-6852-5ffd-98bb-eb7045f22e92</guid><pubDate>Thu, 01 Oct 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/hacktoberfest/hacktoberfest.png" length="0" type="image/png"/><content:encoded><![CDATA[<h3 id="let-the-pull-requests-come-in">Let the pull requests come in!</h3><p>We&#x27;re happy to announce that PostHog has joined <a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest 2020</a>.</p><p>For those who don&#x27;t know, Hacktoberfest is an initiative led by DigitalOcean to promote open source projects and foster the overall open source community. </p><p>It encourages developers to contribute to public repositories on GitHub via pull requests by offering to ship a t-shirt to developers who have successfully submitted 4 valid PRs in the month of October (<a href="https://hacktoberfest.digitalocean.com/#rules">Official Rules</a>).</p><p>As a company that&#x27;s extensively dedicated to the open source ecosystem as a whole, it is only fitting that we participate in Hacktoberfest. </p><p>As a result, we have now <a href="https://github.com/PostHog/posthog/labels/Hacktoberfest">tagged some good first issues</a> on our <a href="https://github.com/PostHog/posthog/">main repo</a> with the <code class="hacktoberfest">Hacktoberfest</code> tag, as these should be suitable issues for first-time contributors. We have also made an effort to document those issues better, so that their scope is clearly defined. </p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/hacktoberfest/tagged-issues.png" alt="Hacktoberfest Banner"/></p><p>From the perspective of the Hacktoberfest rules, you are able to contribute to any issue, be it tagged or not. We welcome all contributions and would be happy to help you with your pull request. We nevertheless recommend you try to find an issue tagged with <code class="hacktoberfest">Hacktoberfest</code> or <code class="good-first-issue">good first issue</code> if this is your first time contributing to PostHog. </p><p>Additionally, we also welcome contributions to our Docs, especially to our <a href="https://github.com/PostHog/posthog.com/issues/491">new tutorials section</a>. These are related to the <a href="https://github.com/PostHog/posthog.com">repository for this website</a>. </p><p>Finally, we don&#x27;t want to miss out on the fun. Thus, while you need 4 valid PRs to get an official shirt from DigitalOcean, we are happy to send you some <a href="https://merch.posthog.com/">PostHog merch</a> if you make <em>one</em> relevant contribution. </p><p>Happy Hacktoberfest from our entire team at PostHog. Let&#x27;s get hacking!</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Should open source projects track you?]]></title><description><![CDATA[Many open source projects now track their usage in some way, shape, or form. So much user tracking is horrible. It's usually buried deep in the…]]></description><link>https://posthog.com/blog/open-source-telemetry-ethical</link><guid isPermaLink="false">0ca10874-5d97-578a-bf7d-bbb653d7dfd2</guid><pubDate>Tue, 29 Sep 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Many open source projects now track their usage in some way, shape, or form.</p><p>So much user tracking is horrible. It&#x27;s usually buried deep in the legalese of a size 8 terms and conditions policy, and kept intentionally vague.</p><p><em>All tracking is bad</em>, many say. We disagree. Done right, it enables more and better software in the world. When it&#x27;s applied to open source, it often enables more free software for anyone to use.</p><p>That said, it is a topic that has to be approached with extreme caution. It is an ethical and business minefield - if you&#x27;re working on open source, how do you decide what&#x27;s ok?</p><h2 id="an-ethics-framework">An ethics framework</h2><p>Well, it seems a good starting point is to define what is ethical. It turns out, there are two main approaches, broadly accepted today:</p><h3 id="duty-based-ethics">Duty-based ethics</h3><p>This approach defines morality as being based on duty. That means that the measure of morality isn&#x27;t the outcome of an act, but is rather based on the <em>intention</em> of the act itself.</p><p>Stealing a packet of chips to save your child from starving would be considered wrong under duty-based ethics. Lying to save your friend from a murderer? Those would be considered wrong with this way of thinking.</p><h3 id="utilitarian-based-ethics">Utilitarian-based ethics</h3><p>In this case, moral behavior is whatever generates greatest common good. An act is moral if it increases the happiness or decreases the misery of the greatest number of people. The results are the <em>outcome</em> of moral behavior, not the intent.</p><p>Stealing those chips? Go for it.</p><h2 id="so-is-it-ok-for-open-source-projects-to-track-users">So, is it ok for open source projects to track users?</h2><p>Open source projects are based on the concept of &quot;zero expectations&quot;. This means they may contain bugs, security risks, or have confusingly outdated documentation. Remember that time you lost hours on a project that just didn&#x27;t work in the first place?</p><p>However, the fact it&#x27;s acceptable for open source software not to work is a <em>great</em> thing. This makes it easy for anyone to contribute because there are no hurdles from what your work must include or not include - it&#x27;s up to you. Mistakes, or half-baked projects included. You can&#x27;t have innovation without a lot of people being able to contribute and make mistakes, or give up.</p><p>From a utilitarian perspective, we believe that tracking the minimum data possible to build useful technology, in a way that doesn&#x27;t share that data with 3rd parties, means that you have the right approach to product analytics in your open source project.</p><p>From a duty-based perspective, we&#x27;d argue that transparency is key to covering intent. Since most people won&#x27;t assume they&#x27;re being tracked, that means being upfront in the docs and not relying on people digging through your code.</p><h2 id="sorting-the-good-from-the-questionable">Sorting the good from the questionable</h2><p>First of all, open source is exactly that. That&#x27;s a big step up from SAAS - you can immediately inspect the code or run it on a computer with no internet connection if needed. However, the precise function of the telemetry has user implications.</p><h3 id="what-is-being-tracked">What is being tracked</h3><p>The first step is to think about how much, if anything, a project really needs to track.</p><h4 id="nothing">Nothing</h4><p>Nada, zilch. </p><p>If an open source project exists for fun, for one person only, or to get better at a particular technology, then we don&#x27;t think putting extra tracking in makes sense.</p><p>In practice, however, it&#x27;s pretty much impossible not to track more than you need in this case.</p><p>If a project is hosted on GitHub, it automatically provides basic stats (clones / repo visits) for all repos.</p><h4 id="aggregated-tracking">Aggregated tracking</h4><p>This helps projects validate if the concept of what they&#x27;re working on is valuable - do people install it? Do they actually use it at all?</p><p>It also means they can get a sense of how accessible their software is by looking at how many people work out how to use it. At PostHog, early on, we tracked if people were able to get through the setup process. Many didn&#x27;t, so we&#x27;ve kept tweaking it - and we still have work to do here :)</p><p>With aggregated tracking, a project cannot by definition identify unique users. This means repeat visitors are likely to skew the statistics, and therefore, the understanding of user behavior.</p><h4 id="anonymized-user-tracking">Anonymized user tracking</h4><p>This means not knowing <em>who</em> users are, but having a user id against their profile.</p><p>This gives a much stronger signal than the above. It means you&#x27;ll probably need to start using cookies or some way of obfuscating the user id from their behavior.</p><p>It allows projects to see if people who started using the product are coming back, and which parts of the product they&#x27;re returning too.</p><h4 id="full-user-tracking">Full user tracking</h4><p>Asking permission and not doing this by default feels like the only acceptable way from a user perspective.</p><p>Tracking the actual users can really help understand the kinds of user profiles that find the software valuable. For example, is the project used by those at big companies, or with certain job roles? Those things help inform product decisions. If a project is part of an open source company, then this is very likely to be of critical importance to them. Your project is easier to make more valuable if it&#x27;s tailored to its users better.</p><p>Some users are happy to be tracked personally in return for a great project, but we think in most cases that this is unacceptably invasive by default, and it&#x27;s important to ask permission up front. Let alone, GDPR, CCPA and those other privacy-based laws that are appearing.</p><h2 id="its-not-just-the-data-its-how-the-tracking-works-too">It&#x27;s not just the data, it&#x27;s how the tracking works too</h2><p>An easy step is not to use third party software to do this.</p><p>We built PostHog for this reason. It means you can grab everything you need to do event-based analytics, designed to track a product&#x27;s use, on your own infrastructure. You can choose to send or not send personal data to your instance too. Given you&#x27;ve got full access to the code and database, you can also plug in things like Metabase or your data lake if you need them. There are some less product-focused, more website-based analytics libraries that are also pretty cool - Matomo or <a href="/blog/posthog-vs-plausible">Plausible</a> are definitely worth a look, depending on your use case.</p><p>There are many third party SaaS tools (Amplitude/Mixpanel/Heap) that can provide tracking, but a project would have to send user data to them to use them, we think hence why they&#x27;re rarely (ever?) seen in the open source world.</p><h2 id="how-this-influenced-our-approach">How this influenced our approach</h2><p>It&#x27;s easy to think the two ethical methods outlined here are contradictory.</p><p>For example, being transparent about your use of tracking may reduce adoption, which could harm your ability to build more stuff.</p><p>In our case, PostHog usually doesn&#x27;t know who individual users are since most people (90%) opt out of sharing this with us when they install the product. If we did, and those users were at huge corporations, then we&#x27;d find it easier to raise more money, to hire more engineers, to build more cool stuff for the world. </p><p>However, we knew when we started that PostHog&#x27;s <a href="https://github.com/posthog/posthog">open source library</a> would be designed for developers to use.</p><p>With that in mind, we felt we&#x27;d get a better and happier community by thinking about the intent of the action of tracking and not just trying to sneakily track as much as possible to tell the best short term VC story about adoption. Developers are, after all, some of the most sensitive people about how data is tracked, since we are the people dealing with data all of the time.</p><p>For PostHog, that meant being up front about what we track and what we don&#x27;t track, and giving users the choice if they opt themselves into full user tracking. Most don&#x27;t, and that&#x27;s ok!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.14.0]]></title><description><![CDATA[Over the past three weeks, there was one word on everyone's mind: feedback. We did a bunch of interviews with users and had a lot of discussions with…]]></description><link>https://posthog.com/blog/the-posthog-array-1-14-0</link><guid isPermaLink="false">13233af5-ebd0-5cf7-8d90-d38f08b8ed10</guid><pubDate>Thu, 03 Sep 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Over the past three weeks, there was one word on everyone&#x27;s mind: feedback.</p><p>We did a bunch of interviews with users and had a lot of discussions with the community around one key question: <strong>How can we make PostHog better for you?</strong></p><p>The result is a release with new features and a ton of bug fixes, aimed at making PostHog better, faster, and more secure for our users. </p><p>If you&#x27;re self-hosting and want to upgrade for a better experience with nicer features, remember to <a href="/docs/runbook/upgrading-posthog">update your PostHog instance</a>.</p><h2 id="release-notes">Release Notes</h2><h3 id="insight-history"><a href="https://github.com/PostHog/posthog/pull/1379">Insight History</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/insight-history.png" alt="Insight History Screenshot"/></p><p>Eric really killed this one with a massive pull request where 55 files were modified. </p><p>As a result, PostHog now allows you to look through a history of the charts you&#x27;ve made on &#x27;Insights&#x27;, so that you don&#x27;t have to worry about forgetting the exact filters you used to reach a certain conclusion, or feeling bad about not having saved that perfect chart from a week ago.</p><p>Experiment with insights all you want, now without the fear of losing your work. </p><h3 id="personal-api-keys"><a href="https://github.com/PostHog/posthog/pull/1281">Personal API Keys</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/personal-api.png" alt="API Key Screenshot"/></p><p>We also merged another huge PR (58 files changed!) from Michael that&#x27;s been a long time in the making because we wanted to get this just right. </p><p>To facilitate integrations with external services, as well as make the experience of using our API simpler and safer, we have now introduced Personal API Keys. They can be generated and deleted on the PostHog setup page. It&#x27;s worth noting that this is a private API Key, compared to your public &#x27;Team API Key&#x27; used in the snippet. </p><p>Lastly, because of this change, we have deprecated authentication with username and password for API endpoints.</p><h3 id="public-roadmap"><a href="https://github.com/orgs/PostHog/projects/1">Public Roadmap</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/public-roadmap.png" alt="Public Roadmap"/></p><p>At PostHog, one of our core values is transparency. As a result, we try to make as much information public as we can, from what we&#x27;re working on to how we operate. </p><p>As such, it felt important to us to release a public roadmap where our entire community can view what we&#x27;re up to, what we&#x27;ll work on next, and what our objectives are for the future. For a long time we have had a rough roadmap available in our Handbook, but, by now having our roadmap on GitHub, we can directly link issues to the board, and community members can also vote (with emojis 👍) on issues they believe to be important.</p><p>Furthermore, we have always encouraged members of our community to open issues for bugs, feature requests, or just anything at all they want to see changed. Now, issues opened by the community can be incorporated on the roadmap, so you can have an idea of how your suggestions fit in with our development process. </p><p>Keep the tickets coming!</p><h3 id="posthog-foss"><a href="https://github.com/PostHog/posthog-foss">PostHog FOSS</a></h3><p>As an open core company, we have to conciliate our open source efforts with our ability to generate revenue. Generating revenue is how we&#x27;re able to continue to sustain our extensive work in the open source space. </p><p>Thus, after a lot of brainstorming and <a href="/blog/a-chat-with-sid">calls with the likes of Sid Sijbrandij</a>, CEO of multibillion dollar <a href="https://about.gitlab.com/install/ce-or-ee/">open core company GitLab</a>, we settled on a business model that allows PostHog to be a sustainable company in the open source space. </p><p>This led to the creation of two key things: an <code>ee</code> subdirectory on our <a href="https://github.com/PostHog/posthog">main repo</a>, and a new repository called <a href="https://github.com/PostHog/posthog-foss">posthog-foss</a>. We&#x27;ll be explaining these in more detail in the future, but, for now, you should know that to run fully MIT-licensed software, you can either clone the main repo and delete the <code>ee</code> subdirectory (without any consequences), or clone our posthog-foss repo, which is a mirror of the main repository without proprietary code.</p><p>In addition, if you&#x27;re an enterprise customer looking for added functionality and improved performance, <a href="/talk-to-a-human">contact us</a> to discuss the license for using our proprietary features. </p><h3 id="secret-key-requirement"><a href="https://github.com/PostHog/posthog/pull/1426">Secret Key Requirement</a></h3><p>To ensure the security of your PostHog instance, it&#x27;s important that you use a randomly-generated unique <code>SECRET_KEY</code>. This key is used by Django to encrypt cookies, calculate hashes, and generate tokens, making it of high importance. </p><p>Prior to this version, we denoted the importance of this in our Docs, but did not enforce it in our software. Now, to enhance security, PostHog will not allow you to run the server without setting it.</p><p>Many of our deployments generate and set this key by default, so that you will not need to worry about it. This is the case with our <a href="/docs/self-host/deploy/heroku">Heroku One-Click deployment</a>, for example. However, other methods may not automatically do this (we&#x27;re working on it!). As such, if you run into any issues when updating PostHog, make sure you have a unique <code>SECRET_KEY</code> set. </p><p>You can find more information about this on our <a href="/docs/self-host/configure/securing-posthog#secret-key">&#x27;Securing PostHog&#x27; page</a> and should always feel welcome to ask any questions on our <a href="/posts">our community page</a>.</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><ul><li>We <a href="https://github.com/PostHog/posthog/pull/1539">disabled our own snippet</a> on DEBUG instances and <a href="https://github.com/PostHog/posthog/pull/1519">improved tracking</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1541">started using <code>django_extensions</code></a></li><li>Tim added a test to PRs to <a href="https://github.com/PostHog/posthog/pull/1515/files">check if our Docker image builds</a></li><li><a href="https://github.com/PostHog/posthog/pull/1537/files">Michael</a> and <a href="https://github.com/PostHog/posthog/pull/1527">a bot</a> helped us keep dependencies up-to-date</li><li>Marius made the Toolbar UX better by <a href="https://github.com/PostHog/posthog/pull/1424">fixing its element detection</a>, <a href="https://github.com/PostHog/posthog/pull/1472">making the info window follow the mouse</a>, and <a href="https://github.com/PostHog/posthog/pull/1470">correcting other minor things</a></li><li>Paolo <a href="https://github.com/PostHog/posthog/pull/1508">made user metrics better</a></li><li>Eric <a href="https://github.com/PostHog/posthog/pull/1498">updated our /insights endpoint</a></li><li>We changed the <a href="https://github.com/PostHog/posthog/pull/1485">color on some tabs</a> and the <a href="https://github.com/PostHog/posthog/commit/35e604e031da43b49da0afb0e7a854ecd93c95b8">tone on some buttons</a> to improve our UI</li><li>We <a href="https://github.com/PostHog/posthog/pull/1514">fixed</a> and then <a href="https://github.com/PostHog/posthog/pull/1533/">added tests for our multitenancy environment</a></li><li>Michael <a href="https://github.com/PostHog/posthog/pull/1526">fixed a UI bug on our URL list</a></li><li>We overhauled our README, which was really in need of updating. It now <a href="https://github.com/PostHog/posthog/pull/1410">looks better</a>, <a href="https://github.com/PostHog/posthog/pull/1492">reads better</a>, and has better info about <a href="https://github.com/PostHog/posthog/pull/1525">deployment</a> and <a href="https://github.com/PostHog/posthog/pull/1428">our Enterprise Edition</a>. </li><li>We improved the <a href="https://github.com/PostHog/posthog/commit/6b209413e9a6ee33b1e21b261ef72593da2b912a">command description for <code>setup_review</code></a></li><li>Tim made our <a href="https://github.com/PostHog/posthog/pull/1496">testing of PR environments easier</a></li><li>We made the <a href="https://github.com/PostHog/posthog/pull/1524">&#x27;Launch Toolbar&#x27; links open on a new page</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1522/files">updated our CHANGELOG</a> and bumped versions in <a href="https://github.com/PostHog/posthog/pull/1421">PR #1421</a> and <a href="https://github.com/PostHog/posthog/pull/1517">PR #1517</a> (and in a lot of other places)</li><li>We crushed a bug regarding <a href="https://github.com/PostHog/posthog/pull/1516/files">rest hooks for Docker images</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1490">improved our syntax highlighting for code snippets</a></li><li><a href="https://github.com/PostHog/posthog/pull/1511/files">License issues</a> and <a href="https://github.com/PostHog/posthog/pull/1513">disappearing user paths on Firefox</a> are now bugs of the past</li><li><a href="https://github.com/J0">@J0</a>, a community member, introduced a <a href="https://github.com/PostHog/posthog/pull/1475">feature for disabling link sharing</a></li><li>Michael removed a <a href="https://github.com/PostHog/posthog/pull/1476">useless release drafter action</a></li><li>We had a <a href="https://github.com/PostHog/posthog/pull/1489/files">small refactor done</a> on PostHog&#x27;s <code>head</code> template </li><li>Yakko <a href="https://github.com/PostHog/posthog/pull/1486">fixed our Cypress tests</a> and made them faster</li><li>We <a href="https://github.com/PostHog/posthog/pull/1480">allowed Sentry in DEBUG mode</a></li><li>We demolished issues with <a href="https://github.com/PostHog/posthog/pull/1477">Safari&#x27;s funnels</a> and <a href="https://github.com/PostHog/posthog/pull/1478">IDs for our CohortPeople class</a></li><li>Paolo set up an <a href="https://github.com/PostHog/posthog/pull/1473">awesome Preflight page</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1439">upgraded the Sentry SDK</a></li><li>We made our <a href="https://github.com/PostHog/posthog/commit/12eeaf999ec7a1594a971ead5fda6dc82adc3c1a">action for syncing FOSS and non-FOSS repositories beautiful</a>(&quot;using prettier&quot;)</li><li>We set up an <a href="https://github.com/PostHog/posthog/pull/1423">action for syncing our FOSS and main repo</a> then updated it <a href="https://github.com/PostHog/posthog/commit/534c25686e1a9fc261230ef669df557cc69fb293">again</a> and <a href="https://github.com/PostHog/posthog/commit/e9e6e39c189cdf261f91d56267335170c793e52e">again</a></li><li>We added <a href="https://github.com/PostHog/posthog/pull/1457">regex and action hints for the Toolbar</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1471/">migrated to <code>BigInteger</code> IDs</a></li><li>We changed the Toolbar heatmap to <a href="https://github.com/PostHog/posthog/pull/1459">display number of clicks instead of page rank</a></li><li>We fixed our <a href="https://github.com/PostHog/posthog/pull/1467">bottom notice warning</a> for PostHog running on HTTP</li><li>We set up a <a href="https://github.com/PostHog/posthog/pull/1452/">workflow for auto-updating the version</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1454">improved the description for DAUs</a></li><li>Michael added a <a href="https://github.com/PostHog/posthog/pull/1437">warning bar for production PostHog instances running on HTTP</a></li><li>Anna <a href="https://github.com/PostHog/posthog/pull/1448/">fixed a bug with action deletion</a></li><li>We fixed <a href="https://github.com/PostHog/posthog/pull/1438">an issue with licensing</a> and <a href="https://github.com/PostHog/posthog/pull/1450">another one</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1443">fixed our Docker images</a> to account for changes in Kea and Django&#x27;s SECRET_KEY </li><li>Marius upgraded us to <a href="https://github.com/PostHog/posthog/pull/1427">use the newest version of Kea Typegen</a></li><li>Eric pulverized a <a href="https://github.com/PostHog/posthog/pull/1416">bug about empty conditions on Trends</a></li><li>We added a <a href="https://github.com/PostHog/posthog/pull/1415">column to denote when actions were created</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1345">made the Toolbar easy to launch for all users</a></li></ul><h2 id="favorite-issue">Favorite Issue</h2><h3 id="allow-creations-and-management-of-multiple-teams"><a href="https://github.com/PostHog/posthog/issues/1540">Allow creations and management of multiple teams</a></h3><p>Based on user feedback, we determined that it was essential to allow multiple teams to be managed under the same PostHog account. We&#x27;re happy to announce we have a PR open for it! Keep an eye out for when it gets merged 👀. </p><h2 id="weekly-round-up">Weekly Round Up</h2><ul><li><a href="https://www.linkedin.com/feed/update/urn%3Ali%3Aactivity%3A6702530259822157824/">We offered custom fanny packs</a> to contributors who submitted PRs over a weekend</li><li>Lottie, our designer, moved to Dakar, Senegal. She packed the day before.</li><li>We <a href="https://merch.posthog.com/">launched a merch store</a> which includes a PostHog shower curtain</li></ul><h2 id="posthog-news">PostHog News</h2><p>We made a significant progress with our migration to ClickHouse on the Enterprise Edition. Stay tuned for more news about this.</p><p>Two of our engineers, Marius and Karl, have welcomed a new member into their families! We wish them and their families all the best. </p><p>Sam Burton has joined us to help with video editing as we venture into YouTube. You can now <a href="https://www.youtube.com/watch?v=TIxxIEEvczM">hear about why PostHog was built</a> from James, our CEO. </p><h3 id="open-roles">Open roles</h3><p>Are you a Fullstack Engineer? <a href="https://posthog.com/careers">We want you!</a> </p><p>Bonus points if you can tell us what sound a hedgehog makes.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Building an all-remote company from scratch]]></title><description><![CDATA[Many companies are currently having to adjust to remote work, but what about the ones that started this way from scratch? PostHog has a team of 12, 1…]]></description><link>https://posthog.com/founders/remote-culture</link><guid isPermaLink="false">d7eb6cc6-4959-503d-968a-bda1ec7bf6bd</guid><pubDate>Tue, 01 Sep 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Many companies are currently having to adjust to remote work, but what about the ones that started this way from scratch?</p><p>PostHog has a team of 12, 10 of whom have never met each other in real life. </p><p>So, what&#x27;s it like building an all-remote company from the very first day?</p><h2 id="communication">Communication </h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/remote-culture/github-chat.png" alt="GitHub Chat"/> </p><p><a href="/blog/ceo-diary-6">Communication is perhaps the single most important value</a> for us at PostHog. In our view, getting this right is essential to running an all-remote company successfully. As such, we highly value the following concepts:</p><h4 id="asynchronous-communication">Asynchronous Communication</h4><p>Async communication means people shouldn&#x27;t rely on getting an immediate response from someone else in order to do their work. </p><p>In our case, most of our communication happens openly on GitHub. This is great because each conversation occurs within a specific context (e.g. of an issue or PR) and all the information needed to discuss the topic should be readily available within that context. Additionally, people aren&#x27;t pressed to reply immediately, and will get to it when they get to it (sometimes with a little nudge).</p><p>We also don&#x27;t send internal emails. Zero, zilch, <em>nada</em>. 99% of the time, we&#x27;re talking on GitHub, Slack, or a call. We also mostly use Slack for non-work-related, private, and more urgent conversations. If it doesn&#x27;t fit one of those categories, chances are it could be on GitHub.</p><h4 id="transparency">Transparency</h4><p>Transparency means that if some information or a particular conversation can be public, we should try to make it public. </p><p>This way, we create an ever-growing record of things that have been previously discussed, questions that have been asked, and answers that have been found. </p><p>As such, when someone needs some info, they don&#x27;t need to message a team member to get what they need. They can just find it immediately. 
We extend this concept quite deeply, having our entire <a href="/handbook">Company Handbook</a> public, which outlines things like how we do sales calls, our approach to talking to investors, and how we hire people. As such, if there&#x27;s ever a question about how we operate as a company, referring to the handbook will usually get you the answer. </p><p>Additionally, our massive backlog of issues and pull requests also contains very useful information regarding how we&#x27;ve come to certain decisions, from engineering to marketing. </p><p>Transparency pairs up especially well with the fact that we are an open source company: it&#x27;s not only our code that is &quot;open source&quot;. Heck, James, our CEO, even <a href="https://jefhawkins.com/todo/">used to keep his to-do list public</a>. </p><h4 id="written-communication">Written Communication</h4><p>Underpinning the aforementioned points is our preference for written communication. </p><p>The mantra goes: WRITE STUFF DOWN</p><p>At PostHog, a large part of our async and transparent culture is underpinned by written communication. In our view, writing things down is great because it is:</p><ul><li><p><strong>Faster:</strong> If something doesn&#x27;t need to be a call, it shouldn&#x27;t be a call. Calls are great for the social aspect they bring, but for day-to-day work, they often are a slower process for making decisions, given that they include small-talk, internet issues, and scheduling difficulties. Communicating via writing can help save time.</p></li><li><p><strong>Referenceable:</strong> Unless you record all your calls, chances are you might forget something that was discussed in a meeting. However, by trying to write instead of calling, and taking notes when we do call, we can always refer back to what was discussed and easily expand on the discussion later on.</p></li><li><p><strong>Clearer:</strong> Writing something out requires some effort to communicate your point of view effectively. As such, writing can help you distill your thoughts into concrete points, as well as present these points to others in a more solid way. </p></li></ul><h2 id="socializing">Socializing</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/remote-culture/virtual-coffee.png" alt="Virtual Coffee Bot"/> </p><p>Being all-remote, our team is unable to grab a beer together after a week of hard work. </p><p>As such, we have to make up for this somehow! </p><p>In order to socialize virtually, we do a lot of the traditional things remote companies generally do. We have a bot that schedules virtual coffee meetings between random team members, we have banter in Slack, and we plan offsites. </p><p>However, our favorite concept is what we call &quot;Life Story Fridays&quot;. Every Friday, someone from our team spends about an hour telling the entire company about their life. It&#x27;s entirely up to them how they go about this, but we generally get a bit about their professional background, a good amount of childhood photos, and a whole lot of interesting facts, such as:</p><ul><li><p>Max, our Software Development Intern, ranks in the Top 5 for Pi digit memorization in the UK, is an accomplished ballet dancer, and runs a popular website for learning Latin.</p></li><li><p>James, our CEO, wanted to be a professional cyclist. Being a programmer on the side was just a way to keep that dream alive. </p></li><li><p>The other James, one of our Engineers, is on his way to get a pilot license.</p></li><li><p>Tim, our CTO, was first paid for work as a programmer at 13!</p></li></ul><p>We&#x27;re big fans of our Friday event, and it&#x27;s brought us closer as a result. </p><h2 id="flexibility">Flexibility</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/remote-culture/do-not-disturb.png" alt="Slack do not disturb"/> </p><p>At PostHog we simply don&#x27;t track hours at all. All we care about is output.</p><p>If you&#x27;re getting your work done, that&#x27;s what matters. It&#x27;s not important where you like to work, when you like to work, or how you like to work. We just expect team members to:</p><ul><li>Do the tasks that have been organically assigned to them</li><li>Be proactive in helping out where they recognize they can lend a hand</li><li>Enjoy their work</li></ul><p>All we ask if that you join our daily standup and make sure you keep up with our team communication. However, we don&#x27;t need you to be online all the time, since we generally prefer asynchronous communication. More on this means later. </p><p>We also believe you shouldn&#x27;t overwork yourself. As a result, anyone at PostHog can have unlimited time off, and we strongly suggest taking at least 25 days a year. It&#x27;s not good for the individual nor the company if team members are feeling stressed or low on energy. </p><p>As a result, it&#x27;s not uncommon to hear something along the lines off &quot;I&#x27;m renting a 4x4 and going off to the mountains tomorrow&quot; on Thursday&#x27;s standup. </p><p>It all comes down to trust. We hire people we believe in and give them autonomy and flexibility to drive us forward. </p><h2 id="ship-iterateship">Ship, iterate, ship</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/remote-culture/ship.jpg" alt="Remote work banner"/> </p><small class="centered">Photo by Shaah Shahidh</small><br/><p>When you&#x27;re working with a remote team, especially one distribute across timezones, it can be difficult to get things done fast if they rely on more than one person&#x27;s work.</p><p>For this reason, we believe in asynchrony, as mentioned before, but also the concept of <a href="/blog/we-ship-whenever">shipping whenever</a>.</p><p>The idea is: you&#x27;ve done some work, either individually or as a team, and it feels like it is ready to be published, even if it&#x27;s not perfect. Well, just ship it. </p><p>This can mean a blog post, a tweet, or a new software version. If a failure wouldn&#x27;t have massive consequences, just put out your work. Once it&#x27;s live, you can review it, gather feedback, and improve upon it. We do this <strong>a lot</strong>. </p><p>At PostHog, on a small scale, this means not waiting for our designer to make an amazing blog illustration to put our a new post, or waiting for QA to change a typo on the website. On a larger scale, it can also mean not waiting for a feature to be perfect to launch it to our users. The <a href="/docs/user-guides/toolbar">PostHog Toolbar</a> is a perfect example of this.</p><p>The key to this is a culture of iteration, as well as giving the team a sense of autonomy and responsibility. You should always aim to unblock yourself if you feel it&#x27;s right and can do it without serious negative consequences.</p><h2 id="pull-requests--issues">Pull requests &gt; Issues</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/remote-culture/github-pr.png" alt="GitHub PR"/> </p><p>At PostHog, we try our best to create a culture of submitting pull requests over opening issues. </p><p>The idea is, if you find a bug that needs fixing, or want to build a new feature, if you can do it without much work, you should just do it.
Rather than opening a ticket for someone else to handle, just pick it up on the spot and fix it. </p><p>This requires a culture of flexibility, where people&#x27;s work is allowed to diverge based on what ideas they have or issues they encounter throughout the day. </p><p>However, with such a culture in place, you build a team of doers who are consistently pushing product quality and willing to help out with things outside of their official job description.</p><h2 id="diversity">Diversity</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/remote-culture/dakar-couchsurf.png" alt="Dakar Couchsurf"/> </p><p>In addition to having access to a much broader talent pool, building an all-remote team across various countries gives you the unique chance to get people on board who have distinct backgrounds, speak different languages, and most importantly: think differently.</p><p>This can mean <a href="https://www.youtube.com/watch?v=8EUSPmz6n-E">discussions about what a &quot;biscuit&quot; is</a>, as well as having a team member run a call with a customer because they share a native language. </p><p>Since our goal is to build an innovative product, it&#x27;s important to be exposed to multiple perspectives, and there are few better ways to do so professionally than hiring people from various corners of the Earth.</p><p>At PostHog, for example, we currently have people based in the US, Brazil, England, Cyprus, Belgium, Estonia, Germany, and many other countries. As a result, we consistently get exposed to perspectives we may not have come across before, growing both as individuals and as a company. </p><h2 id="its-in-our-dna-">It&#x27;s in our DNA 🧬</h2><p>PostHog has been remote from day 1, and we don&#x27;t intend on changing that. </p><p>It&#x27;s been a journey full of &quot;Wait, so where are you right now?&quot; questions, through which we&#x27;ve managed to put together a world-class team to build an ambitious product. </p><p>And while it hasn&#x27;t been the easiest, sometimes because of bureaucracy, sometimes because of bad internet connections, we wouldn&#x27;t trade it for anything. </p><p>After all, we want to continue hiring talented 18-year-olds from Poland and experienced founders from Mexico. Because remote isn&#x27;t what we do - it&#x27;s who we are. </p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Open source is eating SaaS]]></title><description><![CDATA[Software-as-a-Service (SaaS) fatigue is real. Open source has several key advantages, which make B2B SaaS companies look and feel traditional. Here's…]]></description><link>https://posthog.com/blog/open-source-eating-saas</link><guid isPermaLink="false">688d054e-b8b2-527f-89ca-69e8c83735c5</guid><pubDate>Tue, 25 Aug 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Software-as-a-Service (SaaS) fatigue is real.</p><p>Open source has several key advantages, which make B2B SaaS companies look and feel traditional.</p><p>Here&#x27;s why most companies building B2B software with technical users will launch this way in the future.</p><h2 id="more-users-giving-more-feedback">More users, giving more feedback</h2><p>In the early days, startups are <em>ravenous</em> for feedback. It&#x27;s the easiest way to build something that people want. It&#x27;s very unlikely you&#x27;ll hit the nail on the head with the first thing that you launch.</p><p>How do you make it useful? User feedback and iteration. Perhaps even a pivot.</p><p>It has never been so easy to launch a SaaS product. That means there is an <a href="https://www.google.com/search?q=startup+one+page+template&amp;rlz=1C5CHFA_enGB833GB833&amp;source=lnms&amp;tbm=isch&amp;sa=X&amp;ved=2ahUKEwiT8a_yk6LrAhVZShUIHYpwAMcQ_AUoAXoECAwQAw&amp;biw=1745&amp;bih=1832">ocean of generic-looking SaaS launches</a>. Even if the products launched this way look useful, the thought of security issues with how your data is handled or the service disappearing in a few months, scare off many technical users. SaaS means new users have to be willing to give up time <em>and</em> their data in exchange for feedback.</p><p>Following the open source route means you are building in a place like GitHub, which is <em>designed</em> for people to raise issues and submit feature requests. The vast majority of open source users already have a GitHub account and can just raise an issue. SaaS product feedback in the early days usually involves emails/phone calls/Slack groups. Open source has all of this available <em>and</em> their community of users are already used to leaving feedback in the repo.</p><p>It&#x27;s tough to measure the advantages of this stuff, but taking Y Combinator launches on Hacker News, we think this is why our own launch was the most upvoted from the <a href="https://bestofshowhn.com/yc-w20">W20 batch</a>.. and that&#x27;s with a product at the time which was only 4 weeks old. Unsurprisingly, there are now a bunch of awesome OS projects in S20 with the same or more upvotes than us :)</p><h2 id="your-work-is-public">Your work is public</h2><p>Goodbye hardcoding stuff.</p><p>The complete visibility of your entire codebase is scary. But you get over it. Then you realize it <em>forces</em> you to do a much better job. It now becomes a strategic advantage to have nice code - not only can your own company get new engineers up and running fast, but you&#x27;re more likely to build a healthy community if they can contribute easily.</p><p>Added retention bonus: the best engineers generally don&#x27;t like working on horrible code.</p><p>Early on, this can make shipping a little slower, but we&#x27;ve found this is outweighed as a team working on your codebase can make sense of it much faster.</p><p>As dumb as it sounds, it&#x27;s also just more fun working transparently with users. It&#x27;s a lot easier to be passionate about open source than SaaS.</p><h2 id="more-people-want-to-work-with-you">More people want to work with you</h2><p>Life is fluid but open source gives a true sense of building something durable. It adds extra purpose to everyone&#x27;s work automatically.</p><p>People just want to work on something that will be <a href="https://archiveprogram.github.com/">placed in a vault</a> in the Arctic, to last the next 1,000 years.</p><p>This means a bigger and better hiring pipeline.</p><p>It&#x27;s nifty being able to say anyone in the world is welcome to use or modify what you&#x27;re working on, even if they have no money to spend. It&#x27;s gratifying to be offering something for free, <em>forever</em>, that lots of people can find useful.</p><h2 id="big-companies-can-use-it">Big companies can use it</h2><p>Within weeks of launching the project, we had some of the world&#x27;s biggest companies using our code (or trying to use it, and giving feedback on what went wrong!).</p><p>If you&#x27;ve ever tried to sell software to huge organizations, it&#x27;s typical to spend 1 to 12 months going through information security processes. Often these are due to concerns with sending data to third-party infrastructure.</p><p>Open source means enterprises can inspect the entire codebase and self-deploy. And you can always just provide your project as a hosted offering too in case that&#x27;s easier. </p><h2 id="your-users-are-nicer-to-you">Your users are nicer to you</h2><p>Each bug becomes an opportunity to build goodwill. &quot;Woah they fixed that bug so fast, I love them&quot; is a thing.</p><p>Open source software builds trust with users. After all, you can see exactly what the code (and often, the team) is doing.</p><p>When StartupSchool started using PostHog, a key reason they moved forward was that they were able to fix or fill in the gaps the project had. As we fixed these problems with them and built new stuff, the project got more useful for everyone.</p><p>If your SaaS only company has lots of bugs, users have to wait for you to fix stuff. They can&#x27;t just go out there and fix it themselves, nor help you fix them. </p><p>Open source has a wonderful culture of developers filing bugs so they can alert you to problems you may not have even found yourself, and as a project grows in popularity, many users will start fixing issues in a cool hive-mind like way!</p><h2 id="theres-one-proviso">There&#x27;s one proviso</h2><p>If this makes you think &quot;heck, we better open source our thing&quot;, great.</p><p>However, the advantages above won&#x27;t all apply if you&#x27;re building something that developers don&#x27;t care about. </p><p>If you have a system that would only have interactions with non-technical users (whether day-to-day use or implementation), then you might be out of luck.</p><p>However, even though the points presented here may not apply to your business, there are still various other benefits to being open source, so maybe don&#x27;t drop the idea just yet.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.13.0]]></title><description><![CDATA[Quality was the name of the game over the last two weeks. We have a few user facing tweaks and a mountain of bug fixes and refactoring this week. We…]]></description><link>https://posthog.com/blog/the-posthog-array-1-13-0</link><guid isPermaLink="false">de4781c7-55ae-5e32-a175-b2b8d187a4f4</guid><pubDate>Thu, 13 Aug 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Quality was the name of the game over the last two weeks.</p><p>We have a few user facing tweaks and a mountain of bug fixes and refactoring this week. We&#x27;re not sure what the collective noun for a bunch of bug fixes and refactoring pull requests is - a &quot;virtue&quot;?</p><p>If you&#x27;re self-hosting and want to upgrade for a better experience with nicer features - <a href="/docs/runbook/upgrading-posthog">update your PostHog</a>.</p><h2 id="release-notes">Release Notes</h2><h3 id="posthog-is-now-available-on-segment"><a href="/blog/posthog-segment-integration">PostHog is now available on Segment!</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/posthog-segment.png"/></p><p>We&#x27;re happy to announce that PostHog is now available as a destination on Segment.</p><p>Our friends at Segment have built a platform that works as an integrated data pipeline to pull in all your customer data. It&#x27;s a cool way to combine PostHog with ie Google Analytics or Salesforce data.</p><p>If you&#x27;re already a Segment user, check us out on their <a href="https://segment.com/docs/connections/destinations/catalog/">Destination Catalog</a>. Otherwise, if you&#x27;re dealing with multiple tools for data collection and analysis, consider using <a href="https://segment.com/">Segment</a>! They have a generous <a href="https://segment.com/industry/startups/">startup scheme too</a>, like us.</p><h3 id="quicker-access-to-everything"><a href="https://github.com/PostHog/posthog/pull/1265">Quicker access to everything</a></h3><p><img src="https://user-images.githubusercontent.com/13127476/88422815-ce7a0080-cdb8-11ea-900e-ae60b36745f7.gif"/></p><p>We consolidated trends, sessions, funnels, retention, and user paths into one page for much faster answers to the questions you may have!</p><h3 id="more-powerful-slack-messages"><a href="https://github.com/PostHog/posthog/pull/1219">More powerful Slack messages</a></h3><p><img src="https://user-images.githubusercontent.com/4550621/89835642-66bc0780-db65-11ea-9203-f08b154f37b0.png"/></p><p>PostHog has a feature where Actions can be posted to Slack or Microsoft Teams. This helps you notify your team in real time of the user actions that really matter. Just got a new user? Ping your sales team. Did a user try out a new feature? Get an alert!</p><p>The integration used to be very basic - but now you can edit the message format directly in the UI.</p><h3 id="toolbars-for-all"><a href="https://github.com/PostHog/posthog/pull/1326">Toolbars for all!</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/casts/inspect.gif"/></p><p>PostHog provides an irrefutably awesome toolbar. This lets you interact with your site or app and understand who is doing what. We&#x27;ve been in Beta for a few weeks, and spent a lot of time interviewing early users - thank you to everyone that took part!</p><p>We have now eliminated many bugs and improved the UX, so this feature will be on by default for all new PostHog users.</p><h3 id="better-annotations"><a href="https://github.com/PostHog/posthog/pull/1331">Better annotations</a></h3><p><img src="https://user-images.githubusercontent.com/13127476/89192699-dda83d80-d572-11ea-9ef1-293ea4498cfe.gif"/></p><p>You can annotate graphs in PostHog - mention big releases, new features, or changes to your UX.</p><p>Now, it&#x27;s quicker and easier to get a quick read on what happened that caused something funky in your graphs.</p><p>We&#x27;ve also made all annotations <a href="https://github.com/PostHog/posthog/pull/1296">default to being global</a>. That means if you create an annotation in one graph (or in the annotations page), it is visible across any dashboard graph that covers that date range. No need to fear losing your annotations.</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><ul><li>Heatmaps <a href="https://github.com/PostHog/posthog/pull/1397">now work</a> for sites built with Tailwind CSS.</li><li>Some clicks for the heatmap were being double counted. Now <a href="https://github.com/PostHog/posthog/pull/1400">they aren&#x27;t</a>.</li><li>We improved the UX for <a href="https://github.com/PostHog/posthog/pull/1402">posting to Slack</a>.</li><li>We fixed <a href="https://github.com/PostHog/posthog/pull/1413">selector attributes</a>.</li><li>We made a <a href="https://github.com/PostHog/posthog/pull/1387">security improvement</a> to the way session cookies are used, and <a href="https://github.com/PostHog/posthog/pull/1384">removed SameSite middleware</a>.</li><li>We fixed a bug where GitHub actions <a href="https://github.com/PostHog/posthog/pull/1304">required packer</a> to be manually installed.</li><li><a href="https://github.com/PostHog/posthog/pull/1362">Cohorts supported</a> for people merged to a person.</li><li><a href="https://github.com/PostHog/posthog/pull/1386">Solved a bug</a> with the way the current version update message displayed.</li><li>If you&#x27;re running in DEBUG mode, it&#x27;ll be <a href="https://github.com/PostHog/posthog/pull/1378">more obvious</a>!</li><li>We <a href="https://github.com/PostHog/posthog/pull/1307">refactored sessions</a> into a new queries folder.</li><li>There was a weird issue with the user email search. <a href="https://github.com/PostHog/posthog/pull/1351">That&#x27;s gone</a>.</li><li>We squished <a href="https://github.com/PostHog/posthog/pull/1330">two</a> <a href="https://github.com/PostHog/posthog/pull/1348">bugs</a> with our stickiness metrics when specific events were filtered.</li><li>The team page now <a href="https://github.com/PostHog/posthog/pull/1346">looks much nicer</a>.</li><li>Eric smushed <a href="https://github.com/PostHog/posthog/pull/1337">a bug</a> with filters.</li><li>We <a href="https://github.com/PostHog/posthog/pull/1309">improved how logouts work</a> with the toolbar.</li><li>We crushed <a href="https://github.com/PostHog/posthog/pull/1335">a bug</a> with date filters and funnels.</li><li>We <a href="https://github.com/PostHog/posthog/pull/1336">improved how StatsD is used</a> for better tracking of the things that PostHog doesn&#x27;t track!</li><li>Chunk loading errors <a href="https://github.com/PostHog/posthog/pull/1333">be gone</a>. The assertive &quot;attempt to&quot; in the title says it all.</li><li>Saving actions from the toolbar <a href="https://github.com/PostHog/posthog/pull/1313">now makes it easier</a> to view insights or to go to your actions list.</li><li>We cleaned up a debug warning, <a href="https://github.com/PostHog/posthog/pull/1332">leveraging heart emojis</a>.</li><li>An issue with demo data on the dashboard loading has <a href="https://github.com/PostHog/posthog/pull/1334">been disappeared</a>.</li><li>Tim eliminated an issue <a href="https://github.com/PostHog/posthog/pull/1328">with cumulative graphs</a>.</li><li>A Sentry error about breakdown filters is now <a href="https://github.com/PostHog/posthog/pull/1321">brown bread</a> (dead).</li><li>We now <a href="https://github.com/PostHog/posthog/pull/1319">return an error</a> for malformed JSONs to the API.</li><li>We&#x27;ve <a href="https://github.com/PostHog/posthog/pull/1306">converted the toolbar to TypeScript</a>. That always makes for a ridiculously huge pull request. 110 files changed. Noice, noice.</li><li>We <a href="https://github.com/PostHog/posthog/pull/1311">added a missing migration</a> for ActionStep URL.</li><li><a href="https://github.com/PostHog/posthog/pull/1308">Warnings on running local tests</a> now don&#x27;t appear.</li><li>The experiments tab in the navigation didn&#x27;t have a highlight. <a href="https://github.com/PostHog/posthog/pull/1298">Now it does</a>. That was weird.</li><li>We <a href="https://github.com/PostHog/posthog/pull/1280">moved most of the analytics logic</a> into a <code>queries</code> folder. This means it&#x27;s in one place and in the future will make a ClickHouse integration way easier.</li></ul><h2 id="favorite-issue">Favorite Issue</h2><h3 id="database-candidate-testing"><a href="https://github.com/PostHog/posthog/issues/1341">Database candidate testing</a></h3><p>We have had a lot of demand for very high volume deployments. We ran a ton of tests. Results to follow!</p><h2 id="weekly-round-up">Weekly Round Up</h2><ul><li><a href="https://www.youtube.com/watch?v=5sgw-achKVM">What noise does a hedgehog make?</a></li><li><a href="https://twitter.com/aaronnstuart/status/1272927611031879680">Lynx deodorant now offers &#x27;Africa and Marmite&#x27;</a></li></ul><h2 id="posthog-news">PostHog News</h2><p>We&#x27;re testing out more scalable databases as we&#x27;ve had several teams start using us with 600+ events/second. We are going to build on ClickHouse for our Enterprise version.</p><p>On the team side, we welcomed Yakko as a Technical Writer and Developer - you&#x27;ll see his work in our Docs, which are getting a serious overhaul. Paolo has also joined as our first Growth Engineer. We&#x27;ll release a blog post explaining what he&#x27;s up to!</p><p>Lottie, our legendary designer, is moving to Senegal from Guildford in the UK. She&#x27;ll start packing soon as she leaves this weekend.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h3 id="open-roles">Open roles</h3><p>Full stack engineers that love hedgehogs - <a href="https://posthog.com/careers">we want you!</a></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The Early Days of GitLab - A Chat with Sid Sijbrandij]]></title><description><![CDATA[It gets pretty easy to idolize the superstars of tech. One of the coolest things we've learned is that many of the most successful founders will find…]]></description><link>https://posthog.com/blog/a-chat-with-sid</link><guid isPermaLink="false">bea8633c-3791-5369-91ae-afd852e48d94</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Mon, 03 Aug 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>It gets pretty easy to idolize the superstars of tech. One of the coolest things we&#x27;ve learned is that many of the most successful founders will find time to talk with you. To put this in context, GitLab is one of the world&#x27;s leading open core companies, worth $2.75B. Kind of a big deal. We wanted to learn even more than we could discern from their handbook.</p><p><a href="https://twitter.com/sytses">Sid Sijbrandij</a>, founder and CEO of GitLab, and has always been an inspiration to PostHog. Their culture gave us the confidence to build PostHog all-remote, and it influenced the style of product we&#x27;re building. Once we saw Sid had <a href="https://twitter.com/PostHog/status/1288563434641072131">liked a few of our releases</a> on Twitter, we thought we&#x27;d ask a friend of a friend to connect us.</p><p>After all, he&#x27;s been featured in <a href="https://www.wired.com/story/hybrid-remote-work-offers-the-worst-of-both-worlds/">Wired</a> and <a href="https://www.forbes.com/sites/cognitiveworld/2020/04/21/tips-from-gitlab-on-remote-work-for-innovative-teams/#537e9f0f4fae">Forbes</a>, so PostHog felt like the next step up.</p><h2 id="what-we-talked-about">What we talked about</h2><p>The call started late on a Friday afternoon. A Zoom backdrop with the tiled images of the entire GitLab <a href="https://about.gitlab.com/company/team/org-chart/">1,288 person team</a> appeared and then did Sid with a glass of water. In true GitLab fashion, there were also two Product Managers on the call two as part of their shadowing program. He was remarkably concise, transparent and happy to answer anything at all. It was also evident that Sid has an encyclopedic knowledge of the GitLab handbook. The GitLab product perhaps isn&#x27;t just a place to develop software, it&#x27;s the way the company works.</p><p>We focused the discussion on things we couldn&#x27;t learn from the web, where the topics were things we are thinking about. In the spirit of transparency, we thought we should write down what we learned.</p><h2 id="making-money">Making money</h2><p>It transpires that even VC-backed companies have to do this, at some point. In GitLab&#x27;s case, they&#x27;ve reached $100M ARR in 2020, growing 50x in 4 years. In other words, they smashed that.</p><h3 id="the-first-1m-in-arr---when-and-how">The first $1M in ARR - when and how?</h3><p>GitLab started off bootstrapped for a long time. They already had 100K users when they started to raise money and revenue became more important.</p><p>&quot;We shouldn&#x27;t have focused on hosted to make money, around 85% of our revenue is from the source available version&quot;.</p><p>GitLab realized that the commercial value was more in the source available version, which big enterprises could deploy on their own infrastructure. You can&#x27;t do that with GitHub. Back in 2012, Sid asked on <a href="https://news.ycombinator.com/item?id=4428278">Hacker News</a> if people would use a hosted version, and received hundreds of sign ups. In 2013, they built the Enterprise Edition and started offering this as source-available.</p><p>&quot;You&#x27;ve a huge amount of competition in the hosted space&quot; - Sid, on where PostHog should focus on revenue growth. We agreed.</p><h3 id="setting-up-your-repos-for-open-core">Setting up your repos for open core</h3><p>&quot;It has been a real headache not getting this right in the first place&quot;.</p><p>Almost in the same breath about focussing on the source-avaible version, Sid&#x27;s inner developer emerges!</p><p>At PostHog, we were worried that having a repo with the licensed and MIT version rolled into one place would harm adoption, even if a mirror with just the MIT version were available. Surely it&#x27;d mean that people wouldn&#x27;t see the little MIT License next to the main repo? To date, PostHog went for an MIT repo and we were planning on having users find an alternate repo and upgrade themselves, but we had concerns this would make managing the deployment tough. For example, what if we received community pull requests to the MIT version that broke the paid version?</p><p>&quot;Put all the non-MIT licensed code into one folder, and have the mirror just keep itself updated whilst deleting that folder automatically. This means to get someone to become a paying customer they don&#x27;t have to find a new repo and upgrade themselves manually. If they want a trial, they can still have a trial this way&quot;.</p><h3 id="how-do-you-manage-to-build-a-paid-and-free-product-at-the-same-time">How do you manage to build a paid and free product at the same time?</h3><p>&quot;Good question. Our org chart reflects this.&quot;</p><p>The decision making around which functionality goes into the source available versus the MIT licensed repo is quite straightforward - a buyer based model is becoming the industry norm.</p><p>However, splitting engineering resources and time is a little less formulaic. GitLab&#x27;s product managers make that call, and they are the ones responsible for sizing the engineering teams too.</p><h3 id="pricing-ideas-that-dont-work">Pricing ideas that don&#x27;t work</h3><p>&quot;Service-based pricing, charging feature-by-feature, those things didn&#x27;t work&quot;. Be willing to iterate.</p><h3 id="finding-the-budget">Finding the budget</h3><p>Many investors told us that it&#x27;s one thing for a developer to install your software, but it&#x27;s tough to get an executive to provide budget to a larger team without a sales presence. GitLab found that in the early days, this just happened organically - the software just spread to the point where someone would reach out.</p><p>In fact, we asked <a href="https://twitter.com/jasoncwarner">GitHub&#x27;s CTO</a> the same question. &quot;The most effective way to sell me something is if I have 100 developers asking for it&quot;. Great!</p><h3 id="approach-to-marketing">Approach to marketing</h3><p>There was no significant spend on marketing for the first 100K users - this all came from adoption of the Community Edition. This has now changed significantly, however, &quot;you have raised money earlier than us so perhaps should do both at once, I&#x27;m not anti-marketing&quot;.</p><h2 id="culture">Culture</h2><h3 id="how-do-you-manage-the-product">How do you manage the product?</h3><p>&quot;Product have the final say. Engineering will have points of view, they need to raise these with Product. You end up with tons of huge meetings if you don&#x27;t take this approach.&quot;</p><p>GitLab, like PostHog, have an engineering-focused product. Thus far, our approach has been developers building for developers, with a huge amount of autonomy. We&#x27;re in fact the exact opposite.</p><p>Whilst we don&#x27;t agree with this approach, we agree with the clarity. We let individual developers choose what to work on - it&#x27;s their call, no one else&#x27;s. That&#x27;s perhaps a little unconventional.</p><h3 id="when-did-you-introduce-a-management-layer-what-did-you-learn-from-that">When did you introduce a management layer? What did you learn from that?</h3><p>&quot;Once we got past about 10 people. Don&#x27;t do this too early.&quot; </p><p>We agree.</p><h2 id="dont-ask-what-i-did">Don&#x27;t ask what I did</h2><p>&quot;Being the pricing genius I am, I charged a (more than $100Bn valuation) company $1,500 per annum for 5,000 seats. The insurance to cover the contract was significantly more than the contract itself&quot;. Stay humble!</p><p>Sid summed up the call perfectly - &quot;don&#x27;t ask so much about what I did, but ask how I&#x27;d approach things now&quot;.</p><p>We shouldn&#x27;t follow blindly how GitLab worked, but getting a good sense of what they learned is powerful. The real takeaway from GitLab overall is that the product isn&#x27;t the software… it&#x27;s the company.</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.12.0]]></title><description><![CDATA[Shared dashboards, global annotations, retention table improvements and a metric ton of bug fixes. This week's PostHog array has it all. If you're…]]></description><link>https://posthog.com/blog/the-posthog-array-1-12-0</link><guid isPermaLink="false">19b78719-b6a1-5abe-bfe5-5d24ae148689</guid><pubDate>Wed, 29 Jul 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Shared dashboards, global annotations, retention table improvements and a metric ton of bug fixes. This week&#x27;s PostHog array has it all.</p><p>If you&#x27;re self hosting and want these features - <a href="/docs/runbook/upgrading-posthog">update your PostHog</a>.</p><p>Please also update your <code>posthog-js</code> version to at least <code>1.3.5</code> if you have it installed via NPM. If you&#x27;re using the snippet, you&#x27;re good to go!  </p><h2 id="release-notes">Release Notes</h2><h3 id="shared-dashboards">Shared Dashboards</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/shared-dashboard.png"/></p><p>Dashboard on a TV in your office? Want to have a public stats page? Share a dashboard with someone who doesn&#x27;t have a PostHog account? You can now publicly share a dashboard. Just click &quot;Share Dashboard&quot; and enable sharing. You&#x27;ll get a link that&#x27;s publicly accessible.</p><p>Changed your mind? You can always disable sharing.</p><h3 id="aggregate-functions">Aggregate Functions</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/aggregate.png"/></p><p>Want to know the average revenue per user? Want to know the lowest browser version anyone is using? You can now do Sum, Max, Min and Avg calculations on any event property and graph them in trends!</p><h3 id="global-annotations">Global Annotations</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/annotations.png"/></p><p>Digging through git commits to find out what changed to make the graphs go hay-wire? No more! You can now annotate when something happened (a big release, a bugfix or a launch) and make it super easy for your teammates to figure out what&#x27;s going on. Now global.</p><p>As part of this, you can now also manage, add and delete annotations from a central screen.</p><h3 id="funnel-step-time">Funnel Step Time</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/funnel-step-time.png"/></p><p>You can now see how long it takes users on average to get through steps in a funnel.</p><h3 id="regex-filtering">Regex Filtering</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/regex.png"/></p><p>Regex master? Put those skills to use on any property with regex filtering</p><h3 id="retention-table-improvements">Retention Table Improvements</h3><p>Previously the retention table was hardcoded only to recognize the <code>$pageview</code> event as a retention event. Now, you can select any action or event to measure retention on.</p><p>Clicking on any section in the retention table will tell you exactly which users fall in that item.</p><h2 id="bug-fixes-and-performance-improvements">Bug Fixes and Performance Improvements</h2><ul><li>We&#x27;ve added a button <a href="https://github.com/PostHog/posthog/pull/1186">to easily launch the toolbar</a></li><li>We&#x27;ve made line charts more precise by <a href="https://github.com/PostHog/posthog/pull/1238">straightening the lines.</a></li><li>We&#x27;ve enabled interval selection for sessions <a href="https://github.com/PostHog/posthog/pull/1241">too</a></li><li>We&#x27;re now using Typescript (<a href="https://github.com/PostHog/posthog/pull/1297">1</a>, <a href="https://github.com/PostHog/posthog/pull/1286">2</a>)</li><li>We&#x27;ve <a href="https://github.com/PostHog/posthog/pull/1291">fixed various issues with annotations</a></li><li>We don&#x27;t refresh the Events table if you <a href="https://github.com/PostHog/posthog/pull/1285">don&#x27;t select a property</a></li><li>&quot;All time&quot; date filter <a href="https://github.com/PostHog/posthog/pull/1252">works on funnels again</a></li><li>You can now <a href="https://github.com/PostHog/posthog/pull/1274">delete users from your team</a></li><li>Fixed an issue where timestamps <a href="https://github.com/PostHog/posthog/pull/1294">were displayed incorrectly on sessions</a></li><li>Fixed a bug where selecting &quot;last 48 hours&quot; <a href="https://github.com/PostHog/posthog/pull/1264">wouldn&#x27;t return results</a></li><li>Fixed issues with funnels loading <a href="https://github.com/PostHog/posthog/pull/1266">on dashboards</a></li><li><a href="https://github.com/PostHog/posthog/pull/1255">UUIDs are ugly</a>, so we just cut them off rather than wrapping entire lines in the events table</li><li><a href="https://github.com/samcaspus">Samcaspus</a> contributed a little bit of magic: we now automatically adjust your date range if <a href="https://github.com/PostHog/posthog/pull/1253">you change the interval</a></li><li>We added a button to dashboard that allows users to <a href="https://github.com/PostHog/posthog/pull/1242">easily add a new item</a></li><li><a href="https://github.com/PostHog/posthog/pull/1248">Enhanced ctrl + click new tab opening feature</a></li><li>Massively speed up <a href="https://github.com/PostHog/posthog/pull/1182">loading live actions</a></li><li><a href="https://github.com/PostHog/posthog/pull/1204">Fix password validation and improve minimums notice (closes #1197)</a></li><li><a href="https://github.com/PostHog/posthog/pull/1181">Fix worker failures when a timestamp is invalid (closes #1180)</a></li><li><a href="https://github.com/abhijitghate">abhijitghate</a> contributed an improvement to the way we display DAU&#x27;s in the graph</li><li>Fix an issue where <a href="https://github.com/PostHog/posthog/pull/1221">loading sessions would do an entire table scan</a>, and then throw it away</li><li><a href="https://github.com/PostHog/posthog/pull/1257">Automatically bind docker-compose 2to port 80</a> for production deployments</li><li>+ a bunch of improvements to make local development better! (<a href="https://github.com/PostHog/posthog/pull/1290">1</a>, <a href="https://github.com/PostHog/posthog/pull/1288">2</a>, <a href="https://github.com/PostHog/posthog/pull/1272">3</a>, <a href="https://github.com/PostHog/posthog/pull/1293">4</a>)</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="funnel-step-re-ordering"><a href="https://github.com/PostHog/posthog/pull/1245">Funnel step re-ordering</a></h3><h2 id="weekly-round-up">Weekly round up</h2><ul><li><a href="https://pointerpointer.com/">pointerpointer.com</a></li><li><a href="https://del.icio.us">del.icio.us</a> will be back</li><li><a href="https://www.youtube.com/watch?v=hSoCmAoIMOU">Windows Task Manager Run Doom (896 cores)</a></li></ul><h2 id="posthog-news">PostHog news</h2><p>We launched <a href="https://posthog.com">a new version of our website!</a> Lottie and Ben have done an amazing job getting this live. We decided to go with a 80&#x27;s-Adidas-retro-SNES look, combined with hedgehogs… obviously.</p><h3 id="open-roles">Open roles</h3><p>Full stack or growth engineers - <a href="https://posthog.com/careers">we want you!</a>. We have <em>just</em> filled the technical writer role too, you can already see the docs getting a makeover! More on that next time.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[We ship whenever]]></title><description><![CDATA[PostHog ships every two weeks, unless it makes more sense not to. Why? Iterating frequently helps improve our product. We get features in users’ hands…]]></description><link>https://posthog.com/blog/we-ship-whenever</link><guid isPermaLink="false">3cbd2b61-3f0a-508a-83fe-7c3ba15ba99e</guid><pubDate>Thu, 23 Jul 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>PostHog ships every two weeks, unless it makes more sense not to.</p><h2 id="why">Why?</h2><p>Iterating frequently helps improve our product. We get features in users’ hands as soon as possible, even when those features have bugs or are very basic.</p><p>Many new features are so simple they can verge on embarrassing. That’s how they should feel when they’re launched to the first users, if you have a forgiving initial audience. If you don’t have one of those, you should find one (and use feature flags!)</p><p>This gives us a quick sense of what users really need. It’s better to spend a week building something and learning no one cares rather than losing a month polishing the wheels on the moon-buggy when it turns out that Earth is pretty cool anyway.</p><p>You can learn more about what people need from what they do rather than what they say.</p><h2 id="shipping-more-often-would-be-annoying">Shipping more often would be annoying</h2><p>We find very frequent updates for important software annoying to update constantly… I&#x27;m looking at you, various wordpress plugins!</p><p>The tradeoff is &quot;is this new bundle of features useful enough to outweigh the time spent upgrading at this point in time&quot;. If we have a feature we believe is particularly useful and it was only a week since the last update, we will ship it.</p><p>Self-deploy aside, there are challenges with frequent shipping in SAAS too. Users have to get used to new functionality. We think it&#x27;s easier to adapt to frequent tiny changes rather than huge overhauls of the UX. Some may disagree!</p><h2 id="flexibility-is-more-sensible">Flexibility is more sensible</h2><p>Some features are too big to get into a releasable state every week or two. Often our team are very excited about something we are building and we really believe it could help our users. If it’s good enough, and could help us learn a lot, it doesn&#x27;t make sense to delay it to the next cycle. Instead, we’d ship the update a couple of days later.</p><p>If we set hard deadlines for shipping a huge new feature, we’d be up all night involuntarily, and we’d not be able to retain a diverse team - it’d mean only those able to do this repeatedly would choose to stay working with us. </p><h2 id="staying-fast">Staying fast</h2><p>One rule we try to stick to is one pull request per developer per day. That can sometimes mean a Work In Progress, but it always means something goes into the repo.</p><p>Pull Requests that take longer than a day often spiral into weeks - and people like helping… getting visibility into what you’re doing makes that possible. Getting out of a rut starts with accepting that you’re in one!</p><p>As we grow and create non technical roles, we&#x27;ll look to apply this principle there too. You can see this from the way we&#x27;ve rebranded our website if you follow the <a href="https://github.com/PostHog/posthog.com">posthog.com repo</a>.</p><h2 id="enterprise-customers-must-hate-you">Enterprise customers must hate you</h2><p>If we keep our team first, customers and users second, then our investors will take care of themselves!</p><p>We have deliberately not sought enterprise customers early on for this reason. The stronger we can get our product and engineering culture before this happens, the better a position we will be in before having to change anything.</p><p>For now, we solve this in two ways for bigger enterprises: (i) you don&#x27;t have to update so frequently, although that will mean many new features suddenly appearing in one go OR (ii) we offer maintenance of your deployment as a <a href="/pricing">paid service</a>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[PostHog is now available on Segment!]]></title><description><![CDATA[We're happy to announce that PostHog is now available as a destination on Segment. Segment is a platform that works as an integrated data pipeline to…]]></description><link>https://posthog.com/blog/posthog-segment-integration</link><guid isPermaLink="false">21d76b4d-5d92-58f3-b29b-94d9f1896914</guid><pubDate>Wed, 22 Jul 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>We&#x27;re happy to announce that PostHog is now available as a destination on Segment.</p><p>Segment is a platform that works as an integrated data pipeline to facilitate the entire data collection and analysis process for your product.</p><table><thead><tr><th align="center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/segment-banner.png" alt="Segment Banner"/></th></tr></thead><tbody><tr><td align="center"><center> &quot;Segment is a customer data platform that makes good data accessible for all teams.&quot; (Image from Segment Docs)</center></td></tr></tbody></table><p>The idea is that multiple sources of data can be integrated via one single platform and delivered to the desired Product Analytics tools all in one continuous flow. </p><p>For example, if you have both an app and a website and your Marketing and Engineering teams use different tools and data to make decisions, Segment can make that integration process much simpler for you.</p><p>Instead of integrating each data collection platform (source) with product analytics tool (destination), you just set up Segment and it does the rest, delivering the appropriate data collected from each source to the right destination.</p><table><thead><tr><th align="center"><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/segment-pipeline.png" alt="Segment Pipeline"/></th></tr></thead><tbody><tr><td align="center"><center> Sources → Segment → Destinations (Image from Segment.com)</center></td></tr></tbody></table><p>Given that Segment is a great tool which we&#x27;re big fans of ourselves, we&#x27;re very excited that PostHog can now be integrated as a destination on their platform.</p><p>With this integration, you&#x27;re now able to seamlessly integrate PostHog into whatever data workflow you are currently using, without harming any of the processes you already have in place. </p><p>Also, if you eventually decide that you want to do all your analytics on a platform that is more private, customizable, and transparent, you can perform the transition from your current platforms to PostHog with ease.</p><p>Are you convinced yet? Ready to start your journey with a self-hosted open source platform?</p><p>If so, check out our <a href="/docs/libraries/segment">new Docs page about integrating PostHog with Segment</a>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.11.0]]></title><description><![CDATA[Annotations, filtering all functionality by cohorts, retention table filtering and many, many bugfixes. It's all in this PostHog update. If you're…]]></description><link>https://posthog.com/blog/the-posthog-array-1-11-0</link><guid isPermaLink="false">932ac889-5dd1-59c7-9eef-524252a1086a</guid><pubDate>Tue, 14 Jul 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Annotations, filtering all functionality by cohorts, retention table filtering and many, many bugfixes. It&#x27;s all in this PostHog update.</p><p>If you&#x27;re self hosting and want these features - <a href="/docs/runbook/upgrading-posthog">update your PostHog</a>.</p><p>Please also update your <code>posthog-js</code> version to at least <code>1.3.4</code> if you have it installed via NPM. If you&#x27;re using the snippet, you&#x27;re good to go!  </p><h2 id="release-notes">Release notes</h2><h3 id="annotations">Annotations</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/annotations.png"/></p><p>Digging through git commits to find out what changed to make the graphs go hay-wire? No more! You can now annotate when something happened (a big release, a bugfix or a launch) and make it super easy for your teammates to figure out what&#x27;s going on.</p><h3 id="cohort-filters">Cohort filters</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/cohort-filter.png"/></p><p>Anywhere you can filter, you can now filter on cohorts as well. The first contribution by our newest member of the team, Michael!</p><h3 id="retention-table-filtering">Retention table filtering</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/retention-filter.png"/></p><p>We added retention the retention table last week but we&#x27;re not done with it yet. This week <a href="https://github.com/Kacppian">Kacppian</a>, a fervent contributor, added filtering, which combined with the cohort filtering is very powerful.</p><p>We&#x27;ll be adding more improvements in the next release!</p><h3 id="many-toolbar-fixes">Many toolbar fixes.</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/casts/heatmap.gif" alt="heatmap"/></p><p>As we talked about last week, we&#x27;ve opened the toolbar for beta access. The toolbar will give you things like heatmaps and stats, right on your own website.</p><p>Thanks for <a href="https://github.com/PostHog/posthog/issues/1129">the feedback on our feedback ticket</a>. We&#x27;ve already solved many issues and are working hard towards a full release. Please add onto that ticket if you have any more!.</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li>Some first-time contributors ran into errors with TemplateDoesNotExist, which <a href="https://github.com/PostHog/posthog/pull/1200">we&#x27;ve solved</a></li><li>Add comprehensive Cypress tests for dashboards <a href="https://github.com/PostHog/posthog/pull/1171">to avoid bugs</a></li><li>Add webpackbar for better <a href="https://github.com/PostHog/posthog/pull/1185">readability while developing</a></li><li>Moves total to the bottom of the pie chart to fix z-index issues <a href="https://github.com/PostHog/posthog/pull/1179">readability while developing</a></li><li>Fix an issue with <a href="https://github.com/PostHog/posthog/pull/1168">filtering on the event type</a></li><li>Add Typescript to the <a href="https://github.com/PostHog/posthog/pull/1157">PostHog frontend codebase</a></li><li>Fix the ability to <a href="https://github.com/PostHog/posthog/pull/1152">delete dashboards</a></li><li>Add support <a href="https://github.com/PostHog/posthog/pull/1058">for LZ-String compression</a></li><li><a href="https://github.com/PostHog/posthog/pull/1136">Use Black for Python formatting</a></li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="stacked-line-charts"><a href="https://github.com/PostHog/posthog/issues/1167">Stacked line charts</a></h3><p>The inkt was barely dry on this issue before Kacppian picked it up. Look for this feature in the next release!</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><p>James (our tallest co-founder) had a baby girl called Ruby! The first PostHog baby, though there&#x27;s already another one in the pipeline!</p><p>We&#x27;ve also welcomed Michael to the team full-time, and Max is going to join us over the summer.</p><h3 id="open-roles">Open roles</h3><p>Full stack or growth engineers - <a href="https://posthog.com/careers">we want you!</a></p><p>We&#x27;ve also started looking for a Ops type person - someone that can take charge of the operational side of a quickly growing, completely remote company.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.10.0]]></title><description><![CDATA[This is our most exciting release to date. Here we go: 🎉 You  have  to try the new toolbar out - you can walk through your own website or app and see…]]></description><link>https://posthog.com/blog/the-posthog-array-1-10-0</link><guid isPermaLink="false">54e236e4-e4c5-5ede-ad48-d789424fcf4d</guid><pubDate>Thu, 25 Jun 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>This is our most exciting release to date. Here we go: 🎉</p><p>You <em>have</em> to try the new toolbar out - you can walk through your own website or app and see where users are clicking. We did it on our own site and immediately found out a lot of things that surprised us, and it gave us a ton of areas to work on our own conversion rates. Go to your /setup page to switch the beta on.</p><p>Feature flags have also come out! If you&#x27;re a developer and thinking of tweaking something a little out there, they give you more control. Like, woah.</p><p>On top of that (yep, there is more), we have a better retention view, deployment on platform.sh, new ways to edit our code with Porter, and a whole load of performance improvements as always.</p><p>If you&#x27;re self hosting and desire these features - <a href="/docs/runbook/upgrading-posthog">update your PostHog</a>.</p><p>Please also update your <code>posthog-js</code> version to at least <code>1.2.4</code> if you have it installed via NPM. If you&#x27;re using the snippet, you&#x27;re good to go!  </p><h2 id="release-notes">Release notes</h2><h3 id="toolbar">Toolbar</h3><p>It&#x27;s like inspect element, but for user data.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/casts/inspect.gif" alt="inspect"/></p><p>Easily see the ranking of which parts of the page your users are interacting with the most:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/casts/heatmap.gif" alt="heatmap"/></p><p>We learned a ton about our product and website within minutes of trying this out.</p><h4 id="how-to-use-it">How to use it:</h4><p>Step 1 - go to your setup page, and switch it on:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/casts/setup.gif" alt="setup"/></p><p>This little buddy will appear over your website, only if you are logged into PostHog (it will NOT appear for your regular visitors…):</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/casts/authenticate.gif" alt="authenticate"/></p><p>Hover over him to get started!</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/casts/dance.gif" alt="toolbar dance"/></p><h4 id="fair-warning-its-beta-really">Fair warning! (It&#x27;s BETA! Really!)</h4><p>The toolbar is now in public beta! No, not &quot;gmail beta&quot;, <em>real</em> BETA! There&#x27;s still a lot of work to be done (<a href="https://github.com/PostHog/posthog/projects/7">follow along here!</a>). It <strong>will</strong> feel like a bumpy ride on an unpolished road, <em>especially</em> when you click the mysterious &quot;dock&quot; icon! 👀</p><p>However, as we already found so much value in using this toolbar ourselves, we felt it was ready to share with you all! </p><p>When you&#x27;re trying it out, please raise all issues that you find in <a href="https://github.com/PostHog/posthog/issues/1129">issue #1129</a>!</p><h3 id="feature-flags">Feature flags</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/feature-flags.png" alt="feature flags"/></p><p>This is the first step in the direction of becoming a product experimentation platform.</p><p>Feature flags let you roll out changes to users with a certain property, or to a percentage of users, or some combo of the two.</p><p>Why use it? For now, this lets you carefully release big changes to gather early user feedback, or to check that nothing is broken by a new feature.</p><p>In the long run, we intend on improving the connection between feature flags and the rest of the stats. If you see a cool use case, let us know about.</p><p>Learn more about <a href="/docs/user-guides/feature-flags">how to use feature flags</a>, and please give us any <a href="https://github.com/PostHog/posthog/issues/new?assignees=&amp;labels=enhancement&amp;template=feature_request.md&amp;title=">feature requests</a> for these that you would like to see in a future edition.</p><h3 id="flutter-integration">Flutter Integration</h3><p>You asked for it and now <a href="/docs/integrate/client/flutter">it&#x27;s here</a>!</p><h3 id="retention-page">Retention page</h3><p>PostHog already had stickiness, but now there is a table that demonstrates perhaps more clearly how your users are coming back (or not!)</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/retention-view.png" alt="toolbar icon"/></p><p>Head to the users menu in the left hand navigation to give it a whirl.</p><h3 id="better-onboarding">Better onboarding</h3><p>You may be one of the lucky folks whom we asked to watch setting up the product. That really made obvious to us that are set up process was a little confusing.</p><p>We&#x27;ve had a go at redoing how our set up flow works, and will be tracking if it helps more people get through PostHog&#x27;s own funnel!</p><h3 id="platformsh-deployment">Platform.sh deployment</h3><p>You can now deploy on platform.sh - a very simple, new and trendy way to get up and running.</p><p>One click deploy for platform.sh (#1044)</p><h3 id="porter-development">Porter development</h3><p>We <em>always</em> love it when a community pull request appears.</p><p>Porter is what the cool kids are using to do web development in the cloud. Thank you so much to <a href="https://github.com/porter-dev">porter-dev</a> for creating this pull request.</p><p>Hopefully that&#x27;ll make life easier for other people to contribute.</p><h3 id="event-name-filtering">Event name filtering</h3><p><img src="https://user-images.githubusercontent.com/1727427/84702990-c7f59f00-af57-11ea-8455-92fb89d9c9ae.png" alt="filter by event name"/></p><p>By popular demand, you can now filter the events table by the event name. Happy debugging your implementations!</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li>We are now more privacy friendly - you can <a href="https://github.com/PostHog/posthog/pull/1081">discard IP address data</a></li><li>Added the offer of a <a href="https://github.com/PostHog/posthog/pull/1028">free pairing session</a> to the contributing guide - ask us!!</li><li>We fixed a bug with <a href="https://github.com/PostHog/posthog/pull/1077">the start times for the session view</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1074">improved the ./bin/test command</a></li><li>We now let you <a href="https://github.com/PostHog/posthog/pull/1070">break down users by their properties</a> (it wasn&#x27;t working before!)</li><li>We <a href="https://github.com/PostHog/posthog/pull/1056">sped up the people page</a> - pro tip: don&#x27;t load stuff you don&#x27;t need!</li><li>We <a href="https://github.com/PostHog/posthog/pull/1049">disabled batching in the snippet</a>, since this helps prevent data loss</li><li>Fixed a weird bug with <a href="https://github.com/PostHog/posthog/pull/1039">moving from sessions to trends</a></li><li>Fixed <a href="https://github.com/PostHog/posthog/pull/1040">person properties being selected</a>, which was causing some issues with the stats.</li><li>We now <a href="https://github.com/PostHog/posthog/pull/1057">automatically select hourly</a> if you&#x27;re looking at data from just today or yesterday - it was weird otherwise!</li><li>We turned <a href="https://github.com/PostHog/posthog/pull/1054">today into the last 24 hours</a> - you can now think of yourself as Jack Bauer</li><li>The people modal now <a href="https://github.com/PostHog/posthog/pull/1042">has pagination</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1047">now copy array.js.map</a> as well as everything else to better debug errors</li><li>We now <a href="https://github.com/PostHog/posthog/pull/1046">show a warning for old browsers</a>, and feel bad for those in big enterprises that must use them!</li><li><a href="https://github.com/PostHog/posthog/pull/1043">Black now added</a> to post commit hooks, so we don&#x27;t get crazy all-file reformatting</li><li>Fixed an issue with <a href="https://github.com/PostHog/posthog/pull/1035">force refreshes for cache</a> in certain places</li><li>We <a href="https://github.com/PostHog/posthog/pull/1036">fixed a failing test problem</a> with team_id</li><li>Improved <a href="https://github.com/PostHog/posthog/pull/976">person properties and pagination</a></li><li>Solved <a href="https://github.com/PostHog/posthog/pull/1029">a Sentry error</a> with overly long text</li><li>We <a href="https://github.com/PostHog/posthog/pull/1088">cleaned the configs for release-drafter</a></li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="host-and-path-name-event-properties-are-not-set-for-some-events"><a href="https://github.com/PostHog/posthog/issues/1119">&quot;Host&quot; and &quot;Path name&quot; event properties are not set for some events.</a></h3><p>Another thing we fixed in <code>posthog-js</code> this week! It was actually fixed a fortnight ago, yet we forgot to push it out! Oops! 🙈</p><h2 id="weekly-round-up">Weekly round up</h2><ul><li><a href="https://github.com/dabreegster/abstreet">Traffic simulator</a></li><li><a href="https://www.mirror.co.uk/news/weird-news/farmer-baffled-after-sheep-gave-22251344">Cyclops lamb born</a></li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><p>We are hungry for your feedback this week.</p><p>Feature flags and the toolbar (and bringing those together one day) could really propel the product forward - please raise bugs, ask for more features, and <a href="https://github.com/PostHog/posthog/issues">let us know</a> what you think!</p><h3 id="open-roles">Open roles</h3><p>Full stack or growth engineers - <a href="https://posthog.com/careers">we want you!</a></p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.9.0]]></title><description><![CDATA[First, learn  how PostHog raised $3M for our open source project . We could not have done it without this community - thank you for all your issues…]]></description><link>https://posthog.com/blog/the-posthog-array-1-9-0</link><guid isPermaLink="false">e2355ac2-64f9-5b12-a349-96607209bd61</guid><pubDate>Thu, 18 Jun 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>First, learn <a href="/blog/raising-3m-for-os">how PostHog raised $3M for our open source project</a>. We could not have done it without this community - thank you for all your issues, feedback, usage and support!</p><p>So, what have we been doing with the money?</p><p>Since last time - AWS marketplace deployment, docusaurus integration, much better testing, a shiny new user sessions view, and see a ton of bug fixes and improvements to our testing. This Array is almost emoji-worthy. Almost.</p><p>If you&#x27;re self hosting and desire these features - <a href="/docs/runbook/upgrading-posthog">update your PostHog</a>.</p><h2 id="release-notes">Release notes</h2><h3 id="sessions-view"><a href="https://github.com/PostHog/posthog/pull/926">Sessions view</a></h3><p>We kept getting requests to group events by user session, so we listened! We&#x27;re proud to announce this is now merged:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/sessions-overview.png" alt="sessions overview"/></p><p>You can then see exactly how a user interacted with your app:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/session-broken-out.png" alt="sessions more detail"/></p><p>This should really help with debugging, or just trying to get a detailed view of what users are up to.</p><p>Want to try it? Find Sessions under the Events menu on the left hand navigation.</p><h3 id="far-better-testing">Far better testing</h3><p>We put a huge amount of work into our tooling this week - to get an overview, see <a href="/blog/cypress-end-to-end-tests">our blog post on Cypress end-to-end tests</a>.</p><p>What&#x27;s new? We:</p><ul><li><a href="https://github.com/PostHog/posthog/pull/1015">Fixed Cypress tests</a></li><li>Enabled <a href="https://github.com/PostHog/posthog/pull/959">running cypress in parallel</a>, which saved a minute.</li><li><a href="https://github.com/PostHog/posthog/pull/865">Fixed cypress linting errors and sped up tests further</a></li><li><a href="https://github.com/PostHog/posthog/pull/927">Cached PostHog&#x27;s yarn builds</a>, which took e2e tests down by around 30%.</li><li>Finally, we now <a href="https://github.com/PostHog/posthog/pull/920">wait for PostHog to start serving requests</a> rather than the 60 second sleep when running Cypress.</li></ul><h3 id="docusaurus-integration"><a href="/docs/libraries/docusaurus">Docusaurus integration</a></h3><p>If you&#x27;re using Docusaurus for your own docs, there&#x27;s now a <a href="/docs/libraries/docusaurus">PostHog Docusaurus integration</a> for that!</p><h3 id="aws-marketplace---1-click-install"><a href="https://aws.amazon.com/marketplace/pp/B089QN5DZM">AWS marketplace - 1-click install</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/aws-posthog-marketplace.jpg" alt="PostHog on AWS Marketplace"/></p><p>You can now install PostHog in just a click or two via AWS&#x27; marketplace.</p><p>This is just as easy as Heroku and fractionally less expensive!</p><h3 id="management-command-for-millions-of-events"><a href="https://github.com/PostHog/posthog/pull/475">Management command for millions of events</a></h3><p>It&#x27;s a delight to see another community PR. Thank you <a href="https://github.com/bhavish-agarwal">Bhavish</a>!</p><p>This feature means you can test your PostHog setup at scale. No more guesswork if your server setup is correct.</p><h3 id="set-properties-to-anonymous-users"><a href="https://github.com/PostHog/posthog-js/pull/43">Set properties to anonymous users</a></h3><p>You were already able to set properties on users you had previously identified, but now you can even set properties if the user is anonymous.</p><p>This is especially useful for doing a/b testing. Make sure you upgrade posthog-js if you&#x27;re using it via npm. If you&#x27;re using the snippet this should automatically work.</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li>We worked hard on improving caching to speed things up. We <a href="https://github.com/PostHog/posthog/pull/1035">fixed cache refreshing</a> in a few areas, we made a few <a href="https://github.com/PostHog/posthog/pull/1023">caching adjustments</a> to fix <a href="https://github.com/PostHog/posthog/issues/1022">#1022</a>. Finally, we now use <a href="https://github.com/PostHog/posthog/pull/972">redis to cache results</a>.</li><li>Save time! You can now <a href="https://github.com/PostHog/posthog/pull/990">create actions from the trends page</a>.</li><li><a href="https://github.com/PostHog/posthog/pull/957">Upgrade to posthog-js 1.2.0 to support dynamic params</a>.</li><li>We fixed long href inserts - the href <a href="https://github.com/PostHog/posthog/pull/1027">can now go up to 2048 characters</a> before truncation. Someone must have had some funky urls going on…</li><li><a href="https://github.com/PostHog/posthog/pull/1026">We prevented intermittent issues with yarn build</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/1021">fixed a bug</a> that caused cohorts to fail when actions were deleted</li><li>We <a href="https://github.com/PostHog/posthog/pull/980">solved a problem</a> with comparing trend sessions distribution</li><li>We <a href="https://github.com/PostHog/posthog/pull/1008">added a limit to number of returned entities for breakdowns</a> so queries don&#x27;t time out</li><li>We <a href="https://github.com/PostHog/posthog/pull/1013">created a fix</a> for an issue with heartbeats</li><li>We <a href="https://github.com/PostHog/posthog/pull/1014">made it clearer</a> that PostHog SaaS users are on the latest version</li><li>We <a href="https://github.com/PostHog/posthog/pull/1007">slashed CPU consumption for VSCode</a> by excluding a folder</li><li>Generated a <a href="https://github.com/PostHog/posthog/pull/991">performance improvement for element stats</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/984">stopped giving way too many decimal points</a> on our graphs!</li><li>Trends page <a href="https://github.com/PostHog/posthog/pull/919">UX improvement</a></li><li><a href="https://github.com/PostHog/posthog/pull/986">Improved filtering</a> on elements</li><li>We fixed <a href="https://github.com/PostHog/posthog/pull/973/commits/953af2326dff94e8ae1d75cd6ea0fc2c64567857">a race condition</a></li><li><a href="https://github.com/PostHog/posthog/pull/949">We don&#x27;t rely</a> on $ to separate PostHog&#x27;s events</li><li>We <a href="https://github.com/PostHog/posthog/pull/950">removed the redundant math selector</a> on funnels - it didn&#x27;t do anything!</li><li><a href="https://github.com/PostHog/posthog/pull/932">Django upgraded to 3.0.7</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/910">made HTTPS work locally</a> - we had lots of community issues raised, so that should make it easier to get started with!</li><li>We <a href="https://github.com/PostHog/posthog/pull/904">improved the setup overlay layout</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/903">sped up the events endpoint</a> by just hitting the current week&#x27;s partitions</li><li>We solved a problem <a href="https://github.com/PostHog/posthog/pull/909">with temporary tokens</a></li><li>We added <a href="https://github.com/PostHog/posthog/pull/878">webpack HMR</a> and hashes to chunk filenames. (#878)</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="blog-header-design"><a href="https://github.com/PostHog/posthog.com/issues/128">Blog header design</a></h3><p>We had a lot of fun this week thinking about how the PostHog brand looks and feels, and welcomed Lottie - our new designer - to the team!</p><h2 id="weekly-round-up">Weekly round up</h2><p>From our own blog:</p><ul><li><a href="/blog/raising-3m-for-os">How we raised $3M for an open source project</a> - we hope this helps other open source projects.</li><li><a href="/blog/cypress-end-to-end-tests">Super fast testing with Cypress and GitHub actions</a> - an example of the focus we have on investing in dev tooling.</li></ul><p>Other cool stuff from around the web:</p><ul><li><a href="https://apolloprojects.com/">Funding for moonshots</a> - get your own $3M.</li><li><a href="https://www.strandbeest.com/">Strandbeest</a> - wooden, walking sculptures… they&#x27;re pretty weird.</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><p>We&#x27;ve had a wonderful two weeks.</p><p>The PostHog team is growing - we&#x27;re now 6 people, both our ability to ship and our product plans are bigger and better than ever.</p><p>The seed round we raised is just the start of us making sure we create a full product experimentation platform with you, the community. Now is a great time if you have any ideas for ambitious feature requests to put them into the repo as issues. If you&#x27;d like to build something cool <em>with</em> us, we&#x27;re open to some pair programming - <a href="https://app.posthog.com/home#supportModal">get in touch</a>! :)</p><h3 id="open-roles">Open roles</h3><p>There are two roles we&#x27;d love to talk to you or your friends about:</p><ul><li>We are looking for a CSS wizard to help work with Lottie on our website and docs overhaul.</li><li>We&#x27;re also trying to find a growth engineer. Someone technical that can help us with our own product-led growth.</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Setting up super fast Cypress tests on GitHub Actions]]></title><description><![CDATA[Moving fast is easy. Moving fast with confidence is hard. If you've been keeping track of  The Array  release posts you know that we prioritize…]]></description><link>https://posthog.com/blog/cypress-end-to-end-tests</link><guid isPermaLink="false">5c0aac61-c09f-51f7-aed5-b9071a47d0c2</guid><pubDate>Wed, 10 Jun 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="moving-fast-is-easy-moving-fast-with-confidence-is-hard">Moving fast is easy. Moving fast with confidence is hard.</h2><p>If you&#x27;ve been keeping track of <a href="/blog">The Array</a> release posts you know that we prioritize shipping things fast and often. Just as important to us is being sure that we are not going to break things unnecessarily for our users as we add new features and speedups.</p><p>What we have found that works really well is nothing terribly novel by itself: a solid foundation of unit tests, end to end tests (integration tests), and CI/CD that for automation and gatekeeper keeping master clean.</p><h3 id="unit--integration-tests">Unit &amp; Integration tests</h3><p>In our Django codebase you&#x27;ll find good number of <a href="https://github.com/PostHog/posthog/tree/master/posthog/test">Django tests</a> that help keep us honest as we hack away at the backend of PostHog that keeps track of all the 1&#x27;s and 0&#x27;s that our customers depend on for making product decisions. These are our frontline defenders that let us know that something might be up before we even get to the point of creating a PR.</p><p>For this we do lean heavily on the standard Django test runner.</p><p>If you are interested in learning more on testing with Django check out Django&#x27;s great <a href="https://docs.djangoproject.com/en/3.0/topics/testing/">docs</a> on testing.</p><p>These tests only get you so far though. You know that the backend is going to behave well after you land the changes that you&#x27;ve made, but what if you accidentally changed something that breaks the frontend in weird and unexpected ways?</p><h3 id="enter-cypress">Enter Cypress</h3><p>According to Cypress&#x27;s GitHub <a href="https://github.com/cypress-io/cypress">repo</a> it is a <strong>fast, easy and reliable testing for anything that runs in a browser</strong>. What does that mean exactly though?</p><p>It lets you programmatically interact with your application by querying the DOM and running actions against any selected elements. You can see that in a few of our <a href="https://github.com/PostHog/posthog/tree/master/cypress/integration">Cypress test definitions</a></p><h3 id="tracking-the-elements">Tracking the elements</h3><p>To keep our tested elements clear, manageable, and reusable upon refactor, we take advantage of the element attributes that html and react specifically recognize. Cypress has an amazing built in inspector on their test-runner that allows you to identify elements that you would like to add tests to.</p><p>While the tool works great, we found that occasionally the heavily nested components and classes would create selectors that were inflexible.</p><p>With the data-attr tag, we just need to keep track of the tag when updating/changing the components we&#x27;re using without needing to rely on the inspector to find the precise selector for the test!</p><pre><code>&lt;LineGraph
  data-attr=&quot;trend-line-graph&quot;
  {...props}
/&gt;
</code></pre><h4 id="example-of-our-integration-test-for-our-funnel-user-experience">Example of our integration test for our Funnel user experience:</h4><pre><code class="language-js">describe(&#x27;Funnels&#x27;, () =&gt; {
  //boilerplate to make sure we are on the funnel page of the app
  beforeEach(() =&gt; {
    cy.get(&#x27;[data-attr=menu-item-funnels]&#x27;).click()
  })

  // Test to make sure that the funnel page actually loaded
  it(&#x27;Funnels loaded&#x27;, () =&gt; {
    cy.get(&#x27;h1&#x27;).should(&#x27;contain&#x27;, &#x27;Funnels&#x27;)
  })

  // Test that when we select a funnel then we can edit that funnel
  it(&#x27;Click on a funnel&#x27;, () =&gt; {
    cy.get(&#x27;[data-attr=funnel-link-0]&#x27;).click()
    cy.get(&#x27;[data-attr=funnel-editor]&#x27;).should(&#x27;exist&#x27;)
  })

  // Test that we can create a new funnel when we click &#x27;create funnel&#x27; button
  it(&#x27;Go to new funnel screen&#x27;, () =&gt; {
    cy.get(&#x27;[data-attr=create-funnel]&#x27;).click()
    cy.get(&#x27;[data-attr=funnel-editor]&#x27;).should(&#x27;exist&#x27;)
  })

  // Test that we can create a new funnel end to end
  it(&#x27;Add 1 action to funnel&#x27;, () =&gt; {
    cy.get(&#x27;[data-attr=create-funnel]&#x27;).click()
    cy.get(&#x27;[data-attr=funnel-editor]&#x27;).should(&#x27;exist&#x27;)

    cy.get(&#x27;[data-attr=edit-funnel-input]&#x27;).type(&#x27;Test funnel&#x27;)
    cy.get(&#x27;[data-attr=add-action-event-button]&#x27;).click()
    cy.get(&#x27;[data-attr=trend-element-subject-0]&#x27;).click()
    cy.contains(&#x27;Pageviews&#x27;).click()

    cy.get(&#x27;[data-attr=save-funnel-button]&#x27;).click()

    cy.get(&#x27;[data-attr=funnel-viz]&#x27;).should(&#x27;exist&#x27;)
  })
})
</code></pre><p>I personally love this syntax. It feels super readable to me and reminds me a bit of the best parts of jQuery.</p><h3 id="github-actions">GitHub Actions</h3><p>So that&#x27;s all well and cool, but what about making sure that in a fit of intense focus and momentum we don&#x27;t inadvertently push a breaking change to master? We need someone or something to act as a gatekeeper to keep us from shooting ourselves in the foot. We need CI.</p><p>We could use Travis, or Jekins, or CircleCI… but as you may have noticed we keep almost everything about PostHog in GitHub, from our product roadmap, issues, this blog, everything is in GitHub. So it made sense to us to keep our CI in GitHub if we could. We decided to give GitHub Actions a test. So far, we have loved it.</p><p><a href="https://github.com/features/actions">GitHub actions</a> are basically a workflow you can trigger from events that occur on your GitHub repo. We trigger ours on the creation of a pull request. We also require that our actions all return 👍  before you can merge your PR into master. Thus, we keep master clean.</p><p>To make sure that things are only improving with our modifications, we first re-run our Django unit and integration tests just to make sure that in our customers final environment things are still going to behave as expected. We need to be sure that there was nothing unique about your dev environment that could have fooled the tests into a false sense of awesome. You can check out how we set this up here <a href="https://github.com/PostHog/posthog/blob/master/.github/workflows/pythonapp.yml">Django github actions</a></p><p>The second round of poking we do with our app is we hit it with Cypress tests that we discussed earlier. These boot up our app and click through workflows just as a user would, asserting along the way that things look and behave as we would expect. You can check out how we&#x27;ve setup our <a href="https://github.com/PostHog/posthog/blob/master/.github/workflows/e2e.yml">Cypress action here</a></p><h3 id="caching">Caching</h3><p>We ran up upon an issue though. Installing python dependencies, javascript dependencies, building our frontend app, booting up a chromium browser… this all takes a lot of time. We are impatient. We want instant gratifiction, at least when it comes to our code. Most of this stuff doesn&#x27;t even change between commits on a PR anyways. Why are we spending valuable time and resources towards having things be repulled and rebuilt? That&#x27;s where we ended up using one of the best features of GitHub Actions: the <a href="https://github.com/actions/cache">cache step</a>.</p><p>Using the cache step we can cache the results of pulling python dependencies or javascript dependencies. This saves a chunk of time if you have ever messed around with watching yarn sort out the deps for a large frontend project. Check it out:</p><h4 id="how-we-manage-caching-the-cache-for-pip">How we manage caching the cache for pip:</h4><pre><code class="language-yaml">- uses: actions/cache@v1
  name: Cache pip dependencies
  id: pip-cache
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles(&#x27;**/requirements.txt&#x27;) }}
    restore-keys: |
      ${{ runner.os }}-pip-
- name: Install python dependencies
  run: |
    python -m pip install --upgrade pip
    python -m pip install $(grep -ivE &quot;psycopg2&quot; requirements.txt) --no-cache-dir --compile
    python -m pip install psycopg2-binary --no-cache-dir --compile
</code></pre><p>Note that there is no if block to determine whether to use the cache when we <code>pip install</code> the dependencies. This is because <code>pip</code> is smart enough to use the rehydrated cache if it exists. In cases where it doesn&#x27;t exist, <code>pip</code> will fetch dependencies from the public internet.</p><p>Yarn is a bit more involved only because we grab the location of the cache directory first and use that output as an input to the caching step</p><h4 id="yarn-dependency-caching">Yarn dependency caching</h4><pre><code class="language-yaml">- name: Get yarn cache directory path
    id: yarn-dep-cache-dir-path
    run: echo &quot;::set-output name=dir::$(yarn cache dir)&quot;
- uses: actions/cache@v1
    name: Setup Yarn dep cache
    id: yarn-dep-cache
    with:
        path: ${{ steps.yarn-dep-cache-dir-path.outputs.dir }}
        key: ${{ runner.os }}-yarn-dep-${{ hashFiles(&#x27;**/yarn.lock&#x27;) }}
        restore-keys: |
            ${{ runner.os }}-yarn-dep-
- name: Yarn install deps
    run: |
        yarn install --frozen-lockfile
    if: steps.yarn-dep-cache.outputs.cache-hit != &#x27;true&#x27;
</code></pre><p>That last line with the <code>if</code> block tells GitHub to not run <code>yarn install</code> if the cache exists. This saves us a ton of time if nothing has changed</p><p>On top of that, let&#x27;s say you are making changes to only the API. There&#x27;s no reason why you should be rebuilding the frontend each time the tests are run. So we go ahead and cache that between runs as well.</p><h4 id="frontend-app-build-cache">Frontend app build cache</h4><pre><code class="language-yaml">- uses: actions/cache@v1
    name: Setup Yarn build cache
    id: yarn-build-cache
    with:
        path: frontend/dist
        key: ${{ runner.os }}-yarn-build-${{ hashFiles(&#x27;frontend/src/&#x27;) }}
        restore-keys: |
            ${{ runner.os }}-yarn-build-
- name: Yarn build
    run: |
        yarn build
    if: steps.yarn-build-cache.outputs.cache-hit != &#x27;true&#x27;
</code></pre><p>Now you are catching <code>if</code> the cache exists so we can skip building the frontend altogether since it&#x27;s been rehydrated from the last run. <strong>Nifty!</strong></p><h3 id="throw-more-computers-at-it">Throw more computers at it!</h3><p>One of the best thing about Cypress is that you can grow with it. It would be a real pain if you invested all of this time into building out tests just to have your test suite take 60 minutes to run. Luckily both GitHub actions and Cypress have a solution to that!</p><h4 id="run-it-in-parallel">Run it in parallel!</h4><pre><code class="language-yaml">matrix:
  # run 4 copies of the current job in parallel
  containers: [1, 2, 3, 4]
</code></pre><h4 id="configure-cypress-step-to-coordinate-with-cypress-saas">Configure Cypress step to coordinate with Cypress SaaS</h4><pre><code class="language-yaml">- name: Cypress run
  uses: cypress-io/github-action@v1
  with:
    config-file: cypress.json
    record: true
    parallel: true
    group: &#x27;PostHog Frontend&#x27;
  env:
    # pass the Dashboard record key as an environment variable
    CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
    # Recommended: pass the GitHub token lets this action correctly
    # determine the unique run id necessary to re-run the checks
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
</code></pre><p>Depending on the count of tests and the frequency you are running your suite this might cost you some money having to upgrade your account on <a href="https://cypress.io">Cypress.io</a> but their free tier is pretty generous and they do have OSS plans that are free.</p><p>This all has cut the time it takes for GitHub to stamp our pull requests from &gt;10 minutes to ~5 minutes and that&#x27;s with our relatively small set of tests.</p><p>As we grow functionality within PostHog all of this will only become more important so that we don&#x27;t end up with a 30 minute end to end test blocking you from landing that really killer new feature. Sweet.</p><h3 id="-at-errors">👀 at errors</h3><p>The final bit here is what happens if the tests are failing?</p><p>If this is all happening in a browser up in the cloud how do we capture what went wrong? We need that to figure out how to fix it. Luckily, again, Cypress and GitHub actions has a solution: <a href="https://github.com/actions/upload-artifact">artifacts</a>.</p><p>Artifacts allow us to take the screenshots that Cypress takes when things go wrong, zip them up, and make them available on the dashboard for the actions that are being run.</p><h4 id="capturing-cypress-screenshots">Capturing Cypress screenshots</h4><pre><code class="language-yaml">- name: Archive test screenshots
  uses: actions/upload-artifact@v1
  with:
    name: screenshots
    path: cypress/screenshots
  if: ${{ failure() }}
</code></pre><p>As you can tell by the <code>if</code> block here, we only upload the artifacts if there is a problem. That&#x27;s because we already know what the app will look like when things go right… hopefully 😜</p><h3 id="roadmap">Roadmap</h3><p>There is one thing that we don&#x27;t capture in our current test suite: <strong>Performance!</strong></p><p>We have customers who upload hundreds of telemetry events a second. If we introduce a regression that dings performance this could cause an outage for them where they lose data which is arguably worse than a regression on the frontend.</p><p>Our plan here use GitHub actions to standup an instance of our infrastructure and hammer it with sythentic event telemetry and compare that against a baseline from prior performance tests. If the test runtime changes materially we will block the pull request from being merged in to guard master from having a potentially breaking change. Stay tuned for a post on automated performance testing.</p><h5 id="the-pitch">The pitch™</h5><p>Hey! You made it this far. If you see yourself working on challenging issues at a high paced startup with a really rad group of people. You are in luck! We are looking for people like you!</p><p>Check out our <a href="/careers">careers</a> page and give us a shout!</p><blockquote><p>PostHog is an open source developer platform that helps people build successful products. We help you debug and ship your product faster.</p></blockquote><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[How we raised $3M for an open source project]]></title><description><![CDATA[Open source projects have long battled with how to finance themselves.  PostHog  is lucky to have significant funding and wanted to share what we did…]]></description><link>https://posthog.com/blog/raising-3m-for-os</link><guid isPermaLink="false">ed6d6a42-ef71-52d1-9b99-cb2f3b492dfb</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Thu, 04 Jun 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/how-we-raised-3-million-open-source-project.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Open source projects have long battled with how to finance themselves. <a href="https://github.com/posthog/posthog">PostHog</a> is lucky to have significant funding and wanted to share what we did to help other cool projects take off.</p><p>For those who&#x27;ve not met us before, PostHog provide open source product analytics. We went through the Y Combinator <a href="https://www.ycombinator.com/companies?batch=w2020">W20 batch</a>, which took place from January to March 2020. We have raised $3.025M in funding really quickly, and wanted to share what we did. We may well not be a typical company, but we would hope this gives some lessons learned regardless.</p><h2 id="why-raise-money-at-all">Why raise money at all</h2><p>Before you decide if you want to raise money, it&#x27;s important to know what you are trying to achieve and to optimize for that.</p><p>Many projects don&#x27;t ever want to become businesses - if it&#x27;s just a hobby and you don&#x27;t want to speed up, you should just keep doing that :)</p><p>We felt building a company around the project at the same time would let us build something really ambitious, so we did that.</p><p>So, what are your options for funding?</p><h2 id="venture-capital-vc">Venture Capital (VC)</h2><p>VC means you have way, way more cash to fuel your project&#x27;s growth, if you spend the money wisely. That&#x27;s pretty much the advantage. You will obviously have to build a company around the project so you have a way of making money at least in the long run.</p><p>Depending very heavily on the firm, you may get a lot of support with meeting early customers to generate revenue later on, hiring, free VC swag and your strategy. You can always ask the partners and founders from their portfolio to get a sense of what working with them is like.</p><p>We felt personally the challenge of managing accelerated growth would be a lot more stimulating, and that has certainly been the case so far!</p><p>VC hype begets a bigger team, begets results (hopefully), begets hype:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/vc-hype-cycle.jpg" alt="VC Hype Cycle"/></p><p>Especially early on, VC is buying into your potential value. This makes sense - if the company that forms around your project has a 1% chance of being worth $1Bn or more, it is rational for people to take that bet if the price is right. Open source companies really can make it big - it&#x27;s a post for another time, but we believe that open source will eat SaaS&#x27;s lunch in many product categories.</p><p>The way to pitch open source to VCs is that it is easier to get into production, and there is less of a sense of vendor lock in, which puts off many developers from trying out a new SaaS product. SaaS may be &quot;less work&quot; to manage, but there&#x27;s probably no reason you can&#x27;t also provide your own product, hosted. The end result is that your open source repo could get used at huge companies. They probably have needs your free product can&#x27;t deliver (uptime, better features, support), which you can make money from meeting (through providing services, hosting or premium features), to invest back into the project.</p><p>The downside of this VC route is that you risk hype<code>&lt;&gt;</code>reality disonance!</p><p>If you can&#x27;t achieve results with the money you raised, whilst increasing your burn rate, you are at the mercy of those funding you if you will survive. Not cool, but you took this route!</p><p>You also have investors, who have given you lots of money. Don&#x27;t fall in love with them - you must prioritize your own team and their performance, then users then customers, in that order. Do that, with a good strategy, and your investors will take care of themselves.</p><p>Oh, and you can&#x27;t pay yourself a huge dividend if you succeed as a way of taking money out of the company, although it might become possible to sell some shares later if you&#x27;re rocketing (perhaps to help you keep taking risk), and in the short run, you can now probably afford to pay yourself something - hoorah for being able to work on open source full time! Going for VC means you are committing to an exit or a failure - you can&#x27;t really change your mind later that you want to take things more steadily.</p><p>Turning your project into a VC backed company means you will have to spend a lot more time dealing with people.</p><p>Investors, a larger team, probably more customers, and probably a larger community. Depending on your personality, this might be a good or a bad thing. If you built the project in the first place for the fun of building, you should think hard about this. If you find the concept of treating the company itself as your product not just the repo, then you&#x27;ll enjoy it!</p><p>PostHog chose the VC route. We wanted to build a company as a way of being really ambitious with what we can do with product analytics. We want to help every developer have a better understanding of the impact of their work.</p><p>Personally, when we&#x27;re 80, we think we want to have taken a couple of big swings with our careers even if we don&#x27;t own the whole pie. On the product side, we can build something open source that will outlast us if we get it wrong, and regardless of the outcome, the skills and lessons it will give us will help us in our future lives.</p><h2 id="bootstrapping">Bootstrapping</h2><p>By this we mean getting real customers to pay you money, to reinvest into the project&#x27;s development, and fuelling (or not) your own growth at whatever pace you see fit.</p><p>Basecamp have a great <a href="https://basecamp.com/books/calm">philosophy</a> on this.</p><p>You get complete control this way. That might make it easier to do the &quot;right thing&quot;, or to be more creative in what you build since you won&#x27;t have to be disrupting or creating a multi billion dollar market as a constraint. However, the financial pressure of payroll in the early days might make it tough to optimize for long run decisions. You need to feed yourself somehow!</p><p>Humans get tired and hungry. Not giving up is what we saw as the major challenge of this way of working.</p><p>We felt this was a similarly high level of risk to inflating your burn rate above your revenue that comes from VC, especially with open source where you&#x27;ll have to manage to build a free product first, then a paid version (unless you go down the hosted = paid route).</p><h2 id="donations">Donations</h2><p>If it&#x27;s a side project and you have no need to support yourself, you can use <a href="https://www.patreon.com/">Patreon</a> or similar to ask for donations from your fans.</p><p>The fundamental problem with this is there&#x27;s not a strong incentive for companies to donate money, and even if they do, the amount is typically a fraction of what they would spend on paid software. That means it will be very hard to support yourself to go fulltime, let alone to grow a team to go even further with the project.</p><p>However, this could be a cool way to start before doing bootstrapping or VC in the future. There are good reasons for keeping some things as a side project or hobby - you can be more creative, and just build things for the fun of it.</p><p>From this point on, we&#x27;re going to explain how we raised venture capital in this post.</p><h2 id="converting-an-open-source-project-into-a-business">Converting an Open Source project into a business</h2><p>This is a controversial topic as it creates all kinds of incentives, but for at least our project, it fundamentally made the entire thing possible in the first place. We just wouldn&#x27;t have gone ahead if we were working on it at weekends or in our spare time.</p><h2 id="productcommunity-versus-productmarket-fit">Product<code>&lt;&gt;</code>Community versus Product<code>&lt;&gt;</code>Market fit</h2><p>We&#x27;d advocate that the best way to build a really ambitious, fundable open source project is to get something to ubiquity before anything else.</p><p>In SaaS, there is a lot of advice to charge money even before you have a product. It is almost becoming a standard approach. You somehow have to jump to product<code>&lt;&gt;</code>market fit in one leap to achieve this - you need to have a product concept that is so strong people will pay upfront. That means getting to product<code>&lt;&gt;</code>market fit is incredibly hard since there are too many variables to know how to solve the puzzle except through trial and error. However, when you get there, making money is easy.</p><p>Open source creates a different route. You need to (i) build something useful THEN (ii) work out how to make money. You&#x27;ll get much, much more feedback from open source - it&#x27;s an approach that is more developer-friendly and thus will tend to get you a lot more growth and adoption if you are getting close to something useful. That makes it a lot easier to build something useful for a community.</p><p>However, making money is harder. You will need to do that to sustain and grow the project. You need to have faith that once you&#x27;ve built something useful, you&#x27;ll be able to work this out. PostHog, even at our current scale, get one or two paid enquiries per week inbound. We speak to these people to try to understand what they&#x27;d need and if they&#x27;d then pay for it. Most run off - we&#x27;re still learning! That said, we still ourselves have work to do on making our own community and free product stronger before worrying about revenue.</p><p>The good news is that inbound interest is much, much easier to close, and you don&#x27;t have to waste time sending hundreds of cold emails to generate it - you can focus on the free product.</p><p>This can definitely go wrong - you could run out of cash before you reach product<code>&lt;&gt;</code>market fit. You might accidentally build a free product that has no viable commercial route. You may find that the market you are building for is too small for VCs to be able to invest into it.</p><p>When we raised money, VCs asked about the commercial side, but the ones that invested generally just have the belief that product<code>&lt;&gt;</code>market fit is easy once you get product{<code>&lt;&gt;</code>}community fit. We were upfront about our paid version - we don&#x27;t know how it would work yet, but we have a plan for how we&#x27;d approach it.</p><h2 id="making-money">Making money</h2><p>You&#x27;ll need some way of making money, at some point. That&#x27;ll come after product<code>&lt;&gt;</code>community fit.</p><p>There are three popular ways of doing this, either:</p><ol><li>Services</li><li>Hosted</li><li>Open core</li><li>or even some combo of the above (but don&#x27;t make it too complex)</li></ol><p>There are probably other ways (Ads? Although yuck) that we haven&#x27;t thought of.</p><p>A services approach is pretty simple although if it&#x27;s the only plan in the long run, it&#x27;ll make generating a high valuation tough, so raising money will be more painful. That&#x27;s because services are low margin - selling time rather than a scalable product doesn&#x27;t improve your returns as you get bigger.</p><p>By hosted, we mean charging customers for the hosted version of the open source product. The risk is that a <a href="https://www.fastcompany.com/90290754/aws-launches-mongodb-competitor-amid-criticism-over-amazons-in-house-products">cloud provider decides to compete</a> with your hosted version. There is licensing to prevent this, although it will make you technically &quot;not&quot; open source, which may harm adoption and the fit with the community. Lots of developers can use MIT license software in big enterprises, but they can&#x27;t use licenses that prevent commercial use without some form of approval from their company (if they work at a big company).</p><p>The upside of charging for hosted use is that you don&#x27;t have to build anything beyond your basic product, and that means all your attention that goes into your free version will help the paid version&#x27;s growth too.</p><p>Open core is the model of choice for PostHog in the long run. We made a hosted version in the short run just to see if we could passively make some money to help control our burn rate (although a payment flow is on the todo list still…!), and it turned out around 60% of our users go for that route to try it out. We think that&#x27;s a great sign.</p><p>For open core, you first build a Community Edition open source product and focus on being really helpful to everyone who is willing to try it out or contribute.</p><p>Do a really good job of that and you&#x27;ll get random emails from folks at bigger companies who need more support or extra features. You can then build a &quot;source available&quot; version that you charge monthly for, for those people with premium functionality. The disadvantage is you have to build premium features that you can&#x27;t put into the open source version - and it&#x27;s important to be really upfront with the community about what is free versus paid… since that may put some developers off from doing pull requests, for example.</p><h1 id="how-long-it-took">How long it took</h1><ul><li>August 2019: Tim and I quit our jobs.</li><li>January 4th 2020: We started the YC W20 batch, and that meant receiving our first $150K investment from YC. We worked on a different idea to start with but soon <a href="/blog/pivot-to-posthog">pivoted</a>.</li><li>January 23rd 2020: We wrote the first line of code for PostHog</li><li>February 14th: We did a mini launch for a few YC companies to get early feedback</li><li>February 21st: PostHog <a href="https://news.ycombinator.com/item?id=22376732">launched on Hacker News</a></li><li>March 6th: Day 1 of fundraising and first cheque ($10K!)</li><li>March 12th: Left San Francisco due to covid and started working fully remote from the UK. Everything seemed to slow down at this point for 3 weeks. Our bank balance was $205K this day.</li><li>March 16th: Demo day. </li><li>March 31st: Balance: $530K.</li><li>April 24th: Balance: $719K</li><li>April 26th: Seed round completed at $3.025M - when you start closing bigger cheques, it wraps up very, very fast.</li></ul><p>There was one thing we never expected to happen - we ended up with offers for &quot;too much&quot; money and could have raised $5.5M. We&#x27;re trying not to humblebrag, but it is kind of weird. We already sold quite a lot of the company and didn&#x27;t want to sell more - the money raised already was enough we felt to get to a really good series A.</p><p>We had to shift from selling ourselves to investors, to having to let investors down. This made us feel pretty guilty after all the meetings and relationships that we had built, but it was a great problem to have, and we tried to be as upfront as possible through the process.</p><h2 id="vcs-are-nice">VCs are nice</h2><p>It may have been luck, but we didn&#x27;t have a single negative interaction the entire way through this process. People wanted to understand what we&#x27;re working on, they were encouraging and very helpful - even when they said no in many cases. A lot of the meetings were very intense and direct, but those were the most helpful ones of all. If you can handle QA, you can handle VC!</p><h2 id="the-impact-of-coronavirus">The impact of coronavirus</h2><p>Coronavirus&#x27; impact made fundraising harder. We had started raising as the virus was spreading in China, but before it had affected the US significantly.</p><p>During the raise, that changed and lockdown came into place. Suddenly, we were asking complete strangers, in a different country, for millions of dollars to fund our pre-revenue business, over the internet. The first three weeks after lockdown, the process came to a halt - no one seemed to move forward, and a couple of late stage firms with us pulled out for this reason.</p><p>Tim and I had been living together in <a href="/blog/moving-to-sf">San Francisco</a> for the YC batch. When we saw the ban on flights from Europe to the US, we both decided to go back to the UK so we wouldn&#x27;t end up getting stuck and overstaying our visas. We were both also worried about being stuck away from our families for a very long time. It was nice to be with family again, but the compromise was working West Coast US hours whilst living in a London timezone. It did at times feel like the fundraising cycle may never end - a bit like wrestling a bear, you&#x27;re done when the bear is done. We promised ourselves that we would not use the virus as a reason to not raise not matter how tempting it was to stop and to come back later with more usage - it risked killing our momentum.</p><p>However, after a couple more weeks, it felt like the VCs had become used to this process - they do dozens of meetings every week, so it didn&#x27;t take long to adapt to &quot;over the internet&quot; fundraising becoming the new normal. We stopped discussing how lockdown was affecting each other on calls, and started getting more people closer to investing in PostHog.</p><h2 id="youre-too-early">&quot;You&#x27;re too early&quot;</h2><p>It sounds obvious, but many of the most successful open source companies start off with a really popular open source project. The implication is that you&#x27;re going to have to build something that gets popular first, then monetize later, in most cases.</p><p>From a fundraising perspective, this means you can either be raising (i) off the back of lots of revenue, which seems unlikely or (ii) from a ton of growth of the project.</p><p>It means you&#x27;ll probably need more money than a SaaS company to get off the ground - you&#x27;ll need to <a href="https://a16z.com/2019/10/04/commercializing-open-source/">find product-community fit</a> first. You&#x27;ll also need to make sure the potential investors you speak with agree on this point. We took this stance more and more firmly through our pitches and realized it polarized investors - which is a good thing. At first we were like &quot;we&#x27;ll sort of work on making money and getting lots of users&quot;, which just isn&#x27;t credible.</p><p>Polarize people (without being rude of course!), then you&#x27;ll find those that can share your passion.</p><h2 id="the-fundraising-battlestation">The &#x27;fundraising battlestation&#x27;</h2><h3 id="hardware">Hardware</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/fundraising-battlestation.jpg" alt="Fundraising battlestation"/></p><p>If I were to do this again I&#x27;d probably put more effort into the setup given how many video calls I ended up making.</p><p>&quot;You want to at least look like you have your **** together&quot; - a YC Partner describing how to do video calls with investors. Not sure I quite nailed that.</p><p>The physical notepad helps during calls - sometimes people ask &quot;compounded&quot; questions, so it can help to jot down areas you&#x27;ll want to come back to. Other times, you may find yourself &quot;pushing back&quot; a topic to later in the call to keep the flow more natural, so you can make sure you remember to loop back. It somehow feels less rude to be physically writing than typing - it doesn&#x27;t create the illusion that you could be browsing social media whilst talking.</p><p>The lamp is there to help out with lighting a little, and the laptop stand is to prevent an unflattering angle on the video.</p><p>The snack bowl is so I don&#x27;t eat an entire bag of chips in one sitting.</p><h3 id="software">Software</h3><h3 id="investor-crm">Investor CRM</h3><p>I created a <a href="https://docs.google.com/spreadsheets/u/0/?tgif=d">Google Sheet</a> to track statuses of each potential investor. This stored:</p><ul><li>firm name</li><li>individual partner / associate</li><li>potential cheque size</li><li>interest /10</li><li>next step</li><li>type</li><li>added to <a href="#captable-management">Pulley</a>?</li><li>SAFE status (if applicable)? (sent / signed / money received)</li></ul><p>You could use AirTable or a real CRM, but PostHog are by default opposed to <a href="/handbook/people/spending-money#software">introducing new software</a>.</p><h3 id="markdown-notes">Markdown notes</h3><p>This was handy to store more context than is possible in as spreadsheet.</p><p>The format was a single long document, with more detailed notes that I stored as a private repo. I just had 5-10 bullet points about each person I was meeting and their firm, that I would generate during the <a href="#plan-the-meeting">planning process</a>.</p><h3 id="captable-management">Captable management</h3><p>We used <a href="https://pulley.com/">Pulley</a> for this. <a href="https://captable.io/">Captable.io</a> is a well known alternative. </p><p>This software helps you model out how much of the company you are selling. You can experiment with different scenarios and their impact at series A stage.</p><p>We tried doing this on spreadsheets but it quickly became apparent we couldn&#x27;t quite get the maths right. We found cap tables weirdly hard to do. That&#x27;s probably just us.</p><h3 id="legal-doc-management">Legal doc management</h3><p>We used <a href="https://clerky.com">Clerky</a>. It generates all the legal paperwork you need for raising money, and many other things. I&#x27;m a big fan.</p><h2 id="the-process">The process</h2><p>Fundraising involves dozens or hundreds of meetings. Seriously.</p><p>You will find yourself brought to your administrative knees if you do not run an organized process.</p><h3 id="get-meetings">Get meetings</h3><p>They came from two places. Either (i) I had to get introduced to someone or (ii) I had responded to inbound interest.</p><p>We only sent 1 cold message and got asked for a bunch of detail then ignored. It turns out, this isn&#x27;t how VC really works. That said, I&#x27;m sure there are exceptions and perhaps we had a biased view because our network in San Francisco was strong from having been through YC out there.</p><p>How did we get introductions? We always made an effort to be buddies with other founders - whether through helping people out, becoming friends with users or politely asking for advice from other founders that we look up to. If people believe in what you&#x27;re working on, they will be happy to introduce you to others. The better your idea, the closer your relationships and the more traction you have, the more success you&#x27;ll have here.</p><p>Investors must miss out on so many deals because of this, yet it&#x27;s a weird form of social proof that I guess must work even if it means missing false positives. I imagine this is quite socially harmful - if you&#x27;re network is weaker and further from the most decisive VCs, you will have a harder time raising money for your company.</p><p>It strikes me that <a href="/blog/before-yc">YC&#x27;s application form process</a> doesn&#x27;t work that way at all - we did no hustle to get in.</p><p>On the flipside, as it turned out, weirdly, not a single cold outreach email that we received ourselves from investors wanting to meet us, turned into an investment. It turned out that investors who made the effort to reach out to us through another investor did end up making an offer.</p><p>Make yourself easy to contact - my LinkedIn profile views doubled during the fundraise. Update your social media and put contact details onto your website or readme. Include your phone number in footers of your emails. Create a crunchbase profile, update your LinkedIn and Twitter. We were getting at least 1 inbound request from a VC per week almost immediately on creating a website. During YC, that climbed to nearly 1 per day. These converted poorly but we did get partner meetings from many of them, which gave us valuable experience.</p><h3 id="plan-the-meeting">Plan the meeting</h3><p>You should find out a reasonable amount of information about the person you are meeting. Beyond just looking at the portfolio for the firm, look for a couple of blog posts, and try to work out if the investor is on the board of any companies. That&#x27;ll help the meeting run as a discussion and, bonus, will help you realize if there is a conflict (if an investor has competed in a direct competitor, you probably shouldn&#x27;t talk to them let alone partner with them).</p><p>The portfolio itself can also be useful. Are there any similar companies you could compare yourself to?</p><h3 id="do-the-meeting">Do the meeting</h3><p>It should feel like you are driving - you made it happen, after all.</p><p>Start by introducing yourself, give the company one-liner, and have the investor do the same. Try to get a good sense of who the investor really is - they could be working with you for a very long time.</p><p>There&#x27;s basic information that you should find out every time, if you can&#x27;t work it out online beforehand. For example, do they follow on (you&#x27;ll need that info later), what sort of cheque size they prefer to work with, and if they are a firm rather than an angel, do they have an ownership requirement, and are they comfortable leading a round. </p><p>Later in the discussion, you should make sure to find out how they make decisions - angels may decide on the call, seed firms will often decide after another 2-3 calls with a couple of partners involved, multi stage firms may require a full partner meeting. Just get a sense of how long it normally takes too - some can make a decision in day, others take weeks or months.</p><p>You&#x27;ll probably get asked where you&#x27;re at in the process. This is where it&#x27;s helpful if you&#x27;ve a couple of angels early on - they will help you set a price and will demonstrate some momentum at least. Angels are a lot friendlier and many are willing to back companies that are just starting to raise. However, you should, even at that stage, have a least a point of view on how much money </p><p>How do you value your company? There are plenty of <a href="https://medium.com/the-mission/state-of-seed-investing-in-2018-25eb28ac0e93#:~:text=%F0%9F%92%A5%20Seed%20deal%20sizes%20and,it%20hovered%20around%20%241M.">good guides</a> out there. It&#x27;s key to note that <em>you</em> set the price - you&#x27;ll get feedback pretty quickly if it&#x27;s too high. If you trust angels that you are speaking to, ask them what they think.</p><p>We used the <a href="https://blog.ycombinator.com/intro-to-the-yc-seed-deck/">YC seed deck</a>. Some people get really into the quality and design. Ours was black and white with a logo copy pasted onto the front. Maybe if we were in B2C this would have been more important. </p><p>Subtle sidenote advertisement: we actually do really want to drive design more heavily into the core of how we work. Please <a href="mailto:james@posthog.com">email me</a> if you&#x27;re a UX person - please send your portfolio if you have one. </p><p>We didn&#x27;t present the slides in the meeting, but we&#x27;d send them afterwards - we used this approach to structure how we talked about ourselves - there were a (tiny) handful of main points we wanted to make.</p><p>In the meeting itself, ask the investor&#x27;s opinions - it is a brilliant way to get advice on strategy and your company from people that can pattern match against hundreds of others. Not all investors will give the same advice, particularly for open source where the business models are a little nascent. Some will tell you to focus on revenue, others will push towards adoption, others will do something between the two.</p><p>You can do this positively to work out what to focus on &quot;what would you want us to achieve with this round&quot;, or to help improve your pitch &quot;what do you see as our biggest risk / what would stop you from investing in us&quot;.</p><h3 id="follow-up">Follow up</h3><p>This usually involves sending slides and a demo video (which we thought was a cool way to show the product off), then follow up booking another meeting. We weren&#x27;t perfect, but it&#x27;s clearly obvious that if you can respond immediately after the meeting, you&#x27;ll accelerate your own fundraising process and you&#x27;ve got the attention of the investor at that point rather than giving them time to get onto the next call.</p><p>Once that&#x27;s done, take a moment to think if anything could have been better for next time. If you get rejected, we found investors were very helpful and nice with giving feedback - just bear in mind the reason for rejection may not be the real reason. Did they just walk out of a bad meeting with their LPs, or did they get burned by a similar company once before? There&#x27;s an incentive for them not to tell you these things.</p><p>Do not underestimate how much pipeline you need to build. There is a lot of legwork. My investor spreadsheet ended up with 157 rows.</p><p>That number doesn&#x27;t reflect that we often had 2 - 5 meetings with the same person. I would estimate I did about 200 calls, each lasting about 45 minutes, in ~6 weeks, on top of all the booking meetings in. We probably had 30 rejections, usually due to us being &quot;too early&quot;, often coming from investors who hadn&#x27;t invested in open source companies before. At first, these felt disheartening, but after a while it became clear some people love what we&#x27;re working on, and others don&#x27;t, so we stopped caring! We ended up with the possibility of raising $5.5M and got really oversubscribed with investors fighting to get in, but it didn&#x27;t feel like that would happen at first.</p><p>It was very important that we kept the product getting better and our usage growing during this time. I focused exclusively on the fundraising process, and Tim focused exclusively on building the product with our kick ass team and helping out the community. It would have been much harder if we were solo founders. Some investors during the process of talking to us saw our user number double. ie our user numbers did this:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/ph-deployments.jpg" alt="user growth"/></p><p>Eventually, after the first 4 weeks, we started realizing in the data that there was a clear trend for who seemed the most engaged: general investors &lt; investors with many developer tools companies in their portfolio &lt; investors with a significant open source portfolio. The close rates of the last category was astronomically higher.</p><p>You will also probably need some users to be references, often repeatedly. We had four or five who did this for us and we will forever be grateful / send bottles of wine in the post <em>afterwards</em>.</p><p>If you ever speak to a happy user, or you get nice feedback on Twitter, ask them very nicely - most people find talking to VCs a fun opportunity. We tried to connect users we felt would be able to explain our software to a less technical audience to make sure these went well.</p><p>If you close an investor, it is a <em>really</em> good idea to make sure you then get introductions to whomever else they&#x27;d think your company could be a good fit for. We got the <em>majority</em> of our investment this way. You are not supposed to do this from investors that rejected you though (although that happened without us asking and also led to a lot of investment once or twice, but I would always decline offers to introduce us to others if an investor said no).</p><h2 id="raising-in-the-us-when-you-live-in-a-different-country">Raising in the US when you live in a different country</h2><p>PostHog is proud to be remote first. We think that&#x27;s a big advantage for open source companies. It means your users and community get to know you properly so it&#x27;s easier to make friends with actual people who dig your stuff. We aren&#x27;t a faceless corporation in an office somewhere. That&#x27;s why I write posts like this.</p><p>The reason we chose to raise in the US and to create a US company, even as UK residents, was that we believed it would give us the best swing for the fences. Moving to San Francisco for the YC batch meant we&#x27;d be amongst the highest concentration of founders of companies both big and small in order to learn as quickly as possible. We won&#x27;t move to San Francisco permanently for family reasons, but we will travel there frequently for this purpose.</p><p>It became clear, the same is true - at least for us - on the VC side. Not all, but the majority of UK investors we spoke with, felt the valuation was too high. I&#x27;d hazard a guess that we&#x27;d have $5M post money valuation in the UK (which would have meant we&#x27;d have needed to raise a lot less), whereas we ended up raising at $15M post. We can see why investors can be more risk averse - they can get into more companies if each company has a lower price. However, from the company&#x27;s perspective, more money means you have more resource to hit a homerun, which is what has to happen for the majority of VCs to be successful. There is some <a href="https://tomtunguz.com/seed-followon-rates/">interesting albeit old data</a> on how raising more money increases your chance of success later (although perhaps this is correlation not causation), but only up to a certain point.</p><h2 id="the-paperwork-youll-need">The paperwork you&#x27;ll need</h2><p>If you&#x27;re raising money in the US, we&#x27;d recommend you have a US parent company. You can &quot;flip&quot; your existing company to have a US parent - this cost us $10k, which was a frustrating expense, but a necessary one that was far outweighed in financial terms by raising in a more competitive market. If you don&#x27;t have a company formed for your project already, I&#x27;d just set up directly as a US company, and I&#x27;d definitely pay a US attorney to do that for you. You will have to have some money to do that, and it&#x27;ll mean you need to get an accountant to do taxes. Tim and I saved up before we started and used our own money for this.</p><p>Once the company was incorporated (which we had to do to get YC&#x27;s $150k initial investment in regardless so we were extra incentivized), we (/ our lawyer) created an employee options pool then raised our entire round on <a href="https://www.ycombinator.com/documents/">SAFEs</a>. SAFEs allow investors to invest without you having to create a priced round which costs usually a minimum of $25K or so, unless you use the <a href="https://www.seriesseed.com/">Series Seed</a> paperwork. They are quick to sign, with no legal work needed.</p><p>We set a cap with investors. We started off with a $12M post money cap, meaning that the first $200K or so that we raised guaranteed those investors that if our eventual priced round went over $12M valuation, they&#x27;d get a lower price as a reward for investing early thus getting a higher fraction of the company for the same money. After starting with angel investors on this basis, we decided fundraising was going well so we increased the cap to $15M. We were originally going to increase it to $20M, enabling us to raise more, but we felt given the economic uncertainty as covid hit that we should take the money as fast as possible in case the US went into a recession.</p><p>It&#x27;s important to note that the downside of SAFEs is that if you have a down round at the next phase of fundraising, you&#x27;ll get very diluted (if the price is lower than the cap).</p><p>We&#x27;ve no affiliation other than being friends, but in order to model how much of the company you&#x27;re selling during this process, we used <a href="https://pulley.com">Pulley</a>. You put in all the SAFEs and you can model out a series A to check how much you&#x27;ve sold. <a href="https://blog.ycombinator.com/dilution/">Sam Altman&#x27;s advice</a> is to try to give up no more than 10-15% in a seed round and 15-25% in your A round… although &quot;it&#x27;s far more important not to run out of money than almost anything else&quot;. We used <a href="https://www.clerky.com/">Clerky</a> to generate the SAFEs and to send them for electronic signature.</p><p>If you have traction or a great vision, the world is what you make of it in fundraising. If you act meek and ask investors to make up the price, you&#x27;ll land very low. Go in high and you&#x27;ll polarize people - which is what you need… a definite yes or definite no! Just be careful if you set the bar too high, you will want to jump over it in the next round.</p><h2 id="getting-the-first-cheque">Getting the first cheque</h2><p>We started off by speaking to some friendly angel investors. These are generally wealthy individuals who fall into two categories. Some are just plain passionate and love the idea of what you&#x27;re working on. Others angel invest full time and are like a mini fund.</p><p>To find angels, we thought about who we already knew and the founders of other companies similar to ours but much bigger. As we built the company, we got advice from many people along the way. We asked them. Some invested directly, others pointed us in the right direction. People were very responsive when we asked for specific help, and we will do our best to pay that forward. When people helped us, we tried to keep them posted on how we&#x27;d followed or not followed their advice so they could see that we really did value their time.</p><h2 id="getting-the-right-investors">Getting the right investors</h2><p>Many investors are very hands off, others will put a lot of resource into helping you.</p><p>If you have the luxury of choosing, which happens towards the end of your round when you&#x27;ve already raised enough to survive, it&#x27;s worth thinking about this.</p><p>More hand holding is probably better if you have less experience or you need someone to push you. We were worried that some of the more supportive investors were so supportive we&#x27;d struggle to realize that the company/project&#x27;s success or failure ultimately is our responsibility - not theirs. We are the ones speaking to users every day.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.8.0]]></title><description><![CDATA[What's box-fresh in PostHog? Cumulative graphs, better paths, and an upgrade to our actions. If you're self hosting and want these features -  update…]]></description><link>https://posthog.com/blog/the-posthog-array-1-8-0</link><guid isPermaLink="false">dfe07811-b1cc-5576-b6a8-8116ca6a1cb0</guid><pubDate>Wed, 03 Jun 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>What&#x27;s box-fresh in PostHog? Cumulative graphs, better paths, and an upgrade to our actions.</p><p>If you&#x27;re self hosting and want these features - <a href="/docs/runbook/upgrading-posthog">update your PostHog</a>.</p><h2 id="release-notes">Release notes</h2><h3 id="cumulative-graphs"><a href="https://github.com/PostHog/posthog/pull/862">Cumulative graphs</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/cumulative-graph.gif" alt="cumulative graphs"/></p><p>This feature is designed for startups.</p><p>We built it because we our own team had to create an investor presentation showing PostHog signups and realized that cumulative graphs can <em>only</em> go up and to the right. Just the thing for nailing that valuation!</p><h3 id="paths-got-more-powerful"><a href="https://github.com/PostHog/posthog/pull/897">Paths got more powerful</a></h3><p>We decided that the paths functionality needed more polish. You can&#x27;t quite see your face in it yet, but this week is a good step up.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/paths-start-point.jpg" alt="Paths start point"/></p><p>Finally, you can start your paths on a specific page. Useful for when your landing page isn&#x27;t your homepage, or when you&#x27;re trying to remove some of the noise from the graph when you&#x27;ve lots of volume.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/paths-filtering.jpg" alt="Paths filtering by properties"/></p><p>For sweet, sweet bonus points, our close-to-magical / hard-working developers worked in the ability to filter paths by properties.</p><p>This means you can understand how traffic from a particular URL, or users with a particular property are flowing through your application. Work out which ad campaign engaged users come from, know which teams are doing what, or just have a play.</p><h3 id="add-property-filters-to-actions--lots-of-improvements-841"><a href="https://github.com/PostHog/posthog/pull/841">Add property filters to actions + lots of improvements (#841)</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/actions-property-filter.jpg" alt="Actions property filter"/></p><p>This toy just got shinier. When you create an action, you can now filter events by properties. Not only that, but this pull request also made it easier to create actions too - we saw lots of first time users getting stuck here during the onboarding sessions.</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li>We cleaned up descriptions in the <a href="https://github.com/PostHog/posthog/pull/886">breakdown filter</a>.</li><li>The <a href="https://github.com/PostHog/posthog/pull/863">UX is nicer</a> for selection a URL on creating an action.</li><li>We made it simpler to understand <a href="https://github.com/PostHog/posthog/pull/873">how to use custom events</a> during the setup process.</li><li>The token issues, oh the token issues. <a href="https://github.com/PostHog/posthog/pull/909">Fixed</a> and <a href="https://github.com/PostHog/posthog/pull/894">fixed</a>.</li><li>It was time for our events table <a href="https://github.com/PostHog/posthog/pull/895">to become Ant Designed</a>.</li><li>Pre-2020 events <a href="https://github.com/PostHog/posthog/pull/875">won&#x27;t affect partitions</a> any more.</li><li><a href="https://github.com/PostHog/posthog/pull/854">Better debugging</a> with Sentry.</li><li>Scrollbar <a href="https://github.com/PostHog/posthog/pull/900">small issue be gone</a>.</li><li>We <a href="https://github.com/PostHog/posthog/pull/885">improved</a> how empty funnels work.</li><li>Events are <a href="https://github.com/PostHog/posthog/pull/833">40ms faster to process</a> - 25% quicker!</li><li>The sidebar <a href="https://github.com/PostHog/posthog/pull/839">works properly on mobile</a> - no more squished interface on your cell phone.</li><li>Fix a bug with <a href="https://github.com/PostHog/posthog/pull/844">selecting filters</a></li><li><a href="https://github.com/PostHog/posthog/pull/881">Funnels are simpler</a>.</li><li><a href="https://github.com/PostHog/posthog/pull/874">Solved</a> a tricky bug on app.posthog.com caused by URLs with non-utf8 or raw binary query parameters.</li><li>Nothing to do with <a href="https://www.babybel.com/welcome">dubious cheese</a>, we <a href="https://github.com/PostHog/posthog/pull/861">fixed errors with babel</a></li><li><a href="https://github.com/PostHog/posthog/pull/890">Improved toolbar UX</a> for actions to fix a small <a href="https://github.com/PostHog/posthog/issues/889">issue</a>. </li><li>PostHog will now <a href="https://github.com/PostHog/posthog/pull/845">cache SQL and parameters between events processing</a>. This speeds things up by a further 40%.</li><li>We <a href="https://github.com/PostHog/posthog/pull/898">refactored more classes to hooks</a>, fixing a bug with event name labels along the way.</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="sessions-view"><a href="https://github.com/PostHog/posthog/issues/882">Sessions view</a></h3><p>Thank you to <a href="https://github.com/PaoloC68">PaoloC68</a> for this one.</p><p>The goal is to be able to see all the specific sessions that have taken place, their respective users, the time, activity, and much more. It was really cool to see a mockup design for this to help explain the context!</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="weekly-round-up">Weekly round up</h2><ul><li><a href="https://www.gofundme.com/f/georgefloyd">George Floyd Memorial Fund</a></li><li><a href="https://www.gofundme.com/f/i-run-with-maud">I Run With Maud</a></li><li><a href="http://nationalbailout.org/">National Bail Out Fund</a></li><li><a href="https://actionnetwork.org/fundraising/louisville-community-bail-fund/">Louisville Community Bail Fund</a></li><li><a href="https://colorofchange.org/">Color of Change</a></li><li><a href="https://www.joincampaignzero.org/">Campaign Zero</a></li><li><a href="https://blacklivesmatter.com/">Black Lives Matter</a></li><li><a href="https://www.naacpldf.org/">NAACP Legal Defense Fund</a></li></ul><h2 id="posthog-news">PostHog news</h2><p>In light of all graphs going up and to the right, we&#x27;re looking to go from a team of 5 to &gt;5. Would you like to n+1 this thing?</p><p>If you are proactive, fast and passionate about code - email <a href="mailto:tim@posthog.com.">tim@posthog.com.</a> We are remote first, open source and in need of fast, founder-mentality proactive developers.</p><p>If you&#x27;re a UX or designer - reach out to <a href="mailto:james@posthog.com.">james@posthog.com.</a> We&#x27;ve got a fancy new logo and rebrand planned. We&#x27;d love someone to take the wheel.</p><p>In other news, we&#x27;re getting closer to a new logo and brand. It&#x27;s &#x27;80s and hedgehog inspired. That&#x27;ll take a few more weeks to appear, but watch this space.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.7.0]]></title><description><![CDATA[This week's update brings a React Native integration, time comparisons, easy access to user data from graphs, better user friendliness, and much…]]></description><link>https://posthog.com/blog/the-posthog-array-1-7-0</link><guid isPermaLink="false">ce8c39ea-9721-5cdb-8038-328d0942dd65</guid><pubDate>Tue, 26 May 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>This week&#x27;s update brings a React Native integration, time comparisons, easy access to user data from graphs, better user friendliness, and much stronger frontend testing.</p><p>Self hosting and want to upgrade? <a href="/docs/runbook/upgrading-posthog">Update your PostHog</a>.</p><h2 id="release-notes">Release notes</h2><h3 id="reactive-native"><a href="https://github.com/PostHog/posthog-react-native">Reactive Native</a></h3><p>We&#x27;ve been on a real push the last few weeks to provide libraries for those writing for mobile devices.</p><p>We now support <a href="/docs/integrate/client/android">Android</a>, <a href="/docs/integrate/client/ios">iOS</a> and - finally - <a href="/docs/integrate/client/react-native">React Native</a>!</p><p>As always, calls are non-blocking and fast with this library. It batches requests and flushes asynchronously. We&#x27;d use emojis at this point, if that were our style.</p><h3 id="posthog-for-startups-launched"><a href="/startups">PostHog for Startups Launched</a></h3><p>We benefited from many discounts as a startup ourselves. Now it&#x27;s time for us to do the same.</p><p>The details are <a href="/startups">available here</a>. We&#x27;ll provide a more generous free hosting tier (up to 20 million events per month) or a supported self deployment. You must have raised less than $5M and you have to be under 3 years old.</p><p>Tell your friends, or apply yourself.</p><h3 id="comparison-charts"><a href="https://github.com/PostHog/posthog/pull/824">Comparison charts</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/side-by-side-comparison.gif" alt="Comparison charts"/></p><p>The trends page is now even more powerful. You can compare time periods side-by-side - for charts or tables.</p><p>This is particularly useful if you wish to view different time periods without drawing huge graphs and cluttering your oh-so-beautiful dashboards.</p><p>Thanks to <a href="https://github.com/PaoloC68">Paolo</a> for <a href="https://github.com/PostHog/posthog/issues/715">suggesting this</a> :)</p><h3 id="view-the-users-inside-each-datapoint"><a href="https://github.com/PostHog/posthog/pull/830/commits/64e1ef34b5d8565934b1980d33432cef4e7002f7">View the users inside each datapoint</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/hover-breakdown.png" alt="Hover breakdown"/></p><p>Did you know you could do this? If you click the datapoints in your trends graphs, you can see a list of the relevant users.</p><p>It was already possible, but we made it much more obvious!</p><p>The reason we provide underlying data is so that you can debug the software much more easily, and you can get to the data you need.</p><h3 id="property-keys-explained"><a href="https://github.com/PostHog/posthog/pull/822">Property keys explained</a></h3><p><img src="https://user-images.githubusercontent.com/1727427/82579579-ed280500-9b85-11ea-92fe-6e7fe67c9d86.png" alt="property keys with explanations"/></p><p>AI has got less far than we thought from all the hype.</p><p>It turns out that most of our users are humans.</p><p>Ever wondered what <code>Referrer URL</code> actually means?</p><p>We finally decided to pass you explanations rather than weird sounding variable names. We hope this means you really understand what your trends are showing you.</p><p>Oh, and we threw in some hedgehogs icons too. Because we can. #woodlandUX</p><h3 id="automatic-domain-detection"><a href="https://github.com/PostHog/posthog/pull/815">Automatic domain detection</a></h3><p><img src="https://user-images.githubusercontent.com/1727427/82486899-72071600-9ad5-11ea-8bd1-2f589cc69d34.png" alt="automatic domain detection"/></p><p>You <a href="https://github.com/PostHog/posthog/issues/764">used to</a> have to enter your domain every time you created an action by selecting an element. Now you don&#x27;t!</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li>Developing PostHog is now a bit less tedious. We <a href="https://github.com/PostHog/posthog/pull/826">halved the time</a> it takes to install python dependencies for any deployment.</li><li>We&#x27;ve written <a href="https://github.com/PostHog/posthog/pull/802">a lot of front end tests</a>, as well as a <a href="https://github.com/PostHog/posthog/pull/819">regression test</a> for single step funnels, where there was a bug - <a href="https://github.com/PostHog/posthog/pull/817">now fixed</a>.</li><li>We neatened dashboard items so they&#x27;re <a href="https://github.com/PostHog/posthog/pull/846">closer together</a> in the navigation.</li><li>We <a href="https://github.com/PostHog/posthog/pull/842">improved our Sentry setup</a>.</li><li>Marius <a href="https://github.com/PostHog/posthog/pull/838">fixed the way tables display</a> when they&#x27;re on a dashboard.</li><li>Eric <a href="https://github.com/PostHog/posthog/pull/832">slayed a bug</a> when the People page wouldn&#x27;t load with entity specific filters applied.</li><li>We&#x27;ve had several users with very high scale pushing the limits of redis. We have more work to do here, but we&#x27;ve <a href="https://github.com/PostHog/posthog/pull/825">improved the way we handle filled up servers</a>.</li><li>A little <a href="https://github.com/PostHog/posthog/pull/831">header spring cleaning</a>.</li><li>We <a href="https://github.com/PostHog/posthog/pull/835">fixed a bug</a> with suggestions loading, and another with <a href="https://github.com/PostHog/posthog/pull/829">EditAppUrls null check</a>.</li><li>Cohort property filters had a small issue, <a href="https://github.com/PostHog/posthog/pull/828">now fixed</a>.</li><li>AntD&#x27;s gradual takeover of our app and website continued - it was <a href="https://github.com/PostHog/posthog/pull/814">added to more dropdowns</a> this week.</li><li>We prevented requests to update server for those who have opted out, and <a href="https://github.com/PostHog/posthog/pull/821">added fine grained control</a> to the opt out flow.</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="deployment-master-plan"><a href="https://github.com/PostHog/posthog/issues/799">Deployment master plan</a></h3><p>We also have a few backlog bugs to tackle - we will work through these.</p><h2 id="weekly-round-up">Weekly round up</h2><ul><li>Get away from the screen - try Wired&#x27;s <a href="https://www.wired.co.uk/article/best-board-games-2020">recommended board games</a>. Included since they criticize Monopoly.</li><li>Make a new <a href="https://github.com/olivia-ai/olivia">open source best friend</a>, powered by a neural network.</li><li>Get reading <a href="https://github.com/EbookFoundation/free-programming-books">free programming books</a>.</li><li>Also - <a href="https://www.kennedyspacecenter.com/launches-and-events/events-calendar/see-a-rocket-launch">don&#x27;t miss the rocket launch</a> later today!</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><p>We&#x27;ve had a big influx of Y Combinator S20 companies deploying the platform. It has been fun to meet everyone at the start of their journey - especially since new projects should have product analytics installed!</p><p>As a new idea, we&#x27;ve been running 15 min onboarding sessions with each company, which has highlighted many more features we wish to improve… <a href="https://twitter.com/paulg/status/898476047263518720?lang=en">Paul G was right</a>, we&#x27;ll be doing lots more of this.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.6.0]]></title><description><![CDATA[One of the most fun weeks we've had so far with our UX - resizable and touch-enabled dashboards with a new display mode, Microsoft Teams support, and…]]></description><link>https://posthog.com/blog/the-posthog-array-1-6-0</link><guid isPermaLink="false">d72c5f68-17af-5e65-909e-73bfe1e1c631</guid><pubDate>Tue, 19 May 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>One of the most fun weeks we&#x27;ve had so far with our UX - resizable and touch-enabled dashboards with a new display mode, Microsoft Teams support, and paths for events. Plus, a ton of performance improvements.</p><p>Want to try this out and self hosting? <a href="/docs/runbook/upgrading-posthog">Update your PostHog</a>.</p><h2 id="release-notes">Release notes</h2><h3 id="awesome-er-dashboards-with-resizing-including-for-mobile"><a href="https://github.com/PostHog/posthog/pull/753">Awesome-er dashboards</a> with <a href="https://github.com/PostHog/posthog/pull/746">resizing</a>, including <a href="https://github.com/PostHog/posthog/pull/775">for mobile</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/dashboards-moving.gif" alt="Touch dashboards"/></p><p>This update is pretty fun.</p><p>It is now possible to rearrange dashboards, even if you&#x27;re using PostHog on a mobile device.</p><p>Now you&#x27;re able to adjust their colours (including black!) and even to enter &#x27;presentation mode&#x27; to view your dashboard full screen - perfect if you want a dashboard up in the office:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/presentation-mode.png" alt="Dashboard presentation mode"/></p><p>Finally, your pinned dashboards will appear in the sidebar, so they&#x27;re easier to get to.</p><h3 id="microsoft-teams-integration"><a href="/docs/integrate/webhooks/microsoft-teams">Microsoft Teams integration</a></h3><p>PostHog already integrates with <a href="/docs/integrate/webhooks/slack">Slack</a>.</p><p>We had a user who said they&#x27;d got the webhook working with MS Teams too, so we wrote out how to do that.</p><p>This means you can set up an alert for any action that takes place in your app. In this case, the user wanted their sales team to get an alert when a new user signed up.</p><h3 id="paths-with-events"><a href="https://github.com/PostHog/posthog/pull/692">Paths with events</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/paths-with-events.gif" alt="Paths with events"/></p><p>PostHog has a paths page that lets you see how traffic is flowing through your website or application.</p><p>However, to-date, we have only been able to show page views.</p><p>Now, you can visualize any series of page views or events! This means you can easily visualize how thousands of users are interacting with your application in a freeform way.</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li><a href="https://github.com/PostHog/posthog/pull/768">You can now use</a> the <code>django-debug-toolbar</code> to diagnoze performance issues better</li><li>We added <a href="https://eslint.org/">ES Lint</a>, for JavaScript linting.</li><li>We fixed <a href="https://github.com/PostHog/posthog/pull/769">property filter array issue</a></li><li><a href="https://github.com/PostHog/posthog/pull/792">Optimize funnel rendering</a> is a major improvement in speed for those with many events - now 1 order of magnitude faster. </li><li><a href="https://github.com/PostHog/posthog/pull/738">Multiple filters with same key</a>, fixed a bug that means you can now have multiple filters that are the same ie <code>$current_url doesn&#x27;t equal A</code> and <code>$current_url doesn&#x27;t equal B</code></li><li><a href="https://github.com/PostHog/posthog/pull/733">Event partitioning</a>, which speeds up trends and paths pages in particular. Learn more about <a href="/docs/self-host/deploy/configuration#scaling-up">scaling PostHog</a>.</li><li>The component <code>Deletewithundo</code> wasn&#x27;t working because of property mixup, <a href="https://github.com/PostHog/posthog/pull/750">now it is</a>!</li><li><a href="https://github.com/PostHog/posthog/pull/751">Funnels</a> and <a href="https://github.com/PostHog/posthog/pull/757">Actions</a> now use Ant Design</li><li>We temporarily <a href="https://github.com/PostHog/posthog/pull/774">removed stickiness breakdowns</a>, as they were causing issues. We&#x27;ll put this back into our roadmap and will prioritize depending on user feedback.</li><li>We have <a href="https://github.com/PostHog/posthog/pull/758">better handling of breakdown views</a> when users don&#x27;t have the property.</li><li><a href="https://github.com/PostHog/posthog/pull/725">Fixed an issue</a> with viewing certain queries over all time.</li><li><a href="https://github.com/PostHog/posthog/pull/748">Resolved an issue</a> with sessions where null conditions were missing</li><li>Fixed the <a href="https://github.com/PostHog/posthog/pull/785">cohort input search</a> bug</li><li>Solved <a href="https://github.com/PostHog/posthog/issues/794">a bug with navigating to users</a></li><li>We <a href="https://github.com/PostHog/posthog/pull/797">improved our event insertion scalability</a></li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="dev-toolbar"><a href="https://github.com/PostHog/posthog/issues/741">Dev toolbar</a></h3><p>Last week was a call for discussion, now there&#x27;s some really good commentary on how this should look and feel. We&#x27;d love you to weigh in or upvote what you like, to help us shape up <a href="/handbook/strategy/roadmap">phase 2 of the roadmap</a>.</p><h2 id="weekly-round-up">Weekly round up</h2><ul><li><a href="https://en.wikipedia.org/wiki/Timeline_of_the_far_future">Far future timeline</a>. This gave me a mild existential crisis until I got to what happens after universe heat death.</li><li><a href="https://quickref.dev/">Developer search engine</a>. The lack of commercial focus here is pretty neat although I still wish someone would build a manually curated blog search engine as an open source project.</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><p>Overall, we&#x27;re feeling pretty pleased with ourselves this week - the level of polish in the product has gone up quite dramatically. We&#x27;ve got a design candidate lined up, to be disclosed shortly, to help achieve the same with our website and documentation too.</p><p>Our hunt for a superb devops person has come to a wonderful conclusion… we are delighted to say that <a href="https://twitter.com/FuzionTech">James G</a> will be joining us initially as a contractor for the next few months then as a full time employee after that. He has a ton of experience of enormous user bases and already has made our funnels <a href="https://github.com/PostHog/posthog/pull/751">an order of magnitude faster</a>. Tim and James G are busy scoping a <a href="https://github.com/PostHog/posthog/issues/799">deployment master plan</a>, which will be a key part of his focus.</p><p>On that note, if you are reading and are using PostHog at scale, or having any issues with load times, please <a href="/support">let us know</a> - this is a real focus so more folks can use the platform without any issues.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.5.0]]></title><description><![CDATA[Another week, another PostHog Array. We're steadily working towards parity with other tools. This week's highlights include a new website, multiple…]]></description><link>https://posthog.com/blog/the-posthog-array-1-5-0</link><guid isPermaLink="false">0c87b503-d8ef-551e-a461-61bdcb7c8de0</guid><pubDate>Wed, 13 May 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Another week, another PostHog Array. We&#x27;re steadily working towards parity with other tools. This week&#x27;s highlights include a new website, multiple dashboards, a sleek new design and breaking down by cohorts.</p><p><a href="/docs/runbook/upgrading-posthog">Click here for instructions</a> on how to update.</p><h2 id="release-notes">Release notes</h2><h3 id="multiple-dashboards"><a href="https://github.com/PostHog/posthog/pull/740">Multiple dashboards</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/multiple-dashboards.png"/></p><p>It&#x27;s now possible to have multiple dashboards. This can help you organize your graphs and let people have their own personal dashboards. You can also pin important dashboards so they&#x27;re easily accessible to anyone in your organization.</p><p>In the next release, you&#x27;ll even be able to resize, re-order and pick your own color for graphs.</p><h3 id="new-website"><a href="https://posthog.com">New website</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/new-website.png"/></p><p>PostHog has a new home! With improved design and super simple instructions on how to get started with PostHog. Our docs and handbook are also integrated for easy access, and the whole thing is run on Gatsby, because we &lt;3 other open source projects.</p><p>This makes it easier for the community to propose changes at the <a href="https://github.com/posthog/posthog.com">website repo</a>.</p><h3 id="dark-er-mode"><a href="https://github.com/PostHog/posthog/pull/740">Dark-er mode</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/dark-sidebar.png"/></p><p>PostHog is now a lot prettier, with a sleek dark sidebar.</p><h3 id="break-down-by-cohort"><a href="https://github.com/PostHog/posthog/pull/690">Break down by cohort</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/breakdown-cohort.png"/></p><p>You were already able to create cohorts, but now you can use them in trends to find out exactly what your users are doing and how certain groups compare to others.</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li><a href="https://github.com/PostHog/posthog/pull/717">Big refactor of how we do routing in the app</a> which means going backwards and forwards should work a lot smoother</li><li><a href="https://github.com/PostHog/posthog/pull/729">Faster loading of paths</a></li><li><a href="https://github.com/PostHog/posthog/pull/734">More accurate DAU/uniques count</a></li><li><a href="https://github.com/PostHog/posthog/pull/735">Fix dotted line appearing on completed days</a>. Thanks <a href="https://github.com/Jujhar">Jujhar</a>!</li><li>Welcomed <a href="https://github.com/PostHog/posthog/pull/739">another 5 contributors</a> to the README. Thank you <a href="https://github.com/eLRuLL">eLRuLL</a>, <a href="https://github.com/maximmarakov">maximmarakov</a>, <a href="https://github.com/sac0">sac0</a>, <a href="https://github.com/solnsubuga">solnsubuga</a> and <a href="https://github.com/Jujhar">Jujhar</a></li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="dev-toolbar-ideas"><a href="https://github.com/PostHog/posthog/issues/741">Dev toolbar ideas</a></h3><p>The PostHog team is busy working out how to present all the information in PostHog while you&#x27;re developing. Feel free to add your own ideas here!</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="weekly-round-up">Weekly round up</h2><ul><li><a href="https://twitter.com/destraynor/status/1258372157706510336">Amazon Writing Style Tips</a>. Writing is crucial for remote teams and we loved these tips from Amazon.</li><li><a href="https://www.chargedretail.co.uk/2020/05/11/lidl-owner-launching-its-own-rival-to-amazon-web-services/">Lidl owner launching its own rival to Amazon Web Services</a>. I guess if the owners of Whole Foods can do it, why not Lidl?</li></ul><h2 id="posthog-news">PostHog news</h2><p>We’re growing rapidly, and we’re constantly expanding our team. We’re looking for a <a href="https://news.ycombinator.com/item?id=23044768">strong devops engineer</a> to join us. If that sounds like you, please email <a href="mailto:tim@posthog.com">tim@posthog.com</a>.</p><p>We are also looking for a really strong <a href="/careers#designer--ux">designer / UX person</a>! <a href="mailto:james@posthog.com">Email James</a> if this sounds like it&#x27;s for you!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.4.0]]></title><description><![CDATA[Session times are here! They're a great way to help understand how engaged users are. The Array 1.4.0 brings plenty of improvements to our core…]]></description><link>https://posthog.com/blog/the-posthog-array-1-4-0</link><guid isPermaLink="false">05e4b630-be2a-50c8-9f7a-af0a1acc0f86</guid><pubDate>Thu, 07 May 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Session times are here! They&#x27;re a great way to help understand how engaged users are. The Array 1.4.0 brings plenty of improvements to our core functionality.</p><h2 id="release-notes">Release notes</h2><h3 id="filter-properties-individually"><a href="https://github.com/PostHog/posthog/pull/671">Filter properties individually</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/captured.gif"/></p><p>In both trends and funnels, you can now add filters for each event individually, rather than for all events.</p><h3 id="breakdown-by-properties-in-graph"><a href="https://github.com/PostHog/posthog/pull/671">Breakdown by properties in graph</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/captured-1.gif"/></p><p>Previously the only way to see properties broken down by value was in a table. Now you can break down on any property and display it in a graph.</p><p>Select a property on the left hand side, like $browser, and a line will appear for each value of that property (Chrome, Firefox etc).</p><h3 id="session-time-series"><a href="https://github.com/PostHog/posthog/pull/659">Session time series</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/Screenshot-2020-05-06-at-10.59.34.png"/></p><p>Eric has been hard at work improving the way we display session information. You can now see how the average time spent on your app changes over time.</p><h3 id="export-cohorts-as-csv"><a href="https://github.com/PostHog/posthog/pull/441">Export cohorts as CSV</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/Screenshot-2020-05-06-at-10.53.26.png"/></p><p>This was contributed by <a href="https://github.com/anoopemacs">Anoop</a>, and while it admittedly took a while to get merged it’s a great addition. You can now export a full list of users from any cohort to CSV, including all distinct ids and properties.</p><h3 id="edit-frontend-selectors-in-actions"><a href="https://github.com/PostHog/posthog/pull/670">Edit frontend selectors in Actions</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/Screenshot-2020-05-06-at-10.56.03.png"/></p><p>Previously, the only way to edit selectors for frontend elements in actions was to go to your own site and use the toolbar. Now you can do this inside PostHog itself.</p><h3 id="setup-page-redesign">Setup page redesign</h3><p><a href="https://github.com/PostHog/posthog/pull/701">Related PR</a></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/05/Screenshot-2020-05-06-at-11.13.06.png"/></p><p>Thanks to Sanket for this one! The setup page now uses Antd too and it looks great.</p><h3 id="restrict-access-to-instance-by-ip"><a href="/docs/deployment#restrict-access-by-ip">Restrict access to instance by IP</a></h3><p>You can now restrict access to your instance by IP for extra security. <a href="/docs/deployment#restrict-access-by-ip">See docs</a> on how to set that up.</p><h2 id="bug-fixes-and-performance-improvements">Bug fixes and performance improvements</h2><ul><li>More <a href="https://github.com/posthog/posthog/pull/693">accurate timestamps</a> when users have their computer time set incorrectly.</li><li><a href="https://github.com/posthog/posthog/pull/700">Selecting today + hourly interval didn’t work</a>.</li><li><a href="https://github.com/posthog/posthog/pull/706">Speed up cohorts page</a> loading and use Antd.</li><li><a href="https://github.com/posthog/posthog/pull/681">Add screen name</a> to events table for mobile apps.</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="compare-to-in-charts-715"><a href="https://github.com/PostHog/posthog/issues/715">“Compare to” in charts #715</a></h3><p>Thanks to <a href="https://github.com/PaoloC68">Paolo</a> for raising this issue. It’d be great to have the ability to compare certain timeframes against each other.</p><p>Feel free to comment on the issue if you have any other ideas about this!</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="weekly-round-up">Weekly round up</h2><ul><li><a href="https://www.lowtechmagazine.com/2020/01/how-sustainable-is-a-solar-powered-website.html">How Sustainable is a Solar Powered Website?</a></li><li><a href="https://github.com/moufette-tools/moufette">Moufette</a>, a tool inspired by PostHog(!) that allows your users to give instant feedback on any page in your app</li></ul><h2 id="posthog-news">PostHog news</h2><p>We’re growing rapidly, and we’re constantly expanding our team. We’re looking for a <a href="https://news.ycombinator.com/item?id=23044768">strong devops engineer</a> to join us. If that sounds like you, please email <a href="mailto:tim@posthog.com">tim@posthog.com</a>.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.3.0]]></title><description><![CDATA[Another shiny new integration - PostHog now plays nicely with Android! Like what you see and self-hosting?  Update  your instance. Release notes…]]></description><link>https://posthog.com/blog/the-posthog-array-1-3-0</link><guid isPermaLink="false">d2c8f3be-adb2-5542-b8ae-b8960fe61465</guid><pubDate>Wed, 29 Apr 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Another shiny new integration - PostHog now plays nicely with Android!</p><p>Like what you see and self-hosting? <a href="/docs/runbook/upgrading-posthog">Update</a> your instance.</p><h2 id="release-notes">Release notes</h2><h3 id="posthog-android-library"><a href="/docs/integrate/client/android">PostHog Android Library</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/android-events.gif"/></p><p>In addition to the work Marius put into the iOS integration, this week you can also capture events in your Android app and send them to PostHog. Like the iOS library you can automatically captures screen changes, and you can capture events as per usual</p><p>Check out our <a href="/docs/integrate/client/android">Android docs</a> on how to install it on your app.</p><h3 id="gatsby-app"><a href="/docs/libraries/gatsby">Gatsby App</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/gatsbyplugin.gif"/></p><p>This week also sees the first community contributed app – thank you <a href="https://github.com/kgritesh/gatsby-plugin-posthog-analytics/">Ritesh Kadmawala</a>.</p><p>It’s now very easy in Gatsby’s words to “make your blazing fast site even more awesome.”</p><h3 id="url-wildcards"><a href="https://github.com/PostHog/posthog/pull/653">URL Wildcards</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-19-e1588157571429.png"/></p><p>A user came to Tim with a problem, due to the nature of their site pages could be the same but have different url/paths – wildcards felt like an easy way of overcoming this so Tim merged this pr.</p><p>You can now use % as a wildcard when setting up an action.</p><h3 id="further-updates-to-trends-design"><a href="https://github.com/PostHog/posthog/pull/648">Further updates to Trends design</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-21-e1588171341976.png"/></p><p>As you’ll see below we have continued with our AntD implementation but this comes with also considering how to improve the Trends page as we now <a href="https://github.com/PostHog/posthog/pull/656">default to Trends</a> when you login.</p><p>Moving the bar to the left allows users to easily engage with the Trends graphs as they filter by Actions and Events.</p><h3 id="trends-hints"><a href="https://github.com/PostHog/posthog/pull/632">Trends Hints</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Fullscreen_4_29_20__12_09_PM-e1588158606164.png"/></p><p>Eric mentioned when we added the stickiness explanation in Trends it was one of the most transformative updates in that release as he had to check the docs to remind himself of what he was measuring.</p><p>After a customer interview Aaron and Tim realized this was true for trends in general so we added Trends hints.</p><h3 id="sort-events-table-by-timestamp"><a href="https://github.com/PostHog/posthog/pull/626">Sort events table by timestamp</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/timestampreverse.gif"/></p><p>This is another PR this week that we have the community to thank for, <a href="https://github.com/solnsubuga">solnsubuga</a> felt that clicking the table header for the timestamp should sort the events in reverse order, and we agreed.</p><h2 id="performance-updates">Performance updates</h2><ul><li><a href="https://github.com/eLRuLL">Eric</a> added a <a href="https://github.com/PostHog/posthog/pull/660">strict flake8</a> setup as well as improvements, laying the ground work for code linting and likely more prs regarding darker.</li><li><a href="https://github.com/PostHog/posthog/pull/663">Upgraded</a> Kea to 2.0.0-beta.5.</li><li>We continue to implement AntD as above in <a href="https://github.com/PostHog/posthog/pull/621">Setup</a>.</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="favorite-issue">Favorite issue</h2><h3 id="copy-to-clipboard-feature-for-scriptsdocs-661"><a href="https://github.com/PostHog/posthog/issues/661">Copy to clipboard feature for scripts/docs #661</a></h3><p>Thank you <a href="https://github.com/sac0">sac0</a> for opening this issue then after a quick discussion with Tim <a href="https://github.com/PostHog/posthog/pull/662">closed it</a>.</p><p>Great to see updates built on the work we have done so far that ensures PostHog is better to use for the entire community.</p><h2 id="pr-of-the-week">PR of the week</h2><p><a href="https://github.com/PostHog/posthog/pull/660">Flake8 setup and improvements</a></p><p>What makes it the PR of the week is the discussion it started in our repo, it was awesome to see an active discussion on how to make it easier to contribute, potential usage of <a href="https://github.com/psf/black">black</a> and <a href="https://github.com/akaihola/darker">darker</a> for code formatting and a resolution that improves the PostHog project.</p><h2 id="repo-round-up">Repo round up</h2><ul><li><a href="https://github.com/claudiodangelis/qrcp">Qrcp</a> (Transfer files over wifi from your computer to your mobile device by scanning a QR code without leaving the terminal.)</li><li><a href="https://github.com/saltbo/uptoc">Uptoc</a> (A cli tool for deploying files to the cloud storage.)</li><li><a href="https://github.com/programical/gitland">Gitland</a> (A multiplayer game controlled using GitHub.)</li></ul><h2 id="posthog-news">PostHog news</h2><p>We were all pretty excited at PostHog when we hit 2k stars on GitHub, we know it’s a vanity metric but we are pleased that we have started to build the foundations of a strong community thank you all!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.2.0]]></title><description><![CDATA[Big new integration - PostHog now has a library for iOS! Like what you see and self-hosting?  Update  your instance. Release notes PostHog iOS Library…]]></description><link>https://posthog.com/blog/the-posthog-array-1-2-0</link><guid isPermaLink="false">cf957510-2008-5d1a-b5aa-13126354a42b</guid><pubDate>Wed, 22 Apr 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Big new integration - PostHog now has a library for iOS!</p><p>Like what you see and self-hosting? <a href="/docs/runbook/upgrading-posthog">Update</a> your instance.</p><h2 id="release-notes">Release notes</h2><h3 id="posthog-ios-library"><a href="/docs/integrate/client/ios">PostHog iOS Library</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/ioslibrary1.gif"/></p><p>You can now capture events in your iOS app and send them to PostHog. It automatically captures screen changes, and you can capture events as per usual</p><p>Marius has been working on a lot of our libraries (starting with <a href="https://github.com/PostHog/posthog-ruby">Ruby</a>) but we knew that our mobile support was a big gap.</p><p>See our <a href="/docs/integrate/client/ios">iOS docs</a> for how to install it on your app.</p><h3 id="session-information"><a href="https://github.com/PostHog/posthog/pull/586">Session Information</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Sessions.gif"/></p><p>You can now see exactly how much time people are spending on your app using sessions. There’s two modes: “Average session length”, which shows you how long sessions are and how many, and “distribution” which makes it super easy to spot whether sessions are uniformly distributed or whether there are outliers.</p><p>So far engagement metrics have focused on repeated actions or the volume of page views – we still think Stickiness, Active users are very valuable but this adds another dimension.</p><h3 id="filtering-funnels-by-properties"><a href="https://github.com/PostHog/posthog/pull/628">Filtering funnels by properties</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/funnel-properties.gif"/></p><p>In addition to the <a href="https://github.com/PostHog/posthog/pull/506">changes</a> last <a href="https://github.com/PostHog/posthog/pull/561">week</a> on funnels so that they work like /trends you can also apply properties to your funnels to narrow down conversion metrics by anything you like.</p><h2 id="performance-updates">Performance updates</h2><ul><li><a href="https://github.com/PostHog/posthog/pull/630">Added indexes</a> so loading /trends is super fast, even with millions of events.</li><li>We have <a href="https://github.com/PostHog/posthog/pull/615">offloaded storing events</a> to workers, so that calls to our events API are non-blocking, and you can scale insertion of events independently from the rest of PostHog.</li><li>Removed drf-yasg in favor of <a href="https://github.com/PostHog/posthog/pull/596">our own hosted docs</a>.</li><li>As part of our <a href="https://github.com/PostHog/posthog/pull/619">design push</a> Eric got the next branch out with the Ant design layout tweaking some of those aspects.</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="running-locally-with-docker"><a href="https://github.com/PostHog/posthog/issues/636">Running locally with docker</a></h3><p>We had instructions ready to run PostHog locally but had not prioritized doing local development with Docker.</p><p>Thank you <a href="https://github.com/viperfx">Viperfx</a> for requesting this.</p><p>We are very keen to see enhancements that are not part of our parity project, please keep them coming.</p><h2 id="pr-of-the-week">PR of the week</h2><h3 id="removing-drf-yasg-in-favor-of-new-docs-website"><a href="https://github.com/PostHog/posthog/pull/596">Removing drf-yasg in favor of new docs website</a></h3><p>Thank you to <a href="https://github.com/sanketdg">SanketDG</a> for another pr that has helped ensure we fixed an <a href="https://github.com/PostHog/posthog/issues/574">issue</a> raised by another user <a href="https://github.com/maximmarakov">maximmarakov</a>, it’s great to see the community fix ad hoc issues especially ones that might not directly be related to new features but ensuring our docs and instructions are up to date for other users.</p><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="repo-round-up">Repo round up</h2><ul><li><a href="https://github.com/jdan/98.css">98.css</a> (Whilst looking at a new design system, there was one vote to go super old school on the UI) </li><li><a href="https://github.com/alievk/avatarify">Avatarify</a> (More fun to be had with video call being the norm, photorealistic avatars for Skype and Zoom)</li><li><a href="https://github.com/teonite/t-shirts">Teonite T-shirts</a> (Aaron has been creating PostHog T-shirts this week and was intrigued by an Open Source T-shirt project – although the PostHog design is very different) </li></ul><h2 id="posthog-news">PostHog news</h2><p>PostHog gets bigger every week! Not just in terms of new users and feature updates – we’re also excited to have <a href="https://twitter.com/mariusandra">Marius</a> join – he was one of the first contributors but has done a stunning amount in a short time.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.1.0]]></title><description><![CDATA[Major update time (hence the change to 1. 1 .0) - push-based integrations have been introduced! Like what you see and self-hosting?  Update  your…]]></description><link>https://posthog.com/blog/the-posthog-array-1-1-0</link><guid isPermaLink="false">bf018c8a-456a-580e-b066-36573637c7f8</guid><pubDate>Wed, 15 Apr 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Major update time (hence the change to 1.<em>1</em>.0) - push-based integrations have been introduced!</p><p>Like what you see and self-hosting? <a href="/docs/runbook/upgrading-posthog">Update</a> your instance.</p><p>First our updates and new features.</p><h2 id="release-notes">Release notes</h2><h3 id="posthog-integrates-with-slack"><a href="/docs/integrate/webhooks/slack">PostHog integrates with Slack</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Slack_____slackupdates___PostHog.png"/></p><p>This update allows you to send push notifications to Slack when an Action is triggered. Our docs show you how you can <a href="/docs/integrate/webhooks/slack">integrate Slack</a> with your own PostHog instance.</p><p>It’s exciting because PostHog can now update you in real time when key actions are triggered – so if people were for instance having an issue installing your app you can reach out to them immediately. </p><p>Product analytics help you understand how your work is being used but this is the first step towards PostHog helping you act on the metrics you record. </p><h3 id="filtering-funnels-by-date"><a href="https://github.com/PostHog/posthog/pull/506">Filtering Funnels by date</a></h3><p>Funnels allow you to track conversion of actions/events that users take – Seeing funnel performance over all-time is not useful if I wanted to see if I had improved conversion due to a recent change.</p><p>James used this to notice a 300% improvement in a conversion metric after updating the PostHog home page, this wasn’t possible before this release.</p><h3 id="filtering-funnels-by-events"><a href="https://github.com/PostHog/posthog/pull/561">Filtering Funnels by events</a></h3><p>In addition to the update above we realized we were also increasing the amount of time it took to build funnels if you had to add actions even if your events were clear already.</p><p>Now you have a simpler way of using PostHog where you can act on your insights quicker.</p><h3 id="new-design-system"><a href="https://github.com/PostHog/posthog/pull/530">New design system</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-6-e1586882580994.png"/></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-10.png"/></p><p>It had been mentioned that PostHog looked <strike>like it was designed by developers</strike> <em>functional</em> and that perhaps PostHog could be beautiful as well. </p><p>Eric used <a href="https://ant.design/">Ant Design</a> for this and began with adding the buttons and drop downs and the sidebar but we will be changing the <a href="https://github.com/PostHog/posthog/issues/531">whole design</a> so that PostHog is both functional and beautiful. </p><h3 id="adding-time-intervals-to-trends"><a href="https://github.com/PostHog/posthog/pull/504">Adding time intervals to Trends</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/time-intervals.gif"/></p><p>A user told Tim that whilst Trends worked great, measuring performance on a daily basis limited the ability to work out trends for high volume events that might take place over a single day. Could we create options to change the time intervals to hours as well as days?</p><p>We went one further as you can now can build trend graphs across minutes, hours, days, weeks or months.</p><h3 id="dotted-lines-to-represent-data-yet-to-be-determined"><a href="https://github.com/PostHog/posthog/pull/578">Dotted lines to represent data yet to be determined</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/dotted-lines.png"/></p><p>Aaron had to mentally remind himself when looking at PostHog stats each day that 9:30am in London meant well over half of PostHog users were yet to wake up – we felt that other users would have this issue so added dotted lines to make the distinction between collected and collecting data. </p><p>This is tied to the below update where we want PostHog to feel intuitive so you can act on data confidently.</p><h3 id="x-axis-starts-at-0"><a href="https://github.com/PostHog/posthog/pull/563">X axis starts at 0</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-7.png"/></p><p>James was slightly worried that it looked like usage would drop dramatically to nothing. </p><p>Luckily a contributor noticed that we didn’t always start the X axis at 0 to show all values. That sounded right in theory but not in practice. Trend graphs will all start at 0 so as not to shock you at plummeting volumes of actions or events.</p><h3 id="adding-daus-as-a-default-dashboard"><a href="https://github.com/PostHog/posthog/pull/559">Adding DAUs as a default dashboard</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-8.png"/></p><p>Daily active users (DAUs) are a quick and insightful way to measure engagement with your site or app. </p><p>We find it very useful so thought it would be a useful default dashboard for everyone new to PostHog. </p><p>Note: this is <em>only</em> on new deployments.</p><h3 id="paths-are-prettier"><a href="https://github.com/PostHog/posthog/pull/542">Paths are prettier</a></h3><p><img src="https://user-images.githubusercontent.com/1727427/79004996-d1c0e780-7b4d-11ea-824f-bff7251c7beb.png"/></p><p>This is a small change but will be important for future versions as we want to make <a href="https://github.com/PostHog/posthog/issues/448">paths</a> <a href="https://github.com/PostHog/posthog/issues/568">powerful</a>. For now we have updated the way urls are rendered so they don’t cover the whole screen depending on screen size.</p><h3 id="ux-improvements-to-saving-actions">UX Improvements to saving Actions</h3><p><a href="https://github.com/PostHog/posthog/pull/497">Related PR</a></p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/save-actions-ux.gif"/></p><p>We added conditional autofocus and disabling the save button if no changes have been made. </p><p>This ensures a smoother experience as well as helping you be sure exactly what you are saving.</p><h2 id="performance-updates">Performance updates</h2><ul><li>Changed the way <a href="https://github.com/PostHog/posthog/pull/588">we store event properties</a>. This is very impactful if you have a large number of events which could break PostHog instances.</li><li>You can now <a href="https://github.com/PostHog/posthog/pull/571">filter by event name</a>, we don’t know why we didn’t include this originally but now you can get a list of events with a specific name.</li><li>Fixed a small bug that <a href="https://github.com/PostHog/posthog/pull/552">duplicated users</a> in Cohorts.</li><li>We added some helpful mypy rules to <a href="https://github.com/PostHog/posthog/pull/562">configure mypy</a>.</li><li>Added a <a href="https://github.com/PostHog/posthog/pull/583">timestamp index</a> which allows event tables to load at very large volumes.</li><li>We added <a href="https://github.com/PostHog/posthog/pull/558">updates</a> to get helm charts to work with redis and workers.</li><li>A <a href="https://github.com/PostHog/posthog/pull/519">type migration</a> to <a href="https://github.com/PostHog/posthog/pull/513">fix a bug</a> in Trends.</li></ul><p>For a full breakdown of the changes and updates, please see the <a href="https://github.com/PostHog/posthog/blob/master/CHANGELOG.md">changelog</a>.</p><h2 id="favorite-issue-">Favorite issue (!)</h2><p><a href="https://github.com/PostHog/posthog/issues/581">PostHog won’t load, endpoints returning 503 error</a></p><p>This issue isn’t a great one to see come up on GitHub but it there are 2 parts that make it our favorite. </p><ol><li>Tim managed to get a pr to fix in a day </li><li>It helped push us to refactor the way we store events which will have a big impact on users with large event volumes – we’re excited that people are using PostHog at scale as this should help us improve</li></ol><p>Thank you <a href="https://github.com/dazbradbury">dazbradbury</a> for bringing it to our attention.</p><h2 id="pr-of-the-week">PR of the week</h2><h3 id="replace-current-sidebar-with-ant-design-sidebar"><a href="https://github.com/PostHog/posthog/pull/530">Replace current Sidebar with Ant Design Sidebar</a></h3><p>This is the PR of the week as it’s one of the first by a new member of the PostHog team welcome <a href="https://github.com/EDsCODE">Eric</a>!</p><p>We’re very excited to be growing the group and this is the first of what we hope will be many contributions.</p><h2 id="repo-round-up">Repo round up</h2><ul><li><a href="https://github.com/tripleblindmarket/covid-safe-paths">Covid Safe Paths</a> (With a lot of focus on contact tracing by governments, we were intrigued by a project that also focuses on the privacy issues with large scale data collection)</li><li><a href="https://github.com/ahertel/Amazon-Fresh-Whole-Foods-delivery-slot-finder">Delivery Slot Finder</a> (We keep seeing repos appear that make it easier to stay at home and this was our favorite this week)</li><li><a href="https://github.com/EbookFoundation/free-programming-books">EbookFoundation Free programming books</a> (If you are looking for things to do at home other than contribute to open source Aaron has been looking at this) </li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><ul><li>It’s been a big week at PostHog towers, this was another really big release and now our <a href="https://github.com/PostHog/posthog/projects/5">future updates</a> will be focusing on <a href="/handbook/strategy/roadmap">our roadmap</a>. James has put a lot of work in ensuring PostHog abides by its <a href="/handbook/company/values">values</a> and remains transparent  – if you have thoughts write an issue or create a pr.</li><li>PostHog is now Aaron, Eric, James, and Tim. A big welcome to the team – watch this space for more new joiners</li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.0.11]]></title><description><![CDATA[Like what you see and self-hosting?  Update  your instance. First our updates and new features. Also as you will see below we have added Celery…]]></description><link>https://posthog.com/blog/the-posthog-array-1-0-11</link><guid isPermaLink="false">aa4c814c-8284-5d7a-9071-6255ff434035</guid><pubDate>Wed, 08 Apr 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Like what you see and self-hosting? <a href="/docs/runbook/upgrading-posthog">Update</a> your instance.</p><p>First our updates and new features.</p><p>Also as you will see below we have added Celery workers, we’ll move tasks to workers to speed up a lot of actions in PostHog so we&#x27;ve updated the upgrade docs too.</p><p>Updates and performance improvements this week have focused on making PostHog easier to use in small but powerful ways.</p><h2 id="posthog-updates">PostHog updates</h2><h3 id="filter-by-events"><a href="https://github.com/PostHog/posthog/pull/442">Filter by events</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/events-in-trends.gif" alt="filter by events"/></p><p>This is perhaps the most exciting change to PostHog in this release, we have explained the important reason for creating a distinction between <a href="/blog/the-posthog-array-1-0-8">Actions and Events</a>.</p><p>Several users pointed out they shouldn’t have to create a distinct Action for a normal event like a pageview for example – PostHog was making it difficult to get to the information they wanted quickly.</p><p>Within Trends users can now filter by events and/or actions, multiplying the data that you can now see and manipulate within Trends.</p><h3 id="password-changes"><a href="https://github.com/PostHog/posthog/pull/468">Password Changes</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-3.png" alt="password change start"/>
<img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-2.png" alt="password change end"/></p><p>Since we launched this has been one of our longstanding issues (<a href="https://github.com/PostHog/posthog/issues/167">22 February</a> to be exact) – we had neither the capability to change an existing password or reset if we had forgotten.</p><p>These small changes make this possible and should stop people getting stuck for simple reasons.</p><h3 id="github--gitlab-social-authorization"><a href="https://github.com/PostHog/posthog/pull/416">GitHub / GitLab Social Authorization</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-1.png" alt="GitHub or GitLab social authorization"/></p><p>Coupled with the above you can now authenticate your login through GitHub or GitLab making it even easier to login.</p><h3 id="logout-button"><a href="https://github.com/PostHog/posthog/pull/469">Logout Button</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/logoutbuton.gif" alt="GitHub or GitLab social authorization"/></p><p>Aaron was so used to typing /logout he did not realize how frustrating not having a logout button can be.</p><p>It had been pointed out several times that having a username in the top right corner of PostHog made it seem like it was a logout button, it wasn’t but now is. </p><h3 id="explaining-stickiness"><a href="https://github.com/PostHog/posthog/pull/438">Explaining Stickiness</a></h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-4.png" alt="stickiness explanation"/></p><p>We released Stickiness with <a href="/blog/the-posthog-array-1-0-9">#1.0.9</a>, whilst it is explained in our docs and youtube channel it is important to make sure people can understand the Trend Graphs whilst they are in front of them.</p><p>James thought it wasn’t clear that the repeated action is over a time frame (some actions that are important do not need to be repeated on consecutive days or perhaps over weekends).</p><p>So having a sentence here should mean that PostHog users infer the right conclusion from their data.</p><h2 id="performance-updates">Performance updates</h2><h3 id="were-adding-workers-to-posthog"><a href="https://github.com/PostHog/posthog/issues/455">We’re adding workers to PostHog</a></h3><p>This is so we can <a href="https://github.com/PostHog/posthog/issues/105">create slack messages</a>, recalculate Actions for large deployments, store events, and prefetch and cache Funnels.</p><p>So there will be a couple of things to watch out for this week as a result of this pr, every deployed app will provide a REDIS_URL to posthog. This will be used by celery to run background tasks. </p><p>You will also see the below message – as with next week’s release you will need a background worker to get PostHog working properly.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/04/Posthog-5.png" alt="workers added to PostHog message"/></p><h3 id="precalculate-events-that-match-actions">Precalculate events that match actions</h3><p><a href="https://github.com/PostHog/posthog/pull/420">Related PR</a></p><p>This is one of the most impactful updates to PostHog so far –  whenever we did a query involving actions in the frontend, the database had to do a lot of heavy lifting to calculate which events match the action. </p><p>This led to long loading times as well as timeouts – now this works much faster and should be a joy to work with even with large Action volumes.</p><h3 id="other-performance-improvements">Other performance improvements</h3><ul><li>We also <a href="https://github.com/PostHog/posthog/pull/465">sped up</a> the event insert by only loading actions that were really necessary.</li><li>We now have an <a href="https://github.com/PostHog/posthog/pull/440">asynchronous JS Snippet</a> as before PostHog’s array.js would block rendering DOM in some circumstances.</li><li>We went further and fixed <a href="https://github.com/PostHog/posthog/pull/436">array.js</a>.</li><li>Fixing ActionStep.url_ – so that it can be <a href="https://github.com/PostHog/posthog/pull/435">null</a>, this meant that you could not edit custom property in actions before this pr.</li><li><a href="https://github.com/PostHog/posthog/pull/466">Set a default password for postgres</a> in docker-compose as this created an error in some configurations</li><li>We also <a href="https://github.com/PostHog/posthog/pull/459">fixed</a> demo actions not being recalculated with the new input of demo data from <a href="/blog/the-posthog-array-1-0-10">last week</a>.</li><li>We said <a href="/blog/the-posthog-array-1-0-10">last week</a> we were integrating PostHog as a managed app in GitLab and a series of prs were in relation to this. </li></ul><p>For a full breakdown of the changes and updates, please see our <a href="https://github.com/PostHog/posthog/blob/master/CHANGELOG.md">changelog</a>.</p><h2 id="favorite-issue">Favorite issue</h2><h3 id="filtering-by-date-and-events-in-funnels"><a href="https://github.com/PostHog/posthog/issues/444">Filtering by date and events in funnels</a></h3><p>This was one of 4 issues raised by <a href="https://github.com/jeremynevans">jeremynevans</a> at Savvy – it was raised in <a href="/posts">our community page</a> and resulted in an excellent conversation with Tim resulting in more feature requests which is amazing.</p><p>He is also using PostHog for analytics on <a href="https://crowd-cure.com/">Crowd Cure</a> to help build the largest clinical trial dataset to yet to help with the Coronavirus crisis – check it out on <a href="https://www.producthunt.com/posts/crowdcure-covid-19">Producthunt</a>.</p><h2 id="pr-of-the-week">PR of the week</h2><h3 id="add-change-user-password-form"><a href="https://github.com/PostHog/posthog/pull/443">Add change user password form</a></h3><p>As mentioned above this was a long standing issue and big gap. Excellent and quick work from an amazing contributor, thank you <a href="https://github.com/gzog">Gzog</a>!</p><h2 id="repo-round-up">Repo round up</h2><ul><li><a href="https://github.com/excalidraw/excalidraw">Excalidraw</a> (if you miss whiteboards at the office this is a good replacement.)</li><li><a href="https://github.com/aaronjanse/dns-over-wikipedia">dns-over-wikipedia</a> (redirects idk domains using the official link in wikipedia.)</li><li><a href="https://github.com/johntitus/bungholio">bungholio</a> (Get text alerts when products become available on Amazon – useful if resistance bands are as sparse in your location as they are in Aaron’s.)</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><ul><li><p>We migrated our docs so we could host them ourselves – using docsify to generate our site. We’re pleased with it so far and have used it again for our company handbook.</p></li><li><p>PostHog also got a nice mention as part of an “absurdly powerful and productive <a href="https://news.ycombinator.com/item?id=22786853">‘low code’ stack” on HN</a>, James was ecstatic. It consisted of:</p><ul><li><a href="https://hasura.io/">Hasura</a></li><li><a href="https://www.forestadmin.com/">Forest Admin</a></li><li><a href="https://graphql-code-generator.com/">GraphQL Code Generator</a></li><li><a href="https://www.metabase.com/">Metabase</a></li><li>And <a href="https://posthog.com">PostHog</a>!</li></ul><div></div></li></ul><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.0.10]]></title><description><![CDATA[Like what you see and self-hosting?  Update  your instance. First our updates and new features. Release notes Users in Trend Graphs Whilst we have…]]></description><link>https://posthog.com/blog/the-posthog-array-1-0-10</link><guid isPermaLink="false">a7cd6828-c565-520e-b155-b0ea7cce4fb1</guid><pubDate>Wed, 01 Apr 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Like what you see and self-hosting? <a href="/docs/runbook/upgrading-posthog">Update</a> your instance.</p><p>First our updates and new features.</p><h2 id="release-notes">Release notes</h2><h3 id="users-in-trend-graphs">Users in Trend Graphs</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/usersintrends.gif" alt="users in trend graphs"/></p><p>Whilst we have progressively built in Total volume of users, DAUs and Stickiness into our graphs this change lets you identify the unique users performing those actions. </p><p>This is super exciting for us as a big pain we had using product analytics in the past was the aggregated nature of most tools (which is necessary if you have millions of users).</p><p>There were a ton of scenarios in which we wanted to see the breakdown of the users performing an action giving us greater context around their user behavior.</p><p>(The gif is showing a lot of fake emails – those aren’t real people, it’s related to our new demo data, see below) </p><h3 id="adding-demo-data-to-hogflix">Adding demo data to HogFlix</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/demodatahogflix.gif" alt="adding demo data to HogFlix"/></p><p>We wanted to make our demo site a little more complete, if you are self hosting when you set up a fresh instance and navigate to /demo we’ll add a bunch of demo data. This can then be removed easily by going to /setup</p><p>Aaron was still getting responses that suggested it wasn’t clear how to utilize the features best. </p><p>Adding more data like random users and more actions, helps us show how funnels, trend graphs, users and paths relate to each other – we hope this encourages new users to see how using PostHog in production can help them understand the impact of their work.</p><h2 id="performance-updates">Performance updates</h2><ul><li>We built a <a href="https://github.com/PostHog/posthog/pull/407">Helm Chart for PostHog</a> – making it simple to package and deploy PostHog on Kubernetes. This is somewhat related to <a href="https://github.com/PostHog/posthog/issues/343">an issue</a> last week but also so we can integrate PostHog as a <a href="https://github.com/PostHog/posthog/issues/401">managed app into GitLab</a>.</li><li><a href="https://github.com/PostHog/posthog/pull/408">Funnel fix</a> to correct incorrect ordering.</li><li>Everything is now ordered by <a href="https://github.com/PostHog/posthog/issues/421">timestamp</a> over id, this fixes ordering bugs if you explicitly set a “timestamp” in an event.</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="allow-trend-break-downs-by-dom-element-propertiesattributes"><a href="https://github.com/PostHog/posthog/issues/419">Allow Trend break downs by DOM element properties/attributes</a></h3><p>Thank you <a href="https://github.com/alex-ketch">alex-ketch</a> for excellent formatting of your issue as well as bringing to mind how to improve Trends – this has been top of mind in recent weeks so it’s great to capture new ways of utilizing data in Trends.</p><h2 id="pr-of-the-week">PR of the week</h2><h3 id="clicking-on-live-actions-opens-multiple-actions"><a href="https://github.com/PostHog/posthog/pull/409">Clicking on live actions opens multiple actions</a></h3><p>This PR fixes a small bug that had been open for a little while. </p><p>We obviously prioritize bug fixing but what was cool was that the issue created a discussion between Tim and <a href="https://github.com/SanketDG">SanketDG</a> on the solution which led to the PR – this is one real benefit to OSS in that we can be guided and helped to create the most optimum fixes no matter the size of the problem.</p><h2 id="repo-round-up">Repo round up</h2><ul><li><a href="https://github.com/arkadiyt/zoom-redirector#whats-it-for">Zoom redirector</a> (When joining a Zoom meeting, the “join from your browser” link is intentionally hidden. This browser extension solves this.)</li><li><a href="https://news.ycombinator.com/item?id=22669084">Intro to Python</a> (Aaron mainly found this cool as it’s an angle for people who haven’t studied CS)</li><li><a href="https://github.com/liquidata-inc/dolt">Dolt</a> (It’s Git for data, although there have been a fair few options in this space we thought this was interesting.)</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><p>If you follow <a href="https://twitter.com/PostHog">our Twitter</a>, you may have seen us posting about hiring – we are keen on growing the PostHog team so we can build new features even faster – if you’re an engineer who is interested (or knows someone who maybe is) you can find out more on our <a href="/careers">careers</a> page.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.0.9]]></title><description><![CDATA[We’re in the thick of our release schedule this week! Like what you see and self-hosting?  Update  your instance. First our updates and new features…]]></description><link>https://posthog.com/blog/the-posthog-array-1-0-9</link><guid isPermaLink="false">052d1b61-6f0c-5da8-810d-20d8818fd601</guid><pubDate>Wed, 25 Mar 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>We’re in the thick of our release schedule this week!</p><p>Like what you see and self-hosting? <a href="/docs/runbook/upgrading-posthog">Update</a> your instance.</p><p>First our updates and new features.</p><h2 id="release-notes">Release notes</h2><h3 id="stickiness">Stickiness</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/stickiness-gif.gif" alt="stickiness"/></p><p>Last week we made a lot of changes to actions but one important change missed the release.</p><p>Our trend graphs can be viewed with daily total users (DAUs) or total numbers but we could only show you the volume of users.</p><p>Stickiness lets you view an action as it is repeated by unique users on a daily basis. Giving you an understanding of how often your users come back to this action, it is a great indication of the stickiness of your application and/or website.</p><h3 id="new-funnel-builder">New Funnel Builder</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/newfunnel.gif" alt="new funnel builder"/></p><p>Tim spent a lot of work on funnels – we thought it was so useful in our previous product we included it in the very first PostHog release.</p><p>However we perhaps over-engineered our Funnel builder to autosave and switch stages easily – we think the new one is simple and efficient.</p><h3 id="events-changes--improvements">Events changes &amp; improvements</h3><p>This is three small changes grouped together following on from our Actions vs Events work from <a href="/blog/the-posthog-array-1-0-8">last week</a>.</p><p>We are aiming to make events very intuitive so firstly we have changed the wording around event property filters and made it clear that you can use dropdowns in events</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/Posthog-5.png"/></p><p>and most importantly we added &#x27;isnot&#x27; and &#x27;does not contain&#x27; to property filters making this much more powerful.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/isnotdoesnotcontain.gif"/></p><h2 id="performance-updates">Performance updates</h2><ul><li>Upgraded from Parcel to <a href="https://github.com/PostHog/posthog/pull/331">Webpack</a>.</li><li>Placed our <a href="https://github.com/PostHog/posthog/issues/361">API Key</a>  in a more obvious bucket as it used to reside in just the JS snippet.</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="k8s-documentation-and-improvements"><a href="https://github.com/PostHog/posthog/issues/343">k8s documentation and improvements</a></h3><p>This is our favorite issue because we didn’t have a huge amount of experience when it came to deploying k8s. </p><p>What we really enjoy about building PostHog is that the growing community can let us know what is important, and we might have overlooked our k8s documentation without it being drawn to our attention.</p><p>Thank you <a href="https://github.com/Tyler-Churchill">Tyler-Churchill</a>.</p><h2 id="pr-of-the-week">PR of the week</h2><h3 id="frontend-make-invite-team-link-box-visible"><a href="https://github.com/PostHog/posthog/pull/395">frontend: Make “Invite Team” link box visible</a></h3><p>Thank you <a href="https://github.com/SanketDG">SanketDG</a> for helping clean up our multiple users and invite team box – this was quite messy and is now much neater.</p><h2 id="repo-round-up">Repo round up</h2><p>Here is what we thought was cool and interesting in the last week:</p><ul><li><a href="https://github.com/UniversalDataTool/universal-data-tool">Universal Data Tool</a>  (a user shared their project with us and we thought it looked really cool)</li><li><a href="https://github.com/junaid33/opensource.builders">Opensource.builders</a> (this is a really cool way to find and request open-source alternatives to popular software)</li><li><a href="https://github.com/jitsi/jitsi-meet">Jitsi</a> (this is a great project with simple and scalable video conferencing, something I’m sure everyone is beginning to use a lot more of.)</li></ul><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="posthog-news">PostHog news</h2><p>All of PostHog will be back in the UK in light of the border closures that have been happening but will aiming to cover support queries through most of US time as well as now Europe and GMT.</p><p>We’ve also been trading fitness tips, James was a cyclist after all so no surprises what he is up to, Tim is getting in 2-3 HIIT sessions, whilst Aaron is taking advantage of <a href="https://www.downdogapp.com/">Down Dog’s free access</a> and trying yoga so we can weather the UK’s restrictions.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.0.8]]></title><description><![CDATA[Welcome to our second PostHog Array which comes with a new naming convention. We’re going to be doing weekly tagged releases from now on so the…]]></description><link>https://posthog.com/blog/the-posthog-array-1-0-8</link><guid isPermaLink="false">9d731914-c2af-59d7-9d37-468a765041ce</guid><pubDate>Tue, 17 Mar 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Welcome to our second PostHog Array which comes with a new naming convention.</p><p>We’re going to be doing weekly tagged releases from now on so the PostHog Array will reflect our most recent version.</p><p>Like what you see and self-hosting? <a href="/docs/runbook/upgrading-posthog">Update</a> your instance.</p><p>First our updates and new features.</p><h2 id="release-notes">Release notes</h2><p>Nb. The following is for pre 1.0.8.</p><h3 id="multiple-users">Multiple users</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/inviteteamgif.gif" alt="multiple PostHog users"/></p><p>We hadn’t built multiple users as initially this would have been in our paid version but after much internal discussion at PostHogHQ we realized this was not in line with our wish to make our MIT license as generous as possible or provide obstacles to adoption, as such you can have unlimited users!</p><h3 id="multiple-domains-in-one-instance">Multiple domains in one instance</h3><p><img src="https://user-images.githubusercontent.com/53387/75904121-eae5c280-5e42-11ea-9ee6-5755c81d7610.gif" alt="multiple domains one"/>
<img src="https://user-images.githubusercontent.com/53387/75904124-ed481c80-5e42-11ea-84b3-3e5ddc301d38.gif" alt="multiple domains two"/></p><p>Plenty of our users have several side projects they would like to use PostHog for or have multiple domains they would like to see activity for in one place – with this change this is now easy.</p><h3 id="adding-info-to-actions">Adding info to actions</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/actiontrendscss.gif" alt="adding info to actions"/></p><p>James was trying to set the right action for a Trend graph when he couldn’t work out which action was which so we broke actions down by type, (autocapture, event and pageview) as well as exposing the selectors.</p><h3 id="updating-posthog">Updating PostHog</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/changelogtoolbar.gif" alt="updating PostHog"/></p><p>We now have our changelog live on GitHub and a helpful reminder as to whether we are up to date.</p><p>Nb. The following is included in the 1.0.8 update</p><h3 id="events-changes">Events Changes</h3><p>This is a small but mighty change.</p><p>A key feature when building PostHog was autocapture. When we used other tools it was painful to have to add track(‘event’) for every element on our site.</p><p>As such we created two ideas;</p><ul><li>Events (everything that happens on your website).</li><li>Actions (useful events you would like to visualize trends or create funnels for).</li></ul><p>We saw one very (very) useful Loom video that clearly showed us we had not made it clear to our users…</p><p>Big L for us on that one so these changes should stop this from happening.</p><p>Firstly we have nested Actions within events.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/Posthog-3.png" alt="nested actions within events"/></p><h3 id="updated-actions-creation">Updated Actions Creation</h3><p>This focuses on making actions easier to set.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/newtoolbar.gif" alt="updated actions creation"/></p><p>The “New action” button allows users to create any action with one click – whether it be matching a url for a specific page view or using our toolbar to select front-end elements from your site directly.</p><h3 id="delete-user-data">Delete user data</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/Posthog-4.png" alt="deleting user data"/></p><p>When viewing an individual user you are now able to delete data on this person (should they ask you to, for example as this relates to GDPR).</p><h3 id="performance-updates">Performance updates</h3><p>As part of every release we will keep you up to date with bug fixes and small performance updates:</p><ul><li><a href="https://github.com/PostHog/posthog/pull/345">Paths</a> were slow and never indicated they were done loading, this has since been fixed.</li><li>We fixed a <a href="https://github.com/PostHog/posthog/issues/333">cohorts</a> issue, as there was a bug that created an error if you selected “in the last…”</li><li>We noticed for some users they would see a stretched PostHog logo when viewing in <a href="https://github.com/PostHog/posthog/pull/340">safari</a>.</li><li>Email addresses did not show when viewing <a href="https://github.com/PostHog/posthog/pull/326">users</a>.</li><li>We sped up the loading of <a href="https://github.com/PostHog/posthog/pull/321">events</a>.</li><li>Support navigating between pages with the toolbar open while using <a href="https://github.com/PostHog/posthog/pull/369">Turbolinks</a>.</li></ul><h2 id="favorite-issue">Favorite issue</h2><h3 id="ability-to-cleardelete-events"><a href="https://github.com/PostHog/posthog/issues/307">Ability to clear/delete events</a></h3><p>We built PostHog for those that are privacy conscious and didn’t want to send user data to 3rd parties.</p><p>The one thing we hadn’t thought about was deleting data you had already collected.</p><p>The <a href="https://github.com/PostHog/posthog/pull/317">pull request</a> that came out of this just focuses on deleting data associated with a user but we may add more functionality too – issues around this are very welcome.</p><p>Thank you <a href="https://github.com/funkyOne">funkyOne</a> for bringing it to our attention.</p><h2 id="pr-of-the-week">PR of the week</h2><h3 id="add-new-contributors-to-readme">Add new contributors to README</h3><p><a href="https://github.com/PostHog/posthog/pull/312">Related PR</a></p><p>There are lots of prs relating to all of our new features, but what was perhaps more important this week was to ensure we recognized our contributors for their efforts</p><p>It is exciting to have so many new people committing to the repo – as Tim commented:</p><pre><code>@iMerica @frankcash @budnik @tirkarthi @J0 @pedroapfilho @sanketsaurav

Welcome to the club, and thanks for your contributions!
</code></pre><h2 id="share-your-feedback">Share your feedback</h2><p>We&#x27;d love to hear anything you have to say about PostHog, good or bad. As a thank you, we&#x27;ll share some awesome <a href="https://merch.posthog.com">PostHog merch</a>.</p><p>Want to get involved? <a href="mailto:hey@posthog.com">Email us to schedule a 30 minute call</a> with one of our teams to help us make PostHog even better!</p><h2 id="repo-round-up">Repo round up</h2><p>Here is what we thought was cool and interesting in the last week:</p><ul><li><a href="https://github.com/CSSEGISandData/COVID-19">John Hopkins CSSE Visual Dashboard</a> (We’ve been watching this frequently as we’re sure many are)</li><li><a href="https://github.com/firecracker-microvm/firecracker">Firecracker</a> (We like open source projects and this is great – although I must note it has been around since 2018)</li><li><a href="https://github.com/zoom">Zoom</a> (so this isn’t one particular repo but we have been super impressed with how resilient Zoom has been as all our meetings move to video)</li></ul><h2 id="posthog-news">PostHog news</h2><p>As we come to the end of YC, the gang is starting to break up. We have gone from an online <a href="https://news.ycombinator.com/item?id=22506013">only demo day</a> to now just preparing slides. We’re a bit sad that we won’t get to present (well maybe only James is) but it drives home what an intense 3 months this has been!</p><p>Tim and James have headed back to Europe (in advance of travel ban) and we can test out our remote ethos, we have found Gitlab to be <a href="https://about.gitlab.com/company/culture/all-remote/guide/">helpful</a>. We always aimed to be remote post YC but now we are just one of many companies doing this as we see Covid-19 take effect.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Array 1.0.0]]></title><description><![CDATA[This is the first of (what we hope are many) PostHog weekly roundup posts. We want to let the community know what we have been up to, a few of our…]]></description><link>https://posthog.com/blog/the-posthog-array-1</link><guid isPermaLink="false">ee397ee8-3336-5385-acd8-9d98f151e769</guid><pubDate>Mon, 09 Mar 2020 00:00:00 GMT</pubDate><enclosure url="https://posthog.comhttps://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/blog/array/default.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>This is the first of (what we hope are many) PostHog weekly roundup posts. We want to let the community know what we have been up to, a few of our favorite comments, issues, and pull requests as well as some key repos and projects we have noticed over the course of the week.</p><p>If you would like us to change the format or include something new, create an <a href="https://github.com/PostHog/posthog">issue</a>.</p><h2 id="release-details">Release details</h2><p>We’ve made a lot of exciting new features this week (to update, please see <a href="https://github.com/PostHog/posthog/wiki/Upgrading-PostHog">https://github.com/PostHog/posthog/wiki/Upgrading-PostHog</a>):</p><h3 id="filtering-action-trends-graphs">Filtering action trends graphs</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/Action-trend-filter-gif.gif"/></p><p>This is a more intuitive way of filtering action trends. You can also look at both the total and DAUs with this update.</p><h3 id="exactcontains-matching-for-urls-in-actions">Exact/contains matching for URLs in actions</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/image-2.png"/></p><p>This does exactly what it says on the tin, it will allow you to be able to specify specific pages to track in your app/website.</p><h3 id="filtering-paths-by-date">Filtering paths by date</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/Path-by-date-gif.gif"/></p><p>We got a lot of requests for this update – paths are super interesting but if you’re making changes to your website based on your findings you should be able to then refine your paths by date.</p><p>and lastly…</p><h3 id="graphs-show-numbers">Graphs show numbers</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/03/image-1.png"/></p><p>We took way too long to realize this was much simpler than guessing the number on the Y axis.</p><p>We’ll try to ensure we don’t make such oversights again. In the meantime, at least our dashboards are easier to read.</p><h2 id="favorite-issue">Favorite issue</h2><h3 id="library-request-integrate-with-elixir"><a href="https://github.com/PostHog/posthog/issues/227">Library Request: integrate with Elixir</a></h3><p>We’ve wanted to increase the number of integrations. This is why we’re highlighting this issue – having people request something helps us prioritize better.</p><p><a href="/docs/integrate/overview">Integrations-wise</a>, we already have JS, Node, Python, Ruby, PHP and Go – let us know if we’re missing something that you would like.</p><p>Thank you <a href="https://github.com/victorbordo">victorbordo</a> for raising it.</p><h2 id="pr-of-the-week">PR of the week</h2><h3 id="filter-paths-by-timestamp-272"><a href="https://github.com/PostHog/posthog/pull/272">Filter paths by timestamp #272</a></h3><p>Part of a larger <a href="https://github.com/PostHog/posthog/issues/223">issue</a> but hats off to <a href="https://github.com/mariusandra">mariusandra</a> for the excellent contribution which made it into our product update above.</p><h2 id="repo-round-up">Repo round up</h2><p>These are things that we thought were cool in the last week:</p><ul><li><a href="https://github.com/kotartemiy/newscatcher">Newscatcher</a> (we were lucky enough to be included in <a href="https://www.pythonweekly.com/">Python Weekly</a> and this caught our eye at the same time)</li><li><a href="https://github.com/geektutu/7days-golang">7 days golang apps from scratch</a> (No not Craig David’s terrible follow up to his 2000 hit, we came across this as we finished our Go integration)</li><li><a href="https://github.com/commaai/openpilot">openpilot</a> (having recently moved to SF we see loads more Cruise cars and autonomous training vehicles than we ever would in London – it’s pretty cool that this is an open source project)</li></ul><h2 id="posthog-news">PostHog news</h2><ul><li>We wrote a blog about <a href="/blog/moving-to-sf">moving to SF</a>. James was delighted it made it to the front page of HN.</li><li>We also started a <a href="https://www.youtube.com/channel/UCn4mJ4kK5KVSvozJre645LA">Youtube channel</a> – we’re not going to be big time vloggers anytime soon but we did want to make it easier for our users to understand our features. </li></ul><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[After the HN launch]]></title><description><![CDATA[PostHog launched on Hacker News . We were pleased with the reception. The reason we launched wasn’t trying to get the world’s attention – we wanted to…]]></description><link>https://posthog.com/blog/after-the-hn-launch</link><guid isPermaLink="false">b7cd2620-a463-52c3-ada2-732cc21048d4</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Sun, 01 Mar 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://news.ycombinator.com/item?id=22376732">PostHog launched on Hacker News</a>. We were pleased with the reception. The reason we launched wasn’t trying to get the world’s attention – we wanted to find a group of people who loved it, as quickly as possible.</p><p>We said we’d be happy with 500 stars, pleased with 700 and delighted with 1,000. Five days later, we’re over 800 (1 week after publishing the repo). More importantly, we had generally very positive feedback, well over 200 sign ups, and several businesses that are heavily integrating us into how they work every day.</p><p>We spent $1K on marketing the repo early on, which got the first few stars and helped to populate it. Later on, Hacker News going well meant we got onto the GitHub trending main page, which got us more users. Pro-tip for next time, make sure you have tagged your repo appropriately – we had niche tags, and it was only once we changed them that we got discovered. We think the main list is manually curated.</p><p>Our current focus is to make sure that we retain these users. Any publicity leads to an initial rise in traction, but the key factor is if people stick around once they’ve signed up. That way, every piece of marketing we do adds permanent value.</p><p>We fully expect, as a newer company, that most of them will churn. But we’ll learn from as many of them as possible. If we do a good job of being friendly, we believe we’ll end up being able to retain people because they buy into us in the short run, as we work on the product itself with them. </p><p>There are two key things we do with customers to try to make sure we earn their trust. The first, is that we go to as many meetings as possible in person. It’s a lot easier to understand how someone feels when you can see their body language. Showing up is a good way to demonstrate that you care. We try only to take whoever is strictly necessary to meetings, so that’s usually just one of us.</p><p>We write down everything we learn internally on the same doc we started with in August last year. It’s now around 100 pages long.</p><p>The second thing we try to do well is to set up informal communication with the customer – we often us Slack or WhatsApp groups. They let people feel safer just sending a couple of sentences because they lose the formality of email. And, they can just be quite good fun.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/Screenshot-2020-02-25-at-21.52.15.png"/></p><p>Throughout YC, we’ve split our roles pretty clearly. As my former boss used to say “don’t be like 5 year olds playing football”.</p><p>Even when there were just two of us, Tim and I quickly saw how important it was to write tickets for features and issues. This meant that Tim could code uninterrupted, with notifications disabled. I would do everything else. We tend to work with our headphones on almost all day to help stay focused. Occasionally we take them off, and one day we may treat ourselves to a new lightbulb for the office (updated - we never did):</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/working.jpeg"/></p><p>Since Aaron joined, he has focused on getting feedback from users, Tim has kept working on the product, and I’ve focused on product, marketing and anything else. Aaron and I share the QA for features and we try to get them done immediately, so it doesn’t cause Tim to have to multitask.</p><p>Every Monday, we do a short post mortem of the week before, and set new weekly goals, then we do a 5 minute standup 2 to 3 times a week to keep us on track. We write all of this down too, and have been doing so since August. It’s really simple, but when we don’t do this, we tend to lose days to random tasks that don’t actually help us.</p><p>This week, our focus is to build the open source community. That’s where all our business will eventually come from. To start getting pull requests and issues, we need people to be using the product. For that to happen, we need to focus on getting their feedback and incorporating it into what we build as fast as possible – hence doing as much of this as possible is our current goal.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Pivot to PostHog]]></title><description><![CDATA[YC has been running for 15 years, and getting bigger every year. That means there are more than 2,000 companies in their network. Many are still small…]]></description><link>https://posthog.com/blog/pivot-to-posthog</link><guid isPermaLink="false">4089311e-b294-5161-bc25-965ecd9cec40</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Tue, 25 Feb 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>YC has been running for 15 years, and getting bigger every year.</p><p>That means there are more than 2,000 companies in their network. Many are still small, many are dead, but many of them are huge – 102 are valued at more than $150M. The reason this is awesome if you are in the YC network is that it gives you a lot of customers that are slightly more likely to be friendly.</p><p>We focused on building pipeline, again – aiming for our 2 meetings a day routine. We went to as many of the meetings as we could in person.</p><p>A lot of these meetings went well – the product was getting stronger. We started talking money with people.</p><p>That’s when we realized, we had a problem.</p><p>We had 5 friendly companies in a row turn us down on price. We wanted to charge $39/month/user, but had clients telling us they’d pay just $5/month/developer. We could build a business like that, but it’d be tough to reach the kind of growth we wanted.</p><p>The final straw was when we dropped to $300/month for a team of 30 with one of the teams that was the most positive in the meeting (all based in SF, where the average software engineer salary is around $150K) and got told there was “no chance” of that working. Refusing to pay $10/month to power a $150,000 employee meant to us that our solution wasn’t good enough.</p><p>We came to the next group office hours saying we thought we needed to pivot – we couldn’t see a way to make the product more valuable. At the time, we decided we would produce a roadmap for tech debt – created by the engineering team, using surveys. The group convinced us to focus on using the surveys for engineering retention.</p><p>We used the rest of the meetings in our calendar to validate these ideas, but received little enthusiasm. We were starting to feel like a solution in search of a problem. We just stopped feeling excited about what we were doing.</p><p>Tim and I went to a YC dinner. It was an excellent talk by Mathilde, the CEO of Front. We decided in the car that we needed to start over.</p><p>Since we started in August, we kept a list of every single problem and startup idea that we’d had. It’s a long list – 3 pages. The reason we wrote them down is that writing them down stops you wasting time talking about them in more depth when you need to focus on something else.</p><p>One of the things that struck us was implementing product analytics was really frustrating – we wanted to be able to auto-capture all the front end events. We also, crucially, didn’t like sending user data to 3rd parties.</p><p>The last pre-booked meeting I had was with the founder of Sentry. They have a <a href="https://blog.sentry.io/2019/11/06/relicensing-sentry">BSL</a> license – their paid and open source versions are identical. I went to the meeting to talk about engineering retention, but it fell flat. Then I asked what they do about product analytics. “We would never send all our data to 3rd parties, we have a bunch of people who run our own data platform”. That was all the encouragement we needed to go with our gut.</p><p>We decided to build open source product analytics.</p><p>YC also let you book office hours with one partner at a time. This lets you go into more depth in whatever issue you want to talk about.</p><p>We spoke to our partners about the idea. They felt that auto-capture wasn’t really the highlight – it’s just a feature, but that the open source thing was pretty exciting. When Dalton described it as a 10/10 idea, his enthusiasm was infectious, and out we went to build it. Like, that evening.</p><p>We went home, and rebranded to <a href="https://posthog.com">PostHog</a>, and got a new website live. Tim started the product. Aaron started booking discovery meetings. We were up until 3am.</p><p>What followed was the most intense 3 weeks of work of our lives. We started working from around 9am to anywhere between midnight and 3am, 7 days a week.</p><p>Our only break each day would be a 10 minute walk to the local sandwich shop, and a single episode of Parks and Recreation.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/sandwich-scaled.jpg" alt="A PostHog lunch break"/></p><p>We kept exercising and eating healthily, but we had to make up for lost time to make the most of the opportunity of demo day.</p><p>We decided there would be two major goals. The first would be a Hacker News launch. The second would be landing a large paid pilot. </p><p>Our partners encouraged us to speak to the best people in the world at running open source companies – we reached out, and every single one of them said yes! In general, we’ve found that people are really helpful when <a href="/newsletter/how-i-get-good-advice">you’re seeking advice</a> and not trying to sell them something.</p><p>We emailed or met the founders of GitLab, Mattermost, and Docker, on top of the meeting with the folks from Sentry we’d already had. They helped us understand how open source business models work. They also made us realize that we needed to work on the community before anything else – that with a lot of usage, and a vibrant community, what follows is inbound interest.</p><p>In parallel, we took $1K, and spent it on some paid ads on a few display networks online. We wanted to get the product in more people’s hands to iron out some bugs. We got really positive feedback from the developer community, and a few constructive ideas, which we put into the product before the Hacker News launch.</p><p>January 23rd was when we started writing code for PostHog. We set a deadline for the Hacker News launch of February 20th. We had one day off in this period – we went hiking at the hills around Stinson Beach with friends:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/cbcffff9-af00-41d7-896d-65ac04a4b9a3.jpg" alt="Hiking at Stinson Beach with friends"/></p><p>We wanted to have complete documentation, SDKs, and the product all in existence for that date. Surprise, surprise, after a 3.45am finish the night before, it was done.</p><p>We put the post live and told a couple of early users. It immediately started getting upvotes and made it to the front page.</p><p>We got significantly over 100 sign ups (and may have had more – we let users opt out of our tracking), and within a week of the repo going public, we were at 800 stars. We had a bunch of inbound demand ranging from indie developers through to multinational corporates who liked our product from a data privacy perspective.</p><p>More pleasingly, we had a bunch of GitHub issues raised, and even a PR or two from people we didn’t know. That was a good sign that we could build a community.</p><p>We were off to the races!</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[Moving to San Francisco]]></title><description><![CDATA[YC  (a startup accelerator we are taking part in) ask you to move to the Bay Area for the whole program. This gives you “a socially acceptable excuse…]]></description><link>https://posthog.com/blog/moving-to-sf</link><guid isPermaLink="false">7d29255c-8cda-513d-8dab-a7778deec420</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Mon, 24 Feb 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://ycombinator.com">YC</a> (a startup accelerator we are taking part in) ask you to move to the Bay Area for the whole program. This gives you “a socially acceptable excuse to look after yourselves and to work, but little else”. Little did we know how important that ability to focus would be later on. Some of the literature says many people find YC the “the most productive period of their lives”, which is something we have found.</p><p>The YC advice is “you need a door”, so you can grow your own culture. We were sceptical, but we gave it a go.</p><p>First, we had to choose a location. YC’s main office is in Mountain View, but there is a location in San Francisco too. For those who’ve never been to the Bay Area, Mountain View and San Francisco are not near each other!</p><p>We decided if we moved to Mountain View, we’d need a car and we’d be more likely to get cabin fever, so we went for the city instead. I think we’re all glad we made that decision. This is what our house looked like, before we rearranged all the furniture – we work at the dining room table, and there are monitors everywhere. It’s now like a WeWork, without the multibillion dollar collapse and with a lot less free beer:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/house-scaled.jpg" alt="The PostHog YC house"/></p><p>We are in the Castro area of the City – it’s only 25 mins from most meetings, and has lots of cool coffee shops that we try to avoid as we are on a budget.</p><p>It’s within walking distance of the Twin Peaks – if you walk up at night, you can get a beautiful view of the city lights, which makes up for walking along a curvy road in the dark, just about:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/IMG_4294-scaled.jpg" alt="Twin Peaks"/></p><p>For the first week, YC give a full on induction.</p><p>We hired a car to drive to the first induction day, from what we consider to be the best company that has graced the planet with its presence – DriveKyte. You hire a car from their app, it turns up at your door and the driver rides off on an electric scooter, then you can drop it off wherever and whenever you like. And, most importantly, it’s cheap. If you are a VC and reading, please give them money. That’s not an ad, that’s just how we feel.</p><p>We got told how many days were left until demo day, and then the socializing started. There are a lot of companies in the batch, so there are a huge number (roughly 450) of people you can meet.</p><p>It was intense – the first session was 6 hours of explaining what you do, having others explain what they do, and working out if you could help each other. The other founders are great for feedback, introductions, helping you realize there are many others in the same boat, and whatever random questions you may have.</p><p>Fun fact – the batch has lots of Whatsapp groups. You can ask pretty much anything and get a response from someone who has already solved your problem in under 10 seconds. “Do I need an accountant?” through to “Can I get lift to Mountain View?”</p><p>The other exciting news was that our first ever near-customer, Aaron, joined us full time. We’d worked together for four years, so it was really lovely to be on the same team again.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/aaron-scaled.jpg" alt="Aaron joined us"/></p><p>Aaron joined us to help get us in front of more users, and to help us manage the ever increasing number of deals in our pipeline. He’s the organized one.</p><p>The induction week also included our first group office hours. There are a lot of companies, so we were split into groups of 5-6. You get to know each other really well during the program, and it’s fun to follow each other’s progress. You learn a lot from watching the others too.</p><p>I used to run sales teams, my job was to try to give a realistic figure for how much our revenue would increase. Any experienced VP Sales will play down the number – most would prefer hitting a $20M target, over missing a $22M number by $1M and ending up at a higher number. That’s how you optimize for not getting fired.</p><p>The office hours were not like this. They pushed us. All of us were at under $1K MRR at the time. We went around the room setting goals for where we would be by demo day in 3 months time. These varied from $30K MRR to $100K MRR.</p><p>They know we’ll probably miss these targets, but that’s not the point. Some companies actually will hit them – take a swing, think bigger. This was a theme of our time in YC – we met CEOs of $4Bn companies that told us to think bigger than them, when we had no revenue. It made us (try to) work out how to do that.</p><p>We started working long hours, but we made time to go out to walk, think and decompress.  We ended up on some really long walks. The weather in San Francisco looks pretty average online, but when you realize it’s rarely windy and usually sunny, going outside is a lot more inviting than London in January. We walked to the Golden Gate bridge from Castro, and back.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/golden-gate-scaled.jpg" alt="The Golden Gate Bridge"/></p><p>When we were working, it sounds fluffy, but being surrounded by ambitious and impressive people has probably been the most important part of being here so far. Being in San Francisco with YC gave us easy real life access to many of the real thought leaders in technology.</p><p>If you want to check out the product, check out the <a href="https://github.com/posthog/posthog">PostHog repo</a>. If you’d like to get updates from this blog, <a href="mailto:james@posthog.com">email me</a>, and I’ll add you to our mailing list.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The YC Interview]]></title><description><![CDATA[We submitted the application, then got back to work. We couldn't work out how long it'd take to hear back, but then we did. It was now October 16th…]]></description><link>https://posthog.com/blog/the-yc-interview</link><guid isPermaLink="false">c16b0baf-e702-5d1b-bb8a-ed5c78f89c43</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Wed, 01 Jan 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>We submitted the application, then got back to work. We couldn&#x27;t work out how long it&#x27;d take to hear back, but then we did.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/Screenshot-2020-02-24-at-08.48.36.png"/></p><p>It was now October 16th. The interview was going to be November 7th.</p><p>We asked ourselves how we could make as much progress as possible between now and then.</p><p>Best case scenario, we&#x27;d get some paying customers. Worst case, we needed to show we had made a ton of progress.</p><p>Walking between meetings, we felt we had two plays. The first that came to mind was a Hacker News &quot;show HN&quot; post. That website is read by tens of thousands of developers, so to us represented a huge volume of relevant traffic.</p><p>We decided that was too risky - it&#x27;d be binary, either a couple of upvotes or a hundred. We felt the most likely outcome was that we&#x27;d get five upvotes from our friends and that would probably leave us with nothing to talk about if we put all our focus into it.</p><p>Instead, we worked out that if we could find a repeatable approach to generating users, we were guaranteed to be able to make progress. That felt achievable.</p><p>We took $2K of our $8K and set up ad campaigns on every display network - because there aren&#x27;t many other platforms that tackle tech debt, so search traffic doesn&#x27;t exist, yet.</p><p>We started getting a trickle of leads. They all bounced.</p><p>We put in place product tracking - we put UTM tags into every ad, so we&#x27;d know exactly which users came from which ad and each channel.  We started putting more of our spend into the channels that worked.</p><p>We started experimenting with the website layout until more visitors installed the app, then we started tweaking the sign up process until people were starting to use it, then we started tweaking the product further until people were using it a lot. We just treated the whole thing and all our product development as a funnel.</p><p>In parallel, I&#x27;d email every single user who signed up, trying to learn from them. Almost no one spoke to us. You can find a lot out from data, but it&#x27;s no substitute for the real thing. Developers are much less likely to take a call than salespeople from our previous experience.</p><p>We kept up the two meetings a day target, but often missed it. Engineering leaders were harder to get in front of than sales leaders.</p><p><div></div></p><p>The week before, we booked practice sessions with everyone we thought was relevant. This meant friends, family, a VC and two YC alumni who were offering to do this on Twitter.</p><p>We made these sessions realistic - we told them to cut us off, to interrupt if we weren&#x27;t getting to the point, and to trip us up.</p><p>We focused on clarity. We had achieved a lot fast. We had signed up 400 people in just three weeks, for $10 per user (the cost came down a lot per user after a lot of tweaking, so the more recent ones were way less expensive). Given we&#x27;d charge $10 per month per user, the unit economics looked really good. We hadn&#x27;t yet generated revenue, but we had 2 companies who said they would pay (and, a few weeks after the interview, they both did, which got us to our first $600 MRR).</p><p>Tim and I got the Eurostar from Kings Cross to France the night before. That evening, we went out for a beer and caught up with an old friend.</p><p>November the 7th swung around before we knew it. We did a final run through in the morning, wrote out some key stats on a notepad to take into the interview in case we needed them, and tried to catch each other out - we, finally, felt like we had a good shot at this.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/last-min-prep-scaled.jpg"/></p><p>We began the blustery but bright walk from our hotel to Front&#x27;s offices, who were hosting it.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/6A029EAF-FA8D-4C78-867B-55F6732830CB-scaled.jpg"/></p><p>We walked in, got our badges and did our best to ignore everyone else. We were led into the room by Dalton Cadwell. He was the first person I&#x27;d met in real life that I already recognized from YouTube. Geoff Ralston, who also interviewed us, was the second. There was one other person who remained quiet.</p><p>The questions came thick and fast as soon as we started shaking hands, but the tone was bright, excited and helpful. We had a clear view of who would answer different types of question, which was important. The key thing we focused on was making ourselves pause before answering, and we took the time we needed to be clear. We&#x27;d endlessly rehearsed explaining what we do &quot;off guard&quot;, so we wouldn&#x27;t get caught out.</p><p>As we left, literally as the door was shutting, we were asked who we were. It&#x27;s important you can describe your relevant experience as concisely as you can describe the product. </p><p>All of the questions went well, but we felt we didn&#x27;t manage to answer one along the lines of &quot;how could you show that you have solved this problem for a real user?&quot; They asked us for a demo to see the data we had generated but we hadn&#x27;t got the laptop connected to the wifi. There wasn&#x27;t time.</p><p>Note: later on, now we come to write this, that precisely why we ended up pivoting. They&#x27;re good.</p><p>We walked out thinking it&#x27;s 50:50, we did a good job but got that question wrong, and we got hung up on it right at the end.</p><p>We grabbed a quick lunch then went to the nearest WeWork and got back to working. Tim found a guitar, the latest way to distract people who are coworking, it seems:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/guitar-scaled.jpg"/></p><p>For this interview, we knew in advance we wouldn&#x27;t find out for a few days, so we decided to assume we had failed. We met with friends again and got the train back to London.</p><p>That magical phone call came around a week later. Dalton called asking us to accept. We both were in the office, so it was nice to be able to listen to it together. We called our friends and family, and promised ourselves this was just the start. We had to make the most of this opportunity.</p><p>The weeks that followed were quite stressful. We suddenly had to find a lawyer to create a US parent company, we had to book an Airbnb, and work out if we needed an accountant, whilst still keeping the company growing and signing our first clients.</p><p>We immediately started doing regular calls with the partners and we chose to send a regular update once a week with our progress. Knowing this was coming up every Friday kept our urgency up.</p><p><div></div></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item><item><title><![CDATA[The time before YC]]></title><description><![CDATA[I'm  James , and I work with  Tim . We are the co-founders of PostHog - a current batch YC company. This is us (I'm on the right), just after we got…]]></description><link>https://posthog.com/blog/before-yc</link><guid isPermaLink="false">5e6707cc-cac9-555f-9d72-6955488b6ed2</guid><dc:creator><![CDATA[James Hawkins]]></dc:creator><pubDate>Sun, 01 Sep 2019 00:00:00 GMT</pubDate><content:encoded><![CDATA[<p>I&#x27;m <a href="https://twitter.com/james406">James</a>, and I work with <a href="https://twitter.com/timgl">Tim</a>. We are the co-founders of PostHog - a current batch YC company.</p><p>This is us (I&#x27;m on the right), just after we got now-redundant, pre-pivot swag:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/IMG_4294-scaled.jpg" alt="James and Tim"/></p><p>We quit our jobs around August 2019, and put the last $8K of salary into a business bank account. We had both saved enough money to live on for at least 12 months without any income.</p><p>I went travelling with my wife for 3 weeks around Europe whilst we worked on our first idea.</p><p>Our product was &#x27;a sales territory management platform, that uses predictive analytics so you stop wasting time on deals that won&#x27;t sell&#x27;. I used to run a sales team, and this was something I&#x27;d have wanted to help me manage territories. Tim ran R&amp;D and was very quick at building things.</p><p>Tim built the product and I started doing customer calls from the cheapest Airbnbs I could find around Lake Geneva, cafés in Venice and a hut in an olive grove in Tuscany:</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/02/IMG_3338-scaled.jpg" alt="Olive groves in Tuscany"/></p><p>Not only did I have slow wifi, but the idea was complicated and people didn&#x27;t get it. We had just two customers start using it, and that&#x27;s only because they were already our friends. One of those two was happy paying $200 MRR for it, but then his company pivoted. We ended up bringing Aaron on board as our first employee the following January.</p><p>If we explained the complex modelling, we&#x27;d watch people&#x27;s eyes glaze over. If we didn&#x27;t, they wouldn&#x27;t believe it worked.</p><p>We decided to simplify it. We turned our 1-liner into &quot;a sales 1:1 tool that uses predictive analytics to make sure you talk about the deals that matter&quot;. When I ran sales, I struggled to find time to do this, yet I felt it was important, and I felt that salespeople would want to talk about good news but not bad news. Our predictive analytics could keep 1:1s well organised and balanced.</p><p>I drove back to the UK from Tuscany. Sidenote: my ac broke and it was the hottest day of the year. It was a 30 hour drive.</p><p>Tim and I managed to get cheap WeWork access. We spent $100/month each. If you&#x27;re in the US, I would get a platinum AMEX card instead, it&#x27;s an even better deal. It wasn&#x27;t perfect, but working together and not in cafés helped our focus immeasurably.</p><p>Although I can code, I am too slow, but I have done a lot of sales and marketing before. We split our roles out clearly. Tim was to build the product, I was to book 2 meetings with heads of sales every day.</p><p>We did that for 3 weeks. We wrote lengthy notes and took quotes from every single meeting in a gigantic Google Doc. We hit our target. I got meetings by finding real life communities, making friends in those and asking around. I also used LinkedIn a lot, engaging in conversations and eventually asking to talk about our roadmap with people who might find it interesting. People are pretty helpful if you are just <a href="/newsletter/how-i-get-good-advice">asking for advice</a> and not trying to sell them. It was uncomfortable and hard work, but it helped us constantly &quot;talk to users&quot; - something YC preaches.</p><p>In the product, we focused heavily on the onboarding flow. We wanted each user to bring more than 1 extra user. Just like Facebook in the early days. When a user signed in, it would send them to a page that&#x27;d read their calendar to guess which meetings were 1:1s, and it&#x27;d ask them to invite those users. Once they were in the tool, it&#x27;d also integrate with Slack so it&#x27;d remind you to plan your 1:1s and it&#x27;d let you plan the whole thing through their UX.</p><p>The calls sounded like they were going really well. 15 people said they would use it for their team.</p><p>After the first week of building it, we started sending the link out to sign up after each call.</p><p>Almost no one even clicked the link in the email. Not a single person planned a 1:1 with it properly.</p><p>YC later told us, at the induction, that we should read The Mom Test. Now we know why. We think we failed because we didn&#x27;t ask if sales leaders have ever planned their 1:1s in advance, and to show us what their agenda looked like. It turns out, they usually don&#x27;t. If this really felt like a problem to them, they would.</p><p>It was around this time we thought about applying to YC. We had originally had visions of bootstrapping.</p><p>Sat in the bright lights and gentle noise of people cold calling from communal work areas, fuelled by a free oat cappuccino or four, Tim and I talked about what we would regret not doing when we were 80.</p><p>That turned out to be the most helpful way to clarify what we actually wanted. We decided that we could bootstrap and over 4 years get to the kind of job we already had with good pay and with financial stress along the way. That sounded slow, and dull.</p><p>We wanted to push for more. We wanted to go bigger. Getting fuel from VCs meant our success wouldn&#x27;t come from owning a huge pie, we&#x27;d own a smaller chunk of a massive one, and we would get a lot more breadth of experience by doing this. Neither of us is particularly patient, and so we decided shooting for the stratosphere would be more fun.</p><p>We had a problem though. The YC deadline was looming, we had a product no-one cared about. That&#x27;s not what the YC t-shirts say.</p><p>It was now a Thursday evening, the deadline was Tuesday.</p><p>We decided we wanted to focus on developers. They&#x27;d give a better signal:noise ratio when we asked them what they needed, and they&#x27;d be more willing to try new products out.</p><p>In our past, we both saw challenges with tech debt when organisations scale. It causes shipping to slow down and good engineers to get frustrated.</p><p>I did the website, Tim did the product. I started outreach to every developer I knew, interviewing them on pain points. The good news was that a bunch of our friends worked at big companies.</p><p>Tuesday swung around. We had an MVP working and we had developers at 10 companies saying they were interested.</p><p>We wrote the application form. We kept talking about benefits. My previous job was selling enterprise software to banks - that&#x27;s how I write by default.</p><p>Each word had way too many letters, and it was boring. We chucked it away, at 8pm - the night it was due.</p><p>Everyone in the example application videos had thousands of users, revenue or had worked at impressive companies. We were intimidated by them.</p><p>The situation on paper was so bad, that it felt funny.</p><p>We relaxed, and wrote in natural language using very few, and very simple, words.</p><p>We put together a video of our MVP for the demo. We designed it to look so simple it felt tongue in cheek:</p><p>Neither of us has worked at a FANG company. Neither of us knew anyone at YC, and my only knowledge of the West Coast came from my wife making me watch the OC with her. We had no actual users, and we definitely had no revenue.</p><p>We got the interview email.</p><p>We just followed the instructions, and got in. They take people at any stage if they like the application.</p><p><em>Enjoyed this? Subscribe to our <a href="https://newsletter.posthog.com/subscribe">newsletter</a> to hear more from us twice a month!</em></p><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed bottom-4 right-4 z-50 flex flex-col gap-2 sm:w-[390px] max-w-[calc(100vw_-_2rem)] m-0 list-none outline-none" data-radix-toast-viewport="true"></ol></div>]]></content:encoded></item></channel></rss>