Personyze Personyze developer docs
Open Personyze
Analytics

REST ab_test object

The verdict of an A/B test: who is winning, by how much, and how sure.

Personyze developer documentation Questions: support@personyze.com

For information about how REST API works, see rest main page.

Read-only. Returns the verdict of one A/B test: which variation is ahead, by how much, how confident Personyze is, and — when nothing has been decided yet — what is still missing.

This is the same comparison the panel shows, computed by the same code that promotes winners and sends the "your test concluded" email. Reading it never promotes anything.

The URL is:

app.personyze.com/rest/ab_test/where/condition_id=<campaign id>

condition_id is required. There is no "all my tests" form: each campaign costs a full aggregation over its lifetime, so you ask about one at a time. Campaign ids come from conditions.

A campaign that is not a running A/B test — no A/B goals configured, never started, or already ended — is an error rather than an empty answer, so a typo'd id cannot read as "no winner yet".

Example

curl 'https://api:FD09908F25BECB09D78EBEA1DADFB618651F612D@app.personyze.com/rest/ab_test/where/condition_id=1878'
{
    "condition_id": 1878,
    "condition_name": "Homepage hero test",
    "has_winner": false,
    "winner_actiongroup_id": null,
    "message": "Server 362, a/b 1878 (Homepage hero test), bounce_rate (Bounce rate): 0.8404 (Group A) vs. 0.8409 (Control group), 52% sure: Didn't reach min improvement of 0.1 (current: 0.05)",
    "control_group_rotation": 50,
    "max_duration_reached": false,
    "goals": [
        {
            "ab_goal": "bounce_rate",
            "title": "Bounce rate",
            "lower_is_better": true,
            "best": {"actiongroup_id": 1797, "name": "Group A", "rate": 0.8403790087463557},
            "compared_to": {"actiongroup_id": -1, "name": "Control group", "rate": 0.8408839779005525},
            "significance_prc": 52.03,
            "improvement_prc": 0.0505,
            "min_significance_prc": 95,
            "min_improvement_prc": 0.1,
            "reached": false,
            "summary": "0.8404 (Group A) vs. 0.8409 (Control group), 52% sure: Didn't reach min improvement of 0.1",
            "groups": [
                {"actiongroup_id": -1, "name": "Control group", "value": 2283, "denom": 2715, "rate": 0.8408839779005525},
                {"actiongroup_id": 1797, "name": "Group A", "value": 2306, "denom": 2744, "rate": 0.8403790087463557}
            ]
        }
    ]
}

Top level

Field Meaning
has_winner Whether the test has concluded. True only when every configured goal passed its significance and improvement thresholds and they all name the same variation.
winner_actiongroup_id The winning rotation group, or null when there is no winner. Never set without has_winner.
message Why there is no winner yet, in words — minimum duration, minimum sessions per arm, a goal short of its threshold, or goals disagreeing. Empty once a winner exists.
control_group_rotation The percentage of traffic held back as the control group. 0 means no holdout: every visitor sees some variation.
max_duration_reached The test has run past the platform's maximum duration and will be concluded regardless.
goals One entry per configured winner criterion, below. Populated whether or not the test concluded — a test still running reports where each goal currently stands.

Per goal

Field Meaning
ab_goal, title The criterion — goal_event_1..goal_event_12, products_goal_sessions, clicks, bounce_rate — and its display name.
lower_is_better True for bounce rate. Where it is true, the best arm is the lowest rate, and improvement_prc is still positive when the winner is better.
best The arm that is ahead on this goal. actiongroup_id is -1 for the control group.
compared_to What best is measured against: the control group, or — when the control is itself the best arm — the worst arm. In a multivariate test with no control group, -2 is a synthetic baseline pooling every other combination.
significance_prc Confidence that the difference is real, 0–100. Computed one-sided, and penalized for the number of arms compared, so adding variations lowers confidence for the same observed gap.
improvement_prc How much better best is than compared_to, in percentage points — not a relative percentage. Always positive when the winner is genuinely better, including for bounce_rate.
min_significance_prc, min_improvement_prc The thresholds configured for this test, for context on why reached is what it is.
reached This goal passed both thresholds and the winner is not the control group.
summary The one-line rendering of all of the above.
groups Every arm with data: value (the numerator — conversions, clicks, bounced sessions), denom (sessions), rate = value / denom.

A null in place of a number means that arm has no data yet.

Notes

  • Only goals Personyze can score appear. products_value_per_order, page_views and time_on_site can be chosen as reporting metrics but are not scoreable criteria, and are omitted.
  • Figures cover the whole test, from its start time. For day-by-day numbers use summary_actions.
  • A running test is one with A/B goals set, a start time, and no end time. Ended tests keep their results in the panel but are not served here.

See also: server-side personalization and A/B testing, which covers running the test itself from your own code.