ExAbby (ex_abby v0.3.0)

ExAbby: an Elixir/Phoenix library for A/B testing.

Provides a unified interface for both Phoenix controllers and LiveView, automatically detecting and handling each case appropriately.

Summary

Functions

Gets or creates a trial for a single experiment. Convenience wrapper around get_variations.

Gets or creates trials for multiple experiments.

Links session-based trials to a user. This allows tracking experiments across both session and user contexts.

Records a success for a single experiment. Convenience wrapper around record_successes.

Records successes for multiple experiments.

Saves session info to socket. Used on pages where you call success so you do not create a new experiment before you call results

Sets a specific variation for an experiment. Returns {:ok, trial} if successful, {:error, reason} otherwise.

Functions

get_variation(conn, experiment_name)

Gets or creates a trial for a single experiment. Convenience wrapper around get_variations.

Examples:

# In Phoenix controller:
{conn, variation} = ExAbby.get_variation(conn, "experiment_name")

# In LiveView:
socket = ExAbby.get_variation(socket, session, "experiment_name")

# For user-based:
variation = ExAbby.get_variation(user, "experiment_name")

get_variation(socket, session, experiment_name)

get_variations(conn, experiment_names)

Gets or creates trials for multiple experiments.

Examples:

# In Phoenix controller:
{conn, variations} = ExAbby.get_variations(conn, ["exp1", "exp2"])

# In LiveView:
socket = ExAbby.get_variations(socket, session, ["exp1", "exp2"])

# For user-based:
variations = ExAbby.get_variations(user, ["exp1", "exp2"])

get_variations(socket, session, experiment_names)

record_success(context, experiment_name, opts \\ [])

Records a success for a single experiment. Convenience wrapper around record_successes.

record_successes(context, experiment_names, opts \\ [])

Records successes for multiple experiments.

Options

  • :amount - Optional numeric value to track with the success (default: 0.0)
  • :success_type - Type of success to record, either :success1 or :success2 (default: :success1)

Examples:

# In Phoenix controller:
{:ok, results} = ExAbby.record_successes(conn, ["exp1", "exp2"])
{:error, %{successful: ["exp1"], failed: ["exp2"]}} = ExAbby.record_successes(conn, ["exp1", "exp2"])

# In LiveView:
{:ok, results} = ExAbby.record_successes(socket, ["exp1", "exp2"])

# For user-based:
{:ok, results} = ExAbby.record_successes(user, ["exp1", "exp2"])

Returns either:

  • {:ok, %{experiment_name => {:ok, trial}}} if all successful
  • {:error, %{successful: [...], failed: [...]}} if any failed

save_session_data(socket, session)

@spec save_session_data(Phoenix.LiveView.Socket.t(), map()) :: map()

Saves session info to socket. Used on pages where you call success so you do not create a new experiment before you call results

set_variation(conn, experiment_name)

set_variation(conn, experiment_name, variation_name)

Sets a specific variation for an experiment. Returns {:ok, trial} if successful, {:error, reason} otherwise.

Examples:

# In Phoenix controller:
{:ok, trial} = ExAbby.set_variation(conn, "experiment_name", "variation_name")

# In LiveView:
{:ok, trial} = ExAbby.set_variation(socket, "experiment_name", "variation_name")

# For user-based:
{:ok, trial} = ExAbby.set_variation(user, "experiment_name", "variation_name")

upsert_experiment_and_update_weights(experiment_name, description, variations, opts \\ [])

See ExAbby.Experiments.upsert_experiment_and_update_weights/4.