Tim Glaser

Co-founder, PostHog

I've been coding since I've been 11, which isn't as long ago as I'd like it to be. Someone first paid me to write code when I was 13 (though I'm sure they regretted it) and someone else gainfully employed me when I was 16.

Originally from the Netherlands, though I quickly moved to London (I do not generally enjoy nice weather) where I joined Arachnys and shortly afterwards met James Hawkins. I went from being a software engineer, to product manager, to "leading" an R&D team, which consisted of just me.

After four years I thought it was time to go do something else and had lined up a new job. Roughly 37 seconds after it was announced James wanted to "grab a beer." While plying me with alcohol, he convinced me to give up this fancy new job and instead start a startup with him.

In my 'spare' time, I fall down snowy mountains, wrestle in the mud over an egg-shaped ball and watch a lot of Bondi beach in order to perfect my Australian accent.

  • Mark
    3 months ago

    Kafka or Warpstream?

    Just finished reading https://posthog.com/newsletter/choosing-technologies where you mention evaluating Warpstream. Has Warpstream now replaced Kafka or did you not go ahead for some reason?

    • Tim
      3 months ago

      We're in the process of moving more workloads to warpstream, but not finished yet!

  • Jack
    5 months ago

    Does it support a many to many relationship?

    Our current user <-> company (group) modal is many to many. E.g

    User A will be in company One and company Two User B will be in company One and company Three ... etc

    So I need to associate the current user with multiple groups of the same type. Is that supported?

    If so, some group events will have an associated user. E.g "User joined group". However some later events happen without a user in a worker process for many at once. E.g "The subscription that covers two companies/groups was cancelled". Is this supported?

    • Tim
      4 months ago

      Groups are associated with events, not with users. So in your example:

      User A

      • "user joined group" event, associated with company A
      • "user joined group" event, associated with company B

      You'd have to send multiple events for each company

      User A

      • "subscription cancelled", associated with company A
      • "subscription cancelled", associated with company B
  • leo
    8 months ago

    Why are my public and private keys for server vs client almost the same?

    The keys are different by two characters tacked onto the end so if you know by public you can guess the server side key by brute force. Why are they not more different? Should be a major concern.

    • Tim
      8 months ago

      Hey Leo,

      I think both of these are public keys. Public keys (ie ones that are fine to share in the frontend, but are also used in backend SDKs by default) start with phc_. Personal api keys, which you only need if you are using local evaluation on the backend, start with phx_. They are passed through the personalApiKey option in the init call of the backend SDK.

      Tim

    • leo
      Author8 months ago

      Gotcha the public key is used by default in the docs, it should be more clear that you should use personal api key for the posthog-node documentation

  • Iman
    a year ago

    Use external sources in Cohorts, Activities, People, etc.

    Hi! I do have my payment gateway's transactional data as an external table in Posthog. The tables have the person distinct id as a column so theoretically we should be able to join them with our other data points. While I am able to write HogQL queries that would join those, I want to be able to create for example, cohorts based on those who do have a transaction assigned to them, or create filters based on the transaction info in insights. So far I have created a view based on the transactions and have joined it to the "persons", "events", & "person_distinct_ids" tables, but I cannot use them in cohorts, insights, or even use them as a HogQL Expression to filter some events. What do you suggest I do to be able to use those transaction records as if they were new kind of events?

    • Tim
      a year agoSolution

      Once you've set up a join onto the person table, you can create an insight that filters on the fields in your view.

      • Click "add filter"
      • Click "Data Warehouse Person Properties"
      • The properties in the view should be listed.

      You should also see all data warehouse tables show up when you add a graph series, under "Data Warehouse"

  • Abe
    a year ago

    Is this feature working?

    I've exported Parquet snapshots of my databases into s3, created a posthog user with the right permissions, however when linking the s3 to posthog I get an error saying the table couldn't be created, and a link to the forum

    • Tim
      a year ago

      Hey Abe, could you file a ticket from the app (click on support on the right). That way we can easily work out the error.

  • Ron
    a year ago

    Trendy AI stuff

    This is quite random but wondering- seems like posthog isn’t talking about AI at all. Not saying they should- in fact maybe it’s a good thing but curious why.

    • Tim
      a year ago

      Hey Ron,

      We've spent quite a lot of time thinking about and debating this.

      We probably have 3 options

      1. Rebrand our existing functionality, like as "AI" , which is something lots of other companies are doing. Call it marketing-driven development. This feels low value for our customers.
      2. Invest a very large amount of money in a moonshot attempt at building something that's world-changingly useful for customers. With the current models out there, this feels like it'll have a low probability of succeeding and would come at the cost of investing in our existing products, and new ones like Data Warehouse and Web Analytics.
      3. Keep an eye on what's coming out and continue doing small, low stake experiments that will mean incremental improvements.

      We've decided on 3. We've played around with a couple of things, like "chat with your HogQL" that we're testing internally, and we'll update you when it comes out. All of these are small and incremental though, which is why we haven't made a big deal out of them.

      Tim

    • Ron
      Authora year ago

      I love that answer. Thank you.

  • Tayyab
    2 years ago

    GDPR Compliance: Self-hosting vs data accessibility by a party including Posthog

    We want to self-host Posthog on our internal cloud and would like to know if a third party including Posthog would have access to our analytics data gathered from user engagement with our SaaS. We want to strictly follow GDPR compliance and therefore, it is very important to us as well our customers and their users that the data must not be accessed by any party than ourselves as a company. I would highly appreciate your help if you could please elaborate on this.

    • Tim
      2 years agoSolution

      If you're self hosting, no other party would have access to any data.

  • George
    2 years ago

    OpenAPI spec

    Is there a hosted OpenAPI spec somewhere? I found one in the Github repo but pointing a client builder at it uses Github as the host :(

  • Gyanesh
    3 years ago
    • Tim
      3 years ago

      Hey Gyanesh, this works for me. Are you still seeing this? If so, could you elaborate?

  • Andrei
    3 years ago

    snapshots, screenshots, videos

    How to get screenshots (as pictures or videos) through API? Is it possible?

    • Tim
      3 years agoSolution

      It's not possible to get screenshots or videos from session recordings. You might be able to use rrvideo with the data that comes back from the API though!

  • Benjamin
    3 years ago

    How to create a funnel query?

    how do I add steps to the query? IE) find user who has viewed page then page leave?

    • Tim
      3 years agoSolution

      You'll need to add two events or two actions to your query.

  • Sebastian
    3 years ago

    Exception when trying to send a posthog.capture to server how can I fix it?

    Exception in thread "PostHog QueueManager thread" java.lang.NoSuchMethodError: 'okhttp3.RequestBody okhttp3.RequestBody.create(java.lang.String, okhttp3.MediaType)' at com.posthog.java.HttpSender.send(HttpSender.java:56) at com.posthog.java.QueueManager.sendAll(QueueManager.java:108) at com.posthog.java.QueueManager.run(QueueManager.java:132) at java.base/java.lang.Thread.run(Thread.java:829)

    • Sebastian
      Author3 years ago

      javax.net.ssl.SSLException: Received fatal alert: internal_error at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133) at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:339) at java.base/sun.security.ssl.Alert$AlertConsumer.consume(Alert.java:293) at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:185) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:172) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1501) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1411) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:451) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:422) at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.kt:379) at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.kt:337) at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:209) at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226) at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106) at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74) at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryA

PostHog.com doesn't use third party cookies - only a single in-house cookie.

No data is sent to a third party.

Ursula von der Leyen, President of the European Commission