The setup_processes state machine — create, autosave, publish, edit-running, reset. The heart of Wave.
The Wave wizard is built on the setup_processes/{eid} resource — one
row per event that holds the draft (and, after publish, the running
configuration). Get this state machine right and you have Wave.
If client-side validation fails, the reference webapp sends a Sentry
message tagged INVALID_SETUP and refuses to call /boost. Surface the
failures to the user instead.
After publish, the setup_process is frozen — no more PUTs. The
running campaigns are now visible in GET /events/{eid}/campaigns.To edit one cluster’s creative or targeting after publish:
The endpoint is POST /campaigns_setup (plural, no {eid} in the URL).
The eid goes in the body. It is notPUT /setup_processes/{eid}.
This is the single most common source of “why is my edit not saving” bugs.
The URL is /setup_processes/{eid}, not /setup_processes/{setupId}.
Concurrent edits across tabs race. The reference webapp aborts
older PUTs via a module-level AbortController — copy that, or you’ll
have lost-edit bugs.
`/campaigns_setup` is not `/setup_processes/{eid}`
Drilling for the third time: published-cluster edits go to
POST /campaigns_setup (plural, no eid in URL, eid in body). Bookmark
this.
Autosave PUTs send the full payload, not diffs
The endpoint expects the full setup_process, not a JSON patch. If you
send a partial, fields you didn’t include get reset to default.
Validate client-side before publish, hard
/boost errors are surfaced as a generic 400 in production. Catching
invalid setup before the call keeps users out of “wait, why did
publish fail” loops.
Language defaults come from i18n.language
The reference webapp injects the user’s UI locale into creative
defaults. Users with mismatched locale vs event country see surprising
suggested copy. Decide whether to mirror this or use the event’s locale.
Boost is synchronous — no polling
POST /setup_processes/{eid}/boost either returns 2xx (success, see
campaigns in /events/{eid}/campaigns) or 4xx (validation/integration
failure). No async task to poll.