Concepts

The Test loop

A committed Test freezes its question and the evidence it was decided on. Observations are appended, a Conclusion is final, and a changed mind is a new Test.

Win & Scale recomputes Next tests on every read, so their ids and numbers drift with the window. Without a record, a rejected idea comes back next week as a fresh recommendation. A Test is the record: a Next test the operator committed to, with its question frozen.

The loop

Find a Next test

meta_get_history_winners returns nextTests, ranked. An Iteration keeps a winner and changes exactly one Dimension's Value. An Exploration tries a Value, or a combination of Values, the account has not tested enough to judge. Each carries its computed evidence, its basis (account, customers or competitors), its limits (what could make the evidence mislead), reverseIf (what would reverse it) and prior (concluded Tests on the same lesson).

Brief it

A brief is a Next test written up for production: the idea, why, what to make, the openers. It quotes only numbers its evidence carries and is refused otherwise. Briefs are saved with meta_save_briefs for a Next test, or meta_save_brief for one brief on the board. See POST /api/v1/briefs.

Commit

POST /api/v1/tests (meta_create_test) freezes the intent: hypothesis, reference, what stays and what changes, the funnel and goal, and the rule that will judge it. It also snapshots the evidence the decision was based on. Creating a Test never calls Meta and spends nothing.

You commit either a Next test (pass its nextTestId with the same window and funnel it was computed in) or a custom idea with its title, hypothesis and the evidence it rests on.

Make and launch

Win & Scale does not make images or video. The creative is produced outside it. Once you have the files, launch them with the Test's testId and the brief's briefId. The ads are created paused, as always. meta_link_test_artifacts attaches uploads, ads or launches made elsewhere, such as in Ads Manager. A link moves a Test from planned to producing (an upload) or to live (an ad or launch).

Observe

After delivery, POST /api/v1/tests/{testId}/observations reads the outcome now and appends it as an Observation: supported, rejected, inconclusive or invalid, with the numbers and the reasons.

Conclude

POST /api/v1/tests/{testId}/conclusion records the Conclusion, once, with a note on what it means for the next creative. It is final. The lesson then appears on every matching Next test.

What is frozen, and what is appended

PartRule
Intent: hypothesis, reference, keep and change, funnel, goal, markets, the judging rule, the evidence snapshotFrozen when the Test is created. A database trigger refuses an update.
ObservationsAppend-only rows.
ConclusionOne per Test, final. A second is refused.
A changed mindA new Test with supersedesId pointing at the old one. Never an edit.
Abandoningmeta_abandon_test stops a Test with no Conclusion. It keeps its intent, links and Observations, and teaches nothing.

The trigger exists because MCP and REST write with a service client, and row-level security would not stop a buggy tool from editing a frozen row.

The rule is declared before the result

A Test declares its comparator, the expected volume it needs before it can be judged, how long it waits for late conversions, and how long it runs. That makes low delivery read as inconclusive by construction.

An Observation is evaluated in this order:

  1. Nothing linked or delivered: inconclusive.
  2. Reference ads overlapping the Test's own ads: invalid.
  3. Younger than the maturity wait: inconclusive.
  4. Spend that expects fewer goals than the declared volume: inconclusive.
  5. Otherwise the same rule as history verdicts: supported or rejected only when clearly above or below what the spend should have bought, else inconclusive.

The window opens on first delivery, so a later read never moves the goalposts. The default comparator, baseline, holds the Test to the cost per goal the decision was made on. reference races the Test against the reference creative's ads over the same days, and only works if both run.

meta_conclude_test refuses supported or rejected when it contradicts the latest Observation, unless the human gives an overrideReason, which is kept in the note.

Lessons come back

Each Test has a lesson key that names the lesson, not the winner it was proposed on. Concluded Tests, failures included, come back as prior on every Next test asking the same question. A rejected lesson in the same funnel and market sinks to the end of its kind. It is still shown, with its history.

Every Observation is observational. Meta did not randomise who saw each ad, so a Test is not an A/B experiment, and a supported Conclusion means the pattern held in this account, not that the Value caused it.

Where to find it

On this page