@wix/himalaya-cli 0.1385.0 → 0.1387.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.
@@ -16,13 +16,20 @@ on conflict: [`apps/himi-branded-lite/config.ts`](../apps/himi-branded-lite/conf
16
16
 
17
17
  If you scaffolded from the `branded-lite` template with the standalone CLI
18
18
  (`himi init my-app --template branded-lite`) and have **no monorepo checkout**, the whole
19
- site binding is **two values**, and nothing on this page below this section applies to you:
19
+ site binding is **three values**, and nothing on this page below this section applies to you:
20
20
 
21
21
  ```sh
22
22
  export WIX_CLIENT_ID="<your-headless-oauth-client-id>"
23
23
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
24
+ export WIX_SITE_ID="<metasite-id>"
24
25
  ```
25
26
 
27
+ `WIX_SITE_ID` is the site that client belongs to. Reads need only the client, but a native
28
+ build matches its member sign-up CAPTCHA key, push registration and IAP binding against the
29
+ site: without it, sign-up on a CAPTCHA-protected site is refused. The member login takes it
30
+ from the environment while `WIX_CLIENT_ID` is the client the config uses
31
+ ([member-captcha-native.md](member-captcha-native.md)).
32
+
26
33
  Don't have the client id? You no longer have to go and copy it out of the dashboard —
27
34
  `himi site client ensure --site <msid> --yes` resolves the site's Headless client (reusing
28
35
  one that already carries your redirect, or minting one with it registered) and prints the
@@ -39,9 +46,9 @@ failing at redirect-session with "no auth code". `himi site list` shows the site
39
46
  already have.
40
47
 
41
48
  — or hardcode them directly in your app's [`config.ts`](../apps/himi-branded-lite/config.ts)
42
- (`WixConsumerAuthProvider({ clientId: "…", siteUrl: "…" })`). The Headless **`clientId` is the
43
- binding**; `metaSiteId` follows from the visitor token that client mints. That's it — the app now
44
- reads that site's real catalog. (Leaving the shipped `YOUR_WIX_CLIENT_ID` placeholder in place makes
49
+ (`WixConsumerAuthProvider({ clientId: "…", siteUrl: "…", siteId: "…" })`). The Headless
50
+ **`clientId` binds the data**; reads take the `metaSiteId` from the visitor token that client mints,
51
+ so the app now reads that site's real catalog. The native features above still need `siteId`. (Leaving the shipped `YOUR_WIX_CLIENT_ID` placeholder in place makes
45
52
  the app boot and read nothing; `himi validate` now warns when it's unreplaced.)
46
53
 
47
54
  Binding is **step 1 of integrating the app with the website**. To duplicate the site's
@@ -119,7 +126,7 @@ himalaya-dev app open himi-branded-lite device
119
126
  1. Set the env vars in the environment that runs the **dev-server / gen / Xcode / Gradle** process.
120
127
  2. Rebuild or re-run gen so `auth.json` picks up the new values if you are not relying on a live env override at boot.
121
128
 
122
- Off-repo (`himi init --template branded-lite`): set `WIX_CLIENT_ID` and `WIX_SITE_URL` the same way — the generated `config.ts` reads those names.
129
+ Off-repo (`himi init --template branded-lite`): set `WIX_CLIENT_ID`, `WIX_SITE_URL` and `WIX_SITE_ID` the same way — the generated `config.ts` reads the first two, and the member login pairs `WIX_SITE_ID` with `WIX_CLIENT_ID`.
123
130
 
124
131
  ### Where does MSID fit?
125
132
 
@@ -92,13 +92,23 @@ statuses are preserved: incomplete status is exit 1; a failed live Wix catalog r
92
92
 
93
93
  Item-level unavailable checks take precedence over drift in the top-level code. Detailed
94
94
  `priceSource`, `priceDrift` and `priceCheckIssue` fields live in each item's `provisioning` report.
95
- Manifest parsing failures retain their legacy envelopes; this is not a whole-command migration.
95
+ An invalid manifest, including a `reviewScreenshot` file that is missing or not a PNG or JPEG,
96
+ fails with `manifest_invalid`, and `problems` lists every reason. This is not a whole-command migration.
96
97
 
97
98
  IAP provisioning refusals from `plan`, `apply` and `status` also expose their existing typed
98
99
  `reason` as a top-level `code`: `target` (wrong app, bundle, team or territory), `access`
99
100
  (Apple authentication/authorization), `plan` (invalid reviewed plan), `account` (changed
100
101
  credential profile or key), and `drift` (Apple changed since planning). Existing `reason` and
101
- exit statuses remain intact. Manifest parsing failures still use their legacy envelope.
102
+ exit statuses remain intact. An invalid manifest carries `manifest_invalid` alongside its
103
+ existing `problems` list.
104
+
105
+ ## `himi store iap screenshots` codes
106
+
107
+ | Code | Meaning |
108
+ |---|---|
109
+ | `screenshots_incomplete` | At least one selected item has no screenshot. Each one in `items` carries a `skipped` reason: no purchase screen, no Apple price yet, an existing screenshot kept without `--force`, a screen that did not show the Apple price, or a failed read of the item. The screenshots that were made are saved and named in the manifest. Exit 1. |
110
+
111
+ An invalid manifest fails with `manifest_invalid`, like the other `store iap` commands.
102
112
 
103
113
  ## `himi store iap connect` codes
104
114
 
@@ -135,7 +145,7 @@ whole body gzip-encoded because it is over the plain 8 MB cap:
135
145
 
136
146
  | Code | Meaning |
137
147
  |---|---|
138
- | `compressed_publish_unsupported` | The publish body went out gzipped and the publishing service did not accept it compressed, so it read the bytes as malformed JSON. Either the service does not accept compressed bodies yet, or the credential is a self-serve one, which keeps the 8 MB uncompressed limit. Nothing was written. |
148
+ | `compressed_publish_unsupported` | The publish body went out gzipped and the publishing service did not accept it compressed. It either read the bytes as malformed JSON, or measured the decompressed body against the 8 MB uncompressed limit (HTTP 413). Either the service does not accept compressed bodies yet, or the credential is a self-serve one, which keeps the 8 MB uncompressed limit. Nothing was written. |
139
149
 
140
150
  ## `himi site member-app` codes
141
151
 
@@ -112,7 +112,8 @@ and nothing is crawled from a Wix catalog.
112
112
  { "locale": "en-US", "name": "Nutrition Program", "description": "Lifetime access to the nutrition plan." }
113
113
  ],
114
114
  "price": { "baseTerritory": "USA", "currency": "USD", "amount": "0.99" },
115
- "territories": ["USA", "CAN"]
115
+ "territories": ["USA", "CAN"],
116
+ "reviewScreenshot": "screens/nutrition-program.png"
116
117
  }
117
118
  ]
118
119
  }
@@ -138,6 +139,13 @@ Rules, all checked locally before any request:
138
139
  reference name at most 64, product id at most 100, review note at most 4,000.
139
140
  - **`territories`** is an explicit list that includes the base territory. Availability
140
141
  never extends to future territories automatically.
142
+ - **`reviewScreenshot`** (optional) is a PNG or JPEG of the purchase as it appears in your
143
+ app, for Apple's reviewer only; customers never see it. The path is relative to the
144
+ manifest's folder (or absolute). Without a screenshot, a product stays `MISSING_METADATA`
145
+ and can't be submitted. Every named file must exist and be a PNG or JPEG before `plan`
146
+ sends a request. Apple accepts any App Store screenshot size your app supports, so a
147
+ full-size iPhone screenshot is safest. `plan` warns about a size it doesn't recognize,
148
+ and Apple decides.
141
149
  - **Duplicates are refused:** a product id, Wix entity, entitlement or reference name
142
150
  used twice, including a Wix entity mapped both directly and through a tier.
143
151
  - **Unknown keys are refused, at every level.** So is any string that looks like a key or a token.
@@ -149,6 +157,7 @@ himi store iap draft --site <msid> --profile fit-club-owner --apple-app 6450000
149
157
  himi store iap plan --manifest ./iap-products.json --profile fit-club-owner --out ./iap-plan.json
150
158
  himi store iap apply --plan ./iap-plan.json --profile fit-club-owner --out ./iap-result.json
151
159
  himi store iap status --manifest ./iap-products.json --profile fit-club-owner --json
160
+ himi store iap screenshots --manifest ./iap-products.json --content . --profile fit-club-owner
152
161
  himi store iap connect --manifest ./iap-products.json --profile fit-club-owner \
153
162
  --iap-key ~/keys/SubscriptionKey_ABCD123456.p8 --iap-key-id ABCD123456 --content . --dry-run
154
163
  ```
@@ -172,7 +181,7 @@ A **conflict** is any of:
172
181
 
173
182
  - the same product id with another type;
174
183
  - the reference name already used by another product id;
175
- - a live product whose metadata or availability differs, or an in-review product needing changes;
184
+ - a live product whose metadata, availability or review screenshot differs, or an in-review product needing changes;
176
185
  - an existing `exact` price or availability that differs;
177
186
  - a price change with a different base territory, ambiguous price, custom territory prices, or a future/temporary schedule;
178
187
  - no Apple point satisfying the requested price rule, or an unknown product/review state needing changes.
@@ -200,12 +209,78 @@ created. The plan marks this in the item's `notes`.
200
209
  - If anything changed that the plan did not list (**drift**), it stops before the first
201
210
  write. Planned work that already happened is accepted as done.
202
211
  4. For each product, it creates the product, then a draft version, then its
203
- localizations. Then it sets the exact initial price and the explicit territories. Then
204
- it reads everything back. A `changePrice` instead writes an immediate base-territory price
212
+ localizations. Then it sets the exact initial price and the explicit territories, and
213
+ uploads the review screenshot. Then it reads everything back. A `changePrice` instead writes an immediate base-territory price
205
214
  through the same price-schedule API; Apple equalizes the other territories. A changed source
206
215
  price, schedule, review state or resolved target stops apply before the first write.
207
216
  5. Writes the result file, even when the run is partial.
208
217
 
218
+ **The review screenshot** is uploaded the way App Store Connect expects. Apply reserves it,
219
+ PUTs each part to the upload URLs Apple returns, and commits the file's MD5. Apple's storage
220
+ hosts only ever get the file's bytes, never the API key's token.
221
+
222
+ - **Identified by checksum.** Apple keeps the MD5 as `sourceFileChecksum`. A screenshot with
223
+ the same checksum is reused. A different file, an unfinished upload, or an image Apple
224
+ refused is planned as `replaceReviewScreenshot`.
225
+ - **Never deleted while valid.** Apple keeps one screenshot per product, and documents it as
226
+ "can be updated but not removed". A replacement asks Apple for a new upload over the old one;
227
+ if Apple refuses a second one, the step fails and says to replace it in App Store Connect. Only
228
+ what an interrupted or refused upload left behind (no finished image) is cleared first.
229
+ - **Locked once live.** The screenshot of a live or in-review product is never changed. A
230
+ different file there is a conflict.
231
+ - **Bytes fixed at plan time.** The plan records each file's checksum, and apply re-reads
232
+ the file. A file edited after `plan` stops apply as drift before any write.
233
+ - **Read back.** Apple processes the image after the commit, and apply waits briefly for
234
+ the result. A refused image (`FAILED`) fails the step with Apple's reason. An image still
235
+ processing (`UPLOAD_COMPLETE`) counts as uploaded.
236
+
237
+ ### Making the review screenshots: `screenshots`
238
+
239
+ `himi store iap screenshots --manifest <file> --content <app dir> [--profile <name>]` makes each
240
+ product's review screenshot from the app's own purchase screen, so nobody has to take them on a phone:
241
+
242
+ 1. **It renders the screen.** For each item it opens that Wix item's detail screen: `himi_product_<id>`,
243
+ `himi_program_<id>` or `himi_plan_<id>`, or the plain screen given the `id` when the app has no such
244
+ route. For a plan it falls back to the plans list (`himi_plans`), where older apps sell plans. The
245
+ screen loads with live Wix data.
246
+ 2. **It renders as the device would.** The render answers what a bound iPhone answers for a signed-in member of the site:
247
+ - the app's purchases binding;
248
+ - the item's App Store mapping;
249
+ - Apple's price;
250
+ - the member session. The stand-in member is new, so its own plan orders read as none.
251
+
252
+ The screen's own pricing and checkout code then paints the Apple price and an enabled buy button,
253
+ as the member sees them. Nothing is sent to wix-iap or Apple, and no member is signed in anywhere.
254
+ 3. **It checks the result.** A picture is kept only when three things hold:
255
+ - the screen shows Apple's price;
256
+ - its own state offers the purchase, meaning an enabled buy action, or an enabled join on a plan row;
257
+ - its read of the item succeeded.
258
+
259
+ A screen that fell back to "not available", showed no buy action, or failed to load the item is
260
+ reported, never saved.
261
+ 4. **It saves.** It writes `review-screenshots/<productId>.png` next to the manifest, at 1290×2796
262
+ (the largest-iPhone App Store size). It then sets each item's `reviewScreenshot` to that file,
263
+ leaving the rest of the manifest as it was.
264
+
265
+ **Apple's price** comes from App Store Connect when you pass `--profile`, a read-only call. Otherwise it is
266
+ the manifest's `exact` amount. An `atLeast` item that Apple has no price for yet is skipped: run `apply`
267
+ first. A price tier has no single purchase screen and is skipped too.
268
+
269
+ **Other options:**
270
+ - With `--profile`, a product that is live or in review keeps its screenshot: changing it there is a
271
+ conflict anyway.
272
+ - An item that already names a screenshot is kept unless you pass `--force`.
273
+ - `--only <productId,…>` limits the run; an id the manifest doesn't have is reported.
274
+ - `--dry-run` lists what would be rendered.
275
+ - `--out-dir` puts the files elsewhere.
276
+
277
+ The render reads Wix with a visitor token. A screen whose item a visitor cannot read is reported with
278
+ the failing read; take that screenshot on a phone, or fix the screen. A plan detail screen that reads
279
+ `GET /pricing-plans/v2/plans/<id>` gets a 403 as a visitor, while the public plans list works. The
280
+ templates read the public list since #4256.
281
+
282
+ Then run `plan` and `apply` as usual: they upload the screenshots.
283
+
209
284
  **Large catalogs.** App Store Connect allows about 3,600 API requests an hour per key.
210
285
  Registering a new product takes about ten, and each run also lists the app's products once.
211
286
 
@@ -225,8 +300,9 @@ Apple again before doing anything else:
225
300
  - A write is repeated **at most once**, and only after that read proves it didn't land.
226
301
  - An outcome that is still unknown stops that product as `partial`.
227
302
 
228
- So rerunning the same plan never creates a second product, version, locale or price
229
- schedule, even without the local journal. Nothing is ever deleted or rolled back.
303
+ So rerunning the same plan never creates a second product, version, locale, price
304
+ schedule or screenshot, even without the local journal. Nothing is rolled back, and the only
305
+ thing ever deleted is an unfinished or refused screenshot upload, never a finished screenshot.
230
306
 
231
307
  **`status` is read-only.** It reports what Apple has for each product. Add `--out <file>`
232
308
  to save it in the same shape as the result file.
@@ -333,6 +409,8 @@ Each item has two parts:
333
409
  - per-step states and any conflicts
334
410
  - `unmet` — where Apple still differs from the manifest
335
411
  - the requested and observed price, availability and locales
412
+ - `reviewScreenshot` — for an item that names one, the requested file name and the file
413
+ name and processing state Apple holds
336
414
  - the draft version and Apple's review state
337
415
  - `remainingRequirements`
338
416
  - `lastReadAt`
@@ -354,12 +432,14 @@ future importer must authenticate ownership and re-read Apple before activating
354
432
 
355
433
  ## What is still yours to do
356
434
 
357
- - **Finish the product in App Store Connect.** Upload the App Review screenshot and add
358
- anything else App Store Connect lists as missing. `remainingRequirements` names what
359
- Apple reports.
435
+ - **Finish the product in App Store Connect.** Add anything App Store Connect still lists
436
+ as missing. `remainingRequirements` names what Apple reports, including a missing review
437
+ screenshot when the item names none.
360
438
  - **Handle the business side.** Paid Apps agreement, banking and tax information go
361
439
  through the owner's App Store Connect account.
362
- - **Submit for review.** Submit the product with an app version. This command never
440
+ - **Submit for review.** Your first in-app purchases must be submitted together with an
441
+ app version: attach them to the version in App Store Connect before you submit it (see
442
+ `/submit-ios-app`). Later ones can be submitted on their own. This command never
363
443
  submits, and never makes a product available for sale.
364
444
  - **Allow for Sandbox delay.** Product changes can take a while to appear in Sandbox
365
445
  purchase testing. Sandbox is for purchases, not a separate product catalogue:
@@ -368,7 +448,7 @@ future importer must authenticate ownership and re-read Apple before activating
368
448
  Not in this version:
369
449
 
370
450
  - subscriptions
371
- - review screenshot upload and submission
451
+ - submitting products for review
372
452
  - changing a live price
373
453
  - Google Play
374
454
  - the build-time binding bake and the screens' checkout (the companion PR)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1385.0",
3
+ "version": "0.1387.0",
4
4
  "type": "module",
5
5
  "description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
6
6
  "keywords": [
@@ -71,5 +71,5 @@
71
71
  "artifactId": "himalaya-cli"
72
72
  }
73
73
  },
74
- "falconPackageHash": "f52e9acbffd96101463d111ef4cd624d24921816c71a1811584d337f"
74
+ "falconPackageHash": "3775f6901bf78a5a41956aac4c29f84e7abbb7149aa95c4bf7552269"
75
75
  }
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -7,12 +7,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
7
7
 
8
8
  ## Point at your Wix site
9
9
 
10
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
11
- pass, because the visitor token minted from it already names your site. Set these before
12
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
10
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
11
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
12
+ hit YOUR site (the placeholders are not a real backend):
13
13
 
14
14
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
15
15
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
16
+ export WIX_SITE_ID="<metasite-id>"
17
+
18
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
19
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
20
+ a CAPTCHA-protected site, push registration and in-app purchases.
16
21
 
17
22
  Full details, including how to ship a binary a customer can install against their own
18
23
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.
@@ -9,12 +9,17 @@ identity and navigation in `config.ts`, look and feel in `tokens.json`.
9
9
 
10
10
  ## Point at your Wix site
11
11
 
12
- Your **Wix Headless `clientId` IS the site binding** — there is no separate site id to
13
- pass, because the visitor token minted from it already names your site. Set these before
14
- `himi build` / preview so calls hit YOUR site (the placeholders are not a real backend):
12
+ Your **Wix Headless `clientId` binds the data** — the visitor token minted from it already
13
+ names your site, so reads need nothing else. Set these before `himi build` / preview so calls
14
+ hit YOUR site (the placeholders are not a real backend):
15
15
 
16
16
  export WIX_CLIENT_ID="<headless-oauth-client-id>"
17
17
  export WIX_SITE_URL="https://your-site.wixsite.com/…"
18
+ export WIX_SITE_ID="<metasite-id>"
19
+
20
+ `WIX_SITE_ID` is the site that client belongs to. The member login takes it from the environment
21
+ while `WIX_CLIENT_ID` is the client the config uses. A native build needs it for member sign-up on
22
+ a CAPTCHA-protected site, push registration and in-app purchases.
18
23
 
19
24
  Full details, including how to ship a binary a customer can install against their own
20
25
  site: `himi docs branded-lite-site-binding`.