@wix/agent-skills 1.31.2 → 1.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -12
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +39 -15
- package/skills/wix-app/references/BACKEND_API.md +1 -1
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +47 -45
- package/skills/wix-app/references/SDK_MODULE_MAP.md +1 -1
- package/skills/wix-app/references/STORES_VERSIONING.md +24 -2
- package/skills/wix-app/references/dashboard-page/DATA_SOURCES.md +9 -13
- package/skills/wix-app/references/dashboard-page/IMAGE_RENDERING.md +61 -0
- package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +54 -64
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +25 -27
- package/skills/wix-app/references/editor-react-component/COMPONENT-CONTRACT.md +37 -30
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +43 -29
- package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +42 -42
- package/skills/wix-app/references/editor-react-component/DISABLED-INVALID.md +31 -0
- package/skills/wix-app/references/editor-react-component/MANIFEST-ERRORS.md +14 -1
- package/skills/wix-app/references/editor-react-component/PARTS.md +40 -9
- package/skills/wix-app/references/editor-react-component/PROPS-VS-CSS.md +22 -2
- package/skills/wix-app/references/editor-react-component/SSR.md +6 -3
- package/skills/wix-app/scripts/scan-a11y-eslint.cjs +39 -16
- package/skills/wix-app/scripts/sdk-curated.json +45 -0
- package/skills/wix-app/scripts/sdk-lookup.cjs +1180 -0
- package/skills/wix-base44-connector/SKILL.md +4 -2
- package/skills/wix-base44-connector/scripts/utils.cjs +5 -2
- package/skills/wix-headless-kit/SKILL.md +4 -1
- package/skills/wix-headless-kit/guides/api-run.md +14 -20
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-manage/SKILL.md +30 -8
- package/skills/wix-manage/references/automations/actions.md +134 -0
- package/skills/wix-manage/references/automations/activation-status.md +64 -48
- package/skills/wix-manage/references/automations/api-catalog.md +213 -77
- package/skills/wix-manage/references/automations/automation-model.md +199 -0
- package/skills/wix-manage/references/automations/bracket-expressions.md +132 -0
- package/skills/wix-manage/references/automations/build-and-manage-automations.md +305 -26
- package/skills/wix-manage/references/automations/triggers.md +190 -0
- package/skills/wix-manage/references/collaborators/manage-site-collaborators.md +128 -0
- package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +3 -1
- package/skills/wix-manage/references/forms/read-forms-and-submissions.md +277 -0
- package/skills/wix-manage/references/forms/update-form.md +5 -0
- package/skills/wix-manage/references/seo/manage-url-redirects.md +33 -4
- package/skills/wix-manage/references/sites/create-headless-site.md +14 -5
- package/skills/wix-manage/references/sites/upload-static-site.md +373 -302
- package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +3 -3
|
@@ -111,7 +111,7 @@ const wx = require(require("path").resolve(P));
|
|
|
111
111
|
- `wx.bash(cmd)` — shell over saved files (GNU grep/sed; awk is mawk; no rg)
|
|
112
112
|
- `wx.spec(docsUrl | code)` — a method's exact schema, plus the titles of the docs' own request examples saved at `examplesPath`; pass a hit's docsUrl (direct load), or raw code to query the index yourself
|
|
113
113
|
- `wx.mgmtRecipes(q?)` — management-recipe index; no arg → categories, a word → matching recipes
|
|
114
|
-
- `wx.ensureOAuthApp(token, { name, redirectUris, redirectDomains })` — the headless OAuth app, found by name or created
|
|
114
|
+
- `wx.ensureOAuthApp(token, { name, redirectUris, redirectDomains })` — the headless OAuth app, found by name or created with `origin: "base44-app"`, with the redirect lists merged into whatever it already allows; returns `{ clientId, created }`. `clientId` is what the browser mints visitor tokens from. Run it whenever `context` reports no OAuth app, or before any Wix-hosted flow that returns to this app — see Visitor authentication and Wix-hosted flows
|
|
115
115
|
- `wx.installApp(appDefId, siteId, token)` — install a Wix app on the site (Apps Installer). If discovery finds an API whose app isn't installed on the site, install it first — that's a one-call prerequisite, **not** a reason to fall back to a hand-built alternative. `appDefId` from `search` or the Apps-Created-by-Wix table; `siteId` from `context` (the site report)
|
|
116
116
|
|
|
117
117
|
Search makes one combined request across REST, management recipes, and Headless by default.
|
|
@@ -363,7 +363,9 @@ creating the OAuth app when the site has none and adding your URLs to its lists
|
|
|
363
363
|
has one. Returns only complete for URLs in those lists, and a missing one breaks silently —
|
|
364
364
|
create-checkout and the anonymous token still succeed — until a real buyer is redirected and
|
|
365
365
|
stranded on Wix. It is idempotent by name: never create a second OAuth app for the same Base44
|
|
366
|
-
app, or the first `clientId`'s returns stop working.
|
|
366
|
+
app, or the first `clientId`'s returns stop working. The app is created with `origin: "base44-app"`,
|
|
367
|
+
the name of this flow on the OAuth app; `origin` is set at creation only, so an OAuth app created
|
|
368
|
+
by hand carries the same value in its create call.
|
|
367
369
|
|
|
368
370
|
```js
|
|
369
371
|
// Register BOTH of this app's own URLs — its preview URL and its published URL — so returns work
|
|
@@ -432,7 +432,10 @@ async function installApp(appDefId, siteId, token) {
|
|
|
432
432
|
// return needs. Idempotent by name — a site reached by the "connect an existing site" flow
|
|
433
433
|
// has none, and creating a second one for the same app strands the first app's returns.
|
|
434
434
|
// Redirect lists are merged, never replaced: an app that already serves a custom domain
|
|
435
|
-
// keeps it when a preview URL is added.
|
|
435
|
+
// keeps it when a preview URL is added. `origin` names the flow that created the app; it is
|
|
436
|
+
// written once, at creation, and an update leaves it as it is.
|
|
437
|
+
const OAUTH_APP_ORIGIN = "base44-app";
|
|
438
|
+
|
|
436
439
|
async function ensureOAuthApp(token, { name, redirectUris = [], redirectDomains = [] }) {
|
|
437
440
|
const { oAuthApps = [] } = await post(
|
|
438
441
|
"https://www.wixapis.com/oauth-app/v1/oauth-apps/query", { query: {} }, token);
|
|
@@ -440,7 +443,7 @@ async function ensureOAuthApp(token, { name, redirectUris = [], redirectDomains
|
|
|
440
443
|
const merge = (a = [], b = []) => [...new Set([...a, ...b])];
|
|
441
444
|
if (!existing) {
|
|
442
445
|
const { oAuthApp } = await post("https://www.wixapis.com/oauth-app/v1/oauth-apps", {
|
|
443
|
-
oAuthApp: { name, allowedRedirectUris: redirectUris, allowedRedirectDomains: redirectDomains },
|
|
446
|
+
oAuthApp: { name, allowedRedirectUris: redirectUris, allowedRedirectDomains: redirectDomains, origin: OAUTH_APP_ORIGIN },
|
|
444
447
|
}, token);
|
|
445
448
|
return { clientId: oAuthApp.id, created: true, oAuthApp };
|
|
446
449
|
}
|
|
@@ -294,7 +294,10 @@ only after an explicit yes, never automatically. Step 5 ends with the same self-
|
|
|
294
294
|
`https://manage.wix.com/dashboard/<siteId>` (the `siteId` of the `ready_for_brand_layer`
|
|
295
295
|
event: on a migration preview that is the migrated site's dashboard, the release URL is the
|
|
296
296
|
preview's, the original site is unchanged, and completing the migration is the user's next
|
|
297
|
-
step in the Wix CLI once they approve — say all three).
|
|
297
|
+
step in the Wix CLI once they approve — say all three). Tell the user how to put their own
|
|
298
|
+
domain on the site, per the `wix-manage` recipe `references/domains/domain-search-purchase-and-connect.md`
|
|
299
|
+
(installed beside this skill, else `https://www.wix.com/skills/wix-manage/references/domains/domain-search-purchase-and-connect.md`):
|
|
300
|
+
bought through Wix, or one they already own. When the site takes money through
|
|
298
301
|
hosted checkout (a cart, a paid booking or rental, tickets, plans, donations) and nothing says
|
|
299
302
|
payments are already set up, say what a visitor meets at checkout until they are — "We
|
|
300
303
|
can't accept online payments. Contact us for help with your order." — and hand the two links
|
|
@@ -76,7 +76,7 @@ A brief that needs no solution (a game, a landing page, a tool) is a run of two
|
|
|
76
76
|
## 2. The site
|
|
77
77
|
|
|
78
78
|
The CLI's `npm create @wix/new` is one call: `POST /headless-business-setup/v1/headless-business/provision`,
|
|
79
|
-
with `origin:
|
|
79
|
+
with `origin: "drop"`, a name, and the solutions to install as `seedOptions`. The recipe
|
|
80
80
|
is `{MANAGE}/references/sites/create-headless-site.md`; it returns the `metaSiteId` and the
|
|
81
81
|
site's OAuth client `appId`. Do not create a site any other way: a project from Create Project or
|
|
82
82
|
a template is neither headless nor publishable, and a later run with a machine cannot attach to it.
|
|
@@ -95,9 +95,10 @@ Restaurants, Donations, FAQ), goes on with the Apps Installer:
|
|
|
95
95
|
|
|
96
96
|
`seed-{solution}.mjs` is a sequence of REST calls, and `SEED.md` is its contract: the plan shape
|
|
97
97
|
(what to create, how many, which images), the order the entities need, the request bodies and the
|
|
98
|
-
traps the script encodes.
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
traps the script encodes. Write the seed as your own `ExecuteWixAPI` script, its calls made on the
|
|
99
|
+
new site: `wix.request({ scope: "site", siteId: <the metaSiteId>, … })`. Read `SEED.md` before
|
|
100
|
+
the first create: it maps the brief's words to the fields. Build each request body in your script the
|
|
101
|
+
way the script's builder functions do. A call `SEED.md` only names is made through `{MANAGE}`'s recipe for
|
|
101
102
|
it. Keep the script's rules: create, never delete, and report what the site already held. The closing
|
|
102
103
|
names entities you drafted as placeholders.
|
|
103
104
|
|
|
@@ -142,25 +143,20 @@ takes the complete file set in one call and a response has a hard size limit; th
|
|
|
142
143
|
later" section downloads what the site serves, so a later drop adds files to a live set without
|
|
143
144
|
resending what is already there.
|
|
144
145
|
|
|
145
|
-
**When it cannot**, or when its output would all have to be written out by hand, a page that
|
|
146
|
-
|
|
146
|
+
**When it cannot**, or when its output would all have to be written out by hand, a page that talks
|
|
147
|
+
to the site as a visitor over plain `fetch`. One file per call, a few hundred lines, written in full inside that call: a response has a
|
|
147
148
|
hard size limit, and a call that carries the whole frontend at once exceeds it. A second file joins
|
|
148
149
|
the first the recipe's way, "Change it later": the same call downloads the live set and drops the
|
|
149
150
|
union. The
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
`createClient({ modules: { … }, auth: OAuthStrategy({ clientId }) })` with the `appId` the provision
|
|
153
|
-
call returned, and the SDK mints and refreshes the visitor token itself. Markup, a render function
|
|
151
|
+
page calls the Wix REST API with `fetch` and mints the visitor token itself with the `appId` the
|
|
152
|
+
provision call returned, as `{TEMPLATES}/shared/rest/client.ts` does. Markup, a render function
|
|
154
153
|
per state, the event handlers: that is what you write. Keep what the page shows to what the site
|
|
155
154
|
holds; nothing invented, as in SKILL.md step 4.
|
|
156
155
|
|
|
157
|
-
**The calls**, on that second path, take their shape from the kit's
|
|
158
|
-
`{TEMPLATES}/{solution}/app/wix/{solution}/*.ts` (`services.ts`, `booking.ts`, `catalog.ts`, …,
|
|
159
|
-
with `{TEMPLATES}/shared/app/wix/sdk.ts` for the client wiring): those files call the same SDK
|
|
160
|
-
modules the page imports, and they are verified. Copy the form of the call, not the file. A page
|
|
161
|
-
that talks to Wix over plain `fetch`, with no SDK, takes them from the REST twins instead:
|
|
156
|
+
**The calls**, on that second path, take their shape from the kit's REST twins for the solution:
|
|
162
157
|
`{TEMPLATES}/shared/rest/client.ts` (the visitor token and the request) and
|
|
163
158
|
`{TEMPLATES}/{solution}/rest/*.ts` (the calls), each importing its helpers by their real paths.
|
|
159
|
+
They are verified. Copy the form of the call, not the file.
|
|
164
160
|
The cores,
|
|
165
161
|
`{TEMPLATES}/{solution}/app/wix/{solution}/*-core.ts`, hold the rules the page needs and nothing else
|
|
166
162
|
does: which fields to read, how a price or a duration is formatted, which slot is bookable, how an
|
|
@@ -170,11 +166,9 @@ a translatable object, a quantity a nested one). What you write is the markup, t
|
|
|
170
166
|
the cores return, and the event handlers.
|
|
171
167
|
|
|
172
168
|
**A call those files don't cover** is confirmed before it is written, the way `{DOCS}` describes:
|
|
173
|
-
the method's
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
the kit's files already encode: SDK query methods return a query builder finished with `.find()`;
|
|
177
|
-
and an entity's id arrives as `_id` on some objects and `id` on others (the kit reads both,
|
|
169
|
+
the method's REST page, and its schema (SearchWixAPISpec on the method's docs URL) for the exact
|
|
170
|
+
request and response. A shape that recurs, as an example of what the kit's files already encode:
|
|
171
|
+
an entity's id arrives as `_id` on some objects and `id` on others (the kit reads both,
|
|
178
172
|
`rawId`). Dates travel as local wall-clock strings in the business time zone.
|
|
179
173
|
|
|
180
174
|
**The check**, before every upload: a page cannot be opened here, so a wrong shape fails silently in
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wix-manage
|
|
3
|
-
description: "REST recipes to configure and manage a Wix site's business solutions — stores, bookings, payments, CMS, and more. Open the matching recipe for the exact endpoint, method, and payload before calling — never guess a Wix API, never write Wix dashboard URL from memory. Routes to: automations, stores, bookings, get-paid, CMS, contacts, forms, media, app-installation, custom-apps, pricing-plans, restaurants, ricos rich-content, sites, blog, calendar, domains, events, site-properties, ecommerce, marketing, google-ads, google-business-profile, analytics, accessibility, seo, dashboard-navigation."
|
|
3
|
+
description: "REST recipes to configure and manage a Wix site's business solutions — stores, bookings, payments, CMS, and more. Open the matching recipe for the exact endpoint, method, and payload before calling — never guess a Wix API, never write Wix dashboard URL from memory. Routes to: automations, stores, bookings, get-paid, CMS, contacts, forms, media, app-installation, custom-apps, pricing-plans, restaurants, ricos rich-content, sites, collaborators, blog, calendar, domains, events, site-properties, ecommerce, marketing, google-ads, google-business-profile, analytics, accessibility, seo, dashboard-navigation."
|
|
4
4
|
compatibility: Requires Wix REST API access (API key or OAuth).
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -47,7 +47,7 @@ Lists all apps installed on a site using Apps Installer API. Useful for verifyin
|
|
|
47
47
|
Read and update SEO titles and tags at the right level. For "change my site's SEO title", clarify homepage, specific page, or page-type pattern before discovery or writes; site-level tags accept meta tags only, never titles. Discover item IDs and pattern variables, read before every full-replace write, and report resolved tags with their sources.
|
|
48
48
|
|
|
49
49
|
### [Manage URL Redirects on a Wix Site](references/seo/manage-url-redirects.md)
|
|
50
|
-
"Retrieve, create, and delete URL redirects on a Wix site using the public SEO Redirects API. Covers exact and group redirects, language-scoped redirects for multilingual sites,
|
|
50
|
+
"Retrieve, create, and delete URL redirects on a Wix site using the public SEO Redirects API. Covers exact and group redirects, language-scoped redirects for multilingual sites, bulk creates of up to 100 and bulk deletes of up to 500, and the change flow for a redirect that already exists. This API has no query, search, or update method: List Redirects is the only read-many. Redirects do not chain, so creating one that points at a path another redirect starts from permanently deletes that other redirect; list and check before every write."
|
|
51
51
|
|
|
52
52
|
### [Generate and Read a Wix Site's Content Plan](references/seo/manage-content-plan.md)
|
|
53
53
|
Generate an SEO content plan and read its blog post topics, or troubleshoot an existing content plan flow stuck at KEYWORD_RESEARCH while polling GetContentPlanFlow. Use this recipe for both generation and stalled-flow questions: it explains the intentional pause, the Create Content Plan release request, missing flow IDs, and the exact public API paths and response fields.
|
|
@@ -252,8 +252,11 @@ Routes discounts, coupons, sales and bundles to promotion recipes, and visual pr
|
|
|
252
252
|
### [Update Form](references/forms/update-form.md)
|
|
253
253
|
"Changes a Wix form that already exists, with Form Schemas v4 `PATCH` — add a field to my form, add a dropdown, make a field required or optional, rename a label, reorder or retire a question. Covers reading the form back for its `revision` (and the required `namespace` query parameter), the whole-form body that a `PATCH` needs, the wholesale `formFields` replace that silently soft-deletes anything you omit, changing a field's component type in place, retiring a field that already has submissions, and the read-back that proves what was stored. Use whenever the form exists and the request changes what it collects; use Create Form when there is no form yet."
|
|
254
254
|
|
|
255
|
+
### [Read Forms and Submissions](references/forms/read-forms-and-submissions.md)
|
|
256
|
+
"Reads a site's Wix forms and the submissions visitors sent to them — what forms do I have, find a form by name, show the latest submissions, who filled in my contact form, how many submissions did I get last week, submissions from one contact, unread submissions. Covers finding the form's namespace instead of guessing it, where that namespace goes on each read, the Form Schemas and Form Submissions endpoints (and the look-alike URLs that 404), forms hidden from a default listing, the closed list of submission fields you can filter and sort by, date ranges, cursor paging, totals per form, and reading answers by field. Read-only; changing a form is Update Form, building one is Create Form."
|
|
257
|
+
|
|
255
258
|
### [Forms Dashboard Navigation](references/forms/forms-dashboard-navigation.md)
|
|
256
|
-
"Builds direct links to Wix Forms dashboard pages on manage.wix.com. The paths are not guessable and appear in no API reference, so take them from here: under `https://manage.wix.com/dashboard/{metaSiteId}/`, the forms list is `wix-forms`, a form's builder is `wix-forms/form/{formId}`, and that form's submissions are `wix-forms/form/{formId}/submissions` — there is no site-wide submissions page, and nothing lives under `contacts/forms`, `forms`, `form-builder` or `wix-forms-and-payments` (the legacy app). Also standalone forms, and
|
|
259
|
+
"Builds direct links to Wix Forms dashboard pages on manage.wix.com. The paths are not guessable and appear in no API reference, so take them from here: under `https://manage.wix.com/dashboard/{metaSiteId}/`, the forms list is `wix-forms`, a form's builder is `wix-forms/form/{formId}`, and that form's submissions are `wix-forms/form/{formId}/submissions` — there is no site-wide submissions page, and nothing lives under `contacts/forms`, `forms`, `form-builder` or `wix-forms-and-payments` (the legacy app). Also standalone forms, and the dashboard link for each Forms entity; reading forms and submissions is Read Forms and Submissions."
|
|
257
260
|
|
|
258
261
|
---
|
|
259
262
|
|
|
@@ -390,13 +393,20 @@ Authoritative recipe for hand-authoring valid Ricos rich-content JSON (the richC
|
|
|
390
393
|
|
|
391
394
|
---
|
|
392
395
|
|
|
396
|
+
## Collaborators
|
|
397
|
+
|
|
398
|
+
### [Manage Site Collaborators](references/collaborators/manage-site-collaborators.md)
|
|
399
|
+
Manages who has access to a Wix site as a collaborator (contributor) — finds the site's current collaborators, invites someone, removes a collaborator, and resends or revokes a pending collaborator invite. Use when the user wants to give someone access to the site, take it away, or follow up on an invitation that has not been accepted.
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
393
403
|
## Sites
|
|
394
404
|
|
|
395
405
|
### [Create Site from Template](references/sites/create-site-from-template.md)
|
|
396
406
|
Creates new Wix sites from templates using account-level APIs. Covers template search, site creation, and publishing. Not for headless sites.
|
|
397
407
|
|
|
398
408
|
### [Create Headless Site](references/sites/create-headless-site.md)
|
|
399
|
-
Creates a Wix Headless website: a site in the user's Wix account whose frontend is files uploaded to Wix hosting, with the Wix business backend behind it through APIs.
|
|
409
|
+
Creates a Wix Headless website: a site in the user's Wix account whose frontend is files uploaded to Wix hosting, with the Wix business backend behind it through APIs. The site is created and its pages put live by Upload a Website or HTML Files; a Wix Business Solution (a store, blog, bookings and more) is then integrated into it by the Wix Headless kit, from its cold start.
|
|
400
410
|
|
|
401
411
|
### [Manage OAuth Apps](references/sites/manage-oauth-apps.md)
|
|
402
412
|
Create, read, update, and query OAuth apps for a Wix headless site. Each OAuth app's id is the client_id a frontend uses to mint anonymous visitor tokens and call Wix APIs.
|
|
@@ -417,7 +427,7 @@ Drive the Wix Site Import agent to migrate an existing store or site from anothe
|
|
|
417
427
|
"Builds direct links to the account-level sites pages on manage.wix.com — the My Sites list (all sites in the account) and each site's own dashboard. Pairs the site list with the Query Sites read API. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
|
|
418
428
|
|
|
419
429
|
### [Upload a Website or HTML Files](references/sites/upload-static-site.md)
|
|
420
|
-
|
|
430
|
+
Publish HTML, CSS, JavaScript or a static build as a Wix Headless website; inspect its deployed files and edit them on the same site and URL. Covers file and ZIP uploads, selective additions, replacements and deletions while preserving other files, full-site replacement, authenticated and anonymous publishing, verification, and connecting a Wix business backend. Use for files the user supplies or pages you create for them. Not for migrating a live site from another platform by URL or CSV (use Site Import), embedding code in an editor-built Wix site, or uploading assets to Media Manager.
|
|
421
431
|
|
|
422
432
|
---
|
|
423
433
|
|
|
@@ -454,16 +464,28 @@ Start here for existing Catalog V3 product updates, including digital products t
|
|
|
454
464
|
## Automations
|
|
455
465
|
|
|
456
466
|
### [Build and Manage Wix Automations](references/automations/build-and-manage-automations.md)
|
|
457
|
-
|
|
467
|
+
Inspect Wix automations and their on/off status, create linear automations from the site’s installed triggers and actions, and turn automations on or off on request.
|
|
458
468
|
|
|
459
469
|
<details>
|
|
460
470
|
<summary>Internal skills (loaded on demand by Build and Manage Wix Automations — do NOT use directly)</summary>
|
|
461
471
|
|
|
462
472
|
- [Automations API Catalog](references/automations/api-catalog.md)
|
|
463
|
-
Discover
|
|
473
|
+
Discover site-specific triggers and actions, authenticate public Automation API calls, and choose the API for validation, persistence or catalog lookups.
|
|
474
|
+
|
|
475
|
+
- [Automations Graph and Data Model](references/automations/automation-model.md)
|
|
476
|
+
Assemble builder-editable automation graphs with valid node relationships, namespaces and ancestor data access.
|
|
477
|
+
|
|
478
|
+
- [Automations Trigger Configuration](references/automations/triggers.md)
|
|
479
|
+
Select and configure automation triggers, trigger filters and event payload schemas using the site catalog.
|
|
480
|
+
|
|
481
|
+
- [Automations Action Configuration](references/automations/actions.md)
|
|
482
|
+
Configure app-defined automation actions from their input schemas and preserve supported existing action mappings.
|
|
483
|
+
|
|
484
|
+
- [Automations Mapping Expressions](references/automations/bracket-expressions.md)
|
|
485
|
+
Write builder-compatible automation mapping expressions, literals and data references.
|
|
464
486
|
|
|
465
487
|
- [Automations Activation Status](references/automations/activation-status.md)
|
|
466
|
-
Read an automation’s current ACTIVE or INACTIVE status and
|
|
488
|
+
Read an automation’s current ACTIVE or INACTIVE status, and activate or deactivate it when the user asks.
|
|
467
489
|
|
|
468
490
|
</details>
|
|
469
491
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Automations Action Configuration"
|
|
3
|
+
description: "Configure app-defined automation actions from their input schemas and preserve supported existing action mappings."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Stage scope:** this stage covers only what [Build and Manage Wix Automations](https://dev.wix.com/docs/api-reference/business-management/automations/skills/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).
|
|
7
|
+
|
|
8
|
+
# App-Defined Actions — Discovery, Schemas, Input Mapping
|
|
9
|
+
|
|
10
|
+
**TL;DR**
|
|
11
|
+
|
|
12
|
+
- An action is `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.
|
|
13
|
+
- The configuration is `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.
|
|
14
|
+
- Fields marked `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.
|
|
15
|
+
- **Later stages only — email is outside stage 2:** **Send an email** (`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.
|
|
16
|
+
- Entity-selector fields take **ids**, never display names (Automations Entity and Provider Configuration (not yet published)).
|
|
17
|
+
- Before accepting any action, prove its side effect and its recipient (§6).
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. APIs used here
|
|
22
|
+
|
|
23
|
+
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](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-api-catalog) §4.
|
|
24
|
+
|
|
25
|
+
## 2. Finding the right action
|
|
26
|
+
|
|
27
|
+
1. Resolve Actions with small pages (`{"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).
|
|
28
|
+
2. Read the `description`. A name like "Add a coupon" or "Get a …" can be a value-producing step that notifies nobody.
|
|
29
|
+
3. Get Runtime Action for the 1–3 best candidates; build against that version's `inputSchema`, `outputSchema`, `interfaceConfiguration`.
|
|
30
|
+
4. An action missing from Resolve Actions is not usable on this site. The builder shows such a step as "action not found" and blocks it.
|
|
31
|
+
|
|
32
|
+
**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).
|
|
33
|
+
|
|
34
|
+
### Selection rules
|
|
35
|
+
|
|
36
|
+
- Prefer a normal built-in action over any AI action.
|
|
37
|
+
- **Direct action beats communication**: "apply the change" is the change, not an email about it — unless messaging was asked for.
|
|
38
|
+
- **Delivery beats retrieval**: "send the customer a coupon" needs a delivery step. A staging action alone is incomplete; its output must be consumed by a delivery step on the same path.
|
|
39
|
+
- Replacing an unsupported external integration: keep the channel (chat stays chat-like).
|
|
40
|
+
- AI ladder — first that fits: (1) **Delegate to Aria** `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.
|
|
41
|
+
- Ask the user to choose between overlapping actions only when the difference is user-facing and context doesn't decide it.
|
|
42
|
+
|
|
43
|
+
## 3. Reading the action
|
|
44
|
+
|
|
45
|
+
- `inputSchema` — JSON Schema of the mapping. `required` = must map. `oneOf`/`const` = enum. `format`, `wixCustomType`, `identityType` as in [Automations Trigger Configuration](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-trigger-configuration) §3.
|
|
46
|
+
- `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).
|
|
47
|
+
- `interfaceConfiguration.genericOptions.uiSchema` — per-field UI hints (below). It cannot add fields.
|
|
48
|
+
- `outputSchema` — fields downstream steps read as `var("<namespace>.<field>")`. Empty and no dynamic output → later steps must not reference its namespace.
|
|
49
|
+
- `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.
|
|
50
|
+
|
|
51
|
+
**`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.
|
|
52
|
+
|
|
53
|
+
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.
|
|
54
|
+
|
|
55
|
+
UI-schema keys that change what you may write:
|
|
56
|
+
|
|
57
|
+
- `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.**
|
|
58
|
+
- `"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`.
|
|
59
|
+
- `"ui:field": "AudienceSelector"` → an audience object owned by the app's picker; don't hand-author it — the user sets it in the builder.
|
|
60
|
+
- `"ui:field": "TextSectionField"` → display-only text; never map it.
|
|
61
|
+
- `"ui:widget": "hidden"`, `ui:readonly` → keep the schema `default`. Other `ui:*` keys are presentation only.
|
|
62
|
+
|
|
63
|
+
## 4. Dynamic input and output schemas
|
|
64
|
+
|
|
65
|
+
- **Input**: a property with `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.
|
|
66
|
+
- **Output**: after the mapping is final, call Get Action Dynamic Output Schema (or the bulk variant) and use the returned `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)).
|
|
67
|
+
|
|
68
|
+
## 5. Building the input mapping
|
|
69
|
+
|
|
70
|
+
### 5.1 Provider-owned mappings — email and opaque widgets
|
|
71
|
+
|
|
72
|
+
> **Later stages only:** email and other opaque-widget configuration is not available in stage 2; this section is published in stage 4.
|
|
73
|
+
|
|
74
|
+
**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.
|
|
75
|
+
|
|
76
|
+
### 5.2 Hand-authored mapping
|
|
77
|
+
|
|
78
|
+
MUST (builder renderability — the `GENERIC` form drops, rewrites or flags anything else):
|
|
79
|
+
|
|
80
|
+
- Keys: only properties of the current (merged dynamic) input schema. The form drops unknown keys on the first edit.
|
|
81
|
+
- Values: the schema's type — string→string, number/integer→number, boolean→boolean, array→array, object→object field by field (e.g. MONEY `{"value": "…", "currency": "…"}`).
|
|
82
|
+
- Every `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.
|
|
83
|
+
- An action with no input properties (or only hidden ones): send `"inputMapping": {}` — the builder writes `{}` itself on open otherwise.
|
|
84
|
+
- Map fields the form would auto-fill, or opening the step silently changes the automation: fields with a schema `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").
|
|
85
|
+
- Enum fields (`oneOf` / `enum`): one of the listed constants.
|
|
86
|
+
- Entity-selector fields: real ids of the right kind and shape (§1 of Automations Entity and Provider Configuration (not yet published)).
|
|
87
|
+
- `{{…}}` only in fields with `dynamicValuesOptions.enabled` (or an `identityType` field), per [Automations Mapping Expressions](https://dev.wix.com/docs/api-reference/business-management/automations/skills/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.
|
|
88
|
+
- Don't copy volatile values: dates → `now()`/payload dates; ids → resolved at build time, never from examples.
|
|
89
|
+
- Keep what the user describes for one field in that field. A subject described as "Order received, then the customer's first name" is one `subject` string mixing text and expressions (`"Order received {{var(…)}}"`); don't split its values into other fields, such as a message's `fields` rows.
|
|
90
|
+
|
|
91
|
+
Value kinds:
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"subject": "Welcome, {{var(\"contact.name.first\")}}!",
|
|
96
|
+
"priority": "HIGH",
|
|
97
|
+
"notifyCustomer": true,
|
|
98
|
+
"amount": {
|
|
99
|
+
"value": "{{var(\"order.total.value\")}}",
|
|
100
|
+
"currency": "{{var(\"order.total.currency\")}}"
|
|
101
|
+
},
|
|
102
|
+
"contactId": "{{var(\"contactId\")}}",
|
|
103
|
+
"labelKeys": ["<label-key-1>"],
|
|
104
|
+
"note": "Order {{var(\"order_number\")}} from {{var(\"createTask-1.taskId\")}}"
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Trigger fields have no prefix; action outputs use the step's `namespace` (e.g. `createTask-1.taskId`); set-variables use `setVariable.<key>`.
|
|
109
|
+
|
|
110
|
+
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.
|
|
111
|
+
|
|
112
|
+
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.
|
|
113
|
+
|
|
114
|
+
### 5.3 Validation errors on actions
|
|
115
|
+
|
|
116
|
+
Error shape, error type → fix, and how the builder shows each: [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) §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.
|
|
117
|
+
|
|
118
|
+
## 6. Side-effect and recipient review
|
|
119
|
+
|
|
120
|
+
This section owns the semantic review (you, not code) required for every action before acceptance. Confirm from its catalog entry and effective schemas:
|
|
121
|
+
|
|
122
|
+
- **Verb**: it performs what was asked (assign/add/send/create/update/delete). A read-only "get" action can't satisfy a mutation; sending a message about a change is not the change.
|
|
123
|
+
- **Entity**: the affected entity has a matching input (e.g. a label picker for "add label").
|
|
124
|
+
- **Identity input**: the id it acts on, with the right `identityType`.
|
|
125
|
+
- **Recipient lineage** (email, chat, SMS, push): write down `{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.
|
|
126
|
+
- **Later stages only — email is outside stage 2:** Email: the audience fields decide — read `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.
|
|
127
|
+
- Chat (`send-message`): only a schema-supported contact-id or visitor-id route; owner/team chat needs a different, proven component or a clarification.
|
|
128
|
+
- SMS / push: prove the schema-supported contact, audience, phone or device route.
|
|
129
|
+
|
|
130
|
+
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.
|
|
131
|
+
|
|
132
|
+
## 7. Common failure modes
|
|
133
|
+
|
|
134
|
+
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).
|
|
@@ -1,52 +1,68 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "Automations Activation Status"
|
|
3
|
-
description: "Read an automation’s current ACTIVE or INACTIVE status and
|
|
3
|
+
description: "Read an automation’s current ACTIVE or INACTIVE status, and activate or deactivate it when the user asks."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
{"query":{"filter":{"name":"<automation name>"},"cursorPaging":{"limit":25}}}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
`
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
6
|
+
> **Stage scope:** this stage covers only what [Build and Manage Wix Automations](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) lists; do not perform any workflow that needs a guide marked "not yet published". "Stage" 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).
|
|
7
|
+
|
|
8
|
+
# Activation status and lifecycle
|
|
9
|
+
|
|
10
|
+
**What the public API can see.** An automation's live state is `configuration.status` —
|
|
11
|
+
`ACTIVE` (eligible for new trigger events) or `INACTIVE` (not eligible for new trigger events).
|
|
12
|
+
Status does not show whether past runs succeeded. There is no separate
|
|
13
|
+
"published" flag and no public draft API:
|
|
14
|
+
|
|
15
|
+
- **Status check** = Get Automation → read `configuration.status`. Report exactly that value, in a
|
|
16
|
+
short answer that starts with the automation's name and returned ID;
|
|
17
|
+
never infer it from the name or from your own earlier writes. If several automations match the
|
|
18
|
+
supplied name, list each one's returned ID and end with a direct question such as "Which one
|
|
19
|
+
do you mean?"; don't report a single status. If no automation matches the supplied name, say
|
|
20
|
+
so and ask the user to check the name or site; never guess an ID.
|
|
21
|
+
- **Builder drafts are invisible to you**: if the user says "it doesn't show my latest changes",
|
|
22
|
+
tell them to publish (or discard) in the builder first — don't reproduce their edits.
|
|
23
|
+
- **NOT_FOUND is ambiguous.** Open the answer by saying the status can't be determined and
|
|
24
|
+
asking the user to confirm the site and the automation ID; then give the possible causes. A never-published builder draft is absent
|
|
25
|
+
from Get/Query, but deletion and a replaced preinstalled id can also explain a 404. The first
|
|
26
|
+
update of a preinstalled automation can create an override with a new id; use the mutation's
|
|
27
|
+
returned id, or Query to find the current automation and confirm its identity. When the
|
|
28
|
+
user's history supports an unpublished builder draft as the cause, ask the owner to publish or
|
|
29
|
+
discard it rather than reproducing its edits.
|
|
30
|
+
|
|
31
|
+
**Calls** (auth as in [Automations API Catalog](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-api-catalog) §1). A status question needs only Query and Get — no catalogs, Validate or writes.
|
|
32
|
+
|
|
33
|
+
- Find by name: `POST https://www.wixapis.com/automations-service/v2/automations/query` with
|
|
34
|
+
`{"query":{"filter":{"name":"<automation name>"},"cursorPaging":{"limit":25}}}` → `automations[]`
|
|
35
|
+
with each `id` and exact `name`. If the user supplied the ID, skip this.
|
|
36
|
+
- Read: `GET https://www.wixapis.com/automations-service/v2/automations/<automationId>` → `automation.configuration.status`. Add
|
|
37
|
+
`?fields=OVERRIDE_SCHEMA` before activating or deactivating.
|
|
38
|
+
- Activate / deactivate: `PATCH https://www.wixapis.com/automations-service/v2/automations/<automationId>` with
|
|
39
|
+
`{"automation": <the object exactly as fetched, with only configuration.status changed>}` — it
|
|
40
|
+
carries `id`, the current `revision`, `origin` and any `settings` the Get returned.
|
|
41
|
+
|
|
42
|
+
**Activate** (only when the user asks):
|
|
43
|
+
|
|
44
|
+
1. Get Automation with `fields: ["OVERRIDE_SCHEMA"]` → current `revision`, `origin`, `settings`.
|
|
45
|
+
If `settings.disableStatusChange`
|
|
46
|
+
or `settings.readonly` is true, stop and report the lock: the owning app doesn't allow it
|
|
47
|
+
(§4 of Automations Feasibility and Planning (not yet published)).
|
|
48
|
+
2. Already `ACTIVE` → report it and stop (idempotent; no write).
|
|
49
|
+
3. Set only the candidate's status to `ACTIVE`, then apply the §4 checklist in [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) and full Validate — never activate
|
|
50
|
+
an automation that doesn't validate. Preserve existing supported configurations as the §4 checklist in [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) explains.
|
|
51
|
+
4. Explicit activation instructions authorize this change; do not ask again. If the user only
|
|
52
|
+
asked to build or inspect it, obtain authorization before making it eligible for real runs.
|
|
53
|
+
5. Update Automation with the object exactly as fetched, `configuration.status: "ACTIVE"`, and
|
|
54
|
+
its `revision`. Nothing else changes.
|
|
55
|
+
6. Capture the returned id (a preinstalled override can change it), Get that id again with
|
|
56
|
+
override schemas, and confirm `configuration.status` is `ACTIVE` and all other requested
|
|
57
|
+
content is unchanged. Report "active" only then.
|
|
58
|
+
|
|
59
|
+
**Deactivate** (on explicit request): Get the complete object with override schemas; check
|
|
60
|
+
`settings.disableStatusChange` and `settings.readonly`; already INACTIVE means no write.
|
|
61
|
+
Otherwise change only `configuration.status` to `INACTIVE`, preserving origin, settings,
|
|
62
|
+
revision, schemas and all nodes, then Update and read back the returned id. **Do not run the §4 checklist in [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) or
|
|
63
|
+
Validate as a prerequisite**, and do not repair or remove unrelated invalid/legacy steps.
|
|
64
|
+
An explicit request to turn it off is sufficient authorization. Deactivating prevents new
|
|
65
|
+
triggered runs; it is not proof that every pending/running activation has stopped or will finish.
|
|
66
|
+
|
|
67
|
+
**Revision conflicts** (someone published from the builder meanwhile): re-Get and retry once;
|
|
68
|
+
if the fresh object differs in ways that matter, tell the user instead of overwriting.
|