@wix/agent-skills 1.12.0 → 1.14.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.
Files changed (44) hide show
  1. package/README.md +4 -0
  2. package/package.json +1 -1
  3. package/skills/wix-app/references/data-collection/WIX_DATA.md +10 -0
  4. package/skills/wix-design-system/SKILL.md +3 -1
  5. package/skills/wix-headless/references/BUILD-astro.md +10 -1
  6. package/skills/wix-headless/references/shared/STYLING.md +0 -1
  7. package/skills/wix-headless/scripts/compose.mjs +19 -24
  8. package/skills/wix-headless/scripts/patch-decorative-slots.mjs +15 -9
  9. package/skills/wix-manage/SKILL.md +32 -54
  10. package/skills/wix-manage/references/ecommerce/api-recommendation-tracking.md +3 -2
  11. package/skills/wix-manage/references/ecommerce/ecom-load-context.md +144 -0
  12. package/skills/wix-manage/references/ecommerce/ecom-pricing.md +84 -0
  13. package/skills/wix-manage/references/ecommerce/ecom-shipping.md +64 -0
  14. package/skills/wix-manage/references/ecommerce/{setup-coupons.md → pricing-promotions/ecom-pricing-create-coupon.md} +20 -6
  15. package/skills/wix-manage/references/ecommerce/{setup-discount-rules.md → pricing-promotions/ecom-pricing-create-discount-rule.md} +31 -1
  16. package/skills/wix-manage/references/ecommerce/{flow-bundle-and-save.md → pricing-promotions/ecom-pricing-flow-bundle-and-save.md} +11 -52
  17. package/skills/wix-manage/references/ecommerce/{flow-seasonal-promotion.md → pricing-promotions/ecom-pricing-flow-seasonal-promotion.md} +17 -57
  18. package/skills/wix-manage/references/ecommerce/{flow-stock-mover.md → pricing-promotions/ecom-pricing-flow-stock-mover.md} +28 -70
  19. package/skills/wix-manage/references/ecommerce/{flow-upsell-boost.md → pricing-promotions/ecom-pricing-flow-upsell-boost.md} +15 -68
  20. package/skills/wix-manage/references/ecommerce/{goal-clear-inventory.md → pricing-promotions/ecom-pricing-goal-clear-inventory.md} +22 -13
  21. package/skills/wix-manage/references/ecommerce/{goal-drive-cross-sells.md → pricing-promotions/ecom-pricing-goal-drive-cross-sells.md} +26 -8
  22. package/skills/wix-manage/references/ecommerce/{goal-increase-aov.md → pricing-promotions/ecom-pricing-goal-increase-aov.md} +32 -25
  23. package/skills/wix-manage/references/ecommerce/{goal-seasonal-revenue.md → pricing-promotions/ecom-pricing-goal-seasonal-revenue.md} +21 -8
  24. package/skills/wix-manage/references/ecommerce/{troubleshoot-discount-not-applying.md → pricing-promotions/ecom-pricing-troubleshoot-not-applying.md} +1 -1
  25. package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +23 -47
  26. package/skills/wix-manage/references/ecommerce/{api-shipping.md → shipping/ecom-shipping-api.md} +4 -3
  27. package/skills/wix-manage/references/ecommerce/{flow-fix-coverage-gaps.md → shipping/ecom-shipping-fix-coverage.md} +23 -17
  28. package/skills/wix-manage/references/ecommerce/{flow-add-free-shipping.md → shipping/ecom-shipping-free-shipping.md} +23 -18
  29. package/skills/wix-manage/references/ecommerce/{flow-optimize-shipping-rates.md → shipping/ecom-shipping-optimize-rates.md} +19 -16
  30. package/skills/wix-manage/references/ecommerce/{setup-store-pickup-location.md → shipping/ecom-shipping-setup-pickup.md} +12 -10
  31. package/skills/wix-manage/references/ecommerce/{setup-shipping-rates.md → shipping/ecom-shipping-setup-rates.md} +1 -2
  32. package/skills/wix-manage/references/ecommerce/{setup-shipping-regions.md → shipping/ecom-shipping-setup-regions.md} +1 -2
  33. package/skills/wix-manage/references/sites/query-sites.md +104 -32
  34. package/skills/wix-headless/references/astro/templates/Footer.astro +0 -27
  35. package/skills/wix-headless/references/astro/templates/Navigation.astro +0 -38
  36. package/skills/wix-headless/references/astro/templates/index.astro +0 -56
  37. package/skills/wix-manage/references/ecommerce/goal-reduce-cart-abandonment.md +0 -147
  38. package/skills/wix-manage/references/ecommerce/guardrail-discount-conflicts.md +0 -118
  39. package/skills/wix-manage/references/ecommerce/guardrail-margin-protection.md +0 -88
  40. package/skills/wix-manage/references/ecommerce/guardrail-rate-pricing-sanity.md +0 -108
  41. package/skills/wix-manage/references/ecommerce/guardrail-shipping-health.md +0 -124
  42. package/skills/wix-manage/references/ecommerce/recipe-apply-shipping-recommendations.md +0 -298
  43. package/skills/wix-manage/references/ecommerce/skill-graph.md +0 -139
  44. package/skills/wix-manage/references/ecommerce/troubleshoot-checkout-delivery-dropoff.md +0 -124
@@ -1,9 +1,11 @@
1
1
  ---
2
- name: "Setup: Store Pickup Location"
2
+ name: "Shipping: Set Up Pickup / Local Delivery"
3
3
  description: Configures a pickup option for an online store so customers can choose in-store pickup at checkout. Uses the Delivery Profiles API to discover the Pickup carrier, add a delivery region, and attach the carrier with a free pickup rate.
4
4
  ---
5
5
  # Set Up Store Pickup Location
6
6
 
7
+ > **Routing rule:** BEFORE taking any action, call `ReadFullDocsArticle` on [Shipping API Reference](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference). The endpoint shapes for List Installed Delivery Carriers, Query Delivery Profiles, Add Delivery Region, and Add Delivery Carrier all live there. Do NOT call any of these APIs without loading it first.
8
+
7
9
  ## Prerequisites
8
10
 
9
11
  - Wix Stores (or another eCommerce business solution) installed on the site
@@ -11,16 +13,16 @@ description: Configures a pickup option for an online store so customers can cho
11
13
 
12
14
  ## Required APIs
13
15
 
14
- - [List Installed Delivery Carriers](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#list-installed-delivery-carriers)
15
- - [Query Delivery Profiles](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#query-delivery-profiles)
16
- - [Add Delivery Region](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#add-delivery-region)
17
- - [Add Delivery Carrier](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#add-delivery-carrier)
16
+ - [List Installed Delivery Carriers](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#list-installed-delivery-carriers)
17
+ - [Query Delivery Profiles](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#query-delivery-profiles)
18
+ - [Add Delivery Region](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#add-delivery-region)
19
+ - [Add Delivery Carrier](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#add-delivery-carrier)
18
20
 
19
21
  ---
20
22
 
21
23
  ## Step 1: Discover the Pickup carrier
22
24
 
23
- Call [List Installed Delivery Carriers](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#list-installed-delivery-carriers) to find the Pickup carrier's `id`.
25
+ Call [List Installed Delivery Carriers](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#list-installed-delivery-carriers) to find the Pickup carrier's `id`.
24
26
 
25
27
  **Endpoint**: `GET https://www.wixapis.com/ecom/v1/delivery-profiles/installed-carriers`
26
28
 
@@ -53,7 +55,7 @@ If no Pickup carrier appears in the list, the Pickup app is not installed on the
53
55
 
54
56
  ## Step 2: Find the default delivery profile
55
57
 
56
- Call [Query Delivery Profiles](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#query-delivery-profiles) to retrieve the site's default delivery profile.
58
+ Call [Query Delivery Profiles](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#query-delivery-profiles) to retrieve the site's default delivery profile.
57
59
 
58
60
  **Endpoint**: `POST https://www.wixapis.com/ecom/v1/delivery-profiles/query`
59
61
 
@@ -72,7 +74,7 @@ The response contains an array of `deliveryProfiles`. Find the one where `"defau
72
74
 
73
75
  ## Step 3: Add a delivery region for the pickup country
74
76
 
75
- If no region exists for the user's country in the default profile, call [Add Delivery Region](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#add-delivery-region) to create one.
77
+ If no region exists for the user's country in the default profile, call [Add Delivery Region](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#add-delivery-region) to create one.
76
78
 
77
79
  **Endpoint**: `POST https://www.wixapis.com/ecom/v1/delivery-profiles/{deliveryProfileId}/delivery-region`
78
80
 
@@ -130,7 +132,7 @@ Save the new region's `id` from the response.
130
132
 
131
133
  ## Step 4: Add the Pickup carrier to the region
132
134
 
133
- Call [Add Delivery Carrier](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping#add-delivery-carrier) to attach the Pickup carrier to the delivery region.
135
+ Call [Add Delivery Carrier](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference#add-delivery-carrier) to attach the Pickup carrier to the delivery region.
134
136
 
135
137
  **Endpoint**: `POST https://www.wixapis.com/ecom/v1/delivery-profiles/add-delivery-carrier`
136
138
 
@@ -205,4 +207,4 @@ Call [Add Delivery Carrier](https://dev.wix.com/docs/api-reference/business-solu
205
207
 
206
208
  ## Related Documentation
207
209
 
208
- - [API: Shipping Delivery](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-shipping)
210
+ - [API: Shipping Delivery](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/shipping-api-reference)
@@ -1,7 +1,6 @@
1
1
  ---
2
- name: "Setup: Shipping Rates"
2
+ name: "Shipping: Set Up Rates"
3
3
  description: Configures shipping option rates — rate types (flat, tiered, free), condition types and operators, free shipping threshold calibration, AOV sanity check, per-item penalty avoidance, and tier gap detection.
4
- layer: config
5
4
  ---
6
5
  # Shipping Rates
7
6
 
@@ -1,7 +1,6 @@
1
1
  ---
2
- name: "Setup: Shipping Regions"
2
+ name: "Shipping: Set Up Regions"
3
3
  description: Configures delivery profiles and regions — creating profiles, adding regions with destinations, assigning carriers, enabling backup rates, and handling externally managed regions.
4
- layer: config
5
4
  ---
6
5
  # Shipping Regions
7
6
 
@@ -1,37 +1,43 @@
1
1
  ---
2
2
  name: "Query Sites"
3
- description: Lists and queries all sites associated with a Wix account using Sites API. Covers pagination with cursor-based navigation.
3
+ description: Lists and queries all sites associated with a Wix account using the Sites API. Covers filtering, sorting, and cursor-based pagination.
4
4
  ---
5
5
  # Query Sites
6
6
 
7
- This recipe demonstrates how to list and query all sites associated with a Wix account.
7
+ This recipe demonstrates how to list and query the sites associated with a Wix account.
8
8
 
9
9
  ## Prerequisites
10
10
 
11
- - Account-level API access
12
- - Authorization for site listing permissions
11
+ - Account-level API access (authenticated as a Wix user or using an account-level API key)
12
+ - Permission `SITE_LIST.READ` (scope `SCOPE.ACC-DC-OS.READ-SITE`)
13
13
 
14
14
  ## Required APIs
15
15
 
16
16
  - **Query Sites API**: [REST](https://dev.wix.com/docs/api-reference/account-level/sites/sites/query-sites)
17
17
 
18
+ > Returns up to **100** sites per request. Use cursor paging (below) to retrieve more.
19
+
18
20
  ---
19
21
 
20
- ## Query All Sites
22
+ ## Query Sites
21
23
 
22
24
  **Endpoint**: `POST https://www.wixapis.com/site-list/v2/sites/query`
23
25
 
26
+ The request takes a `query` object that supports `filter`, `sort`, and `cursorPaging`.
27
+
24
28
  **Request Body**:
25
29
  ```json
26
30
  {
27
31
  "query": {
28
- "cursorPaging": {
29
- "limit": 50
30
- }
32
+ "filter": { "editorType": "EDITOR" },
33
+ "sort": [{ "fieldName": "createdDate", "order": "ASC" }],
34
+ "cursorPaging": { "limit": 50 }
31
35
  }
32
36
  }
33
37
  ```
34
38
 
39
+ All three fields are optional — `{ "query": { "cursorPaging": { "limit": 50 } } }` lists every site.
40
+
35
41
  **Request**:
36
42
  ```bash
37
43
  curl -X POST \
@@ -40,9 +46,9 @@ curl -X POST \
40
46
  -H 'Content-Type: application/json' \
41
47
  -d '{
42
48
  "query": {
43
- "cursorPaging": {
44
- "limit": 50
45
- }
49
+ "filter": { "editorType": "EDITOR" },
50
+ "sort": [{ "fieldName": "createdDate", "order": "ASC" }],
51
+ "cursorPaging": { "limit": 50 }
46
52
  }
47
53
  }'
48
54
  ```
@@ -51,75 +57,141 @@ curl -X POST \
51
57
 
52
58
  ## Response Structure
53
59
 
60
+ The response has the sites array plus **two** paging objects: a top-level `cursorPaging`
61
+ (echoes the applied limit and the next cursor) and `metadata` (count, `cursors.next`, `hasNext`).
62
+
63
+ > ⚠️ There is **no** `pagingMetadata` field. Read paging info from `metadata`.
64
+
54
65
  ```json
55
66
  {
56
67
  "sites": [
57
68
  {
58
- "id": "site-id-123",
59
- "name": "My Website",
60
- "displayName": "My Website",
61
- "siteUrl": "https://username.wixsite.com/mywebsite",
69
+ "id": "f6061c5f-6aa3-42f8-8822-36a4981dabb2",
70
+ "htmlAppId": "70df538d-906c-44ca-9f27-c186b62f2b2b",
71
+ "name": "my-site-47",
72
+ "displayName": "My Site 47",
73
+ "createdDate": "2023-02-01T14:56:09.831Z",
74
+ "updatedDate": "2026-06-22T03:55:49.031Z",
62
75
  "published": true,
63
- "createdDate": "2024-01-15T10:30:00Z",
64
- "updatedDate": "2024-06-20T14:45:00Z"
76
+ "premium": false,
77
+ "viewUrl": "https://username.wixsite.com/my-site-47",
78
+ "editUrl": "/editor/f6061c5f-6aa3-42f8-8822-36a4981dabb2?editorSessionId=...",
79
+ "thumbnail": "/site-thumbnail/f6061c5f-6aa3-42f8-8822-36a4981dabb2",
80
+ "ownerAccountId": "e6a89eda-d100-4b2d-8a47-3040e2134497",
81
+ "contributorAccountIds": [],
82
+ "editorType": "EDITOR",
83
+ "blocked": false,
84
+ "namespace": "WIX",
85
+ "domainConnected": false,
86
+ "parentChildRole": "NONE"
65
87
  }
66
88
  ],
67
- "pagingMetadata": {
89
+ "cursorPaging": {
90
+ "limit": 50,
91
+ "cursor": "<cursor-for-next-page>"
92
+ },
93
+ "metadata": {
68
94
  "count": 50,
69
95
  "cursors": {
70
- "next": "cursor-for-next-page"
96
+ "next": "<cursor-for-next-page>"
71
97
  },
72
98
  "hasNext": true
73
99
  }
74
100
  }
75
101
  ```
76
102
 
103
+ ### Site object fields
104
+
105
+ Each entry in `sites` has these fields (from the `Site` schema):
106
+
107
+ | Field | Type | Notes |
108
+ |---|---|---|
109
+ | `id` | string | Site ID — use for site-level API calls |
110
+ | `htmlAppId` | string | Internal HTML app ID |
111
+ | `name` | string | URL slug / internal name |
112
+ | `displayName` | string | Human-readable site name |
113
+ | `createdDate` / `updatedDate` | datetime | |
114
+ | `trashedDate` | datetime | Present only if the site is in the trash |
115
+ | `published` | boolean | Whether the site is published |
116
+ | `premium` | boolean | Whether the site has a Wix Premium (paid) plan |
117
+ | `viewUrl` | string | Public site address; empty string when unpublished. **There is no `siteUrl` field.** |
118
+ | `editUrl` | string | Relative editor path; prefix with `https://manage.wix.com` to open |
119
+ | `thumbnail` | string | Relative thumbnail path |
120
+ | `ownerAccountId` | string | |
121
+ | `contributorAccountIds` | string[] | |
122
+ | `editorType` | string | e.g. `EDITOR`, `ODEDITOR` — also a valid `filter` field |
123
+ | `blocked` | boolean | |
124
+ | `folderId` / `parentId` | string | Set for sites organized in folders / parent-child setups |
125
+ | `namespace` | string | e.g. `WIX` |
126
+ | `domainConnected` | boolean | |
127
+ | `parentChildRole` | string | e.g. `NONE` |
128
+
77
129
  ---
78
130
 
79
131
  ## Pagination
80
132
 
81
- For accounts with many sites, use cursor-based pagination:
133
+ Cursor-based. Read the next cursor from `metadata.cursors.next` and stop when
134
+ `metadata.hasNext` is `false`.
135
+
136
+ > The cursor does **not** carry the page limit, and it already encodes the filter/sort
137
+ > from the first request. On follow-up pages send **only** the cursor (plus `limit` if you
138
+ > want a non-default page size) — do **not** repeat `filter` or `sort`.
82
139
 
83
- **First Request**:
140
+ **First request**:
84
141
  ```json
85
142
  {
86
143
  "query": {
87
- "cursorPaging": {
88
- "limit": 50
89
- }
144
+ "filter": { "editorType": "EDITOR" },
145
+ "sort": [{ "fieldName": "createdDate", "order": "ASC" }],
146
+ "cursorPaging": { "limit": 50 }
90
147
  }
91
148
  }
92
149
  ```
93
150
 
94
- **Next Page** (using cursor from response):
151
+ **Next page** (cursor from `metadata.cursors.next`):
95
152
  ```json
96
153
  {
97
154
  "query": {
98
155
  "cursorPaging": {
99
156
  "limit": 50,
100
- "cursor": "<cursor-from-previous-response>"
157
+ "cursor": "<metadata.cursors.next from previous response>"
101
158
  }
102
159
  }
103
160
  }
104
161
  ```
105
162
 
106
- Continue until `hasNext` is `false`.
163
+ **Loop**:
164
+ ```javascript
165
+ async function listAllSites() {
166
+ const sites = [];
167
+ let cursor = null;
168
+ do {
169
+ const cursorPaging = cursor ? { limit: 100, cursor } : { limit: 100 };
170
+ const res = await wixRequest({ query: { cursorPaging } }); // POST .../site-list/v2/sites/query
171
+ sites.push(...res.sites);
172
+ cursor = res.metadata.hasNext ? res.metadata.cursors.next : null;
173
+ } while (cursor);
174
+ return sites;
175
+ }
176
+ ```
107
177
 
108
178
  ---
109
179
 
110
180
  ## Common Use Cases
111
181
 
112
- ### List All Sites
113
- Retrieve all sites without filtering - useful for account dashboards or site selection interfaces.
182
+ ### List all sites
183
+ Omit `filter` and page through with `cursorPaging` until `metadata.hasNext` is `false`.
114
184
 
115
- ### Find a Specific Site
116
- After querying, filter results by name or ID to locate a specific site.
185
+ ### Find a specific site
186
+ Prefer server-side `filter` (e.g. `{ "editorType": "EDITOR" }`) and `sort` over fetching
187
+ everything and filtering client-side. Filterable fields match the site object (e.g. `name`,
188
+ `displayName`, `editorType`, `published`).
117
189
 
118
190
  ---
119
191
 
120
192
  ## Next Steps
121
193
 
122
194
  After finding a site:
123
- - Use the site ID for site-level API calls
195
+ - Use the site `id` for site-level API calls
124
196
  - Create new sites using [Create Site from Template](create-site-from-template.md)
125
197
  - Manage site settings and content
@@ -1,27 +0,0 @@
1
- ---
2
- // ── Composer skeleton: src/components/Footer.astro ────────────────────────────
3
- // Substitutions (see compose.mjs):
4
- // {{brand.name}} — brand name for the wordmark + copyright.
5
- // {{shell.footerTagline}} — short brand-voice tagline from data.shell.
6
- // {{nav.links}} — same inlined Navigation links array (mirror/subset);
7
- // one <a href={href}>{label}</a> per entry, labels VERBATIM. No cart,
8
- // login, or account links.
9
- // Fixed bulk (keep literal): transition:persist, the year expression.
10
- const year = new Date().getFullYear();
11
- ---
12
- <footer class="site-footer" transition:persist="site-footer">
13
- <div class="max-w-6xl mx-auto px-6 py-16 flex flex-col md:flex-row md:items-start md:justify-between gap-8">
14
- <div class="flex flex-col gap-3 max-w-prose">
15
- <span class="font-display text-lg text-ink">{{brand.name}}</span>
16
- <p class="text-sm">{{shell.footerTagline}}</p>
17
- </div>
18
- <nav>
19
- <ul class="flex flex-col gap-3 text-sm">
20
- {{nav.links}}
21
- </ul>
22
- </nav>
23
- </div>
24
- <div class="max-w-6xl mx-auto px-6 pb-8 text-xs">
25
- <p>© {year} {{brand.name}}. All rights reserved.</p>
26
- </div>
27
- </footer>
@@ -1,38 +0,0 @@
1
- ---
2
- // ── Composer skeleton: src/components/Navigation.astro ────────────────────────
3
- // Substitutions (see compose.mjs):
4
- // {{shell.navBrandMark}} — brand mark / wordmark text from data.shell.
5
- // {{nav.links}} — one <a href={href}>{label}</a> per entry in the inlined
6
- // Navigation links array, labels VERBATIM (no editorial rebrands). Render
7
- // each inside a <li class="site-nav-item">.
8
- // Fixed bulk (keep literal): transition:persist, the <!-- nav:links --> marker,
9
- // the empty <div class="nav-actions"> mount, the mobile hamburger toggle.
10
- ---
11
- <header class="site-nav" transition:persist="site-nav">
12
- <nav class="max-w-6xl mx-auto px-6 flex items-center justify-between gap-6 py-4">
13
- <a href="/" class="font-display text-lg tracking-tight">{{shell.navBrandMark}}</a>
14
-
15
- <input type="checkbox" id="nav-toggle" class="peer hidden" aria-hidden="true" />
16
- <label
17
- for="nav-toggle"
18
- class="md:hidden inline-flex flex-col gap-[5px] cursor-pointer"
19
- aria-label="Toggle navigation"
20
- >
21
- <span class="block h-[2px] w-6 bg-ink"></span>
22
- <span class="block h-[2px] w-6 bg-ink"></span>
23
- <span class="block h-[2px] w-6 bg-ink"></span>
24
- </label>
25
-
26
- <div
27
- class="hidden peer-checked:flex md:flex absolute md:static top-full left-0 right-0 md:right-auto
28
- flex-col md:flex-row gap-4 md:gap-6 items-start md:items-center
29
- bg-paper md:bg-transparent border-b md:border-0 border-rule px-6 md:px-0 py-4 md:py-0"
30
- >
31
- <ul class="flex flex-col md:flex-row gap-4 md:gap-6 items-start md:items-center">
32
- {{nav.links}}
33
- <!-- nav:links -->
34
- </ul>
35
- <div class="nav-actions"></div>
36
- </div>
37
- </nav>
38
- </header>
@@ -1,56 +0,0 @@
1
- ---
2
- // ── Composer skeleton: src/pages/index.astro ──────────────────────────────────
3
- // Home shell. Substitutions (see compose.mjs):
4
- // {{shell.heroHeadline}}, {{shell.heroSub}} — brand-voice hero copy.
5
- // {{shell.footerTagline}} is NOT used here.
6
- // {{brand.name}} — used in the brand-story copy.
7
- // {{home-markers}} — one `<!-- home:<pack> -->` marker per LOADED pack that
8
- // contributes a home section (e.g. stores, gift-cards). Emit a marker
9
- // ONLY for such packs; never emit a marker no pack will fill (e.g. no
10
- // <!-- home:cms --> — CMS owns brand-story directly). Disabled packs
11
- // (gift-cards) still get their marker; do NOT add hero CTAs / teasers
12
- // pointing at disabled-pack routes.
13
- // Fixed bulk (keep literal): the Layout wrapper, hero/brand-story structure,
14
- // the data-decorative-slot="hero" and "about" placeholders (the orchestrator
15
- // injects <img> into these after Image Phase 1 — keep them empty).
16
- import Layout from '../layouts/Layout.astro';
17
- ---
18
- <Layout>
19
- <section class="relative">
20
- <div class="max-w-6xl mx-auto px-6 py-24 grid grid-cols-1 md:grid-cols-2 gap-16 items-center">
21
- <div class="flex flex-col gap-6">
22
- <h1 class="font-display text-4xl md:text-5xl leading-tight">{{shell.heroHeadline}}</h1>
23
- <p class="text-lg text-mute max-w-prose">{{shell.heroSub}}</p>
24
- </div>
25
- <div
26
- class="hero-image rounded-md"
27
- data-decorative-slot="hero"
28
- style="aspect-ratio: 4/5; background-color: var(--color-paper-warm);"
29
- >
30
- <!-- orchestrator injects <img src={decorativeImages.hero} …> here -->
31
- </div>
32
- </div>
33
- </section>
34
-
35
- {{home-markers}}
36
-
37
- <section class="max-w-6xl mx-auto px-6 py-24 grid grid-cols-1 md:grid-cols-2 gap-16 items-center">
38
- <div
39
- class="about-image rounded-md order-last md:order-first"
40
- data-decorative-slot="about"
41
- style="aspect-ratio: 4/3; background-color: var(--color-paper-warm);"
42
- >
43
- <!-- orchestrator injects <img src={decorativeImages.about} …> here -->
44
- </div>
45
- <div class="flex flex-col gap-4 max-w-prose">
46
- <hr class="editorial-rule w-16 ml-0" />
47
- <h2 class="font-display text-3xl leading-tight">The story behind {{brand.name}}</h2>
48
- <p class="text-ink leading-relaxed">
49
- A short, brand-contextual paragraph about what makes {{brand.name}} distinct.
50
- </p>
51
- <p class="text-mute leading-relaxed">
52
- A second paragraph adding warmth and detail to the brand story.
53
- </p>
54
- </div>
55
- </section>
56
- </Layout>
@@ -1,147 +0,0 @@
1
- ---
2
- name: "Goal: Reduce Cart Abandonment"
3
- description: Maps cart abandonment reduction to recovery automation KPIs. Covers abandoned cart email automation activation, missing sales detection, and eligibility thresholds. Also references shipping flows that affect checkout drop-off.
4
- layer: goal
5
- references:
6
- - name: "Flow: Fix Coverage Gaps"
7
- path: ecommerce/flow-fix-coverage-gaps.md
8
- load: false
9
- - name: "Recipe: Apply Shipping Recommendations"
10
- path: ecommerce/recipe-apply-shipping-recommendations.md
11
- load: false
12
- - name: "Setup Store Pickup Location"
13
- path: ecommerce/setup-store-pickup-location.md
14
- load: false
15
- ---
16
- # Goal: Reduce Cart Abandonment
17
-
18
- > **Related skills**:
19
- > - [Flow: Fix Coverage Gaps](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/flow-fix-coverage-gaps) — shipping coverage gaps block checkout entirely
20
- > - [Recipe: Apply Shipping Recommendations](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/recipe-apply-shipping-recommendations)
21
- > - [Setup Store Pickup Location](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/setup-store-pickup-location)
22
-
23
- Reduce checkout abandonment caused by shipping friction — coverage gaps, unexpected costs, and missing free shipping options — by optimizing the delivery step of the checkout funnel.
24
-
25
- ---
26
-
27
- ## Business Goal
28
-
29
- The merchant wants to reduce the percentage of customers who abandon checkout, specifically at the delivery/shipping step. Shipping-related friction is the leading cause of checkout abandonment, and the delivery step conversion rate (delivery_step_cvr) is the primary metric.
30
-
31
- **Benchmark:** A healthy delivery_step_cvr is approximately 65%. Stores below this benchmark have significant shipping-related friction.
32
-
33
- ---
34
-
35
- ## KPIs
36
-
37
- | KPI | Definition | How to measure | Benchmark |
38
- |---|---|---|---|
39
- | Delivery step CVR | Customers completing delivery step / customers reaching delivery step | Site metrics: delivery_step_cvr | 65% |
40
- | Cart abandonment rate | Carts created but not converted to orders / total carts | 1 - (orders / carts) | Industry avg ~70% |
41
- | Free shipping qualification rate | Orders qualifying for free shipping / total orders | Track orders meeting free shipping threshold | Higher is better |
42
- | Revenue from recovered checkouts | Incremental revenue from improved conversion | (new_cvr - old_cvr) * checkout_sessions * AOV | - |
43
-
44
- ---
45
-
46
- ## Triggers
47
-
48
- Activate this goal when the merchant expresses any of the following intents:
49
-
50
- - "cart abandonment"
51
- - "checkout drop-off"
52
- - "shipping friction"
53
- - "delivery step"
54
- - "people are leaving at checkout"
55
- - "customers not completing orders"
56
- - "why are customers abandoning"
57
- - "checkout conversion"
58
- - Any request about reducing drop-off during the purchase flow
59
-
60
- ---
61
-
62
- ## Diagnostic Questions
63
-
64
- Before recommending actions, assess the root cause of abandonment. Ask or investigate:
65
-
66
- 1. **Where are buyers dropping off?** — Is it specifically the delivery step, or payment, or earlier in the funnel?
67
- 2. **Are shipping costs visible before checkout?** — Surprise shipping costs are the #1 abandonment driver.
68
- 3. **Is there a free shipping option?** — Free shipping (even with a threshold) dramatically reduces abandonment.
69
- 4. **Are there shipping coverage gaps?** — Customers in unserved regions cannot complete checkout at all.
70
- 5. **Are shipping rates reasonable?** — Rates above 10-15% of order value cause sticker shock.
71
- 6. **Are payment methods adequate?** — Missing payment options can look like shipping-step abandonment in metrics.
72
- 7. **Are recovery emails enabled?** — Abandoned cart emails can recapture 5-15% of abandoned carts.
73
-
74
- ---
75
-
76
- ## Recommended Actions (Prioritized)
77
-
78
- Actions are ordered by impact. Address blocking issues first, then conversion drivers, then optimization.
79
-
80
- ### Priority 1: Flow: Fix Shipping Coverage Gaps (Blocking)
81
-
82
- Coverage gaps are the most critical issue — if a customer's region is not covered by any shipping option, they literally cannot complete checkout.
83
-
84
- **When to use:** When delivery profiles show regions without active shipping options, inactive regions, or missing domestic coverage.
85
-
86
- **Impact:** Removes a hard blocker. Customers in uncovered regions have 0% conversion.
87
-
88
- ### Priority 2: Flow: Add Free Shipping (Conversion Driver)
89
-
90
- Free shipping is the single most effective lever for reducing cart abandonment. Even with a minimum order threshold, offering a free shipping option significantly improves delivery step conversion.
91
-
92
- **When to use:** When the store has no free shipping option, or when the existing free shipping threshold is set too high relative to AOV.
93
-
94
- **Impact:** Typically improves delivery_step_cvr by 10-20 percentage points. The threshold should be calibrated to AOV (typically 1.2x-1.5x AOV).
95
-
96
- ### Priority 3: Flow: Optimize Shipping Rates (Sticker Shock Reduction)
97
-
98
- High shipping rates cause sticker shock even when coverage exists. Rate optimization ensures pricing is competitive and proportional to order value.
99
-
100
- **When to use:** When shipping rates are disproportionately high relative to product prices, or when rates lack tiered/conditional pricing.
101
-
102
- **Impact:** Reduces abandonment from price sensitivity. Most effective when combined with free shipping at a threshold.
103
-
104
- ---
105
-
106
- ## Measurement Plan
107
-
108
- ### Before optimization
109
-
110
- 1. Record baseline delivery_step_cvr from site metrics
111
- 2. Record current cart abandonment rate
112
- 3. Identify the specific shipping configuration state:
113
- - Number of active regions with shipping options
114
- - Presence/absence of free shipping
115
- - Average shipping rate as percentage of AOV
116
-
117
- ### During optimization (weekly monitoring for 30 days)
118
-
119
- 1. Track delivery_step_cvr weekly
120
- 2. Compare week-over-week trend
121
- 3. Monitor free shipping qualification rate (if threshold was added)
122
- 4. Check for new coverage gaps if regions were modified
123
-
124
- ### After optimization (30-day assessment)
125
-
126
- 1. Calculate CVR improvement: `new_delivery_step_cvr - baseline_delivery_step_cvr`
127
- 2. Estimate revenue recovered: `cvr_improvement * checkout_sessions * AOV`
128
- 3. Evaluate threshold effectiveness:
129
- - Free shipping qualification rate > 40% = threshold well-calibrated
130
- - Free shipping qualification rate < 10% = threshold too high, consider lowering
131
- 4. Assess whether further optimization is needed:
132
- - delivery_step_cvr >= 65% = healthy, monitor quarterly
133
- - delivery_step_cvr 50-65% = improving, continue optimization
134
- - delivery_step_cvr < 50% = investigate non-shipping causes (payment, UX)
135
-
136
- ---
137
-
138
- ## Decision Matrix
139
-
140
- | Scenario | Priority Action | Rationale |
141
- |---|---|---|
142
- | Regions without shipping options | Fix Coverage Gaps (P1) | Hard blocker — 0% conversion in uncovered regions |
143
- | No free shipping option exists | Add Free Shipping (P2) | #1 conversion driver for delivery step |
144
- | Free shipping exists but threshold too high | Add Free Shipping (recalibrate) | Lower threshold to match AOV |
145
- | High shipping rates, free shipping exists | Optimize Shipping Rates (P3) | Reduce sticker shock for below-threshold orders |
146
- | delivery_step_cvr >= 65% | No immediate action needed | Already at healthy benchmark |
147
- | Abandonment not at delivery step | Investigate other causes | Payment methods, UX, trust signals may be the issue |