Stage scope: this stage covers only what Build and Manage Wix Automations lists; do not perform anything marked "Later stages only" or any workflow that needs a guide marked "not yet published". "Stage", "Later stages only" and "not yet published" describe how this skill is being rolled out; never mention them to the user. Explain a limit in product terms: what can't be done through the API here and where the user can do it instead (for example, in the automations builder).
TL;DR
appId + actionKey. Find real ones with Resolve Actions (site catalog), then read the version active on the site with Get Runtime Action. Never invent keys.appDefinedInfo.inputMapping: an object keyed ONLY by input-schema property names, with values of the schema's type — literals, or {{…}} formulas in fields the UI schema marks as dynamic.updateSchemaOnChange: true reveal more inputs once set → Get Action Dynamic Input Schema. Output that depends on configuration → Get Action Dynamic Output Schema after the mapping is final.triggered-emails): initialize each NEW step with Generate Action Input Mapping, persist the returned mapping unchanged, then configure content with Get / Set Email Content (Automations Email Actions (not yet published)). Existing content-only edits do not initialize another email.Site-scoped (wix-site-id header), SDK module actionCatalog: Resolve Actions · Get Runtime Action (the version this site runs — use it) · Get Action Dynamic Input / Output Schema (+ bulk output). Paths and request shapes: Automations API Catalog §4.
{"query": {"paging": {"limit": 25}}}); filter by appId when known, otherwise search locally over displayName, description, actionKey with a keyword ladder (phrase → domain verb/noun → synonyms).description. A name like "Add a coupon" or "Get a …" can be a value-producing step that notifies nobody.inputSchema, outputSchema, interfaceConfiguration.Do not use unsupported or deprecated actions — send-mail (→ triggered-emails), send-coupon-action (→ wixcoupons-retrieve_coupon + a delivery step that uses its code), wix_automations-velo_action, wix_automations-data_manipulation_code (code variable; public Create refuses it — §4 of Automations Delays Variables and Branches (not yet published)), whatsapp-send-message (WhatsApp), forward-to-zapier (Zapier), and site actions wix_automations-wix_api_integration (non-public). Match these by actionKey (+ appId), not by app or display name — other actions of the same app are fine. Reasons and replacements: §2 of Automations Feasibility and Planning (not yet published) (site actions: §1).
ai_assistants-delegate-to-assistant: autonomous agent, output NOT used downstream (exposes only summary); (2) Custom agent ai_custom_agent_bm-delegate_to_agent: autonomous agent whose output IS used downstream; (3) Generate or analyze text wix_automations-llm_call: pure LLM over data already in the payload; no tools, no internet. "LLM step" → (3). When later steps need several structured fields, use (3) with an override output schema — not a single-string text action.inputSchema — JSON Schema of the mapping. required = must map. oneOf/const = enum. format, wixCustomType, identityType as in Automations Trigger Configuration §3.interfaceConfiguration.type — GENERIC → the builder renders a form from inputSchema + genericOptions.uiSchema (rules in §5.2). WIDGET_COMPONENT → the app's own configuration widget, which you can't see (below).interfaceConfiguration.genericOptions.uiSchema — per-field UI hints (below). It cannot add fields.outputSchema — fields downstream steps read as var("<namespace>.<field>"). Empty and no dynamic output → later steps must not reference its namespace.implementedMethods — validateConfiguration (the app validates your mapping on Validate Automation), getQuotaInfo. It does not tell you about dynamic schemas — decide by updateSchemaOnChange and by calling the dynamic-output API.WIDGET_COMPONENT actions. The widget owns the mapping; the builder's form rules don't apply to it. In these guides an opaque widget is a WIDGET_COMPONENT action whose inputSchema does not fully describe the requested configuration. If inputSchema fully describes what the user asked for (e.g. addLabelsToContact: contactId + labelKeys), hand-author it (§5.2) and tell the user to review the step; otherwise tell the user this step can’t be configured through the API here and that they can set it up in the automations builder. If the widget can't load (its app is uninstalled), the builder shows an "app not installed" state with a Replace button instead of the settings.
Conditional fields (if/then/dependencies, e.g. a due date shown only when "add a due date" is true): set the toggle and the dependent field together, or leave both out.
UI-schema keys that change what you may write:
dynamicValuesOptions.enabled: true → the field accepts {{…}} formulas. strict: true → the formula must return the field's exact type/format. A field without it is static: literal only."ui:widget": "EntitySelector" + entitySelectorOptions (selectorId/tag, filters, dynamicFiltersMapping) → entity picker; value = id or array of ids (§1 of Automations Entity and Provider Configuration (not yet published)). Same for input properties carrying itemsSelectionConfiguration."ui:field": "AudienceSelector" → an audience object owned by the app's picker; don't hand-author it — the user sets it in the builder."ui:field": "TextSectionField" → display-only text; never map it."ui:widget": "hidden", ui:readonly → keep the schema default. Other ui:* keys are presentation only.updateSchemaOnChange: true (e.g. a template or form id) changes which inputs exist. Set it, then call Get Action Dynamic Input Schema with {appId, actionKey, inputMapping} (the mapping so far). The builder shows the static schema merged with the returned one (properties and required united), so keys from either are kept. Repeat if another controlling field is revealed. Never invent a field you expected but didn't get — it appears only after its controlling selection. The builder re-fetches this schema from your saved mapping every time the step is opened, so a dynamic key whose controlling value isn't in the mapping is dropped on the first edit.outputSchema for downstream var() paths. A dynamic output is a real schema — never replace it with an override (allowlist: §3 of Automations Schemas and Scheduling (not yet published)).Later stages only: email and other opaque-widget configuration is not available in stage 2; this section is published in stage 4.
In this stage: never invent an opaque widget's mapping or its app-owned keys; tell the user which action to add in the builder and how it should be configured.
MUST (builder renderability — the GENERIC form drops, rewrites or flags anything else):
{"value": "…", "currency": "…"}).required field present. An action with visible fields and a missing/null inputMapping is flagged "missing required info" and its panel can't be applied."inputMapping": {} — the builder writes {} itself on open otherwise.default (write the default or your value), every identityType input (the form auto-maps it when exactly one matching payload path exists), required date/date-time/time strings (else filled with "now").oneOf / enum): one of the listed constants.{{…}} only in fields with dynamicValuesOptions.enabled (or an identityType field), per Automations Mapping Expressions §4: number/boolean hold exactly one expression of that type; date-time a single date-time expression or ISO literal; strings may mix text and expressions. An array-typed var() in a string field is flagged as a format mismatch.now()/payload dates; ids → resolved at build time, never from examples.subject string mixing text and expressions ("Order received {{var(…)}}"); don't split its values into other fields, such as a message's fields rows.Value kinds:
Trigger fields have no prefix; action outputs use the step's namespace (e.g. createTask-1.taskId); set-variables use setVariable.<key>.
Optional inputs with no default (e.g. isDueDate, onlyWhenAvailable): omit them unless the request needs them. A deprecated defaulted input (e.g. labelIds: [] on add-label) may be omitted.
Process: (1) fetch the effective schema (§4) before you write a mapping or any script that saves one — never guess an action's field names → (2) classify required vs optional; map optional fields only with a real source → (3) source each required field from payload, upstream outputs or the user; ask for user-specific content (text, recipient, which entity) → (4) build → (5) self-check against the list above → (6) Validate Automation.
Error shape, error type → fix, and how the builder shows each: Build and Manage Wix Automations — included validation procedure §2. Must-know here: fix the field named by configurationError.fieldKey — never delete a field to silence it; CRITICAL blocks (status INVALID), WARNING doesn't but must be reported; a var() path that doesn't exist may NOT be reported — verify paths yourself.
This section owns the semantic review (you, not code) required for every action before acceptance. Confirm from its catalog entry and effective schemas:
identityType.{requestedAudience, resolvedAudienceKind (contact|visitor|owner|contributor|label|phone|device), resolvedIdentityPath}. The trigger contact and a contact created upstream are different people even if both are contactId. Wording never proves the recipient.
selectedAudience / contactId exactly as in §3 of Automations Email Actions (not yet published) ("Recipient encoding"). A root contactId or triggerContactExcluded alone doesn't prove who receives it.send-message): only a schema-supported contact-id or visitor-id route; owner/team chat needs a different, proven component or a clarification.Under-required schemas: send-message requires only contactId/visitorId (anyOf), not the text. Always map the message too — a required-fields-only mapping ships an empty action.
Missing required field or content-free required-only mapping · fabricated user values instead of asking · type/format mismatch, free text in an enum, a name in an id field · var() to a path absent from the aggregated schema (or from an unfetched dynamic schema) · formula in a static field or an unknown function · wrong verb or recipient · a single-value field filled from an array · unmapped defaults / identity fields / missing {} (the builder rewrites the step on first open).
Last updated: 13 October 2026