@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.
- package/README.md +4 -0
- package/package.json +1 -1
- package/skills/wix-app/references/data-collection/WIX_DATA.md +10 -0
- package/skills/wix-design-system/SKILL.md +3 -1
- package/skills/wix-headless/references/BUILD-astro.md +10 -1
- package/skills/wix-headless/references/shared/STYLING.md +0 -1
- package/skills/wix-headless/scripts/compose.mjs +19 -24
- package/skills/wix-headless/scripts/patch-decorative-slots.mjs +15 -9
- package/skills/wix-manage/SKILL.md +32 -54
- package/skills/wix-manage/references/ecommerce/api-recommendation-tracking.md +3 -2
- package/skills/wix-manage/references/ecommerce/ecom-load-context.md +144 -0
- package/skills/wix-manage/references/ecommerce/ecom-pricing.md +84 -0
- package/skills/wix-manage/references/ecommerce/ecom-shipping.md +64 -0
- package/skills/wix-manage/references/ecommerce/{setup-coupons.md → pricing-promotions/ecom-pricing-create-coupon.md} +20 -6
- package/skills/wix-manage/references/ecommerce/{setup-discount-rules.md → pricing-promotions/ecom-pricing-create-discount-rule.md} +31 -1
- package/skills/wix-manage/references/ecommerce/{flow-bundle-and-save.md → pricing-promotions/ecom-pricing-flow-bundle-and-save.md} +11 -52
- package/skills/wix-manage/references/ecommerce/{flow-seasonal-promotion.md → pricing-promotions/ecom-pricing-flow-seasonal-promotion.md} +17 -57
- package/skills/wix-manage/references/ecommerce/{flow-stock-mover.md → pricing-promotions/ecom-pricing-flow-stock-mover.md} +28 -70
- package/skills/wix-manage/references/ecommerce/{flow-upsell-boost.md → pricing-promotions/ecom-pricing-flow-upsell-boost.md} +15 -68
- package/skills/wix-manage/references/ecommerce/{goal-clear-inventory.md → pricing-promotions/ecom-pricing-goal-clear-inventory.md} +22 -13
- package/skills/wix-manage/references/ecommerce/{goal-drive-cross-sells.md → pricing-promotions/ecom-pricing-goal-drive-cross-sells.md} +26 -8
- package/skills/wix-manage/references/ecommerce/{goal-increase-aov.md → pricing-promotions/ecom-pricing-goal-increase-aov.md} +32 -25
- package/skills/wix-manage/references/ecommerce/{goal-seasonal-revenue.md → pricing-promotions/ecom-pricing-goal-seasonal-revenue.md} +21 -8
- package/skills/wix-manage/references/ecommerce/{troubleshoot-discount-not-applying.md → pricing-promotions/ecom-pricing-troubleshoot-not-applying.md} +1 -1
- package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +23 -47
- package/skills/wix-manage/references/ecommerce/{api-shipping.md → shipping/ecom-shipping-api.md} +4 -3
- package/skills/wix-manage/references/ecommerce/{flow-fix-coverage-gaps.md → shipping/ecom-shipping-fix-coverage.md} +23 -17
- package/skills/wix-manage/references/ecommerce/{flow-add-free-shipping.md → shipping/ecom-shipping-free-shipping.md} +23 -18
- package/skills/wix-manage/references/ecommerce/{flow-optimize-shipping-rates.md → shipping/ecom-shipping-optimize-rates.md} +19 -16
- package/skills/wix-manage/references/ecommerce/{setup-store-pickup-location.md → shipping/ecom-shipping-setup-pickup.md} +12 -10
- package/skills/wix-manage/references/ecommerce/{setup-shipping-rates.md → shipping/ecom-shipping-setup-rates.md} +1 -2
- package/skills/wix-manage/references/ecommerce/{setup-shipping-regions.md → shipping/ecom-shipping-setup-regions.md} +1 -2
- package/skills/wix-manage/references/sites/query-sites.md +104 -32
- package/skills/wix-headless/references/astro/templates/Footer.astro +0 -27
- package/skills/wix-headless/references/astro/templates/Navigation.astro +0 -38
- package/skills/wix-headless/references/astro/templates/index.astro +0 -56
- package/skills/wix-manage/references/ecommerce/goal-reduce-cart-abandonment.md +0 -147
- package/skills/wix-manage/references/ecommerce/guardrail-discount-conflicts.md +0 -118
- package/skills/wix-manage/references/ecommerce/guardrail-margin-protection.md +0 -88
- package/skills/wix-manage/references/ecommerce/guardrail-rate-pricing-sanity.md +0 -108
- package/skills/wix-manage/references/ecommerce/guardrail-shipping-health.md +0 -124
- package/skills/wix-manage/references/ecommerce/recipe-apply-shipping-recommendations.md +0 -298
- package/skills/wix-manage/references/ecommerce/skill-graph.md +0 -139
- package/skills/wix-manage/references/ecommerce/troubleshoot-checkout-delivery-dropoff.md +0 -124
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: "
|
|
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-
|
|
15
|
-
- [Query Delivery Profiles](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-
|
|
16
|
-
- [Add Delivery Region](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-
|
|
17
|
-
- [Add Delivery Carrier](https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/api-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
-
"
|
|
29
|
-
|
|
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
|
-
"
|
|
44
|
-
|
|
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": "
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
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
|
-
"
|
|
64
|
-
"
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
140
|
+
**First request**:
|
|
84
141
|
```json
|
|
85
142
|
{
|
|
86
143
|
"query": {
|
|
87
|
-
"
|
|
88
|
-
|
|
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
|
|
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": "<
|
|
157
|
+
"cursor": "<metadata.cursors.next from previous response>"
|
|
101
158
|
}
|
|
102
159
|
}
|
|
103
160
|
}
|
|
104
161
|
```
|
|
105
162
|
|
|
106
|
-
|
|
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
|
|
113
|
-
|
|
182
|
+
### List all sites
|
|
183
|
+
Omit `filter` and page through with `cursorPaging` until `metadata.hasNext` is `false`.
|
|
114
184
|
|
|
115
|
-
### Find a
|
|
116
|
-
|
|
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
|
|
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 |
|