| Part | What to record |
|---|---|
| Identity | The stable external identifier, and the community field it maps to |
| Input values | Every external value the workflow accepts, and how it is normalised |
| Canonical field | The field that stores the current tier or plan |
| Role set | The complete set of roles after each value, including roles that must be absent |
| Consumer | The channel, category or feature that must change its answer |
| Timing | How long the change may take, and the point at which it must be exact |
batchIdPath: "metadata.batch_id" and a record id such as change_id, so a resent change cannot apply twice.post-user-fields step with logic: overwrite stores exactly the new tier. logic: add on a tier field makes the number meaningless.tier here is a custom field the community defines, so its key comes from the catalog's post list rather than from a guess. The platform checks the key against the community's real fields and keeps the label you send, here Tier, because that label is the name the step's result uses. Send the catalog's label, or use your own deliberately and reference that label downstream.type: "code", options.inputs bound to the tier payload, and the source in options.sourceCode.code. Create it with POST /{workflowId}/nodes like any other step. A dry run shows the builder's inputs and source but not its output, so live-test the builder on its own against one transition first, then dry-run the rest around it.wouldDo for the field step: the field, the value, and the logic. Nothing is written, so a mistake here costs nothing.| Case | Transition | What it proves |
|---|---|---|
| Create | no member state, then a tier | The initial field and role state are applied |
| Upgrade | lower to higher | The higher access is granted |
| Downgrade | higher to lower | The higher access is removed, not just hidden |
| Jump | low to a non-adjacent high | The workflow does not depend on every intermediate step |
| Revisit | high, low, then high again | A previously held state can be applied again |
| Replay | the same change twice | Delivery retries do not accumulate roles |
| Edge | an unknown tier or a missing identifier | The failure is bounded and does not half-apply |
GET /{workflowId}/runs for the run, then GET /runs/{runId} for each step result.success proves step execution. It does not prove the member's roles, and it does not prove the consumer.| What you see | What it means | What to do |
|---|---|---|
| Field updated, role unchanged | The role step was skipped, or wrote the wrong column | Read the run detail for the role step, then the job detail per row. |
| Upgrade works, downgrade leaves the old role | The role step only adds | Reconcile the whole role set, subtract included. |
| Repeated change adds a second role | No deduplication on the sender or the trigger | Configure a record id, or make the sender idempotent. |
Run success, member unchanged | The step wrote the same value it read | Check the binding and the logic. |
User not found | The identifier did not resolve | Fix the sender's field, then the selector binding. |