<?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>Wed, 18 Dec 2024 10:26:08 GMT</lastBuildDate><item><title><![CDATA[In-depth: PostHog vs Heap]]></title><description><![CDATA[How is PostHog different? 1. We're built for engineers What does this mean? It means  we ship fast  and iterate based on user feedback. It means…]]></description><link>https://posthog.com/blog/posthog-vs-heap</link><guid isPermaLink="false">f2d17a36-c8f1-51ec-8e59-e62eeaeb6bed</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Tue, 08 Oct 2024 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[<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 <a href="/docs/hogql">powerful 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 built-in data warehouse 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><h2 id="comparing-posthog-and-heap">Comparing PostHog and Heap</h2><h3 id="platform">Platform</h3><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track events and conversion, analyze user behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Easy to use analytics for marketing websites</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product, diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely, toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Experiments</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Run tests on new features, optimize conversion funnels</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collect and analyze feedback, run NPS and PMF surveys </p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer data platform</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync data with third-party tools</p></td><td class="text-center">Beta</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data warehouse</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">A single source for all your important data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users click in your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Notebooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ad-hoc analysis and collaboration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dark mode</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Choose between light and dark UI</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own apps and contribute code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Free usage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">How much free usage do you get each month?</p></td><td class="text-center">1 million events</td><td class="text-center">10k monthly tracked users</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual logging</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SQL query editor</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Write your own queries in SQL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI insight builder</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">&#x27;Talk to your data&#x27; using AI</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at a company and account level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine insights into shareable dashboards</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Graphs and trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build custom insights and visualizations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track users through a sequence of events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize which users stay, for how long</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User paths</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track user flows and where they drop-off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine users based on properties and events for group analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Lifecycle analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand who is dormant, churning, and thriving</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stickiness</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Find out what events keep users coming back.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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-replays">Session replays</h3><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Free usage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">How much free usage do you get each month?</p></td><td class="text-center">5,000 recordings</td><td class="text-center">None</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web app recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture recordings from single-page apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Mobile app recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture recordings in iOS and Android apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Identity detection</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Link recordings to user IDs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Console logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture extra content from a user&#x27;s browser</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Playlists</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sort recordings into static and dynamic playlists</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Performance monitoring</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track network events within a session</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Privacy masking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Censor personal information from playback</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Conditional capture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only capture the sessions you want</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>DOM explorer</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Explore an interactive snapshot of replays</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Export recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Save important recordings offline</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Minimum duration</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only record sessions longer than the minimum duration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sample recorded sessions</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Restrict the percentage of sessions that will be recorded</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Record via feature flag</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only record sessions for users that have the flag enabled</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Free usage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">How much free usage do you get each month?</p></td><td class="text-center">1 million API requests</td><td class="text-center">n/a</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Boolean flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple flags returning true or flag</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Multivariate flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Flags with multiple customizable values</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Payloads</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Flags with string, number, or JSON payloads</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Local evaluation</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Store flag definitions locally</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Percentage rollouts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Target percentages of a group</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom targeting</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Target users based on user properties, custom contexts</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Environments</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Manage flags for dev, staging, prod</p></td><td class="text-center">Partial</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scheduling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Schedule flags to turn on or off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Bootstrapping</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Flags available on frontend application load</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Early access</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Manage betas, test features</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Free usage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">How much free usage do you get each month?</p></td><td class="text-center">1 million API requests</td><td class="text-center">n/a</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom goals</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Customize metrics that a test tracks</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Secondary metrics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Monitor impact on unrelated metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Split testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Split participants into groups</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Multivariate (A/B/n) testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test multiple variants of a change</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Statistical significance</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically checks for statistical significance</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Recommended run time</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Calculates the recommended run time and sample size</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Holdout testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Withhold multiple features to measure cumulative impact</p></td><td class="text-center">Partial</td><td class="text-center">n/a</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Statistics engine</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">How the results of an experiment are calculated</p></td><td class="text-center">Bayesian</td><td class="text-center">n/a</td></tr></tbody></table></div><blockquote><p>💡 <strong>Good to know:</strong> Our experiments integrate seamlessly with our feature flag product. 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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User privacy options</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Anonymize users, drop personal data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>History, audit logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Manage and view flag edits and related users</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>GDPR-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Can be compliant with GDPR</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Can be compliant with HIPAA</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SOC 2</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">SOC 2 security certification</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>2FA</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Enforce login with two-factor authentication</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SAML/SSO</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use SAML or single sign-on authentication</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><p>💡<strong>Good to know:</strong> Additional compliance features, such as HIPAA Business Associate Agreements, advanced permissions, and audit logs are available on our <a href="/addons">Teams add-on</a>, which also includes our <a href="/docs/advanced/proxy/managed-reverse-proxy">managed reverse proxy</a> and white labelling for surveys and shared dashboards.</p></blockquote><h2 id="frequently-asked-questions">Frequently asked questions</h2><h3 id="can-i-migrate-from-heap">Can I migrate from Heap?</h3><p>Yes. See our <a href="/docs/migrate/heap">Heap to PostHog migration guide</a> for more.</p><h3 id="how-long-does-it-take-to-deploy-posthog">How long does it take to deploy PostHog?</h3><p>Deploying PostHog takes mere minutes. Just <a href="/docs/integrate?tab=snippet">include our tracking snippet</a> in your product or website and (thanks to autocapture) you&#x27;re immediately capturing events. Once up and running, you can enable session replays and other features via your project settings. See our guide to <a href="/docs/getting-started/cloud">getting started on PostHog Cloud</a> for more info.</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 <a href="/docs/libraries/google-tag-manager">Google Tag Manager</a>. 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="how-can-i-estimate-my-usage">How can I estimate my usage?</h3><p>The easiest way is to <a href="https://us.posthog.com/signup">sign up to PostHog</a>, integrate our snippet, then check the projection on your billing page after a few days. Alternatively, you can guesstimate by multiplying your current monthly active users by an estimate of events generated per user – 50 to 100 per user is a good starting point. See <a href="/docs/billing/estimating-usage-costs">Estimating usage &amp; costs</a> in our docs for more.</p><h3 id="does-posthog-block-bots-by-default">Does PostHog block bots by default?</h3><p>Yes. See the <a href="/docs/product-analytics/troubleshooting#does-posthog-block-bots-by-default">full blocklist in our docs</a>.</p><h3 id="what-about-ad-blockers">What about ad blockers?</h3><p>We recommend all users deploy a reverse proxy, which enables you 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 offer a managed reverse proxy on our Team plans, and we have <a href="/docs/advanced/proxy">reverse proxy setup guides</a> for AWS Cloudfront, Caddy, Cloudflare, Netlify, Vercel, and more, in our docs if you want to run your own.</p><h3 id="can-i-use-posthog-with-a-cdp-segment-rudderstack-etc">Can I use PostHog with a CDP? (Segment, Rudderstack, etc.)</h3><p>Yes. See <a href="/docs/advanced/cdp">Using PostHog with a CDP</a> in our docs.</p><h3 id="can-you-use-posthog-on-e-commerce-websites">Can you use PostHog on e-commerce websites?</h3><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><h3 id="how-does-posthog-compare-to-amplitude-and-mixpanel">How does PostHog compare to Amplitude and Mixpanel?</h3><p>Amplitude and Mixpanel offer similar features to Heap. Read our <a href="/blog/posthog-vs-mixpanel">PostHog vs Mixpanel</a> and <a href="/blog/posthog-vs-amplitude">PostHog vs Amplitude</a> guides for more info. You may also find guide to the <a href="/blog/best-heap-alternatives">most popular Heap alternatives</a> useful.</p>]]></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">29ad0112-8f7d-542f-8373-6d5e6463c20c</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 natural place to include an AI chatbot 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, credited to our hedgehog mascot, <div name="Max AI"></div>.</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="https://posthog.com/changelog/2024#realtime-destinations-now-in-open-beta">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>]]></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">557da516-6a77-5d14-acdb-c972b2dcdf3d</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/hogql">SQL access</a> and a <a href="/data-warehouse">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><div></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">0e3eaeb8-99dd-54b4-a4b8-32f391980a21</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 product analytics, web analytics, session replays, feature flags, A/B testing, user surveys, 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 class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Matomo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track events and conversion; analyze user behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregate traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product, diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users click in your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Experiments</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Run A/B/n tests on new features, optimize conversion funnels</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collect and analyze feedback, run NPS and PMF surveys</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely, toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Free tier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free forever option, no credit card required</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Free team members</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Number of users you can invite to your instance</p></td><td class="text-center">Unlimited</td><td class="text-center">30</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>EU hosting</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Access and store your data in the EU</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View code, comment on roadmap, and contribute</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Server-side SDKs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events and use features from Python, Node, and more</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Mobile SDKs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events and use features from Android, iOS, and more</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events, get stats, and make changes via API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></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 class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Matomo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Pageviews</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track visitors and their views</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sessions</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track unique sessions and their durations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Traffic breakdown</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where your visitors and conversions are coming from</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Conversions</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track actions you want users to take</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Bounce rate</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See the percentage of users that leave after one pageview</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Entry and exit paths</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See the pages users first visit and the last ones before they leave</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Outbound clicks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See the links that take users away</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>UTM tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track marketing campaigns with UTM tags</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cookieless tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track users without cookies</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Snippet install</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Install simple HTML snippet</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></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 class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Matomo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom events</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture and analyze any type of event</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom properties</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Add more data to custom events or users</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture frontend clicks and events automatically</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Graphs and trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build custom insights and visualizations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track users through a sequence of events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize which users stay, for how long</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build a custom dashboard of your own or use a template</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine users based on properties and events for group analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User profiles</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View user demographic data such as country, language, and device type</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at a company and account level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Paths</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track user flows and where they drop off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SQL</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Query your data with SQL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Enterprise</td></tr></tbody></table></div><h3 id="integrations">Integrations</h3><p>A simple way to compare integrations:</p><ul><li>PostHog has more integrations with data and product tools.</li><li>Matomo has more integrations with ecommerce and CMS platforms.</li></ul><p>But this doesn&#x27;t mean either lacks those types of integrations.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Matomo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>CSV exports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export your data as a CSV</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Warehouse exports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to warehouses like S3 and BigQuery for storage and analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">BigQuery</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Warehouse import</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import and query data from third-party sources like Postgres, S3, and GCS</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Slack</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events, reports, and anomalies to Slack</p></td><td class="text-center">Events, reports</td><td class="text-center">Reports, anomalies</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Email</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send reports to email</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Search Console</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See search queries that sent traffic to your site</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>WordPress</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events from WordPress</p></td><td class="text-center">Script</td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stripe</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import and query charges, customers, invoices, subscriptions, and more</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import and query contacts, companies, deals, and more</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zendesk</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import and query organizations, tickets, users, and more</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zapier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Trigger Zapier automations on events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentry</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send and receive error data with Sentry</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></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 class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Matomo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-hostable</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Self-host your instance for full control</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Bot blocking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Block scrapers, crawlers, and other unwanted traffic from stats</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Reverse proxy</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Official instructions on avoiding tracking blockers</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Can be compliant with HIPAA</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>GDPR-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Can be compliant with GDPR</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data anonymization</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Options to anonymize user data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SOC 2</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">SOC 2 security certification</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>2FA</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Enforce login with two-factor authentication</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SAML/SSO</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use SAML or single sign-on authentication</p></td><td class="text-center">Enterprise</td><td class="text-center">Enterprise</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Audit log</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Get a report of all activities happening in your instance</p></td><td class="text-center">Enterprise</td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></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">250 responses</td><td align="center">From $0.20/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><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 onSessionId&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_api_key&gt;&#x27;, {api_host: &#x27;&lt;ph_client_api_host&gt;&#x27;, person_profiles: &#x27;identified_only&#x27;})
&lt;/script&gt;
</code></pre><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>]]></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">f6156f3b-928c-5b4c-9914-c9c31db363e3</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>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Hotjar]]></title><description><![CDATA[PostHog and Hotjar both help you understand user behavior, including the ability to watch real user sessions, conduct user research, and book…]]></description><link>https://posthog.com/blog/posthog-vs-hotjar</link><guid isPermaLink="false">f12a1019-73d0-5e46-96f2-934f4225fabc</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Thu, 22 Aug 2024 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>PostHog and Hotjar both help you understand user behavior, including the ability to watch real user sessions, conduct user research, and book interviews, but there are some important differences:</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</a> analytics, <a href="/feature-flags">feature flags</a>, <a href="/experiments">A/B testing</a>, and a <a href="/data-warehouse">data warehouse</a>. 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-we-support-both-web-and-mobile-apps">2. We support both web and mobile apps</h3><p>We offer integrations for all the most popular web and and mobile SDKs, including <a href="/docs/libraries/next-js">Next.js</a>, <a href="/docs/libraries/react">React</a>, <a href="/docs/libraries/react-native">React Native</a>, <a href="/docs/libraries/android">Android</a>, <a href="/docs/libraries/ios">iOS</a>, and <a href="/docs/libraries/flutter">Flutter</a>. Unlike Hotjar, we also support <a href="/session-replay/mobile">session replay on mobile apps</a> through our iOS and Android SDKs – we&#x27;re working on React Native and Flutter support, too. This means you can track all versions of your app using PostHog.</p><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 recordings and 1 million events for free each month, no matter what plan they&#x27;re on. Our generous free tier means more than 90% of companies use PostHog for free, and you&#x27;ll pay less when you do use up your free credits. </p><p>See the <a href="#price-comparison">price comparison section</a> for more.</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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels and trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track conversion funnels and event trends over time</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Advanced conversion funnels, behavior and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Replace Google Analytics and track content performance</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users click in your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scrollmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users scroll on your website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for users or cohorts</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze impact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture user feedback with surveys</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data warehouse</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Query data from any source and analyze it alongside your product data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Interview scheduling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">In-app widget for requesting customer interviews</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Interview transcriptions</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Record and transcribe user interviews</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="analytics">Analytics</h3><p>Product analytics isn&#x27;t a core focus for Hotjar, but it does offer basic event tracking, funnels, and trend insights on its most expensive Scale plan.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Event tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Log page views, clicks and other custom events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track your data over time and visualize in charts</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize conversion rates and drop-offs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Display a collection of insights and trends</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Correlation analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically highlight factors affecting funnel conversion rates</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Group events by users in the same company, project, or any other attribute</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Lifecycle insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Break down events from new, returning, resurrecting, and dormant users</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand churn with returning user actions</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stickiness insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how many times users perform an event in a period of time</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Path insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Inspect how users journey through your product</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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>Both Hotjar and PostHog are good options if you&#x27;re looking for a <a href="/blog/best-microsoft-clarity-alternatives">Microsoft Clarity alternative</a>, though Hotjar doesn&#x27;t support replays on mobile apps and has no public plans to do so.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web app replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch sessions in your web app</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Android replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your Android app</p></td><td class="text-center">Beta</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>iOS replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your iOS app</p></td><td class="text-center">Beta</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Console logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Debug user problems and app errors</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Network performance</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See sessions web vitals and requests</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom playlists</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create playlists of related replays</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Create highlights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Crop and save segments of recordings</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Frustration and engagement scores</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Filter recordings by scores</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Record via URL or event</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Trigger recordings based on URL or event</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Record via feature flag</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Trigger recordings based on feature flag variables</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Download replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Save replay files offline for storage</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><p><strong>Note:</strong> Our <a href="/blog/mobile-session-replay">mobile session replay</a> is free while it&#x27;s in development, and we&#x27;re actively working on session replay support for React Native and Flutter, too. See our <a href="/docs/session-replay/mobile">mobile replay docs</a> for more info on development and how replay works on mobile apps.</p></blockquote><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See clicks and mouse movement on your site</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Clickmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See what elements users click</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scrollmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage clicks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track repeated clicks in the same place</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Save heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Save historic heatmaps</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Toolbar</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View heatmaps in browser</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="surveys">Surveys</h3><p>Hotjar supports more survey types than PostHog, but fewer targeting options.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Show surveys on websites and web apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Mobile surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Show surveys in mobile apps</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Popover surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Small surveys that popover bottom of screen</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Button surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Surveys with a button CTA</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Link surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Surveys with a link CTA</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Embedded surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Surveys embedded directly into web page</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Full screen surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Surveys that take over whole screen</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentiment analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Analyze survey results using AI to discover trends</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Survey templates</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Templates for NPS, market-fit, and CSAT surveys</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Interview scheduling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send users a link to schedule a feedback meeting.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own UI and send responses to API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Webhooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send survey responses to places like Slack or Teams</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><p>Using PostHog&#x27;s product analytics and surveys together unlocks more precise targeting options for surveys, such as using feature flags and pre-defined cohorts.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Target by URL</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Trigger when user visits specific URL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Target by person properties</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Target users by individual attributes</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Target by completed event</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Trigger when user completes specific event or action</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Target by feature flag</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Show to users with a feature flag enabled</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Target by dynamic cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Show to users that meet cohort criteria</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Target by static cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Show to a specific list of users </p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h2 id="price-comparison">Price comparison</h2><blockquote><p><strong>Note:</strong> Prices correct as of Aug 21, 2024.</p></blockquote><p>PostHog is cheaper than Hotjar for both session replay and user surveys, regardless of whether you choose Hotjar&#x27;s most popular Business tier or the more expensive Scale tier that includes Hotjar&#x27;s basic analytics features, and a dedicated account manager.</p><h3 id="session-replay-pricing">Session replay pricing</h3><p>Hotjar charges based on &#x27;sessions per day&#x27;, whereas PostHog uses monthly recorded sessions. We&#x27;ve multiplied Hotjar&#x27;s daily sessions by 30 to get a monthly equivalent. </p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/replay_light_cfa8ac3dd9.jpg" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/replay_dark_c9dba6fd3f.jpg" classes="rounded" alt="session replay pricing"></div><table><thead><tr><th>Monthly sessions</th><th>Hotjar Business</th><th>Hotjar Scale</th><th>PostHog</th></tr></thead><tbody><tr><td><strong>5k</strong></td><td>$99</td><td>$213</td><td>$0</td></tr><tr><td><strong>15k</strong></td><td>$99</td><td>$213</td><td>$50</td></tr><tr><td><strong>45k</strong></td><td>$249</td><td>$525</td><td>$157</td></tr><tr><td><strong>75k</strong></td><td>$389</td><td>$827</td><td>$224</td></tr><tr><td><strong>120k</strong></td><td>$489</td><td>Contact sales</td><td>$313</td></tr><tr><td><strong>240k</strong></td><td>$789</td><td>Contact sales</td><td>$524</td></tr></tbody></table><p>At 75k recorded sessions per month, PostHog is $1,980 cheaper over 12 months compared to Hotjar&#x27;s Business tier, and $7,236 cheaper than Hotjar&#x27;s Scale tier, when paying monthly.</p><p>PostHog also offers a more generous free tier that includes 5,000 replay sessions, 1 million analytics events, and 250 survey responses for free <em>every month</em>. </p><p>Hotjar doesn&#x27;t offer any free usage outside of its extremely limited Basic tier.</p><h3 id="surveys-pricing">Surveys pricing</h3><p>It&#x27;s similar story for user surveys, where PostHog is cheaper than both Hotjar&#x27;s Business and Scale tiers. At 2,500 survey responses each month, PostHog is $324 per year cheaper than Hotjar&#x27;s Business tier when paying monthly.</p><div imageLight="https://res.cloudinary.com/dmukukwp6/image/upload/surveys_light_d45a4a6318.jpg" imageDark="https://res.cloudinary.com/dmukukwp6/image/upload/surveys_dark_96fc402ad8.jpg" classes="rounded" alt="surveys pricing"></div><table><thead><tr><th>Monthly survey responses</th><th>Hotjar Business</th><th>Hotjar Scale</th><th>PostHog</th></tr></thead><tbody><tr><td><strong>250</strong></td><td>$79</td><td>$159</td><td>$0</td></tr><tr><td><strong>500</strong></td><td>$79</td><td>$159</td><td>$51</td></tr><tr><td><strong>1,000</strong></td><td>$99</td><td>$259</td><td>$99</td></tr><tr><td><strong>2,500</strong></td><td>$179</td><td>$479</td><td>$152</td></tr><tr><td><strong>5,000</strong></td><td>$289</td><td>Contact sales</td><td>$240</td></tr><tr><td><strong>7,500</strong></td><td>$399</td><td>Contact sales</td><td>$330</td></tr><tr><td><strong>10,000</strong></td><td>$479</td><td>Contact sales</td><td>$418</td></tr></tbody></table><p>You can see how much PostHog will cost you 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-warehouse">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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Segment</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest events from Segment</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentry</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest Sentry errors for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stripe</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import revenue data and combine with analytics data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import CRM data from Hubspot</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zendesk</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine support ticket data with session replay and customer data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Amazon S3</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import data from Amazon S3 storage</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Postgres</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import data from Postgres data warehouse</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Snowflake</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import data from Snowflake</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Cloud</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import data from GCS</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="data-destinations">Data destinations</h3><p>Hotjar and PostHog support a similar range of data destinations, though PostHog can send more data because it collects more actionable data via product analytics. Hotjar is limited to sending basic event data, session replay, and survey responses.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send data to Hubspot</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zapier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export events for use in Zaps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Slack</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send survey responses and data to Slack</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Teams</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send survey responses and data to Teams</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Discord</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send survey responses and data to Discord</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Intercom</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Extract and load data to external platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Salesforce</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send data to Salesforce</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer.io</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync data between platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>CSV</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to CSV</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>S3</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Batch export data to S3</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>BigQuery</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Batch export data to BigQuery</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Hotjar</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SOC 2 certified</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Information security process audited</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>GDPR-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">EU hosting or data residency available.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>CCPA-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Compliant with California Consumer Privacy Act.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Business Associate Agreement available.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data anonymization</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Remove personally identifiable information.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cookieless tracking option</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use session replays and analytics without cookie consent banners</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h2 id="frequently-asked-questions">Frequently asked questions</h2><h3 id="can-posthog-replace-google-analytics">Can PostHog replace Google Analytics?</h3><p>Absolutely. We include an easy-to-use <a href="/web-analytics">web analytics dashboard</a> for tracking marketing and content performance, and you can use our product analytics to do more in-depth analysis as well. See our <a href="/blog/posthog-vs-ga4">PostHog vs Google Analytics comparison</a> for more.</p><h3 id="can-posthog-replace-mixpanel-amplitude-and-heap">Can PostHog replace Mixpanel, Amplitude and Heap?</h3><p>It&#x27;s what PostHog&#x27;s designed to do. The beauty of PostHog is replaces multiple tools in your analytics and product stack, so you can stop juggling data between multiple tools, and save money by consolidating everything. See our comparisons with <a href="/blog/posthog-vs-mixpanel">Mixpanel</a>, <a href="/blog/posthog-vs-amplitude">Amplitude</a>, and <a href="/blog/posthog-vs-heap">Heap</a> for more.</p><h3 id="can-i-choose-which-sessions-are-recorded">Can I choose which sessions are recorded?</h3><p>Yes. You can choose to only record sessions on specific pages, or sessions with a minimum duration that you set. You can also set a sampling rate – i.e. only record 20% of sessions – or trigger recordings based on a feature flag. See <a href="/tutorials/limit-session-recordings">How to only record the sessions you want</a> for more.</p><h3 id="does-posthog-offer-discounts-for-paying-annually">Does PostHog offer discounts for paying annually?</h3><p>Yes. You get a 20% discount by default for paying annually upfront. Hotjar also offers a 20% discount for paying annually.</p><h3 id="can-i-use-posthog-with-a-customer-data-platform-like-segment">Can I use PostHog with a customer data platform like Segment?</h3><p>Yes. See our guide to <a href="/docs/advanced/cdp">using PostHog with a CDP</a> for more on that, though many of our customers use PostHog as their CDP and utilize our <a href="/docs/cdp">data pipelines</a> and <a href="/docs/data-warehouse">data warehouse</a> for moving data in and out of PostHog.</p><p>Got another question? You can <a href="/questions">ask the PostHog team anything you want</a>!</p>]]></content:encoded></item><item><title><![CDATA[7 best session replay tools for mobile apps (iOS & Android)]]></title><description><![CDATA[1. LogRocket Typical users:  Product managers, engineers, support teams What is LogRocket? LogRocket  is a product experience platform that focuses on…]]></description><link>https://posthog.com/blog/best-mobile-app-session-replay-tools</link><guid isPermaLink="false">37a78518-611c-5ccb-9e38-e3937779b4eb</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Mon, 05 Aug 2024 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[<h2 id="1-logrocket">1. LogRocket</h2><p><strong>Typical users:</strong> Product managers, engineers, support teams</p><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">Supported features</h4><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Supported platforms</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Mobile platforms where session replay is available</p></td><td class="text-center">Android, iOS, React Native</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Debug logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View console logs, network logs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Filters</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View specific replays based on user segments, screens visited, events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Highlight areas that get the most interaction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scroll maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll and where they dwell</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Identify repetitive taps made out of frustration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dead taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Detect taps on elements that do not respond or trigger an action</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Crash reports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Learn what happens before a crash without complex debugging or reproduction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI summaries</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate summaries of session replays</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-much-does-logrocket-cost">How much does LogRocket cost?</h3><p>Its <strong>Team</strong> plan starts at $199/month for up to 10k sessions and includes most session replay features, but excludes other features such as product analytics and some error tracking features.</p><p>The <strong>Professional</strong> plan starts at $420/month for up to 10k sessions 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">Bottom line</h4><p>LogRocket is great choice for teams whose top priority is identifying and mitigating issues.</p></blockquote><br/><h2 id="2-uxcam">2. UXCam</h2><p><strong>Typical users:</strong> Product managers in enterprise companies</p><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 solely for mobile apps. It includes a full-suite of analytics features as well as session replays, heatmaps, and crash analytics.</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-1">Supported features</h4><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>UXCam</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Supported platforms</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Mobile platforms where session replay is available</p></td><td class="text-center">Android, iOS, React Native, Flutter</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Debug logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View console logs, network logs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Filters</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View specific replays based on user segments, screens visited, events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Highlight areas that get the most interaction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scroll maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll and where they dwell</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Identify repetitive taps made out of frustration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dead taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Detect taps on elements that do not respond or trigger an action</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Crash reports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Learn what happens before a crash without complex debugging or reproduction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI summaries</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate summaries of session replays</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="how-much-does-uxcam-cost">How much does UXCam cost?</h3><p>UXCam&#x27;s pricing is sales-driven and completely opaque, so it&#x27;s not clear how much it costs. The company&#x27;s sales team will give you a quote after you&#x27;ve spoken to them.</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-1">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><br/><h2 id="3-microsoft-clarity">3. Microsoft Clarity</h2><p><strong>Typical users:</strong> Marketing and content teams</p><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-2">Supported features</h4><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Microsoft Clarity</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Supported platforms</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Mobile platforms where session replay is available</p></td><td class="text-center">Android, iOS, React Native</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Debug logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View console logs, network logs</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Filters</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View specific replays based on user segments, screens visited, events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Highlight areas that get the most interaction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scroll maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll and where they dwell</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Identify repetitive taps made out of frustration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dead taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Detect taps on elements that do not respond or trigger an action</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Crash reports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Learn what happens before a crash without complex debugging or reproduction</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI summaries</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate summaries of session replays</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-much-does-microsoft-clarity-cost">How much does Microsoft Clarity cost?</h3><p>Clarity is completely free.</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-2">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><br/><h2 id="4-posthog">4. PostHog</h2><p><strong>Typical users</strong> Engineering and product teams</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1722527045/posthog.com/contents/posthog-mobile-replay.png" alt="posthog"/></p><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="https://posthog.com">PostHog</a> (that&#x27;s us 👋) is an all-in-one platform built to help engineers create better products. It includes <a href="/session-replay">session replays</a> <strong>and</strong> a whole bunch more, such as <a href="/analytics">product analytics</a>, <a href="/experiments">A/B testing</a>, and <a href="/feature-flags">feature flags</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="supported-features-3">Supported features</h4><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Supported platforms</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Mobile platforms where session replay is available</p></td><td class="text-center">Android, iOS</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Debug logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View console logs, network logs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Filters</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View specific replays based on user segments, screens visited, events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Highlight areas that get the most interaction</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scroll maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll and where they dwell</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Identify repetitive taps made out of frustration</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dead taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Detect taps on elements that do not respond or trigger an action</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Crash reports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Learn what happens before a crash without complex debugging or reproduction</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI summaries</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate summaries of session replays</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog has <a href="/session-replay#pricing">transparent pricing</a> based on usage. It’s free to get started and completely free for the first 5,000 recordings. After this free monthly allowance, pricing starts at $0.0050/recording (or $50 for 10k recordings), 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-3">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><br/><h2 id="5-smartlook">5. Smartlook</h2><p><strong>Typical users:</strong> Engineers, business analysts, product managers</p><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, visualizations, and crash reports to generate an overall understanding of user experience. It focuses on mobile apps with specific tools like native rendering and wireframe mode.</p><h4 id="supported-features-4">Supported features</h4><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Smartlook</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Supported platforms</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Mobile platforms where session replay is available</p></td><td class="text-center">Android, iOS, React Native, Flutter</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Debug logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View console logs, network logs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Filters</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View specific replays based on user segments, screens visited, events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Highlight areas that get the most interaction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scroll maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll and where they dwell</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Identify repetitive taps made out of frustration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dead taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Detect taps on elements that do not respond or trigger an action</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Crash reports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Learn what happens before a crash without complex debugging or reproduction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI summaries</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate summaries of session replays</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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 $69/month for 5k sessions or $99 for 10k sessions. 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 combination of analytics, session replay, and crash reports make it a good choice for teams who want a full picture of their user experience.</p></blockquote><br/><h2 id="6-fullstory">6. FullStory</h2><p><strong>Typical users:</strong> Product managers, customer success, and support</p><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/best-fullstory-alternatives">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><h4 id="supported-features-5">Supported features</h4><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Supported platforms</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Mobile platforms where session replay is available</p></td><td class="text-center">Android, iOS, React Native, Flutter</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Debug logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View console logs, network logs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Filters</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View specific replays based on user segments, screens visited, events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Highlight areas that get the most interaction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scroll maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll and where they dwell</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Identify repetitive taps made out of frustration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dead taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Detect taps on elements that do not respond or trigger an action</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Crash reports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Learn what happens before a crash without complex debugging or reproduction</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI summaries</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate summaries of session replays</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="how-much-does-fullstory-cost">How much does FullStory cost?</h3><p>FullStory doesn&#x27;t publish pricing publicly. However, according to <a href="https://www.failory.com/blog/fullstory-pricing">Failory</a>, Fullstory will cost you between $250 - $1,000 per month.</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><br/><h2 id="7-contentsquare">7. Contentsquare</h2><p><strong>Typical users:</strong> Product managers, ecommerce teams, and marketers</p><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>Contentsquare is an analytics platform that combines heatmaps, customer journey analysis, and frustration scoring to help find and fix issues and friction points.</p><h4 id="supported-features-6">Supported features</h4><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Contentsquare</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Supported platforms</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Mobile platforms where session replay is available</p></td><td class="text-center">Android, iOS, React Native</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Debug logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View console logs, network logs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Filters</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View specific replays based on user segments, screens visited, events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Highlight areas that get the most interaction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scroll maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how far users scroll and where they dwell</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rage taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Identify repetitive taps made out of frustration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dead taps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Detect taps on elements that do not respond or trigger an action</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Crash reports</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Learn what happens before a crash without complex debugging or reproduction</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>AI summaries</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate summaries of session replays</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="how-much-does-contentsqaure-cost">How much does Contentsqaure cost?</h3><p>Since Contentsquare caters mostly to enterprise companies, its pricing is not available publicly and you need to speak to its  sales team to get a quote. According to <a href="https://www.capterra.co.uk/software/161591/contentsquare">Capterra</a>, pricing starts at $10,000/month, but no further information is given</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>From data visualizations, to behavior analysis, and detailed session replays, Contentsquare has a lot to offer, especially for larger companies.</p></blockquote><h2 id="further-reading">Further reading</h2><ul><li><a href="/blog/best-mobile-app-ab-testing-tools">The 9 best mobile app A/B testing tools</a></li><li><a href="/blog/best-mobile-app-analytics-tools">The 7 best mobile app analytics tools</a></li><li><a href="/blog/best-uxcam-alternatives">The best UXCam alternatives &amp; competitors, compared</a></li></ul>]]></content:encoded></item><item><title><![CDATA[The 7 best mobile app analytics tools]]></title><description><![CDATA[1. PostHog Best for:  Engineering and product teams What is PostHog? PostHog  (that's us 👋) is an all-in-one platform built to help engineers create…]]></description><link>https://posthog.com/blog/best-mobile-app-analytics-tools</link><guid isPermaLink="false">145f873d-abff-52a7-98a0-a34148493de0</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Wed, 31 Jul 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[<h2 id="1-posthog">1. PostHog</h2><p><strong>Best for:</strong> Engineering and product teams</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/ab-testing.png" alt="posthog"/></p><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="https://posthog.com">PostHog</a> (that&#x27;s us 👋) is an all-in-one platform built to help engineers create better products. It includes product analytics <strong>and</strong> a whole bunch more, such as <a href="/experiments">A/B testing</a>, <a href="/feature-flags">feature flags</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’s free to get started and completely free for the first 1 million analytics events. After this free monthly allowance, pricing starts at $0.000248/event (or $2.48 for 10k 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><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><br/><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, in recent years it&#x27;s deprecated additional features, such as A/B testing, to focus on product analytics alone.</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></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. 1 million events cost $168/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.</p></blockquote><br/><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&#x27;s pricing is sales-driven and completely opaque, so it&#x27;s not clear how much it costs. The company&#x27;s sales team will give you a quote after you&#x27;ve spoken to them.</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><br/><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 is the most expensive platform on this list. Pricing starts at $49/month for up to 1k events. 100k events cost $849/month.</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>Like PostHog, Amplitude is a good option if you value powerful analytics and experimentation in one. If you don&#x27;t need session replay or heatmaps, it can be a good choice.</p></blockquote><br/><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>Since Firebase is powered by <a href="/blog/google-analytics-cost">Google Analytics</a>, it follows the same pricing. It has a generous free tier that&#x27;s sufficient for most startups. Larger enterprises with higher data collection and export requirements will need to upgrade to GA360, which <em>starts</em> at $50,000 per year. </p><p>A good rule of thumb is that if you&#x27;re exporting more than 1 million events per day, or querying data with more than 10 million events, you&#x27;ll need to upgrade to GA360. See Google&#x27;s <a href="https://support.google.com/analytics/answer/11202874">breakdown</a> for more. </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><br/><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 analytics and, unlike other platforms on this list, it doesn&#x27;t include product analytics. Instead, it focuses on attribution to help teams measure, analyze, and optimize their marketing efforts.</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>Since it focuses on marketing analytics, Appsflyer charges $0.07 per conversion events. Examples of conversion are app installs, in-app purchases, and sign-ups.</p><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><br/><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 has different tiers based on number of active users. To give you an idea of how much it charges per active user, below is a list of its first four tiers:</p><ul><li>Free up to 1k MAU</li><li>$80/month for up to 2k MAU.</li><li>$190/month for up to 5k MAU.</li><li>$350/month for up to 10k MAU.</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><br/><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>Check out <a href="/product-analytics">our product pages</a> and <a href="/docs">read our docs</a> to learn more.</p><div></div><h2 id="further-reading">Further reading</h2><ul><li><a href="/blog/best-mobile-app-ab-testing-tools">The 9 best mobile app A/B testing tools</a></li><li><a href="/blog/best-mobile-app-session-replay-tools">7 best session replay tools for mobile apps (iOS &amp; Android)</a></li><li><a href="/blog/best-gdpr-compliant-analytics-tools">The 9 best GDPR-compliant analytics tools</a></li></ul>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Mixpanel]]></title><description><![CDATA[How is PostHog different? 1. We're an all-in-one platform PostHog combines  product analytics  with  web analytics ,  session replay ,  feature flags…]]></description><link>https://posthog.com/blog/posthog-vs-mixpanel</link><guid isPermaLink="false">1e5a2137-8d0e-535d-985a-caebab807dfd</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Fri, 19 Jul 2024 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[<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> 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>, and a <a href="/docs/data-warehouse">data warehouse</a> 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><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>, and a <a href="/docs/hogql">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-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 massive sales teams, or 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><h2 id="comparing-posthog-and-mixpanel">Comparing PostHog and Mixpanel</h2><h3 id="platform">Platform</h3><p>PostHog can replace multiple tools, such as <a href="/blog/best-mixpanel-alternatives">Mixpanel</a> for product analytics, <a href="/blog/best-hotjar-alternatives">Hotjar</a> for session replay and surveys, and <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a> for A/B tests and feature flags.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track events and conversion, analyze user behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Easy to use analytics for marketing websites</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product, diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Closed beta</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely, toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Run tests on new features, optimize conversion funnels</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analysis only*</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collect and analyze feedback, run NPS and PMF surveys </p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data pipelines</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export event data to data warehouses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer data platform</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync cusomter data between third-party tools</p></td><td class="text-center">Beta</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data warehouse</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Centralized data storage for business intelligence</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users click in your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scrollmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize how far users scroll in your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Notebooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ad-hoc analysis and collaboration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dark mode</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Choose between light and dark UI</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own apps and contribute code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Libraries only</td></tr></tbody></table></div><p>*You can&#x27;t run A/B tests using Mixpanel, only analyse the results of tests created using third-party integrations.</p><h3 id="product-analytics">Product analytics</h3><p>There are two key differences here:</p><ol><li><p>PostHog supports autocapture, which makes it much faster to implement as you don&#x27;t have to manually instrument every event. Don&#x27;t want autocapture? Just <a href="/docs/product-analytics/autocapture">turn it off</a> and rely on one of our many SDKs – we offer the best of both worlds.</p></li><li><p>PostHog has a <a href="/docs/hogql">SQL-based query builder</a> for power users, which enables you to generate custom data analyses using PostHog event data. In future, our query builder will let you analyze data as you would in a business intelligence tool, like Metabase, inside PostHog.</p></li></ol><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture frontend clicks and events automatically</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Query editor</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Write your own queries in SQL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Managed reverse proxy</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events from your own domain, managed by us</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine insights into shareable dashboards</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Graphs and trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build custom insights and visualizations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track users through a sequence of events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize which users stay, for how long</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User paths</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track user flows and where they drop-off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine users based on properties and events for group analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at a company and account level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Lifecycle analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand who is dormant, churning, and thriving</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stickiness insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how many times users perform an event in a period of time.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom formulas</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use formulas to calculate unique insights</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Correlation analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Suggested events and properties that lead to success or failure</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></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>. Our feature flags are also 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 class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Boolean flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple flags returning true or flag</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Multivariate flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Flags with multiple customizable values</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Payloads</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Flags with string, number, or JSON payloads</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Local evaluation</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Store flag definitions locally</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Percentage rollouts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Target percentages of a group</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom targeting</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Target users based on user properties, custom contexts</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scheduling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Schedule flags to turn on or off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Environments</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Manage flags for dev, staging, prod</p></td><td class="text-center">Partial</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scheduling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Schedule flags to turn on or off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Bootstrapping</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Flags available on frontend application load</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Early access</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Manage betas, test features</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="ab-testing">A/B testing</h3><p>PostHog&#x27;s A/B testing are billed with feature flags. You <strong>can&#x27;t run A/B tests using Mixpanel</strong>, but you can analyze the results of experiments created using third-party A/B testing tools.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Built-in A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Setup and run A/B tests using feature flags</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Experiment analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Analyze results of A/B tests</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom goals</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Customize metrics that a test tracks</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Secondary metrics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Monitor impact on unrelated metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Statistical significance</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically checks for statistical significance</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Split testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Split participants into groups</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Multivariate (A/B/n) testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test multiple variants of a change</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Recommended run time</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically calculate the recommended run time and sample size</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dynamic cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Add new users to an experiment automatically by setting a user property</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Holdout testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Withhold multiple features to measure cumulative impact</p></td><td class="text-center">Partial</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Statistics engine</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">How the results of an experiment are calculated</p></td><td class="text-center">Bayesian</td><td class="text-center">Frequentist</td></tr></tbody></table></div><h3 id="session-replay">Session replay</h3><p>Replays enable you watch how users experience your app, diagnose issues, improve support, and understand real user behavior in a way raw data can&#x27;t. You get 5,000 recordings for free every month, so you&#x27;ll pay nothing if you remain below this limit.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web app recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture recordings from single-page apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Closed beta</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Mobile app recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture recordings in iOS and Android apps</p></td><td class="text-center">Beta</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Identity detection</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Link recordings to user IDs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Console logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture extra content from a user&#x27;s browser</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Playlists</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sort recordings into static and dynamic playlists</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Performance monitoring</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track network events within a session</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Privacy masking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Censor personal information from playback</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Conditional recording</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only capture the sessions you want</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>DOM explorer</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Explore an interactive snapshot of replays</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Export recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Save important recordings offline</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Minimum duration</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only record sessions longer than the minimum duration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sample recorded sessions</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Restrict the percentage of sessions that will be recorded</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Record via feature flag</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only record sessions for users that have the flag enabled</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><p><strong>Note:</strong> Mixpanel&#x27;s session replay tool is currently a closed, invite-only beta for customers on its Enterprise plan. </p><h3 id="surveys">Surveys</h3><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 class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open text</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free text answers and feedback</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product rating</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Rank using emojis or number</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Single choice</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Select one answer from multiple</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Multiple choice</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Select more than one answer from multiple</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>NPS surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Net Promoter Score survey template</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>PMF surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Product-market fit survey template</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User property targeting</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Target users based on any of their user properties</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom colors &amp; positioning</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Customize the colors of your surveys to match your brand</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom HTML</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Add custom HTML to your survey text</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>API mode</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create surveys via the API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="data-integrations">Data integrations</h3><p>PostHog and Mixpanel diverge here:</p><ol><li><p>PostHog 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></li><li><p>Mixpanel 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></li></ol><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data warehouse</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Query customer and product data together</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Warehouse import</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import data from third-party warehouse</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stripe</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Stripe customer data connector</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zendesk</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send and receive data from Zendesk</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send and receive data from Hubspot</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentry</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send and receive data from Sentry</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Segment</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events via Segment</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rudderstack</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events via Rudderstack</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zapier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Trigger Zapier automations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer.io</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Messaging and marketing automation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Intercom</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Messaging and marketing automation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><p>See our docs for full lists of <a href="/docs/cdp">destinations</a> and <a href="/docs/data-warehouse">data warehouse connectors</a>.</p><h3 id="security-and-compliance">Security and compliance</h3><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User privacy options</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Anonymize users, drop personal data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>History, audit logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Manage and view flag edits and related users</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>GDPR-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Can be compliant with GDPR</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA-ready</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Can be compliant with HIPAA</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SOC 2</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">SOC 2 security certification</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>2FA</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Enforce login with two-factor authentication</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SAML/SSO</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use SAML or single sign-on authentication</p></td><td class="text-center">Enterprise</td><td class="text-center">Enterprise</td></tr></tbody></table></div><h2 id="frequently-asked-questions">Frequently asked questions</h2><h3 id="can-i-migrate-my-data-from-mixpanel-to-posthog">Can I migrate my data from Mixpanel to PostHog?</h3><p>Yes. See our <a href="/docs/migrate/mixpanel">Mixpanel to PostHog migration guide</a>.</p><h3 id="can-posthog-replace-google-analytics">Can PostHog 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 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><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>Every PostHog user gets a generous amount of free usage each month:</p><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>Data warehouse</strong></td><td>1 million synced rows</td></tr><tr><td><strong>Session replay</strong></td><td>5,000 recordings</td></tr><tr><td><strong>Feature flags</strong></td><td>1 million API requests</td></tr><tr><td><strong>A/B testing</strong></td><td>1 million API requests</td></tr><tr><td><strong>Surveys</strong></td><td>250 responses</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><p>A full breakdown and pricing calculator is on <a href="/pricing">our pricing page</a>.</p><h3 id="can-i-use-posthog-with-a-cdp-segment-rudderstack-etc">Can I use PostHog with a CDP? (Segment, Rudderstack, etc.)</h3><p>Yes. See <a href="/docs/advanced/cdp">Using PostHog with a CDP</a> in our docs.</p><h3 id="what-about-ad-blockers">What about ad blockers?</h3><p>We recommend all users deploy a reverse proxy, which enables you 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 setup. 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><h3 id="how-do-posthog-and-mixpanel-compare-to-amplitude">How do PostHog and Mixpanel compare to Amplitude?</h3><p>Amplitude is closer to Mixpanel than PostHog – it doesn&#x27;t support features like session replays or surveys, and doesn&#x27;t offer autocapture. Read our <a href="/blog/posthog-vs-amplitude">PostHog vs Amplitude</a> comparison for information.</p>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs Google Analytics 4]]></title><description><![CDATA[Septemeber 2024 Update:  We built  our own, dedicated web analytics tool . Now PostHog is an even better alternative to Google Analytics 4! How is…]]></description><link>https://posthog.com/blog/posthog-vs-ga4</link><guid isPermaLink="false">f00163cf-9147-5c9a-b899-06a0d554bfd9</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Tue, 09 Jul 2024 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[<blockquote><p><strong>Septemeber 2024 Update:</strong> We built <a href="/web-analytics">our own, dedicated web analytics tool</a>. Now PostHog is an even better alternative to Google Analytics 4!</p></blockquote><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="/experiments">A/B testing</a>, <a href="/surveys">surveys</a>, and a baked in <a href="/docs/data-warehouse">data warehouse</a> 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><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>, and a <a href="/docs/hogql">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-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 massive sales teams, or 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><h2 id="comparing-posthog-and-google-analytics">Comparing PostHog and Google Analytics</h2><h3 id="analytics">Analytics</h3><p>Features like <a href="/docs/product-analytics/group-analytics">group analytics</a>, which enables you analyze behavior at an account of company level, make PostHog ideal for B2B SaaS products.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Google Analytics</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Traffic breakdown</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Gain insights into where your visitors and conversions are coming from</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User profiles</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View user demographic data such as country, language, and device type</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>UTM tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track marketing campaigns with UTM tags</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize conversion rates and drop-offs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User paths</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track user flows and where they drop-off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Analyze user and revenue retention</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Monetization analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track purchase value, LTV, and other revenue metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Advertising analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track ROI on Google Ads and other marketing campaigns</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Real-time view</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Monitor activity on your site or app as it happens.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Predictive insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">AI-powered alerts when metrics change</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><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/hogql">custom SQL insights</a>.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Google Analytics</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize how users navigate your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Clickmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users click in your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scrollmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize how far users scroll in your app or website</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Correlation analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically highlight factors affecting funnel conversion rates</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Lifecycle insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Break down events from new, returning, resurrecting, and dormant users</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stickiness insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how many times users perform an event in a period of time</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Formulas</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use custom formulas to create unique insights</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SQL access</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Write your own queries in SQL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Toolbar</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">View insights on your live website or app with an overlay</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="platform">Platform</h3><p>When you choose PostHog, you get more than analytics.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Google Analytics</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track events and conversion, analyze user behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product, diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely, toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Run tests on new features, optimize conversion funnels</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collect and analyze feedback, run NPS and PMF surveys </p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer data platform</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync data with third-party tools</p></td><td class="text-center">Beta</td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data warehouse</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">A single source for all your important data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Notebooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ad-hoc analysis and collaboration</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dark mode</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Choose between light and dark UI</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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/airbyte-export">data pipeline</a> and <a href="/docs/data-warehouse/setup">warehouse docs</a> for a complete list of integrations.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Google Analytics</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stripe</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import charges, customers, invoices, subscriptions, and more</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zapier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Trigger Zaps with events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import contacts, companies, deals, and more</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Salesforce</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Intercom</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Extract and load data to external platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer.io</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync data between platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentry</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest Sentry errors for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Ads</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track Google Ads ROI</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Search Console</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Seamlessly import data from your search console</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google BigQuery</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically export data to BigQuery</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="security-and-compliance">Security and compliance</h3><p>PostHog makes GDPR compliance easy by letting you choose where your data is hosted: EU or US. 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.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Google Analytics</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>EU hosting available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data anonymization</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Security certification</strong></p></td><td class="text-center">SOC 2 Type II</td><td class="text-center">ISO 27001</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Role-based access control</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SAML/SSO available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>2FA available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h2 id="frequently-asked-questions">Frequently asked questions</h2><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 different terminology. Here’s a quick comparison of the two:</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 API key</td><td>The unique identifier for your project, used to send data to your PostHog instance.</td></tr></tbody></table></div><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="how-much-do-posthog-and-google-analytics-cost">How much do PostHog and Google Analytics cost?</h3><p><a href="/blog/google-analytics-cost">Google Analytics</a> has a free tier that&#x27;s sufficient for most startups. Larger enterprises with higher data collection and export requirements will need to upgrade to GA360, which <em>starts</em> at $50,000 per year.</p><p>A good rule of thumb is that if you&#x27;re exporting more than 1 million events per day, or querying data with more than 10 million events, you&#x27;ll need to upgrade to GA360. See Google&#x27;s <a href="https://support.google.com/analytics/answer/11202874">breakdown</a> for more.</p><p>PostHog has transparent pricing based on the usage. It&#x27;s free to get started and completely free for the first 1 million analytics events. After this free monthly allowance you&#x27;re charged based on usage – we charge progressively less per event the more you use.</p><p>We recommend trying <a href="/pricing">our pricing calculator</a> to estimate your costs.</p><h3 id="does-posthog-offer-a-free-trial">Does PostHog offer a free trial?</h3><p>With PostHog, it&#x27;s free to get started, with a generous monthly allowance of events, replays, and feature flag requests. If you’re within this allowance, PostHog is free to use forever.</p><h3 id="can-i-migrate-from-google-analytics-to-posthog">Can I migrate from Google Analytics to PostHog?</h3><p>Yes, see our <a href="/docs/migrate/google-analytics">Google Analytics to PostHog migration guide</a> for more details.</p><h3 id="does-posthog-block-bots-by-default">Does PostHog block bots by default?</h3><p>Yes. See the <a href="/docs/product-analytics/troubleshooting#does-posthog-block-bots-by-default">full blocklist in our docs</a>.</p><h3 id="what-about-ad-blockers">What about ad blockers?</h3><p>We recommend all users deploy a reverse proxy, which enables you send events to PostHog Cloud using your own domain.</p><p>Events sent from your own domain and are less likely to be intercepted by tracking blockers, ensuring you capture the best data possible. We have <a href="/docs/advanced/proxy">reverse proxy setup guides</a> for AWS Cloudfront, Caddy, Cloudflare, Netlify, Vercel, and more, in our docs.</p><h3 id="are-there-discounts-for-non-profits-and-startups">Are there discounts for non-profits and startups?</h3><p>Yes, PostHog offers both. Non-profit organizations can contact our team and are usually eligible for a 50% discount, while startups can sign up for $50,000 of free credit (and a host of other perks) in the <a href="/startups">PostHog for Startups program</a>.</p>]]></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">1b9d0915-f411-5fc7-821c-55b99a72faf0</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><div people="Marius Andra,Anirudh Pillai"></div><p>What’s cooler than having your <a href="/docs/hogql">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><div people="James Greenhill,Zach Waterfield,Michael Matloka,Brett Hoerner"></div><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><div people="Paul D&#x27;Ambra,Tom Owers,Ted Kaemming"></div><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><div people="Charles Cook,Eric Duong,James Hawkins,James Temperton"></div><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><div people="Cory Watilo,Andy Vandervell,Fraser Hopper"></div><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><div people="Dylan Martin,Tiina Turban,Marcus Hof,Neil Kakkar"></div><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><div></div><h2 id="the-referral-scheme">The referral scheme</h2><div people="Ben White,Raquel Smith,Joe Martin"></div><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><div people="Frank Hamand,David Newell,Steven Shults"></div><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><div people="Ian Vanagas,Juraj Majerik,Lior Neu-ner"></div><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><div people="Annika Schmid,Simon Fisher,Mine Kansu"></div><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><div people="Sandy Spicer,Tim Glaser"></div><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="https://posthog.com/changelog/2024#hedgehog-mode-2.0-launched">Hedgehog mode 2.0</a>, which also shipped recently.</p><h2 id="cli">CLI</h2><div people="Manoel Aranda Neto,Daniel Esneider Jaramillo"></div><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><div people="Coua Phang,Kendal Hall"></div><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><div people="Lior Neu-ner,Annika Schmid,Mine Kansu"></div><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><div></div>]]></content:encoded></item><item><title><![CDATA[The 7 best HIPAA-compliant analytics tools]]></title><description><![CDATA[What is HIPAA? Passed in 1996, HIPAA (Health Insurance Portability and Accountability Act) defines the legal requirements for securing and handling…]]></description><link>https://posthog.com/blog/best-hipaa-compliant-analytics-tools</link><guid isPermaLink="false">f76ab408-d4f5-56d3-8fec-9e786f00cabf</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/hipaa-compliant-ab-testing/hipaa.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<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>Self-host your analytics, 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 Google Analytics, 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><h4 id="overview">Overview</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>Customer data platform:</strong> <span class="text-green text-lg">✔</span></li></ul><p><a href="https://posthog.com/">PostHog</a> is an open-source platform that combines product analytics, web analytics, session replay, feature flags, A/B testing, and user surveys into one platform. 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 individual 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, 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></ul><p>A BAA is available on PostHog&#x27;s <a href="/pricing">Teams plan</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><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><h4 id="overview-1">Overview</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-red text-lg">✖</span></li><li><strong>Feature flags:</strong> <span class="text-red text-lg">✖</span></li><li><strong>A/B testing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Surveys:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Customer data platform:</strong> <span class="text-red text-lg">✖</span></li></ul><p><a href="https://mixpanel.com/">Mixpanel</a> is a pure product analytics tool for analyzing user funnels and behavior. It doesn&#x27;t offer built-in tools for things like session replay, feature management, A/B testing, or user surveys, but it does have extensive integrations with third-party tools for these. </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></ul><p>A BAA is available on Mixpanel&#x27;s Growth plan, which starts at $20 per month for 10,000 events. You&#x27;ll need to sign separate BAAs with any other analytics you wish to integrate with Mixpanel.</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><h4 id="overview-2">Overview</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-red text-lg">✖</span></li><li><strong>Feature flags:</strong> <span class="text-red 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>Customer data platform:</strong> <span class="text-red text-lg">✖</span></li></ul><p><a href="https://countly.com">Countly</a> 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 self-host your analytics.</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><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-red text-lg">✖</span></li><li><strong>A/B testing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Surveys:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Customer data platform:</strong> <span class="text-green text-lg">✔</span></li></ul><h4 id="overview-3">Overview</h4><p><a href="https://www.freshpaint.io/">Freshpaint</a> 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 Google Analytics, 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></ul><p>Freshpaint is a cloud-only product specifically designed for healthcare companies, so offers a BAA for HIPAA compliance.</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><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-red text-lg">✖</span></li><li><strong>Feature flags:</strong> <span class="text-red text-lg">✖</span></li><li><strong>A/B testing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Surveys:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Customer data platform:</strong> <span class="text-green text-lg">✔</span></li></ul><h4 id="overview-4">Overview</h4><p>Piwik PRO 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></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><h4 id="overview-5">Overview</h4><ul><li><strong>Product analytics:</strong> <span class="text-green 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-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-red text-lg">✖</span></li><li><strong>Customer data platform:</strong> <span class="text-green text-lg">✔</span></li></ul><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, and A/B testing. 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></ul><p>Amplitude offers a BAA, but doesn&#x27;t stipulate the minimum terms for signing one on its website. 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><h3 id="7-heap">7. Heap</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/best-amplitude-alternatives/heap.png" alt="heap"/></p><ul><li><strong>Product analytics:</strong> <span class="text-green 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-green text-lg">✔</span></li><li><strong>Feature flags:</strong> <span class="text-red text-lg">✖</span></li><li><strong>A/B testing:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Surveys:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Customer data platform:</strong> <span class="text-red text-lg">✖</span></li></ul><h4 id="overview-6">Overview</h4><p><a href="https://heap.io">Heap</a> is a product analytics tool that, like PostHog, Mixpanel and Amplitude, helps you understand user behavior using trends and funnel analysis. It also offers a basic session replay tool. Like Amplitude, it caters more to non-technical users, such as marketing and e-commerce teams focused on optimizing conversions.</p><h4 id="heap-and-hipaa-compliance">Heap 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></ul><p>Heap offers a BAA, but only on its Pro and Premier plans, not on its self-serve Growth plan. It&#x27;s not available as a self-hosted product.</p><p><strong>See also:</strong> <a href="/blog/best-heap-alternatives">The most popular Heap alternatives</a></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 analytics 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-analytics-better-than-signing-a-baa">Is self-hosting analytics 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 analytics 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><div></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">66cb3e40-8aca-5a11-9913-af2a56d6b0d9</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 data warehouse.</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 Teams plan, which starts at $450 and includes <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>LaunchDarkly 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><div></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 Marketers believe onboarding emails are a powerful tool for driving engagement…]]></description><link>https://posthog.com/blog/how-we-built-email-onboarding</link><guid isPermaLink="false">2dc8cd8b-4e22-5d20-ac4c-e1cff3ddde86</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</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 5 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><div>The first map we did of what our email onboarding flow looked like</div><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><div>Onboarding 2.0 added more checks to try and validate ingestion and three simple introductory emails</div><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><div>New emails for 3.0 tried to emphasize what was possible with PostHog, directing users to helpful blog content</div><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><div>Onboarding 3.1 was when we really started tailoring emails based on what we knew about users</div><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="https://posthog.com/community/profiles/227">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><div>Onboarding 4.0 split high-ICP users out into their own email flow because our CS team would reach out directly</div><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 <a href="/teams/customer-success">our customer success team</a> 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><div>Onboarding 5.0: Messy, complex, and highly personalized to user interests</div><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-current-one">Onboarding 6.0: The current one</h2><p>The next <a href="https://github.com/PostHog/meta/issues/212">(and current) version</a> is 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><div>Onboarding 6.0: Simpler. Better. Funnier.</div><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="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="https://posthog.com/community/profiles/227">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><div></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">4d11ad67-c58e-5efa-96dd-55b9c34845f2</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>]]></content:encoded></item><item><title><![CDATA[In-depth: PostHog vs LogRocket]]></title><description><![CDATA[Wnat 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">1d90e85e-efa9-5575-9987-3d6dc260ae11</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 11 Jan 2024 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>Wnat 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 detects and solve issues.</p></li><li><p><strong>PostHog</strong> goes beyond just frontend monitoring by integrating powerful analytics, session replay, feature management, A/B testing tools 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>LogRocket is a narrow tool. It does one thing – and it does it well. PostHog includes many of the same tools, such as session replay, error tracking, and console logs, but augments them with powerful product and data tools, such as product analytics, feature flags, A/B testing, and surveys. 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-open-source-and-transparent">2. PostHog is open source and transparent</h3><p>PostHog is built with transparency at its core. Not only do we work in the open and give full access to <a href="https://github.com/PostHog/posthog">our source code</a>, we also enable developers to <a href="/docs/apps/build">build their own integrations</a>, open their own PRs, or give feedback on <a href="/roadmap">our roadmap</a>. PostHog&#x27;s open app framework makes it easy to integrate internal tools, an advantage closed-source products like LogRocket can&#x27;t offer.</p><h3 id="3-posthog-constantly-ships-new-features">3. PostHog constantly ships new features</h3><p>We ship weirdly fast. We update <a href="/changlog">our changelog</a> every week and often there’s even more features in beta testing. And that’s without counting all the apps and integrations submitted by our community! We work hard to keep PostHog on the cutting edge and we’re transparent about the ways we do that.</p><h2 id="comparing-posthog-and-logrocket">Comparing PostHog and LogRocket</h2><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track events and conversion; analyze user behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregate traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Experiments</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze impact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track where users click</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Event pipelines</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Push and pull data to enrich customer profiles</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own apps and contribute code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><ul><li><p><strong>Feature flags:</strong> PostHog offers robust, multivariate feature flags which support JSON payloads. This enables you to push real-time changes to your product without needing to redeploy. Visit <a href="/feature-flags">our feature flag page</a> for more information. LogRocket doesn’t have any in-built feature flag functions.</p></li><li><p><strong>Experiments:</strong> PostHog offers multivariate experimentation, which enables you to test changes and discover statistically relevant insights. Visit <a href="/experiments">the experimentation page</a> for more information. LogRocket doesn’t have any in-built experimentation features.</p></li></ul><h3 id="product-analytics">Product analytics</h3><p>While LogRocket offers some product analytics features, it isn’t primarily intended as an analytics platform and lacks many things product managers and engineers require. PostHog is a more capable product analytics platform, offering advanced features such as correlation analysis, custom formulas, and a flexible SQL query editor.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Graphs and trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build custom insights and visualizations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine insights into shareable dashboards</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand conversion between events, pages</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine users based on properties and events for group analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User paths</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track user flows and where they drop-off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Analyze user and revenue retention</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>UTM tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track marketing campaigns with UTM tags</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Correlation analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Suggested events and properties that lead to success or failure</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand how organizations use your product</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Formulas</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use custom formulas to calculate unique insights</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SQL query editor</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Write your own queries in SQL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><ul><li><strong>Correlation analysis:</strong> This feature enables you to <a href="/manual/correlation">automatically find correlated events or properties</a> which affect the conversion rate of users within a funnel. LogRocket doesn’t offer any such automated correlation discovery, meaning users must search for correlating factors manually and without assistance.</li></ul><blockquote><p><strong>Further reading:</strong> <a href="/blog/best-logrocket-alternatives">Comparing the most popular LogRocket alternatives</a></p></blockquote><h3 id="session-replay">Session replay</h3><p>LogRocket and PostHog both offer robust, full-featured <a href="/blog/best-open-source-session-replay-tools">session replay tools</a> that outperform even dedicated tools, such as Hotjar.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web app recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture recordings from single-page apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Mobile app recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture recordings in iOS and Android apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Identity detection</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Link recordings to user IDs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Console logs</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture extra content from a users’ browser environment</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Playlists</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sort recordings into static and dynamic playlists</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Performance monitoring</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track network events within a session</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Privacy masking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Censor personal information from playback</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Conditional recording</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only capture the sessions you want</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Export recordings</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Take recordings in/out of the platform</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><ul><li><strong>Mobile app recordings:</strong> Session replay for mobile apps is currently under development – see <a href="https://github.com/PostHog/posthog/issues/13267">our GitHub mega issue</a> for more.</li></ul><h3 id="heatmaps-and-click-tracking">Heatmaps and click tracking</h3><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize cursor movements on a page</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Clickmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users click on a page</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scrollmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize how far down a page users scroll</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="tracking--sdks">Tracking &amp; SDKs</h3><p><strong>Tl;dr:</strong> Both support a broad range of tracking options and libraries, and manual event instrumentation, as well as autocapture.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Event tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track manually instrumented events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically track events without instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Combined events</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track related events as a single trackable action or behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Reverse proxy available</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events from your own domain to capture more data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cross-domain tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track users across domains and sub-domains</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Server-side tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events from your server</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Capture API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events through an API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="library-support">Library support</h3><p>PostHog supports a wide range of client and server libraries, but not all features are equally available across all of them. We recommend using PostHog&#x27;s JavaScript snippet to enjoy all our features. See <a href="/docs/getting-started/install?tab=snippet">our client library documentation</a> for more information.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>JavaScript</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>React Native</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>React</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Flutter</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>iOS</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Android</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Ruby</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="data-pipelines">Data pipelines</h3><p><a href="/cdp">PostHog offers more than 50 integrations and apps</a>, while <a href="https://logrocket.com/features/integrations">LogRocket offers slightly fewer</a>. As an open-source application, PostHog welcomes contributions from the community. If an integration you need isn’t available, <a href="/docs/apps/build">it’s possible to create it</a>!</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Export API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data via API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Import API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Import data via API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Amazon Redshift</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Redshift</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Amazon S3</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to S3 bucket</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Azure Blob Storage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Microsoft Azure</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Cloud Storage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to GCS</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Snowflake</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Snowflake database</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>BigQuery</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Google BigQuery for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>RudderStack</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Airbyte</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Extract and load data to external platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="popular-integrations">Popular integrations</h3><p>Below, we&#x27;ve listed a few of the most popular integrations used across PostHog and LogRocket. See our <a href="/cdp">app directory</a> for a full list.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>LogRocket</strong></td><td class="text-center"><strong>PostHog</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Salesforce</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zapier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export events for use in Zaps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stripe</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync customer and invoice data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Intercom</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Extract and load data to external platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer.io</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync data between platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentry</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest Sentry errors for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Segment</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest events from Segment</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="compliance">Compliance</h3><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>LogRocket</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>GDPR ready</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA ready</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Self-host only</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data anonymization</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cookie-less tracking option</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SOC 2 certified</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SAML/SSO available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>2FA available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h2 id="frequently-asked-questions">Frequently asked questions</h2><p>Got another question? You can <a href="/questions">ask the PostHog team anything you want</a>!</p><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog has transparent pricing based on usage with a generous free tier:</p><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</strong></td><td>1 million API requests</td></tr><tr><td><strong>A/B testing</strong></td><td>1 million API requests</td></tr><tr><td><strong>Surveys</strong></td><td>250 responses</td></tr></tbody></table><p>We charge progressively less the more you use once you exceed your monthly free allowance. Volume, non-profit and <a href="/startups">startup discounts</a> are also available. </p><h3 id="how-can-i-estimate-my-usage">How can I estimate my usage?</h3><p>The easiest way is to <a href="https://us.posthog.com/signup">sign up to PostHog</a>, integrate our snippet, then check the projection on your billing page after a few days. Alternatively, you can guesstimate by multiplying your current monthly active users by an estimate of events generated per user – 50 to 100 per user is a good starting point. See <a href="/docs/billing/estimating-usage-costs">Estimating usage &amp; costs</a> in our docs for more.</p><h3 id="does-posthog-block-bots-by-default">Does PostHog block bots by default?</h3><p>Yes. See the <a href="/docs/product-analytics/troubleshooting#does-posthog-block-bots-by-default">full blocklist in our docs</a>.</p><h3 id="what-about-ad-blockers">What about ad blockers?</h3><p>We recommend all users deploy a reverse proxy, which enables you 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. We have <a href="/docs/advanced/proxy">reverse proxy setup guides</a> for AWS Cloudfront, Caddy, Cloudflare, Netlify, Vercel, and more, in our docs.</p><h3 id="can-i-use-posthog-with-a-cdp-segment-rudderstack-etc">Can I use PostHog with a CDP? (Segment, Rudderstack, etc.)</h3><p>Yes. See <a href="/docs/advanced/cdp">Using PostHog with a CDP</a> in our docs.</p>]]></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">67bf8d9a-56f0-5399-bd65-2a512f3b0e32</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><div></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">370c3d43-3677-58d6-95f2-6560bc306aaf</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Mon, 11 Dec 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>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="the-best-open-source-feature-flag-tools">The best open-source feature flag tools</h2><blockquote><p><strong>Changelog:</strong></p><ul><li><strong>Mar 15, 2023:</strong> Removed DevCycle, added Flipt. Updated copy and screenshots.</li><li><strong>Sep 14, 2023:</strong> Removed Harness, added Flipper and FeatBit, added SDKs</li><li><strong>Dec 11, 2023:</strong> Added FeatureHub</li></ul></blockquote><h3 id="1-posthog">1. PostHog</h3><ul><li><strong>License:</strong> MIT</li><li><strong>GitHub stars:</strong> 14.8k</li><li><a href="https://github.com/PostHog/posthog">PostHog on GitHub</a></li></ul><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/feature-flags.png" alt="PostHog"/></p><h4 id="what-is-posthog">What is PostHog?</h4><p><a href="https://posthog.com">PostHog</a> is 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>It&#x27;s an all-in-one platform, which means it offers product analytics, session replay, A/B testing, and user surveys, in addition to feature flags.</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><h4 id="supported-libraries">Supported libraries</h4><ul><li><p><strong>Client-side:</strong> JavaScript, React Native, React, Android, iOS, Flutter, Remix, Angular, Next.js, Svelte.</p></li><li><p><strong>Server-side:</strong> Node.js, Python, PHP, Ruby, Go.</p></li></ul><p>You can also evaluate feature flags using PostHog&#x27;s API from any language that can make HTTP requests.</p><h4 id="how-much-does-it-cost">How much does it cost?</h4><p>There are no limits on feature flag usage in the open-source edition, though A/B testing isn&#x27;t available. PostHog&#x27;s Cloud edition includes 1 million API requests per month for free – see the <a href="/feature-flags#pricing">feature flag pricing page</a> for more info.</p><h3 id="2-unleash">2. Unleash</h3><ul><li><strong>License:</strong> Apache</li><li><strong>GitHub stars:</strong> 9k</li><li><a href="https://github.com/Unleash/unleash">Unleash on GitHub</a></li></ul><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><h4 id="what-is-unleash">What is Unleash?</h4><p><a href="https://www.getunleash.io/">Unleash</a> is open-source feature 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><h4 id="supported-sdks">Supported SDKs</h4><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-1">How much does it cost?</h3><p>Unleash is free for two environments when you self-host. A managed version is also available at cost if you want to add team members or access additional features like advanced segmentation or custom activation strategies.</p><h3 id="3-growthbook">3. GrowthBook</h3><ul><li><strong>License:</strong> MIT</li><li><strong>GitHub stars:</strong> 5.2k</li><li><a href="https://github.com/growthbook/growthbook/">GrowthBook on GitHub</a></li></ul><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><h4 id="what-is-growthbook">What is GrowthBook?</h4><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><h4 id="supported-sdks-1">Supported SDKs</h4><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><h4 id="how-much-does-it-cost-2">How much does it cost?</h4><p>Growthbook’s open source self-hosted plan is free forever, with unlimited flags and experiments. <a href="/blog/best-growthbook-alternatives">GrowthBook</a> also offers a hosted version with pricing based on the number of users.</p><h3 id="4-flagsmith">4. Flagsmith</h3><ul><li><strong>License:</strong> BSD 3-clause</li><li><strong>GitHub stars:</strong> 3.4k</li><li><a href="https://github.com/Flagsmith/flagsmith">Flagsmith on GitHub</a></li></ul><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><h4 id="what-is-flagsmith">What is Flagsmith?</h4><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><h4 id="supported-sdks-2">Supported SDKs</h4><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><h4 id="how-much-does-it-cost-3">How much does it cost?</h4><p>Flagsmith is free up to 50,000 requests per month when you choose the cloud feature flag service. In addition to open source, Flagsmith also offers self-hosted and private cloud options.</p><h3 id="5-flipt">5. Flipt</h3><ul><li><strong>License:</strong> GPL-3.0</li><li><strong>GitHub stars:</strong> 3k</li><li><a href="https://github.com/flipt-io/flipt">Flipt on GitHub</a></li></ul><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><h4 id="what-is-flipt">What is Flipt?</h4><p><a href="https://www.flipt.io/">Flipt</a> 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><h4 id="supported-sdks-3">Supported SDKs</h4><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><h4 id="how-much-does-it-cost-4">How much does it cost?</h4><p>Nothing. There is no paid version of Flipt. It&#x27;s distributed under a GPL-3.0 license.</p><h3 id="6-flipper">6. Flipper</h3><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><ul><li><strong>License:</strong> MIT</li><li><strong>GitHub stars:</strong> 3.4k</li><li><a href="https://github.com/flippercloud/flipper">Flipper on GitHub</a></li></ul><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><h4 id="supported-sdks-4">Supported SDKs</h4><p>Ruby only</p><h4 id="how-much-does-it-cost-5">How much does it cost?</h4><p>In addition to the free open-source edition, Flipper also offers a cloud-hosted version with a 14-day trial. It&#x27;s priced at $20 per seat with unlimited flags and projects.</p><h3 id="7-featbit">7. FeatBit</h3><ul><li><strong>License:</strong> MIT</li><li><strong>GitHub stars:</strong> 1.1k</li><li><a href="https://github.com/featbit/featbit">FeatBit on GitHub</a></li></ul><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><h4 id="what-is-featbit">What is FeatBit?</h4><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 Datadog, Grafana, and Amplitude.</p><h4 id="supported-sdks-5">Supported SDKs</h4><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><h3 id="how-much-does-it-cost-6">How much does it cost?</h3><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.</p><h3 id="8-featurehub">8. FeatureHub</h3><ul><li><strong>License:</strong> Apache 2.0</li><li><strong>GitHub Stars:</strong> 276</li><li><a href="https://github.com/featurehub-io">Feature Hub on GitHub</a></li></ul><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><h4 id="what-is-featurehub">What is FeatureHub?</h4><p>FeatureHub 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><h4 id="supported-sdks-6">Supported SDKs</h4><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><h4 id="how-much-does-it-cost-7">How much does it cost?</h4><p>FeatureHub offers a hosted option in addition to its open-source edition, though both version offer the same features. The hosted version is $4.99 per user, per month and ~$0.33-0.38 per 10,000 API requests.</p><h2 id="further-reading">Further reading</h2><ul><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></ul>]]></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">d6decab8-9e08-5ab3-93a4-c0a3894828b5</guid><dc:creator><![CDATA[Lior Neu-ner]]></dc:creator><pubDate>Mon, 04 Dec 2023 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. In this guide, we’ll explore these options so that you can decide which is best for you.</p><h2 id="1-posthog">1. PostHog</h2><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><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/screenshots/ab-testing.png" alt="posthog"/></p><h3 id="what-is-posthog">What is PostHog?</h3><p><a href="https://posthog.com">PostHog</a> (that&#x27;s us!) is an all-in-one platform built to help engineers create better products. It includes A/B testing <strong>and</strong> 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>, and <a href="/survey">surveys</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><h3 id="which-platforms-does-posthog-support">Which platforms does PostHog support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></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 the usage. It’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>While PostHog is open source, its A/B testing features aren&#x27;t included in the open source release.</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>.</p></blockquote><h2 id="2-vwo">2. VWO</h2><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-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><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 product analytics, so you don&#x27;t need a separate platform or integration to link your analytics data to your A/B test results.</p><h3 id="which-platforms-does-vwo-support">Which platforms does VWO support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="how-much-does-vwo-cost">How much does VWO cost?</h3><p>VWO mobile app A/B tests starts at $1,526 per month for up to 10k users. This is billed annually, so it means an upfront cost of $18,312. Also note that this price is only for mobile A/B tests. If you want to include analytics in your package, prices start at an additional $15,936 per year.</p><p>Lastly, if you also want to run server-side tests, you also need to purchases a separate package. Prices for this start at $28,164 per year.</p><h2 id="3-optimizely">3. Optimizely</h2><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><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><h3 id="which-platforms-does-optimizely-support">Which platforms does Optimizely support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="how-much-does-optimizely-cost">How much does Optimizely cost?</h3><p>Optimizely&#x27;s pricing is sales-driven and completely opaque, so it&#x27;s not clear how much it costs. However, according to <a href="https://splitbase.com/blog/optimizely-pricing">Splitbase</a>, Optimizely will cost you at least $36,000 per year.</p><h2 id="4-firebase">4. Firebase</h2><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><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><a href="https://firebase.google.com/products/ab-testing">Firebase A/B testing</a> 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 <a href="https://firebase.google.com/products/cloud-messaging">cloud messaging</a> and <a href="https://firebase.google.com/products/in-app-messaging">in-app messaging</a>. </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><h3 id="which-platforms-does-firebase-support">Which platforms does Firebase support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Web:</strong> <span class="text-red text-lg">✖</span></li><li><strong>Server:</strong> <span class="text-red text-lg">✖</span></li></ul><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><h2 id="5-kameleoon">5. Kameleoon</h2><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><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><a href="https://www.kameleoon.com/">Kameleoon</a> is built specifically for 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><h3 id="which-platforms-does-kameleoon-support">Which platforms does Kameleoon support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="how-much-does-kameleoon-cost">How much does Kameleoon cost?</h3><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">state</a> pricing starts at $35,000 per year and scales based on traffic volume.</p><h2 id="6-statsig">6. Statsig</h2><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> Partial</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><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 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><h3 id="which-platforms-does-statsig-support">Which platforms does Statsig support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="how-much-does-statsig-cost">How much does Statsig cost?</h3><p>Statsig has a free tier with an allowance of 1 million events. After that, you&#x27;ll pay $150 per month for up to 5 million events and $50 for every 1 million events thereafter. They also offer enterprise discounts for large volume customers.</p><h2 id="7-launchdarkly">7. LaunchDarkly</h2><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> 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><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><h3 id="which-platforms-does-launchdarkly-support">Which platforms does LaunchDarkly support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></li></ul><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><h2 id="8-taplytics">8. Taplytics</h2><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><li><strong>Best for:</strong> Product and 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/taplytics.jpeg" alt="Taplytics mobile app A/B tests"/></p><h3 id="what-is-taplytics">What is Taplytics?</h3><p><a href="https://taplytics.com/">Taplytics</a> is an A/B testing platform focusing on mobile. Its no-code experiment builder makes it easy for non-technical users to create and run A/B tests.</p><h3 id="which-platforms-does-taplytics-support">Which platforms does Taplytics support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-red text-lg">✖</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></li></ul><h3 id="how-much-does-taplytics-cost">How much does Taplytics cost?</h3><p>Taplytics don&#x27;t share their pricing publicly, so it&#x27;s not clear how much it costs. You need to talk to sales first.</p><h2 id="9-apptimize">9. Apptimize</h2><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><li><strong>Best for:</strong> Product teams in large enterprisess</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>Similar to Taplytics, <a href="https://apptimize.com/">Apptimize</a> focsuses on A/B tests on mobile. It doesn&#x27;t have a no-code builder like Taplytics has, which makes it less user friendly for non-technical users.</p><h3 id="which-platforms-does-apptimize-support">Which platforms does Apptimize support?</h3><ul><li><strong>iOS:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Android:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Flutter:</strong> <span class="text-green text-lg">✔</span></li><li><strong>React Native:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Web:</strong> <span class="text-green text-lg">✔</span></li><li><strong>Server:</strong> <span class="text-green text-lg">✔</span></li></ul><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><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>Check out <a href="/product-analytics">our product pages</a> and <a href="/docs">read our docs</a> to learn more.</p></blockquote><div></div><h2 id="further-reading">Further reading</h2><ul><li><a href="/blog/best-open-source-ab-testing-tools">The 6 best free and open-source A/B testing tools</a></li><li><a href="/blog/best-mobile-app-session-replay-tools">7 best session replay tools for mobile apps (iOS &amp; Android)</a></li><li><a href="/blog/best-mobile-app-analytics-tools">The 7 best mobile app analytics tools</a></li></ul>]]></content:encoded></item><item><title><![CDATA[The 12 best open source analytics tools you can self-host]]></title><description><![CDATA[What are the criteria for this guide? This guide only includes open-source analytics tools that: Enable users to visualize and analyze behavioral data…]]></description><link>https://posthog.com/blog/best-open-source-analytics-tools</link><guid isPermaLink="false">07e28f17-d4dc-561b-895e-bba57684c4ab</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 22 Nov 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[<h2 id="what-are-the-criteria-for-this-guide">What are the criteria for this guide?</h2><p>This guide only includes open-source analytics tools that:</p><ol><li><p><strong>Enable users to visualize and analyze behavioral data for products or websites.</strong> This includes tools that actively capture data as well as dashboarding tools that connect to existing data sources, but not data pipeline platforms like Snowplow or Rudderstack. </p></li><li><p><strong>Are actively developed or maintained by a company or community.</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 self-hostable.</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><h2 id="who-maintains-this-guide">Who maintains this guide?</h2><p>This guide is maintained by <a href="https://posthog.com/">PostHog</a>, an open-source analytics 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>. We update the guide ~3 times per year.</p><p>We maintain separate guides on <a href="/blog/best-open-source-feature-flag-tools">open-source feature flag tools</a> and <a href="/blog/best-open-source-ab-testing-tools">open-source AB testing products</a>.</p><blockquote><p><strong>Changelog</strong> </p><ul><li><strong>Mar 14, 2022:</strong> Added Umami; updates to copy and screenshots</li><li><strong>Jun 16, 2022:</strong> Added Fathom Lite, GrowthBook, OpenReplay</li><li><strong>Aug 24, 2022:</strong> Removed Fathom Lite (dormant), 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 (dormant)</li></ul></blockquote><h2 id="the-best-open-source-analytics-tools">The best open source 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><ul><li><strong>GitHub Stars:</strong> 14.4k</li><li><strong>Category:</strong> Product and website analytics</li><li><strong>Alternative to:</strong> <a href="/blog/best-mixpanel-alternatives">Mixpanel</a>, <a href="/blog/best-amplitude-alternatives">Amplitude</a>, <a href="/blog/best-hotjar-alternatives">Hotjar</a>, <a href="/blog/best-fullstory-alternatives">FullStory</a>, <a href="/blog/best-launchdarkly-alternatives">LaunchDarkly</a></li><li><strong>Language(s):</strong> TypeScript (53%) and Python (42%)</li><li><a href="https://github.com/PostHog/posthog">PostHog on GitHub</a></li></ul><h4 id="what-is-posthog">What is PostHog?</h4><p><a href="https://posthog.com/">PostHog</a> is an all-in-one platform designed to give engineers and product managers a complete view of user behavior. It&#x27;s built on the highly-scalable ClickHouse OLAP database.</p><p>Features include a comprehensive product analytics suite (e.g. trend analysis, dashboards, funnels, path analysis, retention tracking etc.), feature flags for feature control, experimentation (A/B and <a href="/product-engineers/what-is-multivariate-testing-examples">multivariate testing</a>), session recording, heatmaps and <a href="/product">more</a>.</p><p>It’s entirely self-serve, with the ability to autocapture event information out of the box. PostHog can also be self-hosted on your existing infrastructure using Docker Compose, making it ideal if you don&#x27;t want to share data with third parties. </p><p>It&#x27;s a good option if you&#x27;re after an <a href="/blog/best-open-source-session-replay-tools">open-source session recording tool</a>, too. </p><h4 id="who-is-posthog-for">Who is PostHog for?</h4><p>PostHog is useful for engineering, data science, and product teams. As an all-in-one platform, it can replace multiple tools (e.g. Mixpanel, LaunchDarkly, Hotjar) so you can simplify your tech stack. <a href="/customers">PostHog customers</a> include the likes of <a href="/customers/hasura">Hasura</a>, <a href="/customers/netdata">Netdata</a>, and <a href="/customers/phantom">Phantom</a>.  </p><h4 id="strengths">Strengths</h4><ul><li>All-in-one analytics suite</li><li>Easy-to-use, no SQL required</li><li>Self-hosting and cloud-hosting available</li><li>Feature flags for safely deploying changes</li><li>Multivariate experimentation suite for testing ideas</li><li>Session recording for gathering insights</li><li>Event pipelines to integrate with data warehouses</li><li>Built on the ultra-fast ClickHouse OLAP database</li></ul><h4 id="license-and-monetization">License and monetization</h4><p><a href="https://github.com/PostHog/posthog">PostHog Open Source</a> is free to use for life and distributed under an MIT license. The open-source version includes the core product analytics, feature flag, and session recording features, but has a one project limit. There&#x27;s also a <a href="https://github.com/PostHog/posthog-foss">FOSS edition</a> that removes all proprietary code. </p><p>Subscribing to PostHog Cloud removes the project limit and adds numerous paid-only features, including experimentation, correlation analysis, group analytics for tracking organizations, and advanced cohorts. PostHog Cloud is <a href="/pricing">free up to 1 million events per month</a>.</p><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><ul><li><strong>GitHub Stars:</strong> 18.4k</li><li><strong>Category:</strong> Website analytics</li><li><strong>Alternative to:</strong> Google Analytics</li><li><strong>Languages:</strong> PHP (78%), JavaScript (8.1%)</li><li><a href="https://github.com/matomo-org/matomo">Matomo on GitHub</a></li></ul><h4 id="what-is-matomo">What is Matomo?</h4><p><a href="/blog/posthog-vs-matomo">Matomo</a> is an open-source platform for website analytics. It&#x27;s one of the most popular open-source <a href="/blog/ga4-alternatives">alternatives to Google Analytics 4</a> for website owners and marketing teams. It even offers a data import tool for Google Analytics, so you can bring your data with you. You can run it on-premise or use Matomo&#x27;s own cloud hosting service.</p><h4 id="who-is-matomo-for">Who is Matomo for?</h4><p><a href="/blog/best-matomo-alternatives">Matomo</a> is intended for marketing and website teams looking to track content performance and marketing attribution. It&#x27;s suitable for both SMBs and enterprises – the European Union runs a version of Matomo on all its websites.</p><h4 id="strengths-1">Strengths</h4><ul><li>Google Analytics data importer</li><li>Easy to set up on WordPress and WooCommerce</li><li>Marketing metrics and attribution</li><li>Integrations with popular off-the-shelf CMS</li><li>Built-in GDPR and tag managers</li></ul><h4 id="open-source-license-and-monetization">Open source license and monetization</h4><p>Matomo on-premise is available under a AGPLv3 license. It includes Matomo&#x27;s core web analytics reports, such as ecommerce tracking, real-time analytics, and content tracking, and supports an unlimited number of websites and users. Numerous premium add-ons (e.g. roll-up reporting, A/B testing, cohorts, funnels etc.) are charged for on a per-user basis. Cloud hosting is also available, which is billed on hits.</p><p><strong>Related:</strong> <a href="/blog/posthog-vs-matomo">In-depth PostHog vs Matomo comparison</a></p><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 - open source analytics tools"/></p><ul><li><strong>GitHub Stars:</strong> 34.9k</li><li><strong>Category:</strong> Dashboarding and business intelligence</li><li><strong>Alternative to:</strong> Looker, Tableau, Power BI</li><li><strong>Languages:</strong> Clojure (49%), JavaScript (33%), TypeScript (17%)</li><li><a href="https://github.com/metabase/metabase">Metabase on Github</a></li></ul><h4 id="what-is-metabase">What is Metabase?</h4><p><a href="https://www.metabase.com/">Metabase</a> is one of the most popular open-source business intelligence (BI) tools, offering teams a way to visualize complex data and run analysis with no coding required. Instead, Metabase’s visual query builder enables you to create shareable dashboards in just a few minutes with a drag-and-drop interface — though a native SQL editor is available for advanced users.</p><h4 id="who-is-metabase-for">Who is Metabase for?</h4><p>Metabase&#x27;s drag-and-drop interface makes it accessible for technical and non-technical teams, making it an ideal platform for democratizing data analytics in organizations.</p><h4 id="strengths-2">Strengths</h4><ul><li>Easy-to-use, no SQL required</li><li>Automated reports and interactive dashboards</li><li>Self-hosting and cloud-hosting available</li><li>Integrate with 20+ data sources</li></ul><h4 id="license-and-monetization-1">License and monetization</h4><p>Metabase is available under a AGPL license. A limited version of the product is available for free, while an Enterprise license is available for a cost. Check <a href="https://github.com/metabase/metabase">the Metabase repo</a> for more information.</p><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><ul><li><strong>GitHub Stars:</strong> 16.8k</li><li><strong>Category:</strong> Website analytics</li><li><strong>Alternative to:</strong> Google Analytics</li><li><strong>Languages:</strong> Elixir (74%), JavaScript (14%)</li><li><a href="https://github.com/plausible/analytics/">Plausible on Github</a></li></ul><h4 id="what-is-plausible-analytics">What is Plausible Analytics?</h4><p><a href="/blog/posthog-vs-plausible">Plausible Analytics</a> is focused on providing website analytics that don’t infringe on user privacy. That means Plausible doesn’t rely on cookies and is naturally compliant with regulations like GDPR. </p><p>Unlike Matomo, Plausible is a very streamlined tool rather than a feature-equivalent Google Analytics alternative. As a result, it&#x27;s a great fit for smaller teams who prefer ease of use to in-depth reporting, or hobby deployments if you just want basic analytics for a website or blog.</p><h4 id="who-is-plausible-analytics-for">Who is Plausible Analytics for?</h4><p><a href="/blog/posthog-vs-plausible">Plausible</a> is intended for marketing teams and website owners who want to track top-level website metrics, such as pageviews, bounce rate and visit duration, but it&#x27;s not an ideal tool for understanding user behavior.</p><h4 id="strengths-3">Strengths</h4><ul><li>Easy to use and focused on essential web metrics</li><li>Lightweight integration script won’t impact page performance</li><li>No cookies required, GDPR compliant out of the box </li></ul><h4 id="license-and-monetization-2">License and monetization</h4><p>Plausible Analytics is available under a AGPLv3 license and can be self-hosted via Docker Compose. Pricing for its hosted version starts at €9 per month for 10,000 monthly pageviews.</p><blockquote><p><strong>Also consider:</strong> Plausible is one of a large subset of privacy-first analytics products that have proven popular in the wake of GDPR and less permissive attitudes to user tracking. <a href="https://umami.is/">Umami</a> is another popular, open-source product in this space. Read our <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR analytics guide</a> for more options.</p></blockquote><h3 id="5-grafana">5. Grafana</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/grafana-screenshot.png" alt="Grafana - open source analytics tools"/></p><ul><li><strong>GitHub Stars:</strong> 58k</li><li><strong>Category:</strong> Dashboarding and data observability</li><li><strong>Alternative to:</strong> Datadog, Dynatrace </li><li><strong>Languages:</strong> TypeScript (57%), Go (37%)</li><li><a href="https://github.com/grafana/grafana">Grafana on GitHub</a></li></ul><h4 id="what-is-grafana">What is Grafana?</h4><p><a href="https://grafana.com/products/cloud/">Grafana</a> is an open-source data observability platform. It focuses on interactive visualization, providing a wide variety of charts, graphs, and alerts that can be connected to a wide range of online data sources. As a result, it’s a powerful system for monitoring and analyzing data in real-time.  </p><h4 id="who-is-grafana-for">Who is Grafana for?</h4><p>Grafana is an ideal choice for engineering, DevOps, or data science teams in businesses of any size, including enterprises, who need to observe and monitor data.</p><h4 id="strengths-4">Strengths</h4><ul><li>Great for tracking data in real time</li><li>Multiple products allow you to scale</li><li>Get alerts when anomalous events occur</li><li>Integrates with a wide range of data sources</li></ul><h4 id="license-and-monetization-3">License and monetization</h4><p>Grafana is available to self-host under an AGPLv3 license. Grafana Cloud also has a free tier, though it&#x27;s limited to three active users and 14 days retention. Additional tiers remove those limitations.</p><h3 id="6-umami">6. 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><ul><li><strong>GitHub Stars:</strong> 16.9k</li><li><strong>Category:</strong> Website analytics</li><li><strong>Alternative to:</strong> Google Analytics, Plausible</li><li><strong>Languages:</strong> 53% JavaScript, 39% TypeScript</li><li><a href="https://github.com/umami-software/umami">Umami on GitHub</a></li></ul><h4 id="what-is-umami">What is Umami?</h4><p><a href="https://umami.is/">Umami</a> 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. On top of this, you can track basic events, such button clicks, using CSS classes or JavaScript. It also offers a free cloud hosting option.</p><h4 id="who-is-umami-for">Who is Umami for?</h4><p>Hobbyists who want basic website analytics that doesn&#x27;t collect any personal data.</p><h4 id="strengths-5">Strengths</h4><ul><li>Fast and lightweight, no impact on website performance</li><li>Doesn&#x27;t collect any personally identifiable information</li><li>Easy to self-host and configure</li></ul><h4 id="license-and-monetization-4">License and monetization</h4><p>Umami is available via an MIT license. The cloud hosted option is free up to 10k events per month, then starts at $9 per month for their &quot;Pro&quot; tier.</p><h3 id="7-openreplay">7. 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><ul><li><strong>GitHub Stars:</strong> 8.2k</li><li><strong>Category:</strong> Session replay and funnel analysis</li><li><strong>Alternative to:</strong> LogRocket, Hotjar </li><li><strong>Languages:</strong> Python (25%), TypeScript (24%), JavaScript (24%)</li><li><a href="https://github.com/openreplay/openreplay">OpenReplay on GitHub</a></li></ul><h4 id="what-is-openreplay">What is OpenReplay?</h4><p><a href="https://openreplay.com/">OpenReplay</a> is a session replay suite built for developers and privacy conscious companies. While it lacks many core analytics features, it does offer some basic analytics features such as funnel analysis.  </p><p>Its session replay feature automatically captures events, and provides useful click maps in addition to detecting rage clicks and slow loading pages. It also offers funnel analysis, performance monitoring, error tracking, and extensive integrations with other logging tools.</p><h4 id="who-is-openreplay-for">Who is OpenReplay for?</h4><p>OpenReplay is primarily for developers, especially due to its focus on error tracking and bug fixing. It&#x27;s a good option for early-stage products looking to understand user behavior and validate product-market fit.</p><h4 id="strengths-6">Strengths</h4><ul><li>Privacy-friendly</li><li>Error tracking and bug fixing features</li><li>Performance monitoring</li></ul><h4 id="license-and-monetization-5">License and monetization</h4><p>OpenReplay is available under the ELv2 license. An Enterprise version adds additional reporting features and dedicated support, but there&#x27;s no public pricing. There&#x27;s also a cloud version with pricing based on sessions.</p><h3 id="8-growthbook">8. GrowthBook</h3><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 analytics tools"/></p><ul><li><strong>GitHub Stars:</strong> 5.1k</li><li><strong>Category:</strong> Experimentation</li><li><strong>Alternative to:</strong> LaunchDarkly</li><li><strong>Languages:</strong> TypeScript (92%)</li><li><a href="https://github.com/growthbook/growthbook">GrowthBook on GitHub</a></li></ul><h4 id="what-is-growthbook">What is GrowthBook?</h4><p><a href="/blog/posthog-vs-growthbook">GrowthBook</a> is an <a href="/blog/best-open-source-ab-testing-tools">open source A/B testing</a> and feature flag tool for teams who want granular control over rolling out new features, and the ability to validate those changes through experiments. </p><p>It supports multiple development environments, each with a unique API endpoint, and its comprehensive feature flag functionality allows for targeting based on person properties.</p><p>You don&#x27;t need to import metric data into GrowthBook as it works with your data wherever it lives, be that a data warehouse or an analytics tool like Mixpanel, but it lacks any additional analytical features.</p><h4 id="who-is-growthbook-for">Who is GrowthBook for?</h4><p><a href="/blog/best-growthbook-alternatives">GrowthBook</a> is ideal for engineering teams who want flexible, instant control over what users see in their product and already have, or don&#x27;t require, a broader analytics platform.</p><h4 id="strengths-7">Strengths</h4><ul><li>Multivariate feature flags</li><li>A/B testing visual editor</li><li>Can be self-hosted</li><li>No performance impact</li></ul><h4 id="open-source-license-and-monetization-1">Open source license and monetization</h4><p>GrowthBook is distributed under an MIT license and self-hosted is supported at no cost. The cloud version is free for up to three users, and $20 per user per month thereafter. </p><h3 id="9-redash">9. Redash</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/redash.png" alt="Redash - open source analytics tools"/></p><ul><li><strong>GitHub Stars:</strong> 24.1k</li><li><strong>Category:</strong> Dashboarding and business intelligence</li><li><strong>Alternative to:</strong> Looker, Tableau, Power BI</li><li><strong>Languages:</strong> Python (41%), JavaScript (33%), TypeScript (17%)</li><li><a href="https://github.com/getredash/redash">Redash on GitHub</a></li></ul><h4 id="what-is-redash">What is Redash?</h4><p>Like Metabase, Redash is a tool for connecting to and visualizing data from a number of different sources. Unlike Metabase, you need to be fluent in SQL to get the most from it. Redash supports more data sources than Metabase by default, though how important this is will depend on your specific needs.</p><h4 id="who-is-redash-for">Who is Redash for?</h4><p>Redash is ideal for engineering and data teams who want lots of flexibility for accessing and interrogating data.</p><h4 id="strengths-8">Strengths</h4><ul><li>Powerful SQL editor</li><li>Alerts for changes in metrics</li><li>Large selection of charts and visualizations</li><li>Excellent range of natively supported data sources</li></ul><h4 id="open-source-license-and-monetization-2">Open source license and monetization</h4><p>Redash is distributed via a BSD-2-Clause license. It currently has no paid tiers or limitations.</p><h3 id="10-apache-superset">10. Apache Superset</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/superset.png" alt="superset - open source analytics tools"/></p><ul><li><strong>GitHub Stars:</strong> 55.3k</li><li><strong>Category:</strong> Dashboarding and business intelligence</li><li><strong>Alternative to:</strong> Looker, Tableau, Power BI</li><li><strong>Languages:</strong> TypeScript (37%), Python (33%), JavaScript (13%)</li><li><a href="https://github.com/apache/superset">Superset on GitHub</a></li></ul><h4 id="what-is-superset">What is Superset?</h4><p>Superset is the third 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.</p><h4 id="who-is-superset-for">Who is Superset for?</h4><p>Superset is ideal for enterprises with experienced in-house data teams. It can handle large data sets, and provides extensive permissioning systems, so you can restrict access to sensitive data.</p><h4 id="strengths-9">Strengths</h4><ul><li>Connects to a large range of SQL databases</li><li>Large and active community</li><li>Powerful web-based SQL query editor</li><li>Huge range of charting options</li><li>Deck.GL integration for advanced geographic dataviz</li></ul><h4 id="open-source-license-and-monetization-3">Open source license and monetization</h4><p>Apache Superset is distributed under an Apache-2.0 license. There are no paid features or tiers.</p><h3 id="11-countly">11. 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><ul><li><strong>GitHub Stars:</strong> 5.3k</li><li><strong>Category:</strong> Product analytics</li><li><strong>Alternative to:</strong> Mixpanel, Amplitude, LogRocket</li><li><strong>Languages:</strong> JavaScript (82%), HTML (9.4%)</li><li><a href="https://github.com/Countly/countly-server">Countly on GitHub</a></li></ul><h4 id="what-is-countly">What is Countly?</h4><p>Like PostHog, <a href="https://count.ly/">Countly</a> offers a wide range of tools to help you build better products. It has a strong focus on mobile and desktop applications, and enables you to bring together both qualitative and quantitative insights. However many features, such as dashboards, funnel analysis, and retention tracking are only available in the enterprise-level product.</p><h4 id="who-is-countly-for">Who is Countly for?</h4><p>Countly is suitable for both small teams and enterprise businesses, especially those which focus on mobile apps. The crash analytics tools make it useful for customer support and engineering teams, too. </p><h4 id="strengths-10">Strengths</h4><ul><li>Wide range of analysis tools</li><li>Focus on mobile and desktop app development</li><li>Crash analytics to diagnose bugs</li><li>Run surveys to get qualitative insights</li></ul><h4 id="open-source-license-and-monetization-4">Open source license and monetization</h4><p>Countly&#x27;s Community Edition is available under a AGPLv3 license, but it&#x27;s somewhat limited. It includes versions of its core analytics features, but customer behavior insights (e.g. retention, cohorts, funnels, user paths) are only available in the paid Enterprise Edition. Countly doesn&#x27;t provide public pricing information.</p><h3 id="12-open-web-analytics">12. Open Web Analytics</h3><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-analytics-tools/owa.png" alt="open web analytics"/></p><ul><li><strong>GitHub Stars:</strong> 2.2k</li><li><strong>Category:</strong> Website analytics</li><li><strong>Alternative to:</strong> Google Analytics</li><li><strong>Languages:</strong> 67% PHP, 23% JavaScript</li><li><a href="https://github.com/Open-Web-Analytics/Open-Web-Analytics">OWA on GitHub</a></li></ul><h4 id="what-is-open-web-analytics">What is Open Web Analytics?</h4><p><a href="https://www.openwebanalytics.com/">Open Web Analytics</a> is an entirely free, open-source alternative to Google Analytics. In addition to usual web analytics basics, it includes a basic heatmap feature, and the ability to track clicks on all DOM elements. It&#x27;s less focused on privacy than others in this list, so you can use it to track when users come back, and perform basic campaign and ecommerce tracking. </p><p>In comparative terms, it&#x27;s more advanced than Plausible and Umami, but less advanced than Matomo or PostHog, though the interface is somewhat dated. </p><h4 id="who-is-open-web-analytics-for">Who is Open Web Analytics for?</h4><p>OWA suits developers who want self-hosted analytics, but desire more tracking capabilities than privacy-focused alternatives like Plausible.</p><h4 id="strengths-11">Strengths</h4><ul><li>Simple GDPR compliance</li><li>Control over your own data</li><li>Heatmap and DOM element tracking</li><li>Basic campaign and e-commerce tracking</li></ul><h4 id="open-source-license-and-monetization-5">Open source license and monetization</h4><p>Open Web Analytics is distributed under the GPL-2.0 license. There are no paid features.</p><div></div>]]></content:encoded></item><item><title><![CDATA[The best Heap alternatives & competitors, compared]]></title><description><![CDATA[1. PostHog Founded:  2020 Similar to:  Heap, Amplitude Typical users:  Engineers and product teams Typical customers:  Mid-size B2Bs and startups…]]></description><link>https://posthog.com/blog/best-heap-alternatives</link><guid isPermaLink="false">d1ece217-2c76-5303-9ed8-dd6f25210d16</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 01 Nov 2023 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[<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="https://posthog.com/">PostHog</a> (that&#x27;s us 👋) is an <a href="/blog/best-open-source-analytics-tools">open-source analytics platform</a> that combines product analytics, session replay, feature flags, A/B testing, and user surveys 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/assemblyai">AssemblyAI</a>, <a href="/customers/hasura">Hasura</a>, <a href="/customers/vendasta">Vendasta</a>, and Airbus.</p><h3 id="key-features">Key features</h3><ul><li><p>📈 <strong>Product analytics:</strong> Funnels, user paths, retention analysis, 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> with local evaluation (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 test duration, sample size, and statistical significance.</p></li><li><p>💬 <strong>Surveys:</strong> Target surveys by event or person properties. Templates for Net Promoter Score (NPS), product-market fit (PMF) surveys, and more.</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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-serve</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free to try, no mandatory sales calls</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Visual labeling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create and tag custom events without using code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze their impact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where users click and interact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own apps and contribute code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h3 id="how-popular-is-posthog">How popular is PostHog?</h3><p>According to <a href="https://www.linkedin.com/posts/jhpacker_just-updated-the-popularity-numbers-on-my-activity-7112462135120601088-YLdh/">data compiled by Jason Packer</a>, an independent analytics consultant, PostHog is the fastest growing Heap alternative on the market.</p><p>As of July 2023, <strong>PostHog</strong> is deployed by 2,365 (0.2%) of the top 1 million websites in 2023, up +327% from 554 the previous year. <strong>Heap</strong> is deployed by 3,200 (0.3%), but only grew by 1% YoY.</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 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 is the only Heap alternative that offers product analytics with autocapture, session replay, and a visual labeling tool for creating events. This, combined with additional features like feature flags and surveys, makes it an excellent like-for-like replacement for Heap.</p></blockquote><br/><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 offers both product analytics with autocapture and session replay. It also offers session replay for mobile apps, which Heap doesn&#x27;t support.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>FullStory</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-serve</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free to try, no mandatory sales calls</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Visual labeling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create and tag custom events without using code</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze their impact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where users click and interact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-popular-is-fullstory">How popular is FullStory?</h3><p>FullStory is more popular than Heap. According to data from BuiltWith, as of January 2024, FullStory is deployed on 8,430 of the top 1 million websites in the world. Heap is used by 4,221.</p><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Glassbox</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-serve</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free to try, no mandatory sales calls</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Visual labeling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create and tag custom events without using code</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze their impact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where users click and interact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-popular-is-glassbox">How popular is Glassbox?</h3><p>According to data from <a href="https://trends.builtwith.com/analytics/GlassBox">BuiltWith</a>, Glassbox isn&#x27;t as popular as Heap. </p><p>As of January 2024, it&#x27;s deployed on just 386 of the top 1 million websites, compared to Heap&#x27;s 4,221. </p><p>That said, Glassbox&#x27;s greater focus on mobile apps isn&#x27;t reflected in these figures.</p><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><br/><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Pendo</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-serve</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free to try, no mandatory sales calls</p></td><td class="text-center">Starter plans only</td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Visual labeling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create and tag custom events without using code</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze their impact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where users click and interact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-popular-is-pendo">How popular is Pendo?</h3><p>According to <a href="https://trends.builtwith.com/analytics/Pendo">data from BuiltWith</a>, Pendo is about as popular as Heap. As of January 2024, Pendo is used by 3,711 of the top 1 million websites, compared to 4,221 that use Heap.</p><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><br/><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 most popular product analytics tools on the market. Founded in 2009, in recent years it&#x27;s deprecated additional features, such as A/B testing, to focus on product analytics alone.</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. However, Mixpanel lacks several features Heap users rely on, such as event autocapture and session replay.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Mixpanel</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-serve</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free to try, no mandatory sales calls</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Visual labeling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create and tag custom events without using code</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze their impact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where users click and interact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-popular-is-mixpanel">How popular is Mixpanel?</h3><p>According to <a href="https://www.linkedin.com/posts/jhpacker_just-updated-the-popularity-numbers-on-my-activity-7112462135120601088-YLdh/">BuiltWith data compiled by Jason Packer</a>, an independent analytics consultant, Mixpanel is more popular than Heap. As of July 2023, <strong>Mixpanel</strong> is deployed by 5,218 of the top 1 million websites in 2023. <strong>Heap</strong> is deployed by 3,200.</p><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 good option to replace Heap, but it has shortcomings. The lack of autocapture is a major drawback for Heap users reliant on that feature, and you&#x27;ll need to find another session replay tool if you want that feature.</p></blockquote><br/><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>Like Mixpanel, Amplitude lacks features Heap users rely on, such as autocapture, visual labeling, and session replay. But its analytics features are arguably a little more mature, particularly the natural language and anomaly detection features.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Amplitude</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-serve</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free to try, no mandatory sales calls</p></td><td class="text-center">Starter plans only</td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Visual labeling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create and tag custom events without using code</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze their impact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where users click and interact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-popular-is-amplitude">How popular is Amplitude?</h3><p>Amplitude is more than twice as popular than Heap, according to <a href="https://www.linkedin.com/posts/jhpacker_just-updated-the-popularity-numbers-on-my-activity-7112462135120601088-YLdh/">data compiled by Jason Packer</a>, an independent analytics consultant. </p><p>As of July 2023, Amplitude is deployed by 6,973 of the top 1 million websites in 2023. Heap is deployed by 3,200.</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 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>The case for Amplitude is very similar to the case for Mixpanel. It&#x27;s a well-established Heap alternative, but falls short of a like-for-like replacement due to is lack of autocapture and session replay.</p></blockquote><br/><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 is another tool that supports event autocapture, though confusingly Google calls this &quot;enhanced analytics&quot;. </p><p>On paper, it offers similar feature to Heap, though GA4&#x27;s product analytics are less mature than those of Heap and other more established event-based tools.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Google Analytics 4</strong></td><td class="text-center"><strong>Heap</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Self-serve</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Free to try, no mandatory sales calls</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Visual labeling</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create and tag custom events without using code</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze their impact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See where users click and interact</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="how-popular-is-ga4">How popular is GA4?</h3><p>Google Analytics remains the most-used analytics tool in the world by a large margin. </p><p>As of July 2023, <a href="https://www.linkedin.com/posts/jhpacker_just-updated-the-popularity-numbers-on-my-activity-7112462135120601088-YLdh/">30.5% of the top 1 million websites</a> run GA4 – another 35.7% were still running GA3.</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 <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><br/><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>Check out <a href="/product-analytics">our product pages</a> and <a href="/docs">read our docs</a> to learn more.</p><div></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">bd5667b3-9d49-5987-a428-3fea030e5215</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/2023#surveys-beta-released">initial beta in June</a> with open text surveys, we&#x27;ve added:</p><ul><li><strong><a href="/changelog/2023#emoji-and-number-surveys-types-released">July 25:</a></strong> Emoji and number rating survey types</li><li><strong><a href="/changelog/2023#multiple-choice-surveys-released">August 8:</a></strong> Multiple choice surveys</li><li><strong><a href="/changelog/2023#wait-periods-now-available-for-surveys">August 18:</a></strong> Wait periods and thank you messages</li><li><strong><a href="/changelog/2023#automatic-nps-scoring-added-to-surveys">September 14:</a></strong> Automatic NPS calculation</li><li><strong><a href="/changelog/2023#surveys-get-a-makeover">October 10:</a></strong> Redesign and multiple step surveys</li><li><strong><a href="/changelog/2023#survey-templates-added">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>]]></content:encoded></item><item><title><![CDATA[The most popular Mixpanel alternatives & competitors, compared]]></title><description><![CDATA[1. PostHog What is PostHog? PostHog is an open-source product that combines product analytics, session replay, feature flags, A/B testing, and user…]]></description><link>https://posthog.com/blog/best-mixpanel-alternatives</link><guid isPermaLink="false">eb32bc8e-e155-59c5-8411-630c9d0795b3</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Wed, 04 Oct 2023 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[<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 product that combines product analytics, session replay, feature flags, A/B testing, and user surveys into one platform. This means it&#x27;s not just an alternative to Mixpanel, but also Hotjar, <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>Session replays</strong> with event timelines, console logs, and network activity, and 90-day retention. Individual replays can be saved offline indefinitely.</p></li><li><p>🚩 <strong>Feature flags</strong> with local evaluation (for faster performance) and JSON payloads, so you can make changes to your product without deploying new code. </p></li><li><p>🧪 <strong>A/B tests</strong> with up to 9 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></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/assemblyai">AssemblyAI</a>, <a href="/customers/hasura">Hasura</a>, <a href="/customers/vendasta">Vendasta</a>, and Airbus.</p><h3 id="how-does-posthog-compare-to-mixpanel">How does PostHog compare to Mixpanel?</h3><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create A/B tests using feature flags</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Heatmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track where users click and why</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own apps and contribute code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SQL insight builder</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Write your own insights using SQL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Notebooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collaborate on analysis in shareable notebooks</p></td><td class="text-center">Public beta</td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><p>PostHog is the only 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 autocapture. 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="how-popular-is-posthog">How popular is PostHog?</h3><p>According to <a href="https://www.linkedin.com/posts/jhpacker_just-updated-the-popularity-numbers-on-my-activity-7112462135120601088-YLdh/">data compiled by Jason Packer</a>, an independent analytics consultant, PostHog is the fastest growing Mixpanel alternative in the market.</p><p>As of July 2023, <strong>PostHog</strong> is deployed by 2,365 (0.2%) of the top 1 million websites in 2023, up +327% from 554 the previous year. <strong>Mixpanel</strong> is deployed by 5,218 (0.5%), down -17% from 6,295 the previous year.</p><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/mixpanel-alternatives/posthog.png" alt="posthog"/></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><br/><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/google-website.png" alt="GA4"/></p><h3 id="what-is-google-analytics-4">What is Google Analytics 4?</h3><p>Google Analytics 4 (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-1">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="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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>GA4</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Marketing analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track content and advertising performance</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Notebooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collaborate on analysis in shareable notebooks</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Ads integration</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track ROI on Google marketing campaigns</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Predictive insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">AI-powered alerts when metrics chanage</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Natural language insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Fetch insights using natural language queries</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Realtime dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track website activity in realtime</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data governance</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Admin level control over event approval, tags and descriptions</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Transparent pricing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Public pricing calculator</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><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="how-popular-is-ga4">How popular is GA4?</h3><p>Google Analytics remains the most-used analytics tool in the world by a large margin. </p><p>As of July 2023, <a href="https://www.linkedin.com/posts/jhpacker_just-updated-the-popularity-numbers-on-my-activity-7112462135120601088-YLdh/">30.5% of the top 1 million websites</a> run GA4 – another 35.7% were still running GA3.</p><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="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><br/><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/amplitude-website.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 Ford, NBCUniversal, and Walmart. </p><h3 id="key-features-2">Key features</h3><ul><li><p>📈 <strong>Product analytics</strong>, including funnel and retention analysis, user paths, behavioral cohorts, custom dashboards, and more.</p></li><li><p>🧪 <strong>A/B testing</strong> with support for JSON payloads, primary, secondary, and counter metrics.</p></li><li><p>💁‍♂️ <strong>Customer data platform</strong> that combines analytics data with third-party tools for data governance, identity resolution, and data federation.</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></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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Amplitude</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create A/B tests using feature flags</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Notebooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collaborate on analysis in shareable notebooks</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Natural language insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Fetch insights using natural language queries</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data governance</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Admin level control over event approval, tags and descriptions</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><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. Unlike Mixpanel, for example, pricing isn&#x27;t transparent.</p><h3 id="how-popular-is-amplitude">How popular is Amplitude?</h3><p>Amplitude is slightly more popular than Mixpanel, according to <a href="https://www.linkedin.com/posts/jhpacker_just-updated-the-popularity-numbers-on-my-activity-7112462135120601088-YLdh/">data compiled by Jason Packer</a>, an independent analytics consultant:</p><p>As of July 2023, Amplitude is deployed by 6,973 (0.7%) of the top 1 million websites in 2023. Mixpanel is deployed by 5,218 (0.5%).</p><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="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><br/><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-website.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 Contentsquare, 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> is a key differentiator between Heap and Mixpanel. Autocapture means product teams don&#x27;t have to rely on engineers to instrument all events. Heap offers a visual editor for enables teams to tag on-page events for analysis.</p></li><li><p>📺 <strong>Session replay</strong> and heatmaps augment Heap&#x27;s analytics features with qualitative insights, though it lacks the debugging tools typical of most replay tools.</p></li><li><p>🔁 <strong>Managed ETL</strong> to data warehouses, so you can export your Heap analytics data into a data warehouse and combine it with data from other sources.</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 Freshworks.</p><h3 id="how-does-heap-compare-to-mixpanel">How does Heap compare to Mixpanel?</h3><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>Heap</strong></td><td class="text-center"><strong>Mixpanel</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Custom trends, funnels, and retention analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture events without manual instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replay</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Notebooks</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Collaborate on analysis in shareable notebooks</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track metrics at account or company level</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data governance</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Admin level control over event approval, tags and descriptions</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><p>Session replay and autocapture support make Heap a good Mixpanel alternative for product teams.</p><p>Heap has a healthy integration library for things like A/B testing, or marketing automation, but Mixpanel&#x27;s is better. For example, Heap has two official survey integrations (Appcues and Delighted), while Mixpanel has nine.</p><p>Mixpanel also offers a more generous free tier of up to 20 million events; Heap is limited to 10,000 monthly users.</p><h3 id="how-popular-is-heap">How popular is Heap?</h3><p>Heap is less popular than Mixpanel. According to BuiltWith, Heap is deployed on 4,221 (0.4%) of the top 1 million websites, while Mixpanel is used by 6,300.</p><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="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><br/>## Honorable mentions<p>This guide focuses on the most popular Mixpanel alternatives, but these aren&#x27;t the only ones. Here are some honorable mentions that are worth also worth considering:</p><ul><li><p><strong><a href="/blog/best-pendo-alternatives">Pendo</a></strong>, which describes itself as a product experience platform. It combines analytics with in-app guides, user feedback widgets, roadmap planning, and product discovery tools.</p></li><li><p><strong><a href="https://www.kissmetrics.io/">Kissmetrics</a></strong>, which 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><a href="https://snowplow.io/">Snowplow</a></strong>, a powerful, open-source behavioral data platform. It can replace tools like Mixpanel, but it&#x27;s only suitable for companies with well-staffed data science teams. It&#x27;s mostly used by large enterprises.</p></li><li><p><strong><a href="https://www.june.so/">June</a></strong>, a lightweight take on product analytics that focuses on auto generated reports. It&#x27;s popular among seed stage and Series A B2B SaaS startups, though its free tier includes only 1,000 active monthly users.</p></li></ul><div></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">0da8c462-4095-549a-96c6-90e636d8c877</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 <a href="/teams/feature-flags">Feature Flags team</a> 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><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><div></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">e1aeb838-9548-57a2-89da-e044703739ec</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 29 Aug 2023 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><blockquote><p><strong>Changelog:</strong></p><ul><li><strong>Mar 15, 2023:</strong> Added Umami</li><li><strong>Aug 29, 2023:</strong> New adequacy decision, added Vercel Web Analytics</li></ul></blockquote><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><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, <a href="/blog/best-open-source-analytics-tools">open-source analytics platform</a> that combines product analytics, session recording, feature flags, and experimentation into a single platform. Think <a href="/blog/best-amplitude-alternatives">Amplitude</a> + Hotjar + <a href="/blog/best-launchdarkly-alternatives">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 autocapture, 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 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 all-in-one analytics suite</li><li>EU data hosting available</li><li>Feature flags, A/B testing, heatmaps, session recording and more</li><li>Apps to integrate with data warehouses</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 the best option for most users.</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>. The open source edition is free to self-host and includes the core product analytics features, session recording, and support for one project only.</p><div></div><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 Google Analytics. 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 – approx. $71. 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>Prices start at $9 for 100k monthly events. 1 million events is $49 per month; 10 million is $369 per month. Umami offers a 20% saving for paying annually.</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 $54 per month, compared to around $71 with Plausible. Fathom also offers two months free use for paying annually, but there is no free-to-use open source 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 Core 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 are limited to just 2,500 events and 10,000 speed insights per month. The Pro plan includes 25,000 events, which you can increase to 500k events for $50 per month more.</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 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>Countly doesn&#x27;t publish pricing on its website. You have to contact sales. 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 has three other plans (Indie, Business and Enterprise) which unlock more signals, support, and user accounts.</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><div></div>]]></content:encoded></item><item><title><![CDATA[The 9 best GA4 alternatives for apps and websites]]></title><description><![CDATA[In July 2023, Google closed Universal Analytics (UA), forcing users to switch to Google Analytics 4 (GA4) or another provider. This hasn't proved a…]]></description><link>https://posthog.com/blog/ga4-alternatives</link><guid isPermaLink="false">07473b0a-eb10-5a4f-a4d5-50db9a17da1d</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Fri, 25 Aug 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>In July 2023, Google closed Universal Analytics (UA), forcing users to switch to Google Analytics 4 (GA4) or another provider.</p><p>This hasn&#x27;t proved a popular decision. GA4 is a radical departure for existing users, particularly those using GA for marketing use cases.</p><p>In this guide we&#x27;ll cover:</p><ul><li>The differences between UA and GA4</li><li>Why existing users want to switch</li><li>The best GA4 alternatives for different use cases</li></ul><blockquote><p><strong>Changelog:</strong></p><ul><li><strong>Aug 24, 2023:</strong> Added Kissmetrics and Vercel Web Analytics; updated info on EU-U.S. privacy framework.</li></ul></blockquote><h2 id="ga4-vs-universal-analytics-whats-the-difference">GA4 vs Universal Analytics... what&#x27;s the difference?</h2><p>In simple terms, the core difference comes from how UA and GA4 track activity:</p><p><strong>Universal Analytics</strong> was a session-based analytics platform. It was designed for a time when desktop websites were the norm, and people didn&#x27;t think much about what cookies were. It&#x27;s good at tracking things like the number of sessions on a website, how many pageviews they generated, and where they came from.</p><p><strong>Google Analytics 4</strong> uses an event-based tracking system. It&#x27;s designed for tracking what people actually do, such as when they click a button, complete an action, or when they fail to do so. It can still track things like pageviews and website referrers, but its event-based model is more flexible and powerful.</p><h3 id="so-why-do-people-hate-ga4">So, why do people hate GA4?</h3><p>If event-based tracking is so great, why do people hate GA4 so much?</p><p>People tend to fall into one or more of the following camps:</p><ol><li><p><strong>Users who miss pre-defined reports:</strong> GA4 lacks many of the pre-defined reports users relied on to do their jobs. Stuff is just harder to find in GA4, unnecessarily so. Some speculate popular reports will make a return one day, but there&#x27;s no guarantee they will.</p></li><li><p><strong>Users who lack data science support:</strong> Universal Analytics is popular among small business users and marketing teams, but GA4 caters to large corporate users and app developers. GA4&#x27;s greater emphasis on exporting data to Looker Studio or BigQuery for analysis is hard for users who lack data science and analytics support.</p></li><li><p><strong>App developers who need more features:</strong> While GA4 courts app developers, it still falls short of the <a href="/blog/categories/comparisons">numerous alternatives</a> that lured customers away from Universal Analytics in the first place. To many, GA4 is too little, too late.</p></li></ol><p>Some users also prefer not to use Google Analytics due to privacy concerns and GDPR compliance. A <a href="https://commission.europa.eu/law/law-topic/data-protection/international-dimension-data-protection/eu-us-data-transfers_en">new EU-U.S. Data Privacy Framework</a>, agreed in July 2023, makes GDPR compliance with Google Analytics less problematic, though the new framework could yet face legal challenges from privacy campaigners in the EU.</p><h2 id="alternatives-to-ga4">Alternatives to GA4</h2><p>The following GA4 alternatives all solve one or more of these issues. Some provide a similar experience to UA, while others focus on unimpeachable privacy, or greater insights. In each case, we&#x27;ve highlighted the strengths of each tool and the ideal use cases.  </p><h3 id="posthog">PostHog</h3><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> Mobile and web apps</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>PostHog is an <a href="/product">all-in-one Product OS</a> that includes product analytics, session recording and A/B testing – pretty much everything you need to track user behavior in an app or website, basically. Like GA4, PostHog is an event-based platform. It&#x27;s priced on per event used, 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><p>As an open-source product, you can see exactly what the team is working on via the <a href="/roadmap">PostHog&#x27;s public roadmap</a>. Small projects can self-host PostHog to keep complete control of their data, while PostHog Cloud (with US and EU hosting options) is available for those who want a managed SaaS experience.</p><p>See <a href="/blog/best-gdpr-compliant-analytics-tools">GDPR-compliant analytics tools</a> for more.</p><h4 id="posthog-vs-google-analytics-4">PostHog vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>PostHog</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Surveys</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><p>Read our <a href="/blog/posthog-vs-ga4">PostHog and Google Analytics comparison</a> for an in-depth look at the differences</p><blockquote><h4 id="verdict">Verdict</h4><p><a href="https://posthog.com/">PostHog</a> is an all-in-one platform for tracking user behavior in apps and websites. While it&#x27;s a <a href="/blog/posthog-marketing">powerful tool for marketing</a> in the right hands, it&#x27;s best deployed by product and engineering teams seeking deep insights into how users use their product. Integrated session recording, A/B testing, survey, and feature flag tools mean it can also replace several other products in your tech stack.</p></blockquote><h3 id="matomo">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><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 suited to 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><h4 id="matomo-vs-google-analytics-4">Matomo vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>Matomo</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-1">Verdict</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.</p></blockquote><h3 id="kissmetrics">Kissmetrics</h3><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>Kissmetrics 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><h4 id="kissmetrics-vs-google-analytics-4">Kissmetrics vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>Kissmetrics</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Surveys</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-2">Verdict</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><h3 id="telemetrydeck">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><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, <a href="https://telemetrydeck.com/">TelemetryDeck</a> 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><h4 id="telemetrydeck-vs-google-analytics-4">TelemetryDeck vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>TelemetryDeck </strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-3">Verdict</h4><p>TelemetryDECK is a good option for those who want basic app analytics, but it falls someway short of feature parity with GA4.</p></blockquote><h3 id="plausible">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><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>, and others like it, 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><h4 id="plausible-vs-google-analytics-4">Plausible vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>Plausible</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-4">Verdict</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><h3 id="vercel-web-analytics">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><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><a href="https://vercel.com/docs/analytics">Vercel Web Analytics</a> 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><p>Vercel acquired another popular analytics tool, Splitbee, in 2022. Splitbee&#x27;s team are now working on developing Vercel&#x27;s analytics further.</p><h4 id="vercel-vs-google-analytics-4">Vercel vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>Vercel Web Analytics</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-5">Verdict</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><h3 id="piwik-pro">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><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><a href="https://piwik.pro/">Piwik PRO</a> 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><h4 id="piwik-pro-vs-google-analytics-4">Piwik PRO vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>Piwik PRO</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-6">Verdict</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><h3 id="fathom">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><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><h4 id="fathom-vs-google-analytics-4">Fathom vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>Fathom</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-7">Verdict</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><h3 id="counter">Counter</h3><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><a href="https://counter.dev/">Counter</a> 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><h4 id="counter-vs-google-analytics-4">Counter vs Google Analytics 4</h4><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Google Analytics 4</strong></td><td class="w-3/12 text-center"><strong>Counter</strong></td></tr></thead><tbody><tr><td>Website analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td>Funnels</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User Paths</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Retention</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Revenue tracking</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>User profiles</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Cohort analysis</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Session recording</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td>Self-hosting</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><h4 id="verdict-8">Verdict</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>]]></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">a1eacd34-a0c1-5143-8957-5aa5d7622942</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 user-facing analytics, 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 business intelligence (BI) tool 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><div></div>]]></content:encoded></item><item><title><![CDATA[The most popular PostHog alternatives, compared]]></title><description><![CDATA[As an all-in-one platform, PostHog replaces  a lot  of legacy tools. PostHog is great if you: Need quantitative  and  qualitative insights into user…]]></description><link>https://posthog.com/blog/posthog-alternatives</link><guid isPermaLink="false">188c523b-59ec-5d43-a7e1-2d5b30e69239</guid><dc:creator><![CDATA[Andy Vandervell]]></dc:creator><pubDate>Fri, 23 Jun 2023 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>As an all-in-one platform, PostHog 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 is an overview of some popular alternatives to PostHog, how they compare, and <a href="#why-people-choose-posthog">why people choose PostHog</a>.</p><blockquote><p><strong>Note:</strong> <em>User reviews and comments are hand curated from G2.com</em></p></blockquote><h2 id="amplitude">Amplitude</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-vs-amplitude/posthog-vs-amplitude.jpg" alt="amplitude vs posthog"/></p><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><p>Amplitude is most known as a product analytics platform, though it also offers separate A/B testing and Customer Data Platform products. Here&#x27;s how Amplitude describes itself:</p><blockquote><p>&quot;We are a digital analytics platform. We help every business optimize the business value of digital product innovation. We’re the competitive edge to not only survive—but thrive—in the new era.&quot;</p></blockquote><h3 id="amplitude-vs-posthog-summary">Amplitude vs PostHog summary</h3><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Amplitude</strong></td><td class="w-3/12 text-center"><strong>PostHog</strong></td><td class="w-3/12 text-center"></td></tr></thead><tbody><tr><td>Product analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze user behavior</td></tr><tr><td>Autocapture</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Fast to implement</td></tr><tr><td>Session replay</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Watch real user sessions</td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Manage feature access and rollouts</td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">CRO and test in production</td></tr><tr><td>Group analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze groups (e.g. companies and teams)</td></tr><tr><td>SQL access</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Write your own queries and filters</td></tr><tr><td>Transparent pricing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Know exactly what you&#x27;ll pay</td></tr><tr><td>Billing limits</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Prevent surprise bills</td></tr><tr><td>Open source</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Open core, build your own integrations</td></tr><tr><td>Cute hedgehogs</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Joy</td></tr></tbody></table></div><h3 id="key-differences">Key differences</h3><ol><li><p><strong>Breadth of features:</strong> PostHog combines product analytics, session replay, feature management, and A/B testing into one integrated platform. Amplitude is primarily a product analytics tool, and doesn&#x27;t include any session replay capability.</p></li><li><p><strong>Marketing use cases:</strong> Amplitude offers more useful features for marketing teams, such as predictive forecasting, and multi-touch attribution. PostHog is primarily designed for technical users, and product teams.</p></li><li><p><strong>Free tier:</strong> PostHog offers a generous 1 million events and 5k session recordings for free. Amplitude&#x27;s free plan is limited to 100k monthly tracks users, and doesn&#x27;t include important features, such as cohorts or data tables.</p></li></ol><h3 id="what-people-like-about-amplitude">What people like about Amplitude</h3><p>Users consistently praise Amplitude&#x27;s range of visualizations:</p><ul><li><p>&quot;One of the features that I appreciate the most is the wide range of graphs and visualizations available. I can create insightful visualizations with just a few clicks.&quot;</p></li><li><p>&quot;Amplitude is built in such a way it eases you into doing data analysis and making sense of the data. It allows for simple analysis to really advanced stuff.&quot;</p></li></ul><p>Users also praise its accessibility for non-technical users, such as marketing and UX designers:</p><ul><li><p>&quot;Its user-friendly interface makes it an ideal tool for Marketing teams to navigate effortlessly.&quot;</p></li><li><p>&quot;As a senior product designer... for the first time, I feel comfortable exploring data.</p></li></ul><h3 id="what-people-dislike-about-amplitude">What people dislike about Amplitude</h3><p>High prices are a frequent complaint:</p><ul><li><p>&quot;The high price tag poses a challenge for small businesses, early-stage, and even medium-sized startups.</p></li><li><p>&quot;I&#x27;d like some more flexibility on their startup programs, pricing seems a little tight for up-and-coming companies. The pricing structure on the website shouldn&#x27;t always redirect you to sales.&quot;</p></li></ul><p>More technical users sometimes find it inflexible and the documentation lacking:</p><ul><li><p>&quot;My primary gripe with Amplitude has always been its documentation, which was scattered across 2 or 3 websites, leading to fragmented content.&quot;</p></li><li><p>&quot;I do feel amplitude makes it difficult to parse out nuanced information on data. For more technical people, like myself, SQL is better for really digging into data.&quot;</p></li></ul><p>**Read more: <a href="/blog/best-amplitude-alternatives">The best Amplitude alternatives, compared</a></p><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><p>Mixpanel is purely focused on product analytics, going so far as to shut down other popular products it offered to renew its focus on analytics. According to Mixpanel, it lets you:</p><blockquote><p>&quot;...explore data freely, without SQL. Set up your metrics to measure growth and retention. Slice and dice data to uncover trends and see live updates on how people are using your app.&quot;</p></blockquote><h3 id="mixpanel-vs-posthog-summary">Mixpanel vs PostHog summary</h3><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Mixpanel</strong></td><td class="w-3/12 text-center"><strong>PostHog</strong></td><td class="w-3/12 text-center"></td></tr></thead><tbody><tr><td>Product analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze user behavior</td></tr><tr><td>Autocapture</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Easy to implement</td></tr><tr><td>Session replay</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Watch real user sessions</td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Manage feature access and rollouts</td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">CRO and test in production</td></tr><tr><td>Group analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze groups (e.g. companies and teams)</td></tr><tr><td>SQL access</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Write your own queries and filters</td></tr><tr><td>Transparent pricing</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Know exactly what you&#x27;ll pay</td></tr><tr><td>Billing limits</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Prevent surprise bills</td></tr><tr><td>Open source</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Open core, build your own integrations</td></tr><tr><td>Cute hedgehogs</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Joy</td></tr></tbody></table></div><p><strong>Read more:</strong> <a href="/blog/best-mixpanel-alternatives">The best alternatives to Mixpanel compared</a></p><h3 id="key-differences-1">Key differences</h3><ol><li><p><strong>Autocapture:</strong> PostHog automatically captures events, which means you don&#x27;t have to manually decide what events to track, unless you want to. It saves time for engineers and product managers, and ensures you&#x27;ll always have usable data even if you forgot to create a custom event. </p></li><li><p><strong>Single tool vs all-in-one:</strong> While it offers integrations with third-party A/B testing, feature flag, and session replay tools, Mixpanel doesn&#x27;t offer much outside typical product analytics features like event tracking and visualization. PostHog integrates all these features into one platform.</p></li><li><p><strong>Dev tool integrations:</strong> As a platform built to engineers, PostHog offer numerous integrations with popular dev tools, such as Sentry, GitHub, and GitLab.</p></li></ol><h3 id="what-people-like-about-mixpanel">What people like about Mixpanel</h3><p>Users frequently praise Mixpanel&#x27;s customer support:</p><ul><li><p>&quot;One of the notable strengths of Mixpanel lies in its exceptional support team.&quot;</p></li><li><p>&quot;It has to be the amazing customer service. I&#x27;ve never had a question that went unanswered for a long time.&quot;</p></li></ul><p>Most also think it&#x27;s easy to use:</p><ul><li><p>&quot;Its interface and ease of use, unlike other tools, makes the learning curve incremental and virtually anyone on the team with minimal knowledge can get the most out of it.&quot;</p></li><li><p>&quot;I appreciate Mixpanel for its uncomplicated and intuitive design, which makes it a pleasure to use.&quot;</p></li></ul><h3 id="what-people-dislike-about-mixpanel">What people dislike about Mixpanel</h3><p>Users frequently complain about Flows, Mixpanel&#x27;s user path feature:</p><ul><li><p>&quot;I find Flows to be very confusing. I tried using this feature multiple times, and while I always managed to understand something from the chart, I never understood the whole picture.&quot;</p></li><li><p>&quot;Flow reports screen looks a bit unorganised. To extract the data is always confusing.&quot;</p></li></ul><p>The lack of autocapture, and the need to maintain tracking plans, comes up often:</p><ul><li><p>&quot;If only I knew from the very beginning that I better keep my tracking plan simple - that would&#x27;ve substantially improved the accuracy of reports overall.&quot; </p></li><li><p>&quot;The dependency to the tech team to add and maintain the track in the code.&quot;</p></li></ul><p>Mixpanel uses its own twist on SQL, called JQL, which adds a learning curve:</p><ul><li>&quot;I also would like to be able to get data using SQL; nowadays, Mixpanel has JQL, which is excellent but has a difficult learning curve for those familiar with SQL.&quot;</li></ul><p><strong>Read more:</strong> <a href="/blog/posthog-vs-mixpanel">In-depth PostHog vs Mixpanel comparison</a> </p><h2 id="fullstory">FullStory</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-vs-fullstory/posthog-vs-fullstory.jpg" alt="fullstory posthog"/></p><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><p>FullStory is primarily a session replay tool, though it also includes some product analytics features. According to FullStory, it is:</p><blockquote><p>&quot;...equipping organizations with the information needed to perfect digital experiences—so that it’s ultimately easier for everyone to get things done online.&quot;</p></blockquote><h3 id="fullstory-vs-posthog-summary">FullStory vs PostHog summary</h3><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>FullStory</strong></td><td class="w-3/12 text-center"><strong>PostHog</strong></td><td class="w-3/12 text-center"></td></tr></thead><tbody><tr><td>Product analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze user behavior</td></tr><tr><td>Autocapture</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Easy to implement</td></tr><tr><td>Session replay</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Watch real user sessions</td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Manage feature access and rollouts</td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">CRO and test in production</td></tr><tr><td>Group analytics</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze groups (e.g. companies and teams)</td></tr><tr><td>SQL access</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Write your own queries and filters</td></tr><tr><td>Transparent pricing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Know exactly what you&#x27;ll pay</td></tr><tr><td>Billing limits</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Prevent surprise bills</td></tr><tr><td>Open source</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Open core, build your own integrations</td></tr><tr><td>Cute hedgehogs</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Joy</td></tr></tbody></table></div><h3 id="key-differences-2">Key differences</h3><ol><li><p><strong>Value and transparency:</strong> FullStory offers no free plan and is notoriously pricey. PostHog offers a generous free plan (1 million events and 5k recordings per month), and all pricing is transparent. </p></li><li><p><strong>Heat maps and scroll maps:</strong> PostHog supports click maps via the <a href="/docs/toolbar">PostHog Toolbar</a>, but FullStory goes further to offer cursor heatmaps and scroll tracking, making it more useful for UX researchers.</p></li><li><p><strong>Use cases:</strong> FullStory is a session replay tool first – it&#x27;s ideal for UX researchers and customer support. PostHog is useful for UX researchers and customer support too, but it&#x27;s primarily designed for technical users (e.g. engineering and product teams) rather than support.</p></li></ol><h3 id="what-people-like-about-fullstory">What people like about FullStory</h3><p>Customer experience and UX researchers like FullStory for troubleshooting:</p><ul><li><p>&quot;I like how I can look specifically into a feature to figure out how users are actually using it. It&#x27;s also great for debugging and seeing issues with flows.&quot;</p></li><li><p>&quot;It&#x27;s been indispensable for our customer service and our tech teams and has helped us understand user behavior.&quot;</p></li></ul><p>Autocapture is also popular:</p><ul><li>&quot;A huge benefit is not requiring development work to set up new events or track site behavior as fullstory does this automatically.&quot;</li></ul><h3 id="what-people-dislike-about-fullstory">What people dislike about FullStory</h3><p>High costs and pay walled features are frequently complaints:</p><ul><li><p>&quot;Due to the high subscription prices, we&#x27;re forced to pick and choose which sections we want to track and when to turn Full Story on or off.&quot;</p></li><li><p>&quot;FullStory not only charges more than leading competitors, but it also charges a lot more for premium features like conversions, journeys and detections. Plus, beware of their contract renewal terms; it can be confusing.&quot;</p></li></ul><p>While users like FullStory&#x27;s session replay features, some find it falls short for deeper analysis:</p><ul><li><p>&quot;FullStory lacks a strong data analysis capability and requires researchers to export to other tools for in-depth qualitative analysis.&quot;</p></li><li><p>&quot;Wish the dashboards had a bit more flexibility in layout, setup and management--they can be pretty basic.&quot;</p></li></ul><p><strong>Read more:</strong> <a href="/blog/posthog-vs-fullstory">In-depth PostHog vs FullStory comparison</a> </p><h2 id="heap">Heap</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-vs-heap/posthog-vs-heap.jpeg" alt="heap posthog"/></p><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><p>Heap is very similar to Amplitude and Mixpanel, though it added session replay features in 2022 through the acquisition of Auryc. Heap describes itself as:</p><blockquote><p>&quot;...the only solution that shows you every action by every user on your product or site, then provides direction on the improvements that will most impact your business.&quot;</p></blockquote><h3 id="heap-vs-posthog-at-a-glance">Heap vs PostHog at a glance</h3><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>Heap</strong></td><td class="w-3/12 text-center"><strong>PostHog</strong></td><td class="w-3/12 text-center"></td></tr></thead><tbody><tr><td>Product analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze user behavior</td></tr><tr><td>Autocapture</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Easy to implement</td></tr><tr><td>Session replay</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Watch real user sessions</td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Manage feature access and rollouts</td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Optimize and test in production</td></tr><tr><td>Group analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze groups (e.g. companies and teams)</td></tr><tr><td>SQL access</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Write your own queries and filters</td></tr><tr><td>Transparent pricing</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Know exactly what you&#x27;ll pay</td></tr><tr><td>Billing limits</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Prevent surprise bills</td></tr><tr><td>Open source</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Open core, build your own integrations</td></tr><tr><td>Cute hedgehogs</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Joy</td></tr></tbody></table></div><h3 id="key-differences-3">Key differences</h3><ol><li><p><strong>Technical features:</strong> PostHog offers more features for technical users, such as console logs and network activity on session replays, built-in feature flags, and a SQL query builder.</p></li><li><p><strong>Marketing uses cases:</strong> Both tools are useful for marketing teams, but Heap goes further by supporting multi-touch attribution for marketing campaigns.</p></li><li><p><strong>Free tier:</strong> Heap&#x27;s free tier is limited to just 10,000 monthly sessions, and doesn&#x27;t include session replay. All PostHog users get 1 million events and 5k recordings for free, every month.</p></li></ol><p><strong>Read more:</strong> <a href="/blog/posthog-vs-heap">In-depth PostHog vs Heap comparison</a> </p><h3 id="what-people-like-about-heap">What people like about Heap</h3><p>Heap&#x27;s visual labeling tool, which allows non-technical user to define events, is very popular:</p><ul><li><p>&quot;If I need more client-side events, the visual labeling tool is convenient. I don&#x27;t need to bother a developer to defined these events for me.&quot;</p></li><li><p>&quot;Visual labeling has been a lot of help when figuring out which UI elements are reporting and determining analytics based on.&quot;</p></li></ul><p>As autocapture, a feature it shares with PostHog:</p><ul><li><p>&quot;I like the sheer <em> amount </em> of information I can access with Heap. I can parse out a lot of data and gain a ton of insight by using this tool.&quot;</p></li><li><p>&quot;Most importantly, data is collected from Day 1 - even if the event hasn&#x27;t been defined, unlike other platforms. This is really useful as requests for analysis often ask for things you haven&#x27;t been actively tracking.&quot;</p></li></ul><h3 id="what-people-dislike-about-heap">What people dislike about Heap</h3><p>Users frequently find it unintuitive:</p><ul><li><p>&quot;Heap is not the easiest tool to use, in my opinion. I have used other data analytics platforms like Looker, <a href="/blog/best-split-alternatives">Split</a> and FullStory, and I find Heap to be very difficult to learn.&quot;</p></li><li><p>&quot;Not intuitive enough for deep analysis of funnels and journeys. It&#x27;s difficult for me to understand what&#x27;s happening between two points in a flow and to determine what the cause for drop-off rates may be.&quot;</p></li></ul><p>Some users also complain about performance:</p><ul><li><p>&quot;I dislike that Heap caches so much – sometimes the tool can get really slow due to this.&quot;</p></li><li><p>&quot;Running large queries, especially exporting data for further anlaysis/customization can be very slow, even not load at times.&quot;</p></li></ul><h2 id="logrocket">LogRocket</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/posthog-vs-logrocket/posthog-vs-logrocket.jpg" alt="logrocket posthog"/></p><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><p>LogRocket is similar to FullStory in many respects, but with a greater focus on developers – particularly front-end developers. Here&#x27;s how LogRocket describes itself:</p><blockquote><p>&quot;LogRocket combines session replay, error tracking, and product analytics – empowering software teams to create the ideal web and mobile product experience.&quot;</p></blockquote><h3 id="logrocket-vs-posthog-summary">LogRocket vs PostHog summary</h3><div><table class="w-full mt-4" style="min-width:600px"><thead><tr><td class="w-3/12"></td><td class="w-3/12 text-center"><strong>LogRocket</strong></td><td class="w-3/12 text-center"><strong>PostHog</strong></td><td class="w-3/12 text-center"></td></tr></thead><tbody><tr><td>Product analytics</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze user behavior</td></tr><tr><td>Autocapture</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Fast to implement</td></tr><tr><td>Session replay</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Watch real user sessions</td></tr><tr><td>Feature flags</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Manage feature access and rollouts</td></tr><tr><td>A/B testing</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">CRO and test in production</td></tr><tr><td>Group analytics</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Analyze groups (e.g. companies and teams)</td></tr><tr><td>SQL access</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Write your own queries and filters</td></tr><tr><td>Transparent pricing</td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Know exactly what you&#x27;ll pay</td></tr><tr><td>Billing limits</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Prevent surprise bills</td></tr><tr><td>Open source</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Open core, build your own integrations</td></tr><tr><td>Cute hedgehogs</td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center">Joy</td></tr></tbody></table></div><h3 id="key-differences-4">Key differences</h3><ol><li><p><strong>Analytics features:</strong> While LogRocket includes some product analytics features, it lacks important data analysis features like support for custom formulas, group analytics, and a SQL query builder that are built into PostHog.</p></li><li><p><strong>Heat maps and scroll maps:</strong> PostHog supports click maps, but LogRocket offers more in-depth heat maps and scroll depth visualizations, which are ideal for UX research and click-through optimization.</p></li><li><p><strong>Pricing &amp; free tier:</strong> LogRocket&#x27;s free tier is limited to just 1,000 sessions per month and excludes numerous features, such as product analytics. In contrast, all PostHog users get 1 million events and 5k session recordings for free every month, and all the core features.</p></li></ol><h3 id="what-people-like-about-logrocket">What people like about LogRocket</h3><p>Users find LogRocket invaluable for debugging user problems:</p><ul><li><p>&quot;Logrocket is a tool we can&#x27;t live without for: improving our UX experience; debugging user problems in an almost live fashion. Integrating it is ridiculously easy, and then you immediately can watch every user&#x27;s experience, all the time.&quot;</p></li><li><p>&quot;The combination of full DOM preservation through the whole timeline, plus the ability to set up filters to search this tree, is killer. This means that we can isolate specific features and interactions without the expensive up-front work of a traditional analytics installation.&quot;</p></li></ul><p>It&#x27;s also easy to implement:</p><ul><li><p>&quot;It starts with easy implementation and a straightforward process, especially supporting iframes, which was merely a single configuration property addition.&quot;</p></li><li><p>&quot;LogRocket integrates easily with our existing tech stack, including error-tracking and project management tools, making it a cohesive part of our workflow.&quot;</p></li></ul><h3 id="what-people-dislike-about-logrocket">What people dislike about LogRocket</h3><p>While users consider LogRocket better value than FullStory, some complain about limited data retention and the cost of upgrading: </p><ul><li><p>&quot;I absolutely don&#x27;t like the fact that we can&#x27;t extend our session retention without upgrading our plan to a much higher level.&quot;</p></li><li><p>&quot;The costs limit our usage a bit - we&#x27;ve had to reduce our session count significantly because we kept exceeding the rate limit before the next cycle.&quot;</p></li></ul><p>Users consistently praise LogRocket&#x27;s session replay tools, but other features are less developed:</p><ul><li><p>&quot;LogRocket&#x27;s additional features outside session replay are harder to set up and understand. We have not been able to fully maximize our platform use or find extra value outside of session replay.&quot;</p></li><li><p>&quot;The metrics feature is promising, but not a substitute for traditional product analytics tools.&quot;</p></li></ul><p><strong>Read more:</strong> <a href="/blog/posthog-vs-logrocket">In-depth PostHog vs LogRocket comparison</a></p><h2 id="why-people-choose-posthog">Why people choose PostHog</h2><p><strong>AssemblyAI</strong> <a href="https://posthog.com/customers/assemblyai">switched from Mixpanel to PostHog</a> because Mixpanel&#x27;s pricing caused them to throttle events. Using PostHog also meant they could combine analytics and A/B testing within a single platform.</p><div><div imageSource="/images/customers/alberto.jpg" name="Alberto Santos" title="Web &amp; Brand Lead, AssemblyAI" quote="“PostHog helps us debug support issues, because we push errors to PostHog as events. It may not be exactly what PostHog was intended for, but it is really useful and shows how adaptable PostHog is.”"></div></div><p><strong>Contra</strong> chose PostHog to <a href="https://posthog.com/customers/contra">replace a complex stack of separate tools</a>, including &quot;Mixpanel for analytics, LaunchDarkly for feature flags, Segment for front-end tracking and FullStory for replays&quot;. Adopting PostHog eliminated numerous data inconsistencies.</p><div><div imageSource="/images/customers/allison.jpg" name="Allison Nulty" title="Head of Product, Contra " quote="“A huge competitive advantage has been the ability to talk directly with PostHog engineers over Slack. We share feedback, ask questions, and make requests and always see a quick response time and thoughtful suggestions. At Contra, we apply these same principles of collaborating with our community to build our product.”"></div></div><p><strong>Netdata</strong> chose PostHog because they <a href="/customers/netdata">wanted a developer-centric tool</a> built for startups. It also enabled them to replace Smartlook, their previous session replay too:</p><div><div imageSource="/images/customers/andrewmaguire.jpeg" name="Andy Maguire" title="Analytics &amp; Machine Learning Lead, Netdata" quote="“I just trust that, when PostHog does something, it will do it the right way because it&#x27;s not just open source code, it&#x27;s all developed in the open too. You&#x27;d never get that modern thinking with the likes of Mixpanel, or other more &#x27;Old School&#x27; platforms.”"></div></div><p>Still not sure? <a href="/demo">Request a call</a> from our customer success team.</p>]]></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">63fb84dd-3ef5-595f-96f7-4750f3d10c67</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><div></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">0f664b23-7293-558b-9879-9e84d378f6c3</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. It&#x27;s 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><div></div><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>]]></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 all…]]></description><link>https://posthog.com/blog/posthog-vs-fullstory</link><guid isPermaLink="false">44774ecb-b9fa-5c15-a43c-f1b0b29b890c</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Thu, 25 May 2023 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 FullStory are both popular tools for understanding user behavior, but how are they different? Here’s the short answer.</p><ul><li><p><strong>PostHog</strong> is an all-in-one product improvement platform built primarily for engineers and technical users. It offers a wide range of features to help teams build better products, including analytics, feature flags, session replays, and more.</p></li><li><p><strong>FullStory</strong> is primarily a session replay tool focused on helping product managers and UX specialists to understand more about how their users interact with product UI. </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’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><h4 id="1-posthog-is-an-all-in-one-product-improvement-platform">1. PostHog is an all-in-one product improvement platform</h4><p>FullStory includes a few additional features, but it&#x27;s mostly focused on session replay. In contrast, PostHog is a comprehensive, all-in-one platform that 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 FullStory.  </p><h4 id="2-posthog-is-for-engineers-technical-users-builders">2. PostHog is for engineers, technical users, <em>builders</em></h4><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 </p><h4 id="3-posthog-is-open-source">3. PostHog is open source</h4><p>As an open source company, we build in public and give you unrivalled access. You can check out the PostHog repo to monitor code changes, build your own features and apps, and interact directly with our engineering team.</p><h2 id="core-features">Core features</h2><p>This comparison will compare all available features, regardless of pricing tier. Visit the <a href="#how-much-do-posthog-and-fullstory-cost">pricing section in the FAQ</a> for more information on pricing.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track events and conversion; analyze user behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregate traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; debug behaviour</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>A/B testing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze impact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>In-app prompts and messages</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send messages to users in your app</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Apps/Integrations</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Push and pull data to other destinations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own apps and contribute code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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>Build your own apps:</strong> PostHog makes it easy to build your own apps and integrations, including site apps that inject surveys, messages and prompts into your product.</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 UI designers and general product managers, 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/product-analytics/hogql">its own SQL dialect for detailed analysis</a>.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Event tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Log page views, clicks and other custom events.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track your data over time and visualize in charts.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize conversion rates and drop-offs.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Display a collection of insights and trends.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Correlation analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically highlight factors affecting funnel conversion rates.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Group events by users in the same company, project, or any other attribute.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Lifecycle insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Break down events from new, returning, resurrecting, and dormant users.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand churn with returning user actions.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stickiness insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">See how many times users perform an event in a period of time.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Path insights</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Inspect how users journey through your product.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><p>Product analytics in PostHog is closely integrated with other tools, such as feature flags and session replays. </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><blockquote><p><strong>PostHog ships weirdly fast.</strong> We never stop shipping. Visit the <a href="/changelog/2023">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 <em>primarily</em> a session replay tool, while PostHog is all-in-one platform. FullStory&#x27;s specialism means it has some extra features compared to Posthog, though the gap isn’t as large as you may imagine... and it&#x27;s closing fast.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>iOS app replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Record user sessions in iOS apps.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Android app replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Record user sessions in Android apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web app replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Capture replays from single-page apps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Privacy masking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Avoid capturing user data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Conditional capturing</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Only capture the sessions you want</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Performance monitoring</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Monitor network activity and performance.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Custom playlists</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Create playlists of related replays</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Share replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Generate timestamped short links for sharing</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Add notes to replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Add notes to a timebar when sharing</p></td><td class="text-center"><span class="text-red text-lg">✖</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>DOM explorer</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Explore an interactive snapshot of replays</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Export replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Save replay files offline for storage.</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data retention</strong></p></td><td class="text-center">Up to 3 months</td><td class="text-center">1 month*</td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Free replay allowance</strong></p></td><td class="text-center">5,000 sessions every month</td><td class="text-center">No free allowance**</td></tr></tbody></table></div><sup>*</sup> Data retention increases on more expensive plans.<sup>**</sup> FullStory offers a 14-day trial with 5,000 free sessions before forcing you to pay.<p>Beyond this, PostHog and FullStory are roughly comparable even in spite of FullStory’s near-exclusive focus on session replays as a feature. A major exception is PostHog’s lack of mobile app recording features, but <a href="/roadmap">we’re working on it</a>.</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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Clickmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize where users click on a page</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Scrollmaps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Check where users scroll to</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Movement maps</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Visualize mouse movements</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="apps-integrations-and-plugins">Apps, integrations and plugins</h3><p>Apps are a major point of difference between FullStory and PosthHog because PostHog offers the ability to inject code into your site. We use this functionality for our <a href="/docs/surveys/manual">surveys</a> feature, which enables you to ask users for qualitative feedback, to schedule face to face interviews, and more.</p><p>PostHog is also open source, meaning <a href="/tutorials/build-your-own-posthog-app">you can easily create your own apps</a>. In fact, it’s so easy to create apps in PostHog that some of the apps we already offer have been developed by non-engineers! </p><p>Below are some of the most popular apps and integrations for FullStory and PostHog:</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Salesforce</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zapier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export events for use in Zaps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stripe</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync customer and invoice data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Intercom</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Extract and load data to external platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer.io</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync data between platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentry</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest Sentry errors for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Segment</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest events from Segment</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Amazon Redshift</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Redshift</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Amazon S3</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to a S3 bucket</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Azure Blob Storage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Microsoft Azure</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Cloud Storage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to GCS</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Snowflake</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Snowflake database</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>BigQuery</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Google BigQuery for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Rudderstack</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h2 id="event-tracking">Event tracking</h2><p>Both PostHog and FullStory support a broad range of tracking options and libraries, and manual event instrumentation, as well as autocapture.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically track events without instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Combined events</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track related events as a single trackable action or behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Reverse proxy available</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events from your own domain to capture more data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cross-domain tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track users across domains and sub-domains</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Server-side tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events from your server</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Capture APi</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events through an API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><h4 id="should-you-autocapture-events">Should you autocapture events?</h4><p>Autocapture is much faster to setup than manual instrumentation, but some argue that it creates too much noise to be useful. We disagree, and it’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’s something we feel strongly about</a>.</p></blockquote><h2 id="security-and-compliance">Security and compliance</h2><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>FullStory</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>GDPR-ready</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA-ready</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data anonymization</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cookieless tracking option</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SOC 2 certified</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SAML/SSO available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>2FA available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h2 id="frequently-asked-questions">Frequently asked questions</h2><h3 id="how-much-do-posthog-and-fullstory-cost">How much do PostHog and FullStory cost?</h3><p>Both PostHog and FullStory offer three main pricing tiers, but how these tiers differ is actually quite different. </p><p><strong>PostHog</strong> has a free tier with a limited feature set and a generous allowance of 1 million free events and 5,000 free sessions each month, after which users move to a more full-featured paid plan that&#x27;s billed on usage. The third tier is an enterprise add-on, which expands the feature set further with the permissioning and privacy tools needed by large organizations.</p><blockquote><p> See <a href="/pricing">PostHog’s pricing page</a> to find out more about what’s included in each tier.</p></blockquote><p><strong>FullStory</strong> has three premium, paid-for tiers, which differ in available features. The basic Business plan offers minimal features and a limited 14-day trial, while the following Advanced and Enterprise plans increase the feature scope and, presumably, cost. </p><p>We say &#x27;presumably&#x27; because FullStory’s pricing isn’t transparent and there’s no way to know exactly how much each tier costs. In contrast, PostHog&#x27;s pricing is completely transparent – we have a cost calculator on <a href="/pricing">our pricing page</a> and you can set billing limits to prevent surprise bills.</p><h4 id="do-posthog-and-fullstory-offer-free-trials">Do PostHog and FullStory offer free trials?</h4><p>It doesn’t cost anything to get started with PostHog, and every month we give user their first million events <em>and</em> their first 5,000 sessions for free. As a result, there’s no need for a free trial — you can get started, start tracking and use billing limits to stay within the free allowance. Forever. </p><p>FullStory offers a 14-day free trial which is limited to 5,000 sessions. After this, it defaults to a premium Business plan. </p><h4 id="does-session-replay-capture-personal-information">Does session replay capture personal information?</h4><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. </p><h4 id="what-are-the-alternatives-to-posthog-and-fullstory">What are the alternatives to PostHog and FullStory?</h4><p>Some other popular session replay tools include <a href="/blog/posthog-vs-hotjar">HotJar</a> and <a href="/blog/posthog-vs-logrocket">LogRocket</a>. For more information on how PostHog compares to these, check <a href="/session-replay">the session replay page</a>.</p>]]></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 enables users to add in tool-tips and in-app messages. It…]]></description><link>https://posthog.com/blog/posthog-vs-pendo</link><guid isPermaLink="false">d2013508-d480-55bb-9784-dac00c955b6c</guid><dc:creator><![CDATA[Joe Martin]]></dc:creator><pubDate>Tue, 25 Apr 2023 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 Pendo and PostHog? Here&#x27;s the short answer:</p><ol><li><p>Pendo enables users to add in tool-tips and in-app messages. It includes some product analytics tools.</p></li><li><p>PostHog is an all-in-one product improvement platform that includes the ability to add in-app messages, as well as analytics, feature flags, session replays and more.</p></li></ol><p>Now it&#x27;s time for the long answer...</p><p>In this article we’ll explore the crucial differences and similarities between Pendo (specifically, Pendo Engage) and PostHog. We’ll cover topics such as:</p><ul><li>Pendo and PostHog’s <a href="#core-features">core features</a></li><li><a href="#product-analytics">Product analytics</a> and <a href="#in-app-messages-and-prompts">in-app messaging</a> features in detail</li><li><a href="#apps-and-integrations">Integrations</a> and <a href="#data-pipelines">data pipelines</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><a href="#how-much-does-pendo-cost">Pricing details</a>, <a href="#do-pendo-and-posthog-offer-free-trials">free trials</a> and 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’s a complete, all-in-one product OS, with robust analytics, feature flagging, A/B testing, and session capturing features. Pendo, on the other hand, is a more limited, and requires you to adopt other platforms, such as Hotjar or <a href="/blog/posthog-vs-launchdarkly">LaunchDarkly</a>, to get comparable functionality to PostHog.</p><h3 id="2-posthog-is-built-for-engineers">2. PostHog is built for engineers</h3><p>We built PostHog to support technically-savvy product managers and engineers — especially <a href="/blog/what-is-a-product-engineer">engineers with a product focus in their role</a>. As such, PostHog includes many powerful features that aren’t available in tools like Pendo, which are built for more general audiences.</p><h3 id="3-posthog-is-open-source">3. PostHog is open source</h3><p>Because we build for engineers first, we&#x27;re also open source. You can check out <a href="https://github.com/PostHog">PostHog’s source code</a>, <a href="/docs/apps/build">build integrations</a> or <a href="/blog/how-we-built-an-app-server">other services</a> on top of the product, and even <a href="https://github.com/PostHog">give feedback or interact with the team via GitHub</a>. Transparency, including transparent pricing, is one of our core values.</p><div></div><h2 id="comparing-posthog-and-pendo">Comparing PostHog and Pendo</h2><p><strong>Pendo</strong> has four pricing tiers — Free, Starter, Growth, and Portfolio – for its main product, Pendo Engage. Pendo&#x27;s Starter plan is limited to 2,000 active users a minimum of $8,000 per year.</p><p><strong>PostHog</strong> has three pricing plans — Free, Scale, and Enterprise:</p><ul><li><p>The Free plan includes everything early-stage companies need with a generous usage limit – 1 million events and 5k replays per month.</p></li><li><p>The Scale plan unlocks advanced features, like group analytics and A/B testing. Your first 1 million events and 5k replays each month are still free – you pay for what you use thereafter. </p></li><li><p>The Enterprise plan unlocks extra security, compliance, and permissioning features to meet the needs of large businesses. </p></li></ul><blockquote><p><strong>Are you an early-stage startup?</strong> Get $50k in PostHog credit, and more, by joining <a href="/startups">our PostHog for Startups program</a>!</p></blockquote><p>To make a clean comparison between PostHog and Pendo, we’ll focus on comparing Pendo Engage to PostHog and include features from all pricing tiers.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Pendo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Product analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track events and conversion; analyze user behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Web analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Simple dashboard of aggregated traffic, sources, campaigns, and session metrics</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Session replays</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Watch real users use your product; diagnose bugs</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User surveys</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ask users for qualitative feedback and gather responses</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Feature flags</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Roll out features safely; toggle features for cohorts or individuals</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Experiments</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Test changes and analyze impact</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>In-app prompts and messages</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send messages to users in your app</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Apps/integrations</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Push and pull data to other destinations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Open source</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build your own apps and contribute code</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Pendo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Graphs and trends</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Build custom insights and visualizations</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Dashboards</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine insights into shareable dashboards</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Funnels</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand conversion between events, pages</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cohorts</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Combine users based on properties and events for group analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>User paths</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track user flows and where they drop-off</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Retention</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Analyze user and revenue retention</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>UTM tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track marketing campaigns with UTM tags</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Correlation analysis</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Suggested events and properties that lead to success or failure</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Group analytics</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Understand how organizations use your product</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Formulas</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Use custom formulas to calculate unique insights</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SQL access</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Write your own queries in SQL</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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 user 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/product-analytics/hogql">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-messages-and-prompts">In-app messages and prompts</h3><p>Pendo is all about creating in-app messages, prompts, tooltips, measuring their impact on adoption and retention, and collecting feedback. But these aren&#x27;t unique features – PostHog also supports in-app messages and interactive pop-ups through the use of <a href="/docs/feature-flags/payloads">feature flag payloads</a> and <a href="/tutorials/build-site-app">site apps</a>, as well as <a href="/docs/surveys/manual">customizable surveys</a>.</p><p>The main difference is, because Pendo is designed for less technical users, it offers an interface that is simpler, but less powerful. You can easily create tooltips, announcement pop-ups and polls in Pendo, but not other types of prompt such as a Calendly integration. </p><p>PostHog has ready-made apps for displaying pop-ups and tooltips, including banners and site notifications, but can also create customizable surveys with which you can collect qualitative feedback to analyze alongside the quantitative data. Surveys can even be used to send links to users for scheduling face-to-face interviews. </p><h4 class="mb-4">Discover what&#x27;s possible with <span class="text-blue">PostHog apps</span></h4><div slugs="/tutorials/build-site-app,/tutorials/build-your-own-posthog-app,/tutorials/how-to-connect-discord-to-posthog-with-zapier,/tutorials/react-popups"></div><h3 id="apps-and-integrations">Apps and integrations</h3><p>Both Pendo and PostHog have a wide selection of apps and integration. Both also include integrations with tools such as Zapier, which enable you to move data to even more platforms.</p><p>One unique advantage of PostHog is that, because it is open source, it’s easy to <a href="/tutorials/build-your-own-posthog-app">create your own apps and integrations</a>. This is useful if you’re, for example, using niche software in your stack that hasn’t been widely adopted, or if you require a direct integration between PostHog and your product. </p><blockquote><p>The number of available apps is constantly increasing for both PostHog and Pendo, so rather than list all available apps, we’ve shortened this section to only list the most popular integrations in particular categories. Want the full list? Check <a href="/apps">the PostHog app library</a>!</p></blockquote><h3 id="data-pipelines">Data pipelines</h3><p>‘Data pipeline’ refers to apps which enable you to integrate with data warehouses, data lakes, or other forms of data storage. </p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Pendo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Export API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data via API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Import API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data via API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Amazon Redshift</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Redshift</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Amazon S3</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to S3 bucket</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Azure Blob Storage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Microsoft Azure</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google Cloud Storage</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to GCS</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Snowflake</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to Snowflake database</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Google BigQuery</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export data to BigQuery for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>RudderStack</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Airbyte</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Extract and load data to external platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Pendo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Hubspot</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Salesforce</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync event and person data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Zapier</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Export events for use in Zaps</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Shopify</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync customer and order data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Stripe</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync customer and invoice data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Slack</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Receive notifications about new data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Discord</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Receive notifications about new data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>MS Teams</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Receive notifications about new data</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Intercom</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Extract and load data to external platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Customer.io</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Sync data between platforms</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Sentry</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest Sentry errors for analysis</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Segment</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ingest events from Segment</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><blockquote><p><strong>Want more?</strong> For a full list of PostHog’s available integrations, please <a href="/apps">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 HIPPA and GDPR can require teams to store data in certain locations, or to protect data in certain ways. </p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Pendo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>GDPR-ready</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>HIPAA-ready</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>EU hosting available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Data anonymization</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cookieless tracking option</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SOC 2 certified</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>SAML/SSO available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>2FA available</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><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 setup, but some argue that it creates too much noise or cost to be useful. We disagree, and it’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’s something we feel quite strongly about</a>.</p><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Pendo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Event tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track manually instrumented events</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Autocapture</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Automatically track events without instrumentation</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Combined events (actions)</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track related events as a single trackable action or behavior</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Send events from your own domain</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Ensure ad blockers don&#x27;t block data capture</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Cross-domain tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Track users across domains and subdomains</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Server-side tracking</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events from your server</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Capture API</strong></p><p class="!mb-0 !text-sm text-opacity-75 leading-none">Send events through an API</p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr></tbody></table></div><h3 id="library-support">Library support</h3><p>PostHog supports a wide range of client and server libraries, 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><div class="min-w-full overflow-x-auto -mx-5 px-5 lg:-mx-6 lg:px-6 xl:-mx-12 xl:px-12"><table class="w-full mt-4"><thead><tr><td class=""></td><td class="text-center"><strong>PostHog</strong></td><td class="text-center"><strong>Pendo</strong></td></tr></thead><tbody><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>JavaScript</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>React Native</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>React</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Flutter</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>iOS</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Android</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-green text-lg">✔</span></td></tr><tr><td><p class="!mb-0 pb-0.5 !leading-tight"><strong>Ruby</strong></p></td><td class="text-center"><span class="text-green text-lg">✔</span></td><td class="text-center"><span class="text-red text-lg">✖</span></td></tr></tbody></table></div><h2 id="frequently-asked-questions">Frequently asked questions</h2><ul><li><a href="#who-is-pendo-useful-for">Who is Pendo useful for?</a></li><li><a href="#who-is-posthog-useful-for">Who is PostHog useful for?</a></li><li><a href="#how-much-does-pendo-cost">How much does Pendo cost?</a></li><li><a href="#how-much-does-posthog-cost">How much does PostHog cost?</a></li><li><a href="#do-pendo-and-posthog-offer-free-trials">Do Pendo and PostHog offer free trials?</a></li></ul><p>Got another question? You can <a href="/questions">ask the PostHog team anything you want</a>!</p><h3 id="who-is-pendo-useful-for">Who is Pendo useful for?</h3><p>Pendo is designed primarily for marketers and UX specialists. Its key features are the ability to create in-app prompts and messages, such as tooltips, without technical know-how. Pendo enables these users to follow the performance of such messages and to monitor broad feature adoption and usage. </p><h3 id="who-is-posthog-useful-for">Who is PostHog useful for?</h3><p>PostHog is built primarily with engineers, product managers and other technical users in mind. It also offers the ability to create in-app prompts and messages, but also offers a number of other tools that are useful for these types of teams, such as feature flags and session replays. </p><p>This difference is ultimately reflected in many of the features both platforms offer, and how they are designed. PostHog&#x27;s focus on breadth and supporting engineers in creating better products, for example, is reflected in its core features. </p><h3 id="how-much-does-pendo-cost">How much does Pendo cost?</h3><p>Pendo has complex, tier-based pricing, which isn’t entirely transparent and is based on the number of monthly active users. </p><p>A free tier is available with basic features, but can only track up to 500 monthly active users. After this, the Starter tier offers greater in-app messaging features and support for up to 2,000 monthly active users — but costs $8,000 per year. </p><p>Two additional tiers are available for larger teams — Growth and Portfolio — but the pricing for each is custom and not available publicly.</p><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog has transparent pricing based on the usage. It’s free to get started and completely free for the first 1 million events and 5,000 sessions captured every month.</p><p>After this free monthly allowance you&#x27;ll pay $0.00031/event and $0.005/replay, and PostHog charges progressively less the more you use. Volume, non-profit and <a href="/startups">startup discounts</a> are available upon request, and we recommend trying <a href="/pricing">our pricing calculator</a> to estimate your pricing.</p><h3 id="do-pendo-and-posthog-offer-free-trials">Do Pendo and PostHog offer free trials?</h3><p>Pendo offers a free tier, called Pendo Free. This version is limited in scope, supporting only one web, iOS or Android application, basic features and up to 500 monthly active users. After this, you must pay additional fees.</p><p>With PostHog, it’s free to get started, and all users get their first 1 million events and 5,000 sessions for free, every month. There are no other restrictions and billing limits can be used to keep usage beneath this allowance, enabling you to use PostHog for free indefinitely.</p><h3 id="can-i-migrate-from-pendo">Can I migrate from Pendo?</h3><p>Yes. See our <a href="/docs/migrate/pendo">Pendo to PostHog migration guide</a> for more.</p>]]></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">5631103a-efa7-503a-a514-fc72f118827f</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><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><div class="mermaid" data-processed="true"><svg viewBox="-8 -8 444.671875 770.171875" style="max-width:444.671875px" aria-labelled-by="chart-title-mermaid-1734517170519,chart-desc-mermaid-1734517170519" role="img" xmlnsXLink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-1734517170519"><title id="chart-title-mermaid-1734517170519"></title><desc id="chart-desc-mermaid-1734517170519"></desc><style>#mermaid-1734517170519 {font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1734517170519 .error-icon{fill:#552222;}#mermaid-1734517170519 .error-text{fill:#552222;stroke:#552222;}#mermaid-1734517170519 .edge-thickness-normal{stroke-width:2px;}#mermaid-1734517170519 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1734517170519 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1734517170519 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1734517170519 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1734517170519 .marker{fill:#333333;stroke:#333333;}#mermaid-1734517170519 .marker.cross{stroke:#333333;}#mermaid-1734517170519 svg{font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:16px;}#mermaid-1734517170519 .label{font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;color:#333;}#mermaid-1734517170519 .cluster-label text{fill:#333;}#mermaid-1734517170519 .cluster-label span{color:#333;}#mermaid-1734517170519 .label text,#mermaid-1734517170519 span{fill:#333;color:#333;}#mermaid-1734517170519 .node rect,#mermaid-1734517170519 .node circle,#mermaid-1734517170519 .node ellipse,#mermaid-1734517170519 .node polygon,#mermaid-1734517170519 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1734517170519 .node .label{text-align:center;}#mermaid-1734517170519 .node.clickable{cursor:pointer;}#mermaid-1734517170519 .arrowheadPath{fill:#333333;}#mermaid-1734517170519 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-1734517170519 .flowchart-link{stroke:#333333;fill:none;}#mermaid-1734517170519 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-1734517170519 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-1734517170519 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-1734517170519 .cluster text{fill:#333;}#mermaid-1734517170519 .cluster span{color:#333;}#mermaid-1734517170519 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-1734517170519 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}</style><g><marker orient="auto" markerHeight="12" markerWidth="12" markerUnits="userSpaceOnUse" refY="5" refX="9" viewBox="0 0 10 10" class="marker flowchart" id="flowchart-pointEnd"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowMarkerPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker><marker orient="auto" markerHeight="12" markerWidth="12" markerUnits="userSpaceOnUse" refY="5" refX="0" viewBox="0 0 10 10" class="marker flowchart" id="flowchart-pointStart"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowMarkerPath" d="M 0 5 L 10 10 L 10 0 z"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="11" viewBox="0 0 10 10" class="marker flowchart" id="flowchart-circleEnd"><circle style="stroke-width:1;stroke-dasharray:1, 0" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5" refX="-1" viewBox="0 0 10 10" class="marker flowchart" id="flowchart-circleStart"><circle style="stroke-width:1;stroke-dasharray:1, 0" class="arrowMarkerPath" r="5" cy="5" cx="5"></circle></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="12" viewBox="0 0 11 11" class="marker cross flowchart" id="flowchart-crossEnd"><path style="stroke-width:2;stroke-dasharray:1, 0" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><marker orient="auto" markerHeight="11" markerWidth="11" markerUnits="userSpaceOnUse" refY="5.2" refX="-1" viewBox="0 0 11 11" class="marker cross flowchart" id="flowchart-crossStart"><path style="stroke-width:2;stroke-dasharray:1, 0" class="arrowMarkerPath" d="M 1,1 l 9,9 M 10,1 l -9,9"></path></marker><g class="root"><g class="clusters"></g><g class="edgePaths"><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-A LE-I" id="L-A-I-0" d="M223.6171875,34L223.6171875,39.75C223.6171875,45.5,223.6171875,57,223.6171875,68.5C223.6171875,80,223.6171875,91.5,223.6171875,97.25L223.6171875,103"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-I LE-J" id="L-I-J-0" d="M223.6171875,137L223.6171875,142.75C223.6171875,148.5,223.6171875,160,223.6171875,171.5C223.6171875,183,223.6171875,194.5,223.6171875,200.25L223.6171875,206"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-J LE-C" id="L-J-C-0" d="M223.6171875,240L223.6171875,245.75C223.6171875,251.5,223.6171875,263,223.70052083333334,274.5833333333333C223.78385416666666,286.1666666666667,223.95052083333334,297.8333333333333,224.03385416666666,303.6666666666667L224.1171875,309.5"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-C LE-D" id="L-C-D-0" d="M274.42621553329116,433.36284696670884L291.5127316944093,445.8310183055907C308.59924785552744,458.29918964447256,342.7722801777638,483.2355323222362,359.85879633888186,499.87037032778477C376.9453125,516.5052083333334,376.9453125,524.8385416666666,376.9453125,529.0052083333334L376.9453125,533.171875"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-C LE-E" id="L-C-E-0" d="M224.1171875,483.671875L224.03385416666666,487.7552083333333C223.95052083333334,491.8385416666667,223.78385416666666,500.0052083333333,223.70052083333334,508.2552083333333C223.6171875,516.5052083333334,223.6171875,524.8385416666666,223.6171875,529.0052083333334L223.6171875,533.171875"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-C LE-F" id="L-C-F-0" d="M172.56556203073006,432.12024953073006L153.97260377560838,444.79552044227506C135.37964552048672,457.47079135382,98.19372901024336,482.82133317691,79.60077075512167,499.6632707551217C61.0078125,516.5052083333334,61.0078125,524.8385416666666,61.0078125,529.0052083333334L61.0078125,533.171875"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-F LE-G" id="L-F-G-0" d="M61.0078125,567.171875L61.0078125,571.3385416666666C61.0078125,575.5052083333334,61.0078125,583.8385416666666,77.67317708333333,592.3096668708562C94.33854166666667,600.7807920750456,127.66927083333333,609.3897091500913,144.33463541666666,613.6941676876141L161,617.998626225137"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-E LE-G" id="L-E-G-0" d="M223.6171875,567.171875L223.6171875,571.3385416666666C223.6171875,575.5052083333334,223.6171875,583.8385416666666,223.6171875,592.171875C223.6171875,600.5052083333334,223.6171875,608.8385416666666,223.6171875,613.0052083333334L223.6171875,617.171875"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-D LE-G" id="L-D-G-0" d="M376.9453125,567.171875L376.9453125,571.3385416666666C376.9453125,575.5052083333334,376.9453125,583.8385416666666,361.73418898809524,592.171875C346.52306547619054,600.5052083333334,316.10081845238096,608.8385416666666,300.8896949404762,613.0052083333334L285.67857142857144,617.171875"></path><path marker-end="url(#flowchart-pointEnd)" style="fill:none" class="edge-thickness-normal edge-pattern-solid flowchart-link LS-G LE-H" id="L-G-H-0" d="M223.6171875,651.171875L223.6171875,656.921875C223.6171875,662.671875,223.6171875,674.171875,223.6171875,685.671875C223.6171875,697.171875,223.6171875,708.671875,223.6171875,714.421875L223.6171875,720.171875"></path></g><g class="edgeLabels"><g transform="translate(223.6171875, 68.5)" class="edgeLabel"><g transform="translate(-27.9296875, -9.5)" class="label"><foreignObject height="19" width="55.859375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel">Embed</span></div></foreignObject></g></g><g transform="translate(223.6171875, 171.5)" class="edgeLabel"><g transform="translate(-64.0390625, -9.5)" class="label"><foreignObject height="19" width="128.078125"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel">Query Weaviate</span></div></foreignObject></g></g><g transform="translate(223.6171875, 274.5)" class="edgeLabel"><g transform="translate(-90.6875, -9.5)" class="label"><foreignObject height="19" width="181.375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel">Collect Prompt Params</span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g class="edgeLabel"><g transform="translate(0, 0)" class="label"><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel"></span></div></foreignObject></g></g><g transform="translate(223.6171875, 685.671875)" class="edgeLabel"><g transform="translate(-56.0546875, -9.5)" class="label"><foreignObject height="19" width="112.109375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel">Query OpenAI</span></div></foreignObject></g></g></g><g class="nodes"><g transform="translate(223.6171875, 17)" id="flowchart-A-40" class="node default default"><rect height="34" width="128.125" y="-17" x="-64.0625" ry="0" rx="0" class="basic label-container"></rect><g transform="translate(-56.5625, -9.5)" class="label"><foreignObject height="19" width="113.125"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">User Question</span></div></foreignObject></g></g><g transform="translate(223.6171875, 120)" id="flowchart-I-41" class="node default default"><rect height="34" width="142.640625" y="-17" x="-71.3203125" ry="5" rx="5" class="basic label-container"></rect><g transform="translate(-63.8203125, -9.5)" class="label"><foreignObject height="19" width="127.640625"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Question Vector</span></div></foreignObject></g></g><g transform="translate(223.6171875, 223)" id="flowchart-J-43" class="node default default"><rect height="34" width="158.078125" y="-17" x="-79.0390625" ry="0" rx="0" class="basic label-container"></rect><g transform="translate(-71.5390625, -9.5)" class="label"><foreignObject height="19" width="143.078125"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Most Similar Docs</span></div></foreignObject></g></g><g transform="translate(223.6171875, 396.0859375)" id="flowchart-C-45" class="node default default"><polygon transform="translate(-87.0859375,87.0859375)" class="label-container" points="87.0859375,0 174.171875,-87.0859375 87.0859375,-174.171875 0,-87.0859375"></polygon><g transform="translate(-62.5859375, -9.5)" class="label"><foreignObject height="19" width="125.171875"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Prompt Context</span></div></foreignObject></g></g><g transform="translate(376.9453125, 550.171875)" id="flowchart-D-47" class="node default default"><rect height="34" width="103.453125" y="-17" x="-51.7265625" ry="0" rx="0" class="basic label-container"></rect><g transform="translate(-44.2265625, -9.5)" class="label"><foreignObject height="19" width="88.453125"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Limitations</span></div></foreignObject></g></g><g transform="translate(223.6171875, 550.171875)" id="flowchart-E-49" class="node default default"><rect height="34" width="103.203125" y="-17" x="-51.6015625" ry="0" rx="0" class="basic label-container"></rect><g transform="translate(-44.1015625, -9.5)" class="label"><foreignObject height="19" width="88.203125"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Personality</span></div></foreignObject></g></g><g transform="translate(61.0078125, 550.171875)" id="flowchart-F-51" class="node default default"><rect height="34" width="122.015625" y="-17" x="-61.0078125" ry="0" rx="0" class="basic label-container"></rect><g transform="translate(-53.5078125, -9.5)" class="label"><foreignObject height="19" width="107.015625"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">Context Docs</span></div></foreignObject></g></g><g transform="translate(223.6171875, 634.171875)" id="flowchart-G-53" class="node default default"><rect height="34" width="125.234375" y="-17" x="-62.6171875" ry="0" rx="0" class="basic label-container"></rect><g transform="translate(-55.1171875, -9.5)" class="label"><foreignObject height="19" width="110.234375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">String Prompt</span></div></foreignObject></g></g><g transform="translate(223.6171875, 737.171875)" id="flowchart-H-59" class="node default default"><rect height="34" width="112.59375" y="-17" x="-56.296875" ry="0" rx="0" class="basic label-container"></rect><g transform="translate(-48.796875, -9.5)" class="label"><foreignObject height="19" width="97.59375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="nodeLabel">AI Response</span></div></foreignObject></g></g></g></g></g></svg></div><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><div>Interface for creating feature preview entries, including screenshots and docs options</div><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><div></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">da8a4d2a-457e-5bf3-9e6f-2d797d116c49</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 analytics 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 analytics 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 user-facing analytics 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 analytics products 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><div></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">b02d7a1d-68d4-56fd-ba59-3e8b27f020a4</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><div>Elasticsearch effectively creates a cartesian layout of physical and virtual coordinates.</div><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><div>Inverted indexes dramatically improve search time.</div><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><div>Elasticsearch can replicate data at scale without having to replicate the entire database.</div><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><div>ClickHouse’s biggest magic trick really comes down to swapping rows and columns</div><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 is 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><div></div>]]></content:encoded></item><item><title><![CDATA[The 6 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">4e69c655-b5a6-54ca-b7b5-0b8d81c743d2</guid><dc:creator><![CDATA[Hanna Crombie]]></dc:creator><pubDate>Thu, 16 Mar 2023 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>Product review website G2 lists 120 products in the A/B testing category, but what they offer varies widely. Many products on G2, for example, lean toward marketing uses cases (i.e. testing website landing pages) and aren&#x27;t useful for product feature testing, or focus on a narrow subset of companies.</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/google-optimize-alternatives">alternatives to Google Optimize</a>.</p><blockquote><p><strong>Changelog:</strong></p><ul><li><strong>Mar 16, 2023:</strong> Added VWO, updated images. Various copy updates and improvements.</li></ul></blockquote><h2 id="1-posthog">1. PostHog</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/screenshots/ab-testing.png" alt="posthog"/></p><p><a href="https://posthog.com">PostHog</a> is an <a href="/blog/best-open-source-analytics-tools">open-source analytics platform</a> that integrates a comprehensive A/B testing suite with numerous other tools, such as product analytics, feature flags, and session recording. 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="/product/experimentation-suite">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 feature flags. PostHog uses a Bayesian approach to calculate the probability of each variant being the best, and whether the results are statistically significant or not.</p><h3 id="who-is-posthog-for">Who is PostHog for?</h3><p>PostHog is ideal for product teams, 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>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>Experimentation is free-to-use on PostHog&#x27;s Scale plan, which is also <a href="/pricing">free up to 1 million events</a> and 5,000 recordings per month – you can set billing limits to ensure you don&#x27;t get surprise bills. While PostHog is open source, its A/B testing features aren&#x27;t included in the open source release.</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>.</p></blockquote><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>Modular platform to adapt to your needs</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. A hosted version includes a visual A/B test editor and is free up to five users, with pricing at $20 per user per month thereafter.</p><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><a href="https://www.getunleash.io/">Unleash</a> 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.</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 Google Analytics or Mixpanel 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>Self-hosted and managed service available</li></ul><h3 id="how-much-does-unleash-cost">How much does Unleash cost?</h3><p>Unleash’s basic open source self-hosted plan includes A/B experimentation and is free for two environments. A managed version is also available starting from $80 a month. The open source version is available under an Apache license.</p><h2 id="4-mojito">4. Mojito</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-testing-tools/img3_Mojito.png" alt="Unleash - best open source ab testing tools"/></p><p><a href="https://mojito.mx/">Mojito</a> is an open 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><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>Error tracking and handling</li><li>Lightweight solution for optimized page load speed</li></ul><h3 id="how-much-does-mojtio-cost">How much does Mojtio 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></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. For teams looking to manage their infrastructure, Flagsmith can be hosted entirely on-premises with pricing available on request. They also offer a cloud solution for free up to 50,000 requests per month. </p><h2 id="6-vwo">6. VWO</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><p><a href="/blog/best-vwo-alternatives">VWO</a>&#x27;s testing platform caters mainly to large enterprises, but it recently introduced a free tier to entice companies leaving the <a href="/blog/google-optimize-alternatives">soon-to-be-closed Google Optimize</a>. Its experimentation platform has A/B and multivariate tests, as well as a visual editor. However, many useful features are only available in its paid tiers – the free tier only supports A/B tests using split URLs and doesn&#x27;t support multiple variations or geo-targeting.</p><h3 id="who-is-vwo-for">Who is VWO for?</h3><p>VWO&#x27;s free tier is useful for non-technical users who need an easy-to-use (and free) way to test landing pages.</p><h3 id="how-much-does-vwo-cost">How much does VWO cost?</h3><p>VWO&#x27;s Starter plan is free up to 50k visitors per month, and $199 per month up to 100k visitors per month.</p>]]></content:encoded></item><item><title><![CDATA[Open source (and self-hosted) alternatives to Hotjar & FullStory]]></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">476d18b1-6a8d-5b8a-bda2-c733651e5a7d</guid><dc:creator><![CDATA[Hanna Crombie]]></dc:creator><pubDate>Thu, 16 Mar 2023 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. 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>Hotjar and <a href="/blog/best-fullstory-alternatives">Fullstory</a> are popular session replay products, but they&#x27;re expensive, inflexible, and primarily designed with marketing teams. 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><blockquote><p><strong>Changelog:</strong></p><ul><li><strong>Mar 16, 2023:</strong> Removed SessionStack, added Highlight.io. Updated copy and screenshots.</li></ul></blockquote><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="https://posthog.com/">PostHog</a> is an all-in-one, Product OS that offers all the tools required to build better products, including but not limited to <a href="/product/session-recording">session replay</a>.</p><p>PostHog&#x27;s session replay tool includes console logs and network activity, so you can identify the causes of bugs or performance problems. There&#x27;s also a playlist feature, allowing you to save similar replays based on specific events or person properties into one list, and you can save recordings offline for safe keeping.</p><p>Other features include product analytics, <a href="/product/feature-flags">feature flags</a>, <a href="/product/funnels">funnels</a>, <a href="/product/heatmaps">heatmaps</a>, <a href="/product/experimentation-suite">experimentation</a>, <a href="/product/trends">trends</a> and <a href="/product">much more</a>. </p><p>All PostHog’s tools work together natively, offering extensive, actionable user insights beyond what&#x27;s possible with standalone session replay tools.</p><h3 id="who-is-posthog-for">Who is PostHog for?</h3><p>PostHog is ideal for <a href="/blog/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><h3 id="features-and-benefits">Features and benefits</h3><ul><li>Console logs and network performance</li><li>Filter recordings by user or event</li><li>Export recordings offline</li><li>Fully-featured product analytics suite</li><li>Front-end events captured out of the box</li><li>CSS selectors block sensitive data to protect user privacy</li></ul><h3 id="how-much-does-posthog-cost">How much does PostHog cost?</h3><p>PostHog Cloud is free up to 1 million captured events and 5,000 recordings per month, and you can set billing limits to avoid surprise bills. </p><p>You can also self-host PostHog Open Source (available under an MIT license) using Docker Compose, though PostHog Cloud is recommended for event volumes exceeding 100k per month.</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><a href="https://openreplay.com/">OpenReplay</a> 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="features-and-benefits-1">Features and benefits</h3><ul><li>Error and rage click tracking</li><li>Bug reporting and reproduction </li><li>Network activity inspection</li><li>Performance and state monitoring</li><li>Co-browsing feature to assist users at critical moments</li></ul><h3 id="how-much-does-openreplay-cost">How much does OpenReplay cost?</h3><p>OpenReplay’s self-hosted plan is available for free. It also offers a cloud option starting at $3.95 per month for 1,000 recordings with 30 days data retention.</p><h2 id="3-highlightio">3. Highlight.io</h2><p><img src="https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/blog/open-source-hotjar-alternatives/highlightio.png" alt="higlightio"/></p><p><a href="https://www.highlight.io/">Highlight.io</a> is a popular open-source monitoring platform that&#x27;s similar, in some ways, to OpenReplay. Core features include session replay with console logs and network monitoring, error monitoring, and customizable log alerts. It lacks some of OpenReplay&#x27;s additional features, such as click maps and customer support features.</p><h3 id="who-is-highlightio-for">Who is Highlight.io for?</h3><p>Highlight.io is a developer focused tool with a particular focus on debugging user problems and errors.</p><h3 id="features-and-benefits-2">Features and benefits</h3><ul><li>Log alerts </li><li>Open source and self hostable</li><li>Session replay with console logs and network monitoring</li><li>Error monitoring and customizable alerts</li></ul><h3 id="how-much-does-highlightio-cost">How much does Highlight.io cost?</h3><p>You can self-host for free – Highlight.io recommends an upper limit of 10k sessions and 50k errors per month for hobby deployments. The managed cloud service is free up to 500 monthly sessions and 1,000 errors. Costs thereafter vary depending on usage and retention requirements.</p><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><a href="https://www.uxwizz.com/">UXWizz</a> is a simplified, self-hosted product analytics tool offering features like visitor insights, session recording, segments and 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><p>UXWizz is maintained by a single developer.</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="features-and-benefits-3">Features and benefits</h3><ul><li>Broad range of engagement-focused insights</li><li>Low database usage with lightweight version</li><li>Unlimited usage with one-time license fee</li></ul><h3 id="how-much-does-uxwizz-cost">How much does UXWizz cost?</h3><p>UXWizz is available as a self-hosted solution only and with prices starting at £129 for a lifetime license, including 1-year support. Additional updates and support are priced as add-on subscriptions.</p><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><a href="https://uxlens.com/">UXlens</a> 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="strengths">Strengths</h3><ul><li>Customizable filters to track sessions on specific user segments</li><li>Input elements masked by default to protect user data</li><li>UI to assist with complex filter building</li></ul><h3 id="how-much-does-uxlens-cost">How much does UXlens cost?</h3><p>The cloud version starts at just $6 per month for 6,000 recordings. Lifetime self-host licenses start at $200.</p><h2 id="6-matomo">6. <a href="/blog/posthog-vs-matomo">Matomo</a></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 <a href="https://plugins.matomo.org/HeatmapSessionRecording">on-premise marketplace</a>.</p><h3 id="who-is-matomo-for">Who is Matomo for?</h3><p>Matomo 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. To learn more, read our <a href="/blog/posthog-vs-matomo">PostHog vs Matomo comparison</a>.</p><h3 id="features-and-benefits-4">Features and benefits</h3><ul><li>Funnels, acquisition analysis and other insight features</li><li>Unlimited session recordings</li><li>Out-of-the-box solution meaning no developer required to get set up</li></ul><h3 id="how-much-does-matomo-cost">How much does Matomo cost?</h3><p>The session recording add-on for a self-hosted Matomo solution has a 30-day free trial, after which the cost ranges from $199 to $599 per year depending on the number of users in your team. Session recording is also included in Matomo’s cloud Business plan. Pricing is calculated depending on the volume of your site traffic.</p>]]></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">92d2ffbf-2702-5eef-95ff-58b2921f11d4</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><div></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">3a4d7748-1038-5100-9042-65e37fc879d4</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 customer data platforms (CDP), 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 data warehouse 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">HogQL and 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><div></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">5d775148-0980-5a51-8439-b116a8859131</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 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 business intelligence tools 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 analytics 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><div></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">7836af38-bdca-55ca-87a5-e91c0c3bc8e5</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><div></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">212df8e6-1257-5801-8702-dbab83152607</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><div></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">0a254d55-2525-577f-90f4-f93b2dab9914</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="/blog/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: product management and software engineering.</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><div></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">38b055dd-cc7f-5bf8-ad21-df9825bec0ec</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><div></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">6de7035a-daf4-5d6b-a958-e37c66190b47</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 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>Vendasta:</strong> SaaS marketplace – <a href="/customers/vendasta">read how they cut onboarding drop-off by 50%</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>]]></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">f07e2687-e47c-50b5-a029-b3e2d95ddbc0</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><div></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">5d456458-b293-59ac-9ac9-060266916166</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 business intelligence tools, 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">product analytics 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><div></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">ed58a972-33ca-515c-9b1c-75e0dfdbe7a6</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><div></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">46e2c26e-ba15-5165-abca-353ffba34dd0</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 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="/community/profiles/721">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 <a href="../teams/people">People and Ops team</a>, and a <a href="../teams/growth">Growth Team</a> 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>]]></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">3f03db12-b178-5858-bd0d-5a7b6ca2febc</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="/blog/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><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>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 product analytics 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><div>PostHog&#x27;s <a href="/product/session-recording">session recordings</a> visualize what users are actually doing in your product</div><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><div>The benefits of Linear built specifically for product engineers.</div><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><div>We use GitHub Actions to run our Cypress, Jest, Django, and Storybook tests to ship fast while maintaining quality.</div><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><div>The benefits of integrating infrastructure and code from Vercel and Next.js.</div><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><div>Sentry provides multiple tools (including stack traces) for monitoring errors and problems in your code.</div><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="/blog/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><div></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">ddea3e63-cd9f-5e25-b90f-d157a7f02d21</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/blog/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><div></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">34008922-40fc-5d9d-9e9a-48b8fe6e6051</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 software engineer building products. 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 figure out what to do next.</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></ul><div></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">19aab2f8-56fc-5527-9bd6-c69911d4f06b</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><div></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">7fe2d2dd-d3d4-5571-828e-33308727bbc4</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><div></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 analytics and…]]></description><link>https://posthog.com/blog/how-we-built-an-app-server</link><guid isPermaLink="false">a18791c7-5858-5d4e-9972-1df50c87036a</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 analytics and data 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>/capture</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><div class="mermaid" data-processed="true"><svg viewBox="0 0 390.0859375 650" style="max-width:390.0859375px" aria-labelled-by="chart-title-mermaid-1734517169978,chart-desc-mermaid-1734517169978" role="img" xmlnsXLink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-1734517169978"><title id="chart-title-mermaid-1734517169978"></title><desc id="chart-desc-mermaid-1734517169978"></desc><style>#mermaid-1734517169978 {font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1734517169978 .error-icon{fill:#552222;}#mermaid-1734517169978 .error-text{fill:#552222;stroke:#552222;}#mermaid-1734517169978 .edge-thickness-normal{stroke-width:2px;}#mermaid-1734517169978 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1734517169978 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1734517169978 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1734517169978 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1734517169978 .marker{fill:#333333;stroke:#333333;}#mermaid-1734517169978 .marker.cross{stroke:#333333;}#mermaid-1734517169978 svg{font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:16px;}#mermaid-1734517169978 .label{font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;color:#333;}#mermaid-1734517169978 .cluster-label text{fill:#333;}#mermaid-1734517169978 .cluster-label span{color:#333;}#mermaid-1734517169978 .label text,#mermaid-1734517169978 span{fill:#333;color:#333;}#mermaid-1734517169978 .node rect,#mermaid-1734517169978 .node circle,#mermaid-1734517169978 .node ellipse,#mermaid-1734517169978 .node polygon,#mermaid-1734517169978 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1734517169978 .node .label{text-align:center;}#mermaid-1734517169978 .node.clickable{cursor:pointer;}#mermaid-1734517169978 .arrowheadPath{fill:#333333;}#mermaid-1734517169978 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-1734517169978 .flowchart-link{stroke:#333333;fill:none;}#mermaid-1734517169978 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-1734517169978 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-1734517169978 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-1734517169978 .cluster text{fill:#333;}#mermaid-1734517169978 .cluster span{color:#333;}#mermaid-1734517169978 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-1734517169978 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}</style><g><g class="output"><g class="clusters"></g><g class="edgePaths"><g style="opacity:1" id="L-CLIENT-DECIDE" class="edgePath LS-CLIENT LE-DECIDE"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead49)" d="M111.25847085674158,47L103.69651217228466,51.166666666666664C96.13455348782772,55.333333333333336,81.01063611891387,63.666666666666664,73.44867743445694,72C65.88671875,80.33333333333333,65.88671875,88.66666666666667,65.88671875,97C65.88671875,105.33333333333333,65.88671875,113.66666666666667,65.88671875,122C65.88671875,130.33333333333334,65.88671875,138.66666666666666,65.88671875,142.83333333333334L65.88671875,147" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead49"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-CLIENT-CAPTURE" class="edgePath LS-CLIENT LE-CAPTURE"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead50)" d="M182.03840414325842,47L189.60036282771534,51.166666666666664C197.16232151217227,55.333333333333336,212.28623888108612,63.666666666666664,219.84819756554307,72C227.41015625,80.33333333333333,227.41015625,88.66666666666667,227.41015625,97C227.41015625,105.33333333333333,227.41015625,113.66666666666667,227.41015625,122C227.41015625,130.33333333333334,227.41015625,138.66666666666666,227.41015625,142.83333333333334L227.41015625,147" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead50"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-CAPTURE-Kafka" class="edgePath LS-CAPTURE LE-Kafka"><path style="fill:none" marker-end="url(#arrowhead51)" d="M227.41015625,186L227.41015625,190.16666666666666C227.41015625,194.33333333333334,227.41015625,202.66666666666666,227.41015625,211C227.41015625,219.33333333333334,227.41015625,227.66666666666666,227.41015625,231.83333333333334L227.41015625,236" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead51"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-Kafka-PLUGINS" class="edgePath LS-Kafka LE-PLUGINS"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead52)" d="M227.41015625,275L227.41015625,279.1666666666667C227.41015625,283.3333333333333,227.41015625,291.6666666666667,227.41015625,300C227.41015625,308.3333333333333,227.41015625,316.6666666666667,227.41015625,325C227.41015625,333.3333333333333,227.41015625,341.6666666666667,227.41015625,350C227.41015625,358.3333333333333,227.41015625,366.6666666666667,227.41015625,370.8333333333333L227.41015625,375" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead52"><path style="fill:#333" d="M 0 0 L 0 0 L 0 0 z"></path></marker></defs></g><g style="opacity:1" id="L-PLUGINS-PERSONS" class="edgePath LS-PLUGINS LE-PERSONS"><path style="fill:none" marker-end="url(#arrowhead53)" d="M183.3520014044944,414L173.9378657537453,418.1666666666667C164.52373010299627,422.3333333333333,145.69545880149812,430.6666666666667,136.28132315074905,439C126.8671875,447.3333333333333,126.8671875,455.6666666666667,126.8671875,459.8333333333333L126.8671875,464" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead53"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-PLUGINS-Kafka2" class="edgePath LS-PLUGINS LE-Kafka2"><path style="fill:none" marker-end="url(#arrowhead54)" d="M271.4683110955056,414L280.8824467462547,418.1666666666667C290.29658239700376,422.3333333333333,309.1248536985019,430.6666666666667,318.5389893492509,439C327.953125,447.3333333333333,327.953125,455.6666666666667,327.953125,459.8333333333333L327.953125,464" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead54"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-Kafka2-ClickHouse" class="edgePath LS-Kafka2 LE-ClickHouse"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead55)" d="M327.953125,503L327.953125,507.1666666666667C327.953125,511.3333333333333,327.953125,519.6666666666666,327.953125,528C327.953125,536.3333333333334,327.953125,544.6666666666666,327.953125,553C327.953125,561.3333333333334,327.953125,569.6666666666666,327.953125,578C327.953125,586.3333333333334,327.953125,594.6666666666666,327.953125,598.8333333333334L327.953125,603" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead55"><path style="fill:#333" d="M 0 0 L 0 0 L 0 0 z"></path></marker></defs></g></g><g class="edgeLabels"><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-CLIENT&#x27; L-LE-DECIDE" id="L-L-CLIENT-DECIDE"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-CLIENT&#x27; L-LE-CAPTURE" id="L-L-CLIENT-CAPTURE"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-CAPTURE&#x27; L-LE-Kafka" id="L-L-CAPTURE-Kafka"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-Kafka&#x27; L-LE-PLUGINS" id="L-L-Kafka-PLUGINS"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-PLUGINS&#x27; L-LE-PERSONS" id="L-L-PLUGINS-PERSONS"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-PLUGINS&#x27; L-LE-Kafka2" id="L-L-PLUGINS-Kafka2"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-Kafka2&#x27; L-LE-ClickHouse" id="L-L-Kafka2-ClickHouse"></span></div></foreignObject></g></g></g><g class="nodes"><g style="opacity:1" transform="translate(146.6484375,27.5)" id="flowchart-CLIENT-40" class="node default"><rect class="label-container" height="39" width="127.359375" y="-19.5" x="-63.6796875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-53.6796875,-9.5)"><foreignObject height="19" width="107.359375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Client Library</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(65.88671875,166.5)" id="flowchart-DECIDE-41" class="node default"><rect class="label-container" height="39" width="109.03125" y="-19.5" x="-54.515625" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-44.515625,-9.5)"><foreignObject height="19" width="89.03125"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">/decide API</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(227.41015625,166.5)" id="flowchart-CAPTURE-42" class="node default"><rect class="label-container" height="39" width="114.015625" y="-19.5" x="-57.0078125" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-47.0078125,-9.5)"><foreignObject height="19" width="94.015625"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Capture API</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(227.41015625,394.5)" id="flowchart-PLUGINS-43" class="node default"><rect class="label-container" height="39" width="124.71875" y="-19.5" x="-62.359375" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-52.359375,-9.5)"><foreignObject height="19" width="104.71875"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Plugin server</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(126.8671875,483.5)" id="flowchart-PERSONS-44" class="node default"><rect class="label-container" height="39" width="237.734375" y="-19.5" x="-118.8671875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-108.8671875,-9.5)"><foreignObject height="19" width="217.734375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">PostgreSQL (persons table)</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(327.953125,483.5)" id="flowchart-Kafka2-45" class="node default"><rect class="label-container" height="39" width="64.4375" y="-19.5" x="-32.21875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-22.21875,-9.5)"><foreignObject height="19" width="44.4375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Kafka</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(227.41015625,255.5)" id="flowchart-Kafka-51" class="node default"><rect class="label-container" height="39" width="64.4375" y="-19.5" x="-32.21875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-22.21875,-9.5)"><foreignObject height="19" width="44.4375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Kafka</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(327.953125,622.5)" id="flowchart-ClickHouse-59" class="node default"><rect class="label-container" height="39" width="108.265625" y="-19.5" x="-54.1328125" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-44.1328125,-9.5)"><foreignObject height="19" width="88.265625"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">ClickHouse</div></foreignObject></g></g></g></g></g></g></svg></div><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><div></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">83c2eb57-51f2-536e-bfcd-8e8e6d40cd2f</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 the advice 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><div></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">3a710fb3-d9a3-5c2f-9a52-429d6b1649e9</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="https://posthog.com/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><div></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">b250de32-d780-57eb-a92f-6db074f3d656</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 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 occured. 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><div></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">4a4af998-8675-50dc-8b6a-0801c7c4d44a</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>]]></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">8bd9857c-b222-58a8-b890-6855d54a5b31</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 an analytics 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><div></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">c8146c05-7039-5ac3-af4c-d825e4975663</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><div></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">999aa2f3-2748-5c5e-b10a-a65e6ccd33fe</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 product analytics platform is a 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><div></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">d9da18c9-1cfb-5687-971d-ef6529e76e29</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><div></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">7968a77a-cf8b-58a6-8d75-10748b90b43a</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><div></div><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><div></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">464938d7-38ff-5b65-9349-68ac51111961</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>]]></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">e3a056b1-2277-5dda-87f2-f03c55f4be1c</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 complex business intelligence tools — 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>]]></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">4b331b7d-fcb9-5ce3-9b48-713b82ddff8e</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><div></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">6e675473-af7a-5239-9a1f-6fdf8dabb491</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><div></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">5b335393-88bf-548e-b9cc-330035f78611</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="/manual/organizations-and-projects#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="/manual/organizations-and-projects#ways-of-organizing-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></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><div></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">9ad55d0c-3b09-5ae2-a760-6500661a2ec1</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><div></div><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 product analytics 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_api_key&gt;&#x27;, {api_host: &#x27;&lt;ph_client_api_host&gt;&#x27;, person_profiles: &#x27;identified_only&#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><div></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  product analytics team  (plus…]]></description><link>https://posthog.com/blog/rome-hackathon</link><guid isPermaLink="false">4a64ed9d-67de-55df-98ef-aaced16ff669</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 <a href="/teams/product-analytics">product analytics team</a> (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="https://posthog.com/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 <a href="https://github.com/PostHog/feedback-app/pull/1">here</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><div></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">78199365-1a5d-5f22-9b6f-528b0223ba27</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><blockquote><p>Andy Vandervell is Content Marketing Lead at PostHog. He edits and writes the blog and runs our newsletter, HogMail. Prior to PostHog, Andy was a journalist and editorial strategist at WIRED, Time Inc. UK and others. He&#x27;s all about them words and those SEO keywords, basically.</p></blockquote><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><div></div><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="https://posthog.com/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="/using-posthog">PostHog product manual</a>: Need to learn how to build an insight, a cohort, or how different insights work? This is the place to start.</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><div></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">67173d6d-e0bf-561b-8ba4-977309b594f0</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><div></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">8e45c91b-0632-53da-84ec-adff4c0561c9</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><div></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">0d7a23ef-bf42-5fe8-80d6-6228aebd5a7a</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-behaviour">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><div></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">caea5f47-5b0b-5df5-9696-0646093741ea</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><div></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">0868181b-60bc-5d6c-b078-6d2df565773c</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="https://posthog.com/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="https://posthog.com/docs/user-guides/funnels#choosing-breakdown-property-behaviour">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="https://posthog.com/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><div></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">1e859643-4db6-5145-8f25-fc8e8419705f</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 platform 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 platform 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><div></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">df27bb9b-c328-5392-aca5-c88435a3fa1e</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="https://posthog.com/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="https://posthog.com/docs/user-guides/actions">action</a> or <a href="https://posthog.com/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 – or use our <a href="/apps/sentry-connector">Sentry Connector</a> to track errors as events.  </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 platforms, 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><div></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">6325294c-0f5c-5ac6-90f7-7f5149701d7e</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><div></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">6006fff1-452d-524a-afc9-08439c79e2c3</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@v2

            - name: Set up Python
              uses: actions/setup-python@v2
              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@v2

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

          - name: Install dependencies
            run: yarn

          - 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@v2

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

            - name: Install package.json dependencies with Yarn
              run: yarn

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

            - name: Lint with ESLint
              run: yarn 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@v2
              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@v2

            - 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@v2
              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>Leters 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@v2

            - name: Set up Python
              uses: actions/setup-python@v2
              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@v2
              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><div></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">f326e78d-12fe-5406-9273-55546ae15114</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="https://posthog.com/docs/self-host/configure/email">email configuration required</a>). See <a href="https://posthog.com/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><div></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">cd7ad5a9-6765-5f98-bfb0-81be89fd8d9b</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><div></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">1f082385-a9d0-51b1-9759-cff3a8ee7263</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>]]></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">c094cfd1-42ce-570f-8f30-cf28677b67bb</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><div></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">49ebfe2f-1adf-5344-8a6d-b0aff5d435d8</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 behaviour. 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><div></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">28c06e32-36f2-50b7-a05b-b80e458de667</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>]]></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">943ab366-fd0f-5788-a9c4-68f443e4ba82</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 behaviour 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 behaviour 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><div></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">1ffcaaca-14d0-5886-9339-bc87d7f19289</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 meet people for advice, 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><div></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">99185c8e-7fad-5609-9477-cd66870c452b</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/growth/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><div></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">ac0c8e79-4b76-59f2-9195-2798e7c3f164</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>]]></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">5f5754a4-4c93-50f2-b60e-4d4562812992</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><div></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">33b819e0-ae44-500a-88e5-c0137ec75600</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><div></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">c841ba8b-5b3d-543e-bd63-b60ae1f3f0df</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 <a href="https://github.com/PostHog/posthog/issues/8595#issuecomment-1056916848">here</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></div><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>]]></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">9f98c557-90ff-5a37-91b6-2b5b59b26ddd</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><div></div><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>]]></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">3d0ccc6d-9a1b-51fd-a1cb-3cb3efa26a88</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>]]></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">f3edf84f-ff08-5af3-a445-a57140923017</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><div class="mermaid" data-processed="true"><svg viewBox="0 0 390.0859375 650" style="max-width:390.0859375px" aria-labelled-by="chart-title-mermaid-1734517170482,chart-desc-mermaid-1734517170482" role="img" xmlnsXLink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-1734517170482"><title id="chart-title-mermaid-1734517170482"></title><desc id="chart-desc-mermaid-1734517170482"></desc><style>#mermaid-1734517170482 {font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1734517170482 .error-icon{fill:#552222;}#mermaid-1734517170482 .error-text{fill:#552222;stroke:#552222;}#mermaid-1734517170482 .edge-thickness-normal{stroke-width:2px;}#mermaid-1734517170482 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1734517170482 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1734517170482 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1734517170482 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1734517170482 .marker{fill:#333333;stroke:#333333;}#mermaid-1734517170482 .marker.cross{stroke:#333333;}#mermaid-1734517170482 svg{font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:16px;}#mermaid-1734517170482 .label{font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;color:#333;}#mermaid-1734517170482 .cluster-label text{fill:#333;}#mermaid-1734517170482 .cluster-label span{color:#333;}#mermaid-1734517170482 .label text,#mermaid-1734517170482 span{fill:#333;color:#333;}#mermaid-1734517170482 .node rect,#mermaid-1734517170482 .node circle,#mermaid-1734517170482 .node ellipse,#mermaid-1734517170482 .node polygon,#mermaid-1734517170482 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1734517170482 .node .label{text-align:center;}#mermaid-1734517170482 .node.clickable{cursor:pointer;}#mermaid-1734517170482 .arrowheadPath{fill:#333333;}#mermaid-1734517170482 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-1734517170482 .flowchart-link{stroke:#333333;fill:none;}#mermaid-1734517170482 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-1734517170482 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-1734517170482 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-1734517170482 .cluster text{fill:#333;}#mermaid-1734517170482 .cluster span{color:#333;}#mermaid-1734517170482 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-1734517170482 :root{--mermaid-font-family:&quot;trebuchet ms&quot;,verdana,arial,sans-serif;}</style><g><g class="output"><g class="clusters"></g><g class="edgePaths"><g style="opacity:1" id="L-CLIENT-DECIDE" class="edgePath LS-CLIENT LE-DECIDE"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead49)" d="M111.25847085674158,47L103.69651217228466,51.166666666666664C96.13455348782772,55.333333333333336,81.01063611891387,63.666666666666664,73.44867743445694,72C65.88671875,80.33333333333333,65.88671875,88.66666666666667,65.88671875,97C65.88671875,105.33333333333333,65.88671875,113.66666666666667,65.88671875,122C65.88671875,130.33333333333334,65.88671875,138.66666666666666,65.88671875,142.83333333333334L65.88671875,147" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead49"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-CLIENT-CAPTURE" class="edgePath LS-CLIENT LE-CAPTURE"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead50)" d="M182.03840414325842,47L189.60036282771534,51.166666666666664C197.16232151217227,55.333333333333336,212.28623888108612,63.666666666666664,219.84819756554307,72C227.41015625,80.33333333333333,227.41015625,88.66666666666667,227.41015625,97C227.41015625,105.33333333333333,227.41015625,113.66666666666667,227.41015625,122C227.41015625,130.33333333333334,227.41015625,138.66666666666666,227.41015625,142.83333333333334L227.41015625,147" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead50"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-CAPTURE-Kafka" class="edgePath LS-CAPTURE LE-Kafka"><path style="fill:none" marker-end="url(#arrowhead51)" d="M227.41015625,186L227.41015625,190.16666666666666C227.41015625,194.33333333333334,227.41015625,202.66666666666666,227.41015625,211C227.41015625,219.33333333333334,227.41015625,227.66666666666666,227.41015625,231.83333333333334L227.41015625,236" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead51"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-Kafka-PLUGINS" class="edgePath LS-Kafka LE-PLUGINS"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead52)" d="M227.41015625,275L227.41015625,279.1666666666667C227.41015625,283.3333333333333,227.41015625,291.6666666666667,227.41015625,300C227.41015625,308.3333333333333,227.41015625,316.6666666666667,227.41015625,325C227.41015625,333.3333333333333,227.41015625,341.6666666666667,227.41015625,350C227.41015625,358.3333333333333,227.41015625,366.6666666666667,227.41015625,370.8333333333333L227.41015625,375" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead52"><path style="fill:#333" d="M 0 0 L 0 0 L 0 0 z"></path></marker></defs></g><g style="opacity:1" id="L-PLUGINS-PERSONS" class="edgePath LS-PLUGINS LE-PERSONS"><path style="fill:none" marker-end="url(#arrowhead53)" d="M183.3520014044944,414L173.9378657537453,418.1666666666667C164.52373010299627,422.3333333333333,145.69545880149812,430.6666666666667,136.28132315074905,439C126.8671875,447.3333333333333,126.8671875,455.6666666666667,126.8671875,459.8333333333333L126.8671875,464" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead53"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-PLUGINS-Kafka2" class="edgePath LS-PLUGINS LE-Kafka2"><path style="fill:none" marker-end="url(#arrowhead54)" d="M271.4683110955056,414L280.8824467462547,418.1666666666667C290.29658239700376,422.3333333333333,309.1248536985019,430.6666666666667,318.5389893492509,439C327.953125,447.3333333333333,327.953125,455.6666666666667,327.953125,459.8333333333333L327.953125,464" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead54"><path style="stroke-width:1;stroke-dasharray:1, 0" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity:1" id="L-Kafka2-ClickHouse" class="edgePath LS-Kafka2 LE-ClickHouse"><path style="fill:none;stroke-width:2px;stroke-dasharray:3" marker-end="url(#arrowhead55)" d="M327.953125,503L327.953125,507.1666666666667C327.953125,511.3333333333333,327.953125,519.6666666666666,327.953125,528C327.953125,536.3333333333334,327.953125,544.6666666666666,327.953125,553C327.953125,561.3333333333334,327.953125,569.6666666666666,327.953125,578C327.953125,586.3333333333334,327.953125,594.6666666666666,327.953125,598.8333333333334L327.953125,603" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead55"><path style="fill:#333" d="M 0 0 L 0 0 L 0 0 z"></path></marker></defs></g></g><g class="edgeLabels"><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-CLIENT&#x27; L-LE-DECIDE" id="L-L-CLIENT-DECIDE"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-CLIENT&#x27; L-LE-CAPTURE" id="L-L-CLIENT-CAPTURE"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-CAPTURE&#x27; L-LE-Kafka" id="L-L-CAPTURE-Kafka"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-Kafka&#x27; L-LE-PLUGINS" id="L-L-Kafka-PLUGINS"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-PLUGINS&#x27; L-LE-PERSONS" id="L-L-PLUGINS-PERSONS"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-PLUGINS&#x27; L-LE-Kafka2" id="L-L-PLUGINS-Kafka2"></span></div></foreignObject></g></g><g style="opacity:1" transform="" class="edgeLabel"><g class="label" transform="translate(0,0)"><rect height="0" width="0" ry="0" rx="0"></rect><foreignObject height="0" width="0"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml"><span class="edgeLabel L-LS-Kafka2&#x27; L-LE-ClickHouse" id="L-L-Kafka2-ClickHouse"></span></div></foreignObject></g></g></g><g class="nodes"><g style="opacity:1" transform="translate(146.6484375,27.5)" id="flowchart-CLIENT-40" class="node default"><rect class="label-container" height="39" width="127.359375" y="-19.5" x="-63.6796875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-53.6796875,-9.5)"><foreignObject height="19" width="107.359375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Client Library</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(65.88671875,166.5)" id="flowchart-DECIDE-41" class="node default"><rect class="label-container" height="39" width="109.03125" y="-19.5" x="-54.515625" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-44.515625,-9.5)"><foreignObject height="19" width="89.03125"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">/decide API</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(227.41015625,166.5)" id="flowchart-CAPTURE-42" class="node default"><rect class="label-container" height="39" width="114.015625" y="-19.5" x="-57.0078125" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-47.0078125,-9.5)"><foreignObject height="19" width="94.015625"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Capture API</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(227.41015625,394.5)" id="flowchart-PLUGINS-43" class="node default"><rect class="label-container" height="39" width="124.71875" y="-19.5" x="-62.359375" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-52.359375,-9.5)"><foreignObject height="19" width="104.71875"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Plugin server</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(126.8671875,483.5)" id="flowchart-PERSONS-44" class="node default"><rect class="label-container" height="39" width="237.734375" y="-19.5" x="-118.8671875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-108.8671875,-9.5)"><foreignObject height="19" width="217.734375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">PostgreSQL (persons table)</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(327.953125,483.5)" id="flowchart-Kafka2-45" class="node default"><rect class="label-container" height="39" width="64.4375" y="-19.5" x="-32.21875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-22.21875,-9.5)"><foreignObject height="19" width="44.4375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Kafka</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(227.41015625,255.5)" id="flowchart-Kafka-51" class="node default"><rect class="label-container" height="39" width="64.4375" y="-19.5" x="-32.21875" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-22.21875,-9.5)"><foreignObject height="19" width="44.4375"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">Kafka</div></foreignObject></g></g></g><g style="opacity:1" transform="translate(327.953125,622.5)" id="flowchart-ClickHouse-59" class="node default"><rect class="label-container" height="39" width="108.265625" y="-19.5" x="-54.1328125" ry="0" rx="0"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-44.1328125,-9.5)"><foreignObject height="19" width="88.265625"><div style="display:inline-block;white-space:nowrap" xmlns="http://www.w3.org/1999/xhtml">ClickHouse</div></foreignObject></g></g></g></g></g></g></svg></div><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="https://posthog.com/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><div></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">6fbe87a1-eb59-5467-a928-fbdd875d2466</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">8a44222e-2e40-5eb9-be44-c6ab3a0e37da</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">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">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">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">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">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><div></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">011039d7-6d6d-580b-abd3-60dd3a56767c</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">071a2646-8b8e-511b-9b8b-a4f7a5d5b9d8</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">941acca4-81b2-590d-9279-40c396e2e0a1</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><div></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">8e350d0b-b14b-542f-82de-af18f82a7031</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>]]></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">4eea488d-baff-5ce8-9e9c-b2e104e59e5f</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><div></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">c0de60f4-ea4b-575a-8e0a-ec71e85b8597</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><div></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">a4649924-4924-5533-8b81-58864828b03f</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 Opimize 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><div></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">518c4611-8fb7-5e38-9483-145718a3e4b7</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><div></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">076b25c4-e6af-5f99-b651-09fef2bdd9b9</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">f7cf688b-3d5d-5ff5-b579-a743039663bb</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><div></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">9e9890a1-7268-586a-b625-7bd6f4e553d6</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/growth/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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">803cd843-88a4-536f-aa1b-57d8dca86b5b</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></div><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>]]></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">bdc7d1d1-9b0d-5c91-af14-3ffc925c5540</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. To use this version, you must <a href="/docs/migrate/migrate-between-posthog-instances" target="_blank">upgrade to ClickHouse</a> first.</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="https://posthog.com/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. Read <a href="/docs/migrate/migrate-between-posthog-instances">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 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="/community/profiles/62">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="/community/profiles/49">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><div></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">a2af18dc-d332-5859-b8cd-b8d7eb0eba28</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><div></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">3b76b6c1-ddd3-54f0-977f-75a9d9437895</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>usage-based pricing 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><div></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">22b48ec6-74ab-5549-bd1e-8cae5592c021</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 behaviours, 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 behaviour 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 behaviours 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><div></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">3df1096c-3018-57bb-bfa9-390450be9c10</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 behaviour 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><div></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">ce043825-c6ce-58c2-9fb6-50743f254936</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><div></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">b451b2cd-5614-505f-8fc0-1eeb36597847</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 iniatives. </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><div></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">603908d3-66fe-538b-8f3a-3dcf2f6d6de9</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>]]></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">63f0220e-d5f8-58cd-812b-5c656fa2ee93</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 business intelligence (BI) tools 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 behaviour. 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 a <em>product</em> analytics platform. </p><p>There are lots of self-service product analytics platforms, but naturally we think PostHog is the best. Not only is PostHog entirely self-service, but it’s also an all-in-one toolset 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><div></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">3511ac4b-c575-540b-a141-25be24e7b96d</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="https://posthog.com/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/growth/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>]]></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">0558c85a-9821-559d-a312-49f924695639</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></li><li><a href="#what-is-the-best-way-to-measure-product-engagement">What is the best way to measure product engagement?</a></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="https://posthog.com/docs/user-guides/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="https://posthog.com/docs/user-guides/feature-flags">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="https://posthog.com/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="https://posthog.com/docs/user-guides/sessions">Session Recording</a>, <a href="https://posthog.com/docs/user-guides/toolbar#inspecting-elements">Heatmaps</a>, <a href="https://posthog.com/docs/user-guides/cohorts">Cohorts</a> and <a href="https://posthog.com/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><div></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">3a99631e-7468-5126-b566-3c849b62a5ee</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><div></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">4e365f96-d974-5466-80e8-50ffc79391b7</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 teams 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>]]></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">66d20c76-892c-5fc1-9056-022c5d539618</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 our pricing 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><div></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">e9d70006-b98c-5007-819f-9fa658fd31f9</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">58118fc6-bf57-5854-bb57-9428cb571ec5</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">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">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">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">OPTIMIZE TABLE events FINAL
</code></pre><p>After backfilling, running the updated query speeds things up significantly:</p><pre><code class="language-sql">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">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 <a href="https://github.com/PostHog/posthog/blob/c23704b3909ae8ebb827e6a43453e32b3d3487bd/ee/clickhouse/materialized_columns/analyze.py#L42-L119">here</a> and <a href="https://github.com/PostHog/posthog/blob/c23704b3909ae8ebb827e6a43453e32b3d3487bd/ee/clickhouse/materialized_columns/columns.py#L37-L130">here</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">e6a0b3a3-f0a5-509e-8003-533f0443b635</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="#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></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/user-guides/organizations-and-projects#private-projects">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="blog/../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 <a href="/teams/infrastructure">Platform Team</a>.</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><div></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">64c0f1c5-a31d-5c5b-a1e1-fba90919a2cc</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 your product analytics platform 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 is 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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">68020792-1536-5fc2-bac8-570fc94722c1</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">be31da84-ea19-5376-8a46-000f09f2ccdb</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 80’s 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><div></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">5000afd1-3009-58da-a261-726d4b380ca9</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 product analytics 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 <a href="/teams/website-vibes">amazing design team</a>, 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 <a href="/handbook/strategy/business-model#why-would-you-work-on-the-community-edition">community is core to our business</a>.</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> <a href="https://noti.st/leggetter/9B23EW/defining-the-roles-within-developer-relations-v0-1-0#s6yhNbi">Source: Most popular roles within Developer Relations</a></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:<ul><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></ul></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 product analytics 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 for write docs, update SDKs, 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:<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></li></ul><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><div></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">d08ee0e0-84a8-51df-b4e9-0481b669662c</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>]]></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">e7c1b7fe-313c-5b6d-a684-6a140777ecc6</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="https://posthog.com/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="/community/profiles/3">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="/community/profiles/69">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><div></div>]]></content:encoded></item><item><title><![CDATA[How PostHog uses Wren to offset carbon emissions during offsites]]></title><description><![CDATA[Earlier this month, we finished our first PostHog offsite of the year near Porto, in Portugal. Team members travelled from America, Estonia, The…]]></description><link>https://posthog.com/blog/carbon-offset-wren</link><guid isPermaLink="false">fc959149-2b4a-5c5c-b448-7e57f3f1e323</guid><dc:creator><![CDATA[Joe Martin]]></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/wren.png" length="0" type="image/png"/><content:encoded><![CDATA[<p>Earlier this month, we finished our first PostHog offsite of the year near Porto, in Portugal. Team members travelled from America, Estonia, The United Kingdom, and Poland to spend a week living together and, in many cases, meeting for the first time.</p><p>As you can imagine, the offsite is both a working event and a social occasion for the team, with focus split between planning for the future and spending time together. We run workshops to inform strategy, feedback sessions to create rapport, and games nights to build relationships. The latter is especially important for us as an otherwise all-remote company, because it’s often easier to work remotely if you have a better sense of who your colleagues are. </p><p>Given that the offsites are such international events, a common concern is about the environmental impact. Many people ask whether we could run offsites online instead, since we run all other meetings in this way. We have tried this in the past, but we’ve found it makes sessions more draining and less impactful. Some interactions are just better in person. </p><p>However, we do want to limit our environmental impact and minimize our carbon footprint. That’s why we work with <a href="https://www.wren.co/">Wren</a> to offset the carbon our teams generate — not just for the offsite, but across all the work and travel they do. </p><p>The principle behind carbon offsetting is simple: if you emit a ton of CO2, you can balance out those emissions by also removing a ton of CO2 from the atmosphere - or preventing another ton. Wren lets us do this by analyzing our usage and redirecting some money from us towards causes with proven real-world impact. </p><p>This way, we offset the carbon footprint of our international travel through projects such as regenerative forestry and rainforest protection.</p><p>Unfortunately, Wren doesn’t have any projects specifically focused on supporting hedgehog wildlife, but that’s OK — it’s why we <a href="https://www.hertswildlifetrust.org.uk/shop#!/Hedgehog-Sponsorship/p/100527218/category=27439637">sponsor a hedgehog</a> for every team member that joins the company. </p><p>Carbon offsetting won&#x27;t fix the climate change crisis on its own - and we don’t view it as a reason to rest on our laurels. We take additional steps to minimize our carbon footprint such as limiting the use of single-use plastics at our events and in <a href="https://merch.posthog.com/collections/all">our merchandise</a>.</p><p>However, while carbon offsetting isn’t a cure-all, it remains an effective tool in limiting our environmental impact. We’re excited to offer it as a benefit for all team members. You can check out <a href="https://posthog.com/careers">other benefits we offer</a> or even <a href="https://github.com/PostHog">submit an issue in GitHub</a> if you have ideas for how we can be even more climate friendly.</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>]]></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">8d0b2cac-ad26-5833-9e21-3b99c9e758ad</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><div></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">6c92dfc2-859e-56a6-b9ac-a3b9f2ea0168</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>]]></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">3c32fa2b-e420-5243-a39b-aa85b7b697cb</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><div></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">d1708b9e-1e22-5aa2-b8d5-dc8aae903e08</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><div></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">82449741-fb73-5e41-9839-f11d9f1e9920</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">35182466-7e65-5524-af3d-354e62a13528</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">7e921911-21f1-5b4d-8a1c-1cd49d01342a</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, can I get advice?&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 <a href="https://posthog.com/product-features">here</a> and sign up for a free trial today.</p><div></div>]]></content:encoded></item><item><title><![CDATA[Introducing Joe Martin - Our first Product Marketer]]></title><description><![CDATA[Before joining PostHog,  Joe Martin  had never owned a Mac. The former tech and games journalist previously did everything on PC, but joining PostHog…]]></description><link>https://posthog.com/blog/joe-martin-intro</link><guid isPermaLink="false">5b8b6227-99c2-501f-96e6-c208957c29d5</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, <a href="/community/profiles/59">Joe Martin</a> 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>]]></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">002642a9-cc2f-5289-81d7-12454211d5ca</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 45mins 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>]]></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">67968a9c-3328-5d64-a1a6-7be7cbb725d7</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><div></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">e3f25724-b25d-598f-816e-17f86c190513</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><div></div><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><div></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">fbe1c730-6c85-5e7c-9040-73aa3b4def66</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>]]></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">39e109e9-6779-54c4-868d-3b3e35434b9e</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">96190d2a-d1ad-5474-a582-c7b8320258c4</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 <a href="/handbook/strategy/overview">here</a>.</p><div></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">4446a895-2649-5b44-8958-5587abd99677</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><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>]]></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">dfccfab5-7b63-5852-9695-304d8626bffb</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">95ea4b13-516a-5fc9-b89f-5b66378207e9</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>]]></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">8a8621bd-b2a1-5306-8b50-6c3a10ccecb5</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, product analytics 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 David Cramer (Founder, Sentry).</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">3566021a-8596-55fa-94b3-7a08506ad51d</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 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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">583162ca-d273-5dbc-95a0-920babb851bd</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="/blog/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><div></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">7e4afa61-c606-5b4d-9dbf-9a91596b9413</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="https://share.hsforms.com/1-IVCY9gNRvaZBajMt_UPIg4559u">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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">2bf3e62e-04d7-5f78-8456-f031583d0086</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><div></div><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 30min 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><div></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">b4d22a66-9792-5ae1-b90b-8de7c929d7a6</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><div></div><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><div></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">566f1670-1602-56f4-b901-b53ad3d863b5</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="https://sentry.io">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><div></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">25cee81f-d3ee-5472-becf-b1bcd24a4fec</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 communication skills 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><div></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">c2a5cec2-e2bd-5b6e-a6c2-bfa51429a82a</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><div></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">d524f6f4-e77f-5517-bbc9-73a280314a93</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><div></div><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, contact us on <i><a href="mailto:sales@posthog.com">sales@posthog.com</a></i>.</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><div></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">8fd60dfd-9d95-5fec-a37f-fc2097543e77</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><div></div><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><div></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">de58cadc-8bcd-57e0-b56e-e04948e1be87</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="https://posthog.com/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-api-key-autofill-in-docs-for-cloud-users"><a href="https://github.com/PostHog/posthog.com/pull/998">Project API Key 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 API Key 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><div></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">dadf2c2f-10ba-5344-97c6-5f3c22357523</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><p>For a start, how about <a href="https://posthog.com/docs/libraries/sentry">integrating PostHog with Sentry</a> and watching all recordings with an <code>$exception</code> event in them?</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><div></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">4fe9a3a7-3f2b-5c96-8ed7-f60e0b60b9bb</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><div></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">d2e38de4-f708-5b8e-a4ec-d9c5860294d3</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 David Cramer (Founder, Sentry) 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, product analytics 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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">eda75a4b-1b72-5482-ac78-222822d63224</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><div></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">823fb39f-cd94-517d-8e3b-05e46051f63d</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><div></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">399992c9-e8e6-52b2-888f-d2bde5e9e5ab</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>To set up the integration you can read the step-by-step instructions on the dedicated <a href="/docs/libraries/sentry">Sentry Integration page</a>.</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><div></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">01e234e4-52e3-53af-bca2-541e13032fca</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 data analytics 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 contact us at <em><a href="mailto:sales@posthog.com">sales@posthog.com</a></em> 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 (see: <a href="/handbook/company/values#everyone-codes">everyone codes</a>).</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><div></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">25d16611-0673-5eaa-8cf9-ef6797026f5d</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="https://share.hsforms.com/1-IVCY9gNRvaZBajMt_UPIg4559u">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>/decide</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 /decide 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 /decide 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><div></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">8fd2de72-22e6-592e-bd6a-d009293a6262</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">3fe47a61-587f-5577-9e8a-4c27ed154818</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><div></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">862c5a89-e399-5670-92ca-a768a19c7a2a</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, contact us at <em><a href="mailto:sales@posthog.com">sales@posthog.com</a></em> or via <a href="https://share.hsforms.com/1-IVCY9gNRvaZBajMt_UPIg4559u">this form</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 <a href="https://github.com/PostHog/posthog/pull/1421">here</a> and <a href="https://github.com/PostHog/posthog/pull/1517">there</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><div></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">9c7d10d8-5dcc-5bee-9217-93a6d1f86337</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>Communication is perhaps the single most important value 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, Senegal, 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><div></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">092a0770-3851-5c7e-86df-440c12ea4223</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><div></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">dc7a3113-2be8-51e5-952f-cb29a7c95a7a</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><div></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">85d98b99-bdcc-5ef5-b312-b5ac31f3396d</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><p>### How do you manage the product?</p><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>]]></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">262a50f9-db1a-55fe-b330-aba7f5a6c036</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 team-mates 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>enhanced ctrl + click new tab opening feature <a href="https://github.com/PostHog/posthog/pull/1248"></a></li><li>Massively speed up <a href="https://github.com/PostHog/posthog/pull/1182">loading live actions</a></li><li>Fix password validation and improve minimums notice (closes #1197) <a href="https://github.com/PostHog/posthog/pull/1204"></a></li><li>Closes #1180 worker fails if timestamp is invalid <a href="https://github.com/PostHog/posthog/pull/1181"></a></li><li>(abhijitghate)[https://github.com/abhijitghate] 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><div></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">151c3932-a18b-5aa6-b161-a17ce05a3969</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><div></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">30f71af7-6a1c-5179-8ed7-028bb300af6c</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><div></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">5194b919-76cc-598d-8bc0-4b51e9ddfdd3</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 team-mates 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><div></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">0d8a98a2-988a-5b35-8eae-d6f85003566e</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 <a href="https://github.com/PostHog/posthog/issues/1129">here</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="https://posthog.com/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><div></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">090ac396-8ddb-5006-ad6d-572c4c516740</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><div></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">343a3ce7-1e78-5a80-b3db-61488cb78c88</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 analytics platform you can host yourself. We help you build better products faster, without user data ever leaving your infrastructure.</p></blockquote><div></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">a6a4d596-63cc-5c70-be82-4a3ed6f31feb</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><div></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">39fcf8fd-64db-5bd1-8f66-3415d56cd048</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><div></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">05cf6e3e-142e-508d-9bbf-f66aac360899</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><div></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">7180e0a2-bb4a-59b8-8627-fee65cff22d8</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 priortize 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><div></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">56e0c679-0ca7-5ef5-abfe-59011acae79e</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><div></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">e6169741-68b5-514b-bffb-920fc9bf9386</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><p>### <a href="https://github.com/PostHog/posthog/pull/701">Setup page redesign</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><div></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">5558702e-b05e-57e7-a2e2-99a98a241915</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><div></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">875bf422-9e19-5c61-851e-0747cf5669d1</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><div></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">74e70bd9-964b-54b8-add2-fa3f29e53173</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><p>### <a href="https://github.com/PostHog/posthog/pull/497">UX Improvements to saving Actions</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><div></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">91dc6344-33c9-5467-9971-6c8cd518aa33</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><p>###<a href="https://github.com/PostHog/posthog/pull/420"> Precalculate Events that match Actions</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>]]></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">f966eafa-e0bc-5edf-93c9-8ae529dad94c</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><p>## Favorite issue</p><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><div></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">198c3c64-02e3-5b51-b0fb-cc285af0209e</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><p>## Repo round up</p><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><div></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">3a801152-55d4-5ff8-a623-4be6cdf0137c</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><p>### Adding info to actions</p><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><p>### <a href="https://github.com/PostHog/posthog/pull/312">Add new contributors to README #312</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><div></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">efb33904-7117-5fbd-9005-4fabc58f7a76</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><div></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">d6c5d3f8-f855-5164-b266-b2b2077f6790</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><div></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">0383b07a-3ad3-5e1f-b53e-816038122d24</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 you’re seeking advice 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><div></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">f2cc58f4-409c-59ba-9760-43d590d422a5</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><div></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">c901f365-ff4c-5797-b878-8cb18b63442e</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><div></div><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><div></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">37e2de1d-489d-5ee8-8356-7ad497ff65f8</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 asking for advice 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>]]></content:encoded></item></channel></rss>