> ## Documentation Index
> Fetch the complete documentation index at: https://help.dsalta.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PostHog

> Product analytics — members & access

<Tabs>
  <Tab title="Overview">
    Connect PostHog with a personal API key to sync organization members and run access reviews. Read-only; the key is held by Nango.

    <Info>
      **Read-only access.** DSALTA only reads data from this integration. It never creates, modifies, or deletes anything in your environment, and every remediation step is performed by your team directly in the third-party product.
    </Info>

    <Note>
      DSALTA collects this integration's data when you connect it — you can refresh it at any time with **Sync from integrations** on the **Integrations** page. The compliance checks below re-run once a day at 02:00 America/New\_York.
    </Note>

    ## What DSALTA reads

    DSALTA reads the PostHog user roster — names, emails, roles, join dates and each member's 2FA status, which appears on your **Access** page; and your PostHog resources, which appear on your **Inventory** page. PostHog's members endpoint has no status field — removing someone deletes the membership rather than flagging it inactive — so every member is listed as Active.

    It calls these PostHog endpoints:

    * `/api/users/@me/`
    * `/api/organizations/{orgId}/members/`
    * `/api/organizations/{orgId}/projects/`

    Every request is a read. DSALTA has no code path that creates, modifies, or deletes anything in your PostHog environment.

    ## Troubleshooting

    <AccordionGroup>
      <Accordion title="How do I check whether the connection is healthy?">
        Open **Integrations** in the DSALTA sidebar, stay on the **Connected** tab, and click **Manage** on the integration's card. Open the **Status** tab: it shows either **Connected and working properly** or **Connection issues detected**.

        Use the **Status** tab, not **Overview** — Overview always reports **Connected** regardless of the real state.
      </Accordion>

      <Accordion title="A check shows Failed and nothing changed on my side">
        On an integration-powered check, **Failed** normally means DSALTA was blocked rather than that you are non-compliant. Open the test, go to **Source Data**, and read the result code: **403** is a missing permission, **428** is a setting DSALTA still needs, **500** is a failure on DSALTA's side.

        A real compliance gap shows **207** and leaves the test looking **Completed**. See [Understanding Test Results](/guides/data-library/test-results).
      </Accordion>

      <Accordion title="Data looks out of date">
        Compliance checks re-run once a day at 02:00 America/New\_York. To refresh sooner, open **Integrations → Connected** and click **Sync from integrations** at the top right — it refreshes every connected integration at once.
      </Accordion>

      <Accordion title="How do I repair a broken connection?">
        There is no Reconnect, Repair or Refresh Token button. The only repair available is to disconnect and connect again.

        <Warning>
          **Disconnecting is destructive and cannot be undone.** DSALTA removes the access records, inventory, vulnerabilities, code changes, incidents and device records collected from this integration, and deletes the test results tied to the connection. Export anything you still need as audit evidence first — see [Integration errors](/troubleshooting/integration-errors).
        </Warning>
      </Accordion>

      <Accordion title="Configure scope will not let me change anything">
        That is expected. **Configure scope** is read-only — it shows what DSALTA is permitted to read, and has no Save action. To change what DSALTA can see, change the permissions on the credential in the third-party product, then disconnect and connect again.
      </Accordion>
    </AccordionGroup>
  </Tab>

  <Tab title="How to connect">
    Create the personal API key with these scopes: `organization_member:read`, `user:read`, `project:read`.

    <Steps>
      <Step title="Start in DSALTA">
        Open **Integrations** in the DSALTA sidebar, find **PostHog**, and click **Connect** to open the connect panel.
      </Step>

      <Step title="Open PostHog personal API keys">
        In PostHog, click your profile picture in the bottom-left, then Account settings, then Personal API keys.

        <img src="https://mintcdn.com/dsalta/4UzgskHSsjeDN5e5/images/integrations/posthog/01-personal-api-keys-settings.png?fit=max&auto=format&n=4UzgskHSsjeDN5e5&q=85&s=3bef2a88adbb809966d9d0808e7354b3" alt="PostHog Settings, Personal API keys page with an empty key table and the Create personal API key button highlighted" style={{maxWidth:"720px",width:"100%",borderRadius:"8px"}} width="1100" height="357" data-path="images/integrations/posthog/01-personal-api-keys-settings.png" />
      </Step>

      <Step title="Create a personal API key">
        Click + Create personal API key. Give it a name (e.g. DSALTA), and under Scopes select: Organization members - Read, Project - Read, and User - Read. Click Create.

        <Tip>If you miss a scope, you do not have to start over — you can edit an existing personal API key's scopes later from the same Personal API keys page.</Tip>

        <Tip>Before the scope list, the dialog asks for **Organization & project access**. Leave it on **All access**, or choose **Organizations** and select the organization you want reviewed — DSALTA reads organization-level endpoints (`/api/organizations/{id}/members/` and `/api/organizations/{id}/projects/`), so a key narrowed to individual projects leaves those calls without access.</Tip>

        <img src="https://mintcdn.com/dsalta/4UzgskHSsjeDN5e5/images/integrations/posthog/02-create-personal-api-key-dialog.png?fit=max&auto=format&n=4UzgskHSsjeDN5e5&q=85&s=04800e9cd784943e8729868ff601059c" alt="PostHog 'Create personal API key' dialog showing the Label field, Organization and project access selector, and the scrollable Scopes list with No access, Read and Write toggles" style={{maxWidth:"720px",width:"100%",borderRadius:"8px"}} width="1100" height="500" data-path="images/integrations/posthog/02-create-personal-api-key-dialog.png" />
      </Step>

      <Step title="Copy your API key and region">
        The key is shown once — copy it (starts with phx\_). You'll also be asked for your PostHog region: check your browser's address bar while in PostHog — us.posthog.com is US Cloud, eu.posthog.com is EU Cloud.

        The Subdomain field offers four values, but only two work here: enter `us` for US Cloud or `eu` for EU Cloud. DSALTA calls PostHog's private API endpoints, which PostHog serves on `us.posthog.com` and `eu.posthog.com`; `us.i`/`eu.i` are PostHog's public event-capture hosts. If the field suggests `us.i`, replace it with `us`.
      </Step>

      <Step title="Finish in DSALTA">
        Return to the connect panel you opened in step 1, enter the credential you just created, and confirm to complete the connection.

        <img src="https://mintcdn.com/dsalta/4UzgskHSsjeDN5e5/images/integrations/posthog/03-link-posthog-account-panel.png?fit=max&auto=format&n=4UzgskHSsjeDN5e5&q=85&s=179efdb80068a8f826ed3067ee8861d4" alt="DSALTA 'Link PostHog Account' panel with a Subdomain field prefilled as https://us.i.posthog.com and an API Key field, above a Connect button" style={{maxWidth:"340px",width:"100%",borderRadius:"8px"}} width="1000" height="1282" data-path="images/integrations/posthog/03-link-posthog-account-panel.png" />
      </Step>
    </Steps>

    <Check>
      Once connected, PostHog appears on the **Connected** tab and the checks below begin reporting after the first sync.
    </Check>
  </Tab>

  <Tab title="Automated checks">
    Each check below re-runs once a day, at 02:00 America/New\_York, while this integration is connected. Click any check for step-by-step remediation guidance.

    | Check                                                                                                                  | Severity | What it verifies                                                                   |
    | ---------------------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------- |
    | [User access to Critical System should be valid](/integrations/posthog/user-access-to-critical-system-should-be-valid) | Info     | Checks that everyone with PostHog access is an active employee on the People page. |
    | [Offboarded users should not have active access](/integrations/posthog/offboarded-users-should-not-have-active-access) | High     | Checks that offboarded employees no longer have active PostHog access.             |
    | [MFA should be enabled for all users](/integrations/posthog/mfa-enabled-for-all-users)                                 | High     | Checks that every PostHog member has two-factor authentication enabled.            |
  </Tab>

  <Tab title="Useful links">
    | Topic   | Link                                                                        |
    | ------- | --------------------------------------------------------------------------- |
    | Setup   | [PostHog personal API keys](https://posthog.com/docs/api/personal-api-keys) |
    | Setup   | [PostHog API overview (hosts)](https://posthog.com/docs/api)                |
    | General | [PostHog website](https://posthog.com)                                      |
    | DSALTA  | [Connection error messages](/troubleshooting/connection-error-messages)     |
  </Tab>
</Tabs>
