This library provides an Elixir HTTP client for PostHog. See the repository for more information.
Installation
This library was built by the community and is not maintained by the PostHog core team.
The package can be installed by adding posthog
to your list of dependencies in mix.exs
:
def deps do[{:posthog, "~> 1.0.0"}]end
Configuration
config :posthog,api_url: "https://us.i.posthog.com",api_key: "<ph_project_api_key>"
Optionally, you can pass in a :json_library
key. The default JSON parser is Jason.
You'll also need to include the posthog
application in your supervision tree. You can do this in two ways:
- Add it to your
application
function:
# mix.exsdef application do[extra_applications: [# ... your existing extra applications:posthog]]end
- Add it to your existing
MyApp.Application
module:
# lib/my_app/application.exdefmodule MyApp.Application douse Applicationdef start(_type, _args) dochildren = [# ... your existing children{Posthog.Application, []}]opts = [strategy: :one_for_one, name: MyApp.Supervisor]Supervisor.start_link(children, opts)endend
Development mode
If you are running in development or test mode, you can pass in a capture_disabled: false
value to the config. This causes events to be dropped instead of sent to PostHog.
config :posthog,capture_disabled: false
Capturing events
You can send custom events using capture
:
Posthog.capture("user_signed_up", distinct_id_of_the_user)
Tip: We recommend using a
[object] [verb]
format for your event names, where[object]
is the entity that the behavior relates to, and[verb]
is the behavior itself. For example,project created
,user signed up
, orinvite sent
.
Setting event properties
Optionally, you can include additional information with the event by including a properties object:
Posthog.capture("user_signed_up", distinct_id_of_the_user, %{login_type: "email",is_free_trial: true})
Batching events
To capture multiple events at once, use batch()
:
Posthog.batch([{"user_signed_up", distinct_id_of_the_user, %{}}])
Feature flags
PostHog's feature flags enable you to safely deploy and roll back new features as well as target specific users and groups with them.
Elixir supports a subset of what our feature flag API provides.
Boolean feature flags
is_my_flag_enabled = Posthog.feature_flag_enabled?("flag-key", "distinct_id_of_your_user")if is_my_flag_enabled# Do something differently for this user# Optional: fetch the payload{:ok, feature_flag} = Posthog.feature_flag("flag-key", "distinct_id_of_your_user")end
Multivariate feature flags
{:ok, feature_flag} = Posthog.feature_flag("flag-key", "distinct_id_of_your_user")# %Posthog.FeatureFlag{ name: "flag-key", payload: %{"variant-1" => "value-1", "variant-2" => "value-2"}, enabled: "variant-2" }if feature_flag.enabled == 'variant-2' # replace 'variant-2' with the key of your variant# Do something differently for this userend
Fetching all feature flags
Posthog.feature_flags("distinct_id_of_your_user"){:ok,%{"featureFlagPayloads" => %{"feature-1" => 1,"feature-2" => %{"variant-1" => "value-1", "variant-2" => "value-2"}},"featureFlags" => %{"feature-1" => true, "feature-2" => "variant-2"}}}
More documentation can be found in the repository.
Thanks
Thanks to nkezhaya for initially contributing this library. The library is maintained by the PostHog team since February 2025.