@aglyn/aglyn 1.0.0-beta.250 → 1.0.0-beta.253

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 (47) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/activity-labels.js +1 -0
  3. package/src/lib/app-utils/activity-labels.js.map +1 -1
  4. package/src/lib/app-utils/ad-audience.d.ts +42 -0
  5. package/src/lib/app-utils/ad-audience.js +42 -0
  6. package/src/lib/app-utils/ad-audience.js.map +1 -0
  7. package/src/lib/app-utils/business-profile.d.ts +4 -0
  8. package/src/lib/app-utils/business-profile.js +2 -0
  9. package/src/lib/app-utils/business-profile.js.map +1 -1
  10. package/src/lib/app-utils/console-routes.d.ts +9 -0
  11. package/src/lib/app-utils/console-routes.js +6 -0
  12. package/src/lib/app-utils/console-routes.js.map +1 -1
  13. package/src/lib/app-utils/docs-help-sections.generated.js +455 -451
  14. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
  15. package/src/lib/app-utils/docs-help.generated.d.ts +27 -3
  16. package/src/lib/app-utils/docs-help.generated.js +78 -13
  17. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  18. package/src/lib/app-utils/docs-index.generated.js +193 -67
  19. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  20. package/src/lib/app-utils/email-block-starters.d.ts +39 -0
  21. package/src/lib/app-utils/email-block-starters.js +122 -0
  22. package/src/lib/app-utils/email-block-starters.js.map +1 -0
  23. package/src/lib/app-utils/health-report.js +11 -0
  24. package/src/lib/app-utils/health-report.js.map +1 -1
  25. package/src/lib/app-utils/image-edit.d.ts +77 -0
  26. package/src/lib/app-utils/image-edit.js +116 -0
  27. package/src/lib/app-utils/image-edit.js.map +1 -0
  28. package/src/lib/app-utils/operator-alerts.js +14 -0
  29. package/src/lib/app-utils/operator-alerts.js.map +1 -1
  30. package/src/lib/app-utils/release-flags.d.ts +1 -1
  31. package/src/lib/app-utils/release-flags.js +10 -0
  32. package/src/lib/app-utils/release-flags.js.map +1 -1
  33. package/src/lib/app-utils/screen-route.d.ts +1 -130
  34. package/src/lib/app-utils/screen-route.js +2 -151
  35. package/src/lib/app-utils/screen-route.js.map +1 -1
  36. package/src/lib/app-utils/screen-slug.d.ts +146 -0
  37. package/src/lib/app-utils/screen-slug.js +173 -0
  38. package/src/lib/app-utils/screen-slug.js.map +1 -0
  39. package/src/lib/app-utils/site-theme.d.ts +11 -0
  40. package/src/lib/app-utils/site-theme.js +32 -1
  41. package/src/lib/app-utils/site-theme.js.map +1 -1
  42. package/src/lib/app-utils/template-slug.d.ts +101 -0
  43. package/src/lib/app-utils/template-slug.js +150 -0
  44. package/src/lib/app-utils/template-slug.js.map +1 -0
  45. package/src/lib/plugin-manager/feature-plugins.d.ts +39 -0
  46. package/src/lib/plugin-manager/feature-plugins.js +13 -1
  47. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
@@ -205,7 +205,7 @@ export const DOCS_SECTION_INDEX = [
205
205
  title: 'AI credits',
206
206
  heading: 'What things cost',
207
207
  anchor: '#what-things-cost',
208
- text: 'What a request costs depends on how much the AI reads and writes, so the figures below are typical, not fixed: what jobs like it cost on real builds. Every job shows its estimate before you confirm it.\n| Request | Typical cost |\n| An answer in the chat, a rewrite, a summary | A few credits |\n| An answer quoted straight from the docs | Free |\n| A vector illustration, icon or logo mark | About 18 credits a picture |\n| A photo, art or design picture | About 108 credits a picture (about 75 on Free) |\n| A new site\'s look | A few credits |\n| A page from a brief | About 30 credits for a page of five sections (about 6 a section), plus planning |\n| A layout (header and footer) | About 25 credits |\n| A form | About 30 credits |\n| A component or email design | About 30 credits |\n| A new site started with AI, paid plan | About 170 for 3 pages to 320 for 8 |\n| A new site started with AI, Free plan | About 140 for two pages, within the 300 Free credits |\n| Products, booking services, overlays, A/B tests, funnels, variables in a chat build | Almost nothing |\n| Stock photos in an AI site | Nothing |\nA model you choose with the Model switch can cost more or less than Auto; the switch shows each model\'s cost. See Choosing a model.'
208
+ text: 'What a request costs depends on how much the AI reads and writes, so the figures below are typical, not fixed: what jobs like it cost on real builds. Every job shows its estimate before you confirm it.\n| Request | Typical cost |\n| An answer in the chat, a rewrite, a summary | A few credits |\n| An answer quoted straight from the docs | Free |\n| A vector illustration, icon or logo mark | About 4 credits a picture |\n| A photo, art or design picture | About 108 credits a picture (about 75 on Free) |\n| A new site\'s look | About 1 credit |\n| A page from a brief | About 30 credits for a page of five sections (about 6 a section), plus planning |\n| A layout (header and footer) | About 25 credits |\n| A form | About 30 credits |\n| A component or email design | About 30 credits |\n| A new site started with AI, paid plan | About 160 for 3 pages to 300 for 8 |\n| A new site started with AI, Free plan | About 115 for two pages, within the 300 Free credits |\n| Products, booking services, overlays, A/B tests, funnels, variables in a chat build | Almost nothing |\n| Stock photos in an AI site | Nothing |\nA model you choose with the Model switch can cost more or less than Auto; the switch shows each model\'s cost. See Choosing a model.'
209
209
  },
210
210
  {
211
211
  path: '/ai/ai-credits',
@@ -632,7 +632,7 @@ export const DOCS_SECTION_INDEX = [
632
632
  title: 'Create images with AI',
633
633
  heading: 'Credits',
634
634
  anchor: '#credits',
635
- text: 'Pictures are metered in AI credits from the workspace\'s pool. The window shows an estimate before you create anything:\n| Kinds | About, per picture | What it is made of |\n| Vector | 18 credits | The words the AI reads and writes to draw the SVG, at the same rates as other AI text |\n| Photo, Art and Design, on the Free plan | 75 credits | A 512 px picture, plus the description and the thinking the image model does before it draws |\n| Photo, Art and Design, on a paid plan | 108 credits | A 1K picture (about 1024 px on its longer side), plus the same |\nThe size comes from your plan: pictures are 512 px on Free and 1K on every paid plan.\nWhat is charged is what was actually spent, so a picture can cost a little more or less than its estimate, and an illustration that needed a second attempt costs about twice its estimate. You are charged only for pictures that reach your library:\n- a picture the safety filter holds back is not charged;\n- an illustration that does not come out right is not charged. The window says This one\'s on us — you weren\'t charged.\n- a picture your library could not store, because your storage is full for example, is not charged;\n- when the AI service fails, nothing is charged.\nA Free workspace spends from its monthly allowance and is told before it starts when the pictures it asked for would cost more than it has left. A paid workspace past its included band keeps working at its plan\'s overage rate unless the workspace stops AI at the band, the same as every other AI request.'
635
+ text: 'Pictures are metered in AI credits from the workspace\'s pool. The window shows an estimate before you create anything:\n| Kinds | About, per picture | What it is made of |\n| Vector | 4 credits | The words the AI reads and writes to draw the SVG, at the same rates as other AI text |\n| Photo, Art and Design, on the Free plan | 75 credits | A 512 px picture, plus the description and the thinking the image model does before it draws |\n| Photo, Art and Design, on a paid plan | 108 credits | A 1K picture (about 1024 px on its longer side), plus the same |\nThe size comes from your plan: pictures are 512 px on Free and 1K on every paid plan.\nWhat is charged is what was actually spent, so a picture can cost a little more or less than its estimate, and an illustration that needed a second attempt costs about twice its estimate. You are charged only for pictures that reach your library:\n- a picture the safety filter holds back is not charged;\n- an illustration that does not come out right is not charged. The window says This one\'s on us — you weren\'t charged.\n- a picture your library could not store, because your storage is full for example, is not charged;\n- when the AI service fails, nothing is charged.\nA Free workspace spends from its monthly allowance and is told before it starts when the pictures it asked for would cost more than it has left. A paid workspace past its included band keeps working at its plan\'s overage rate unless the workspace stops AI at the band, the same as every other AI request.'
636
636
  },
637
637
  {
638
638
  path: '/ai/create-images',
@@ -933,7 +933,7 @@ export const DOCS_SECTION_INDEX = [
933
933
  title: 'How Aglyn AI builds',
934
934
  heading: 'The plan comes first',
935
935
  anchor: '#the-plan-comes-first',
936
- text: 'Before it generates anything, a build job proposes a plan:\n- what it will reuse from your site: components, layouts, templates, forms, datasets and collections;\n- what it will create, and why nothing you already have will do;\n- the pages it will build, each with its layout, address, search title and sections;\n- any YouTube or Vimeo player your brief asks for, the page or component it goes on, and what it costs: a player loads its host\'s own code when a visitor reaches it, whether or not they press play. A brief that asks for no video gets no player.\nA plan only proposes what your workspace can create: what your plan includes, and what your site still has room for. A plan the job could not build is stopped before you are asked to confirm it, with the reason. What a page\'s plan creates, such as its layout, a card that repeats or its form, is built first when you confirm, in the same job.\nThe job then waits for you. The window you started it from stays with it: it shows the job planning, then the plan itself, with Confirm plan to build it and Cancel job to stop. Nothing is generated until you confirm.'
936
+ text: 'Before it generates anything, a build job proposes a plan:\n- what it will reuse from your site: components, layouts, templates, forms, datasets and collections;\n- what it will create, and why nothing you already have will do;\n- the pages it will build, each with its layout, address, search title and sections;\n- any YouTube or Vimeo player your brief asks for, the page or component it goes on, and what it costs: a player loads its host\'s own code when a visitor reaches it, whether or not they press play. A brief that asks for no video gets no player.\nA plan only proposes what your workspace can create: what your plan includes, and what your site still has room for. A plan the job could not build is stopped before you are asked to confirm it, with the reason. What a page\'s plan creates, such as its layout, a card that repeats or its form, is built first when you confirm, in the same job. If another build on the same site used the last form your plan includes after you confirmed, the page places the form that build just made instead, and the job says so. When no such form will do, the job stops, and you are not charged for what it could not build. Starting a page while another is being built on the same site says A page is already being built: wait for it, or start another anyway.\nThe job then waits for you. The window you started it from stays with it: it shows the job planning, then the plan itself, with Confirm plan to build it and Cancel job to stop. Nothing is generated until you confirm.'
937
937
  },
938
938
  {
939
939
  path: '/ai/how-aglyn-ai-builds',
@@ -1759,7 +1759,7 @@ export const DOCS_SECTION_INDEX = [
1759
1759
  title: 'Element catalog',
1760
1760
  heading: 'Media',
1761
1761
  anchor: '#media',
1762
- text: '| Element | What it\'s for |\n| Image | An image with fit, size and radius controls, an optional link, and an automatic responsive srcSet for media-library URLs. Open in a lightbox shows it full size when pressed. See Image below. |\n| Video | A video file from your media library, poster first. See Video. |\n| Music player | Your own tracks from your media library, one or a playlist of Track elements. See Music player. |\n| Icon | Any icon from the icon picker. |\n| Image List / Image List Item | A dense gallery. See Image List below. |\nImage\nA picture from your media library is delivered in several widths, and each visitor\'s browser downloads the one that fits the space the image takes on their screen — a phone gets a small file, a wide desktop a larger one. You do not set anything for this.\nHow Aglyn knows how big the image shows. Every published page works it out from where the image sits, with nothing for you to do and nothing to re-save:\n- a size you gave the image itself — a pixel Width, or a pixel Height with the width left on auto (a logo set 56px tall is as wide as its picture is at that height), including different sizes per screen size;\n- the layout around it — a Grid cell set to xs:12 md:4 is a third of the page from tablet width up, an image in a grid of three equal columns is a third, the gaps between them come off, and a Container stops the slot growing past its max width.\nOn top of that, the Besigner measures how wide each image renders at the screen size you are looking at, and saving or publishing the page stores it with the image — which covers layouts the rules above cannot read. Check the page on another device in the preview switcher (XS - Mobile, MD, LG…) before you save and that size is measured too. Only when nothing at all is known does the browser a'
1762
+ text: '| Element | What it\'s for |\n| Image | An image with fit, size and radius controls, an optional link, and an automatic responsive srcSet for media-library URLs. Open in a lightbox shows it full size when pressed. See Image below. |\n| Video | A video file from your media library, poster first. See Video. |\n| Music player | Your own tracks from your media library, one or a playlist of Track elements. See Music player. |\n| Icon | Any icon from the icon picker. |\n| Image List / Image List Item | A dense gallery. See Image List below. |\nImage\nA picture from your media library is delivered in several widths, and each visitor\'s browser downloads the one that fits the space the image takes on their screen — a phone gets a small file, a wide desktop a larger one. You do not set anything for this.\nHow Aglyn knows how big the image shows. Every published page works it out from where the image sits, with nothing for you to do and nothing to re-save:\n- a size you gave the image itself — a pixel Width, or a pixel Height with the width left on auto (a logo set 56px tall is as wide as its picture is at that height), including different sizes per screen size;\n- a Width in percent of the space around it — an image at 118% of its grid cell, pulled past the edge of the page, gets a file wide enough for the 118%;\n- the layout around it — a Grid cell set to xs:12 md:4 is a third of the page from tablet width up, an image in a grid of three equal columns is a third, the gaps between them come off, and a Container stops the slot growing past its max width.\nOn top of that, the Besigner measures how wide each image renders at the screen size you are looking at, and saving or publishing the page stores it with the image — which covers layouts the rules above cannot read. Check the page on another '
1763
1763
  },
1764
1764
  {
1765
1765
  path: '/building-sites/besigner/element-catalog',
@@ -4258,7 +4258,7 @@ export const DOCS_SECTION_INDEX = [
4258
4258
  title: 'Bookings & Scheduling',
4259
4259
  heading: 'Payments and fees',
4260
4260
  anchor: '#payments-and-fees',
4261
- text: 'Money for a paid booking goes to you, not to Aglyn. The charge is created on your connected Stripe account, and Aglyn takes its platform fee out of it as the Stripe Connect application fee — the same way a storefront sale works.\n- A booking is priced as a service, which bills at your plan\'s digital transaction rate: 5% on Starter, 3% on Pro, 2% on Business, 1% on Scale, and 0% from Advanced up. It is the same rate and the same ladder as digital products — bookings are not charged separately or additionally.\n- The fee is taken on the service price only. Stripe\'s own processing fee is separate and comes out of your account as usual.\n- Your current rate is shown on the Payments card of the Products hub, and the full ladder is on the plans page.\nService tax\nPaid bookings charge no tax by default, and that stays true for every site that does not change it.\nA service is not goods: the sales-tax rate configured for your store is a goods rate, and whether a service is taxable is a different question with frequently the opposite answer. So Aglyn does not apply your store\'s sales rate to an appointment. Instead, Service tax, on the Taxes card in the store\'s settings, is where you set your own rate for it.\nWhen you set one, Aglyn adds it to the booking charge as its own receipt line using the label you choose, and records the amount and the regime on the booking. It is always your own rate — Stripe Tax is never asked to compute it, because it has no service tax code for this and would apply a goods rate to an appointment.\nThe platform fee is charged on the service price, never on the tax.\nAglyn does not provide tax advice Aglyn applies the rate you enter and records what was charged. It does not determine whether service tax applies to you, at what rate, or where it should be paid'
4261
+ text: 'Money for a paid booking goes to you, not to Aglyn. The charge is created on your connected Stripe account, and Aglyn takes its platform fee out of it as the Stripe Connect application fee — the same way a storefront sale works.\n- A booking is priced as a service, which bills at your plan\'s digital transaction rate: 5% on Starter, 3% on Pro, 2% on Business, 1% on Scale, and 0% from Advanced up. It is the same rate and the same ladder as digital products — bookings are not charged separately or additionally.\n- The fee is taken on the service price only. Stripe\'s own processing fee is separate and comes out of your account as usual.\n- Your current rate is shown on the Payments card of the Products hub, and the full ladder is on the plans page.\nService tax\nPaid bookings charge no tax by default, and that stays true for every site that does not change it.\nA service is not goods: the sales-tax rate configured for your store is a goods rate, and whether a service is taxable is a different question with frequently the opposite answer. So Aglyn does not apply your store\'s sales rate to an appointment. Instead, Service tax, on the Taxes card (Products → Taxes), is where you set your own rate for it.\nWhen you set one, Aglyn adds it to the booking charge as its own receipt line using the label you choose, and records the amount and the regime on the booking. It is always your own rate — Stripe Tax is never asked to compute it, because it has no service tax code for this and would apply a goods rate to an appointment.\nThe platform fee is charged on the service price, never on the tax.\nAglyn does not provide tax advice Aglyn applies the rate you enter and records what was charged. It does not determine whether service tax applies to you, at what rate, or where it should be paid. Con'
4262
4262
  },
4263
4263
  {
4264
4264
  path: '/commerce-and-bookings/bookings/overview',
@@ -4321,7 +4321,7 @@ export const DOCS_SECTION_INDEX = [
4321
4321
  title: 'Product catalog',
4322
4322
  heading: 'Product reviews',
4323
4323
  anchor: '#product-reviews',
4324
- text: 'Shoppers rate a product from 1 to 5 and write a review in the Product reviews block on your product page template. Pro plan and above.\nReview settings {#review-settings}\nThe Reviews card in Settings decides who can review your products and when customers are asked for a review.\nWho can review. By default only customers who bought the product can review it, and their reviews show a Verified buyer badge. A customer is verified when they are signed in to their account on your store with the email their order went to, or when they open the link in their review-request email. Typing an email address into the form never verifies anyone. Everyone else sees "Only customers who bought this can review" and a Sign in link. To accept reviews from anyone, set Who can review to Anyone on the Reviews card in Settings: verified buyers still publish right away, and everyone else gives a name and an email (never shown) and waits for your approval.\nThe review-request email. A set number of days after an order is fulfilled (7 by default, anywhere from 3 to 30), the buyer gets one email asking for a review, with a link for each product on the order. Each link works once, for 60 days, and only for that order, product and buyer. Items that were refunded are left out, and register sales are never asked. The email respects unsubscribes and your suppression list. Turn it off or change the delay on the Reviews card, and change its wording under Emails → Review request.\nReview moderation {#review-moderation}\nThe Review moderation card, in the products hub\'s Promotions section, lists your reviews so you can publish, hide and reply to them:\n1. Verified reviews publish as soon as they are written, good or bad. You can Hide one only for a content reason: spam or advertising, abusive or hateful languag'
4324
+ text: 'Shoppers rate a product from 1 to 5 and write a review in the Product reviews block on your product page template. Pro plan and above.\nShow reviews on your site {#show-reviews}\nThe Product reviews element, in Besigner\'s Commerce elements, shows published reviews with the average rating, and the form customers write theirs in.\n1. Open your product page template in Besigner and add Product reviews below the product details.\n2. Leave Product id blank, so the block shows whichever product the page is showing. Pick a product only to pin the block to that one product.\n3. Optionally change its Heading, which reads Reviews when blank.\n4. Publish the site.\nTo show your store\'s latest published reviews across every product, on a home page for example, set Show to Whole store and choose Max reviews (6 by default, 12 at most). It shows nothing until a review is published.\nReview settings {#review-settings}\nThe Reviews card on Products → Promotions decides who can review your products and when customers are asked for a review.\nWho can review. By default only customers who bought the product can review it, and their reviews show a Verified buyer badge. A customer is verified when they are signed in to their account on your store with the email their order went to, or when they open the link in their review-request email. Typing an email address into the form never verifies anyone. Everyone else sees "Only customers who bought this can review" and a Sign in link. To accept reviews from anyone, set Who can review to Anyone on the Reviews card in Promotions: verified buyers still publish right away, and everyone else gives a name and an email (never shown) and waits for your approval.\nThe review-request email. A set number of days after an order is fulfilled (7 by default, anywhere from'
4325
4325
  },
4326
4326
  {
4327
4327
  path: '/commerce-and-bookings/commerce/catalog',
@@ -4335,7 +4335,7 @@ export const DOCS_SECTION_INDEX = [
4335
4335
  title: 'Product catalog',
4336
4336
  heading: 'Google Merchant Center feed',
4337
4337
  anchor: '#merchant-center-feed',
4338
- text: 'Your catalog is published as a product feed for Google Merchant Center, and for Meta, TikTok, Pinterest, Snapchat and Microsoft Shopping too. Each channel has its own feed address and setup steps in the store\'s settings, under Sales channels; see Sales channels.'
4338
+ text: 'Your catalog is published as a product feed for Google Merchant Center, and for Meta, TikTok, Pinterest, Snapchat and Microsoft Shopping too. Each channel has its own feed address and setup steps on the Products → Sales channels page; see Sales channels.'
4339
4339
  },
4340
4340
  {
4341
4341
  path: '/commerce-and-bookings/commerce/catalog',
@@ -4363,14 +4363,14 @@ export const DOCS_SECTION_INDEX = [
4363
4363
  title: 'Couriers for local delivery (DoorDash Drive)',
4364
4364
  heading: 'Connect DoorDash Drive',
4365
4365
  anchor: '#connect-doordash-drive',
4366
- text: '1. Sign up for a DoorDash developer account at developer.doordash.com, and create an access key. A test key reaches DoorDash\'s sandbox, where no Dasher is sent; a live key, available once DoorDash has approved your account for production, sends real couriers.\n2. In Aglyn, open your store\'s Settings and find the Couriers card.\n3. Enter your key\'s Developer ID, Key ID and Signing secret — your live key, your test key, or both — and choose Connect DoorDash. Aglyn checks each key with DoorDash before saving it, and keeps the signing secret encrypted.\n4. Under At the store, enter the phone number couriers call when the location your deliveries leave from has none, and a note every courier gets ("Ask at the counter for the order number").\nOrders paid in test mode use your test key, and other orders your live key, so a test order never sends a real courier.\nGet delivery updates as they happen {#webhook}\nThe Couriers card shows a webhook address and, once, a webhook token. In the DoorDash developer portal, add a webhook with that address, set its Authorization type to Basic, and paste the token. DoorDash then tells Aglyn each step of every delivery as it happens.\nWithout the webhook, Aglyn checks every open delivery with DoorDash every 15 minutes, and when you open the order. Lost the token? Choose New webhook token and paste the new one in DoorDash.'
4366
+ text: '1. Sign up for a DoorDash developer account at developer.doordash.com, and create an access key. A test key reaches DoorDash\'s sandbox, where no Dasher is sent; a live key, available once DoorDash has approved your account for production, sends real couriers.\n2. In Aglyn, open Products → Shipping & delivery and find the Couriers card.\n3. Enter your key\'s Developer ID, Key ID and Signing secret — your live key, your test key, or both — and choose Connect DoorDash. Aglyn checks each key with DoorDash before saving it, and keeps the signing secret encrypted.\n4. Under At the store, enter the phone number couriers call when the location your deliveries leave from has none, and a note every courier gets ("Ask at the counter for the order number").\nOrders paid in test mode use your test key, and other orders your live key, so a test order never sends a real courier.\nGet delivery updates as they happen {#webhook}\nThe Couriers card shows a webhook address and, once, a webhook token. In the DoorDash developer portal, add a webhook with that address, set its Authorization type to Basic, and paste the token. DoorDash then tells Aglyn each step of every delivery as it happens.\nWithout the webhook, Aglyn checks every open delivery with DoorDash every 15 minutes, and when you open the order. Lost the token? Choose New webhook token and paste the new one in DoorDash.'
4367
4367
  },
4368
4368
  {
4369
4369
  path: '/commerce-and-bookings/commerce/couriers',
4370
4370
  title: 'Couriers for local delivery (DoorDash Drive)',
4371
4371
  heading: 'Send a courier',
4372
4372
  anchor: '#send-a-courier',
4373
- text: '1. On the Orders page, in the Pickup & delivery card, choose Send a courier on a local delivery\'s row — or open the order and find its Courier section.\n2. Choose Get a DoorDash quote. Aglyn shows DoorDash\'s price and arrival estimate. The price is good for five minutes.\n3. Choose Send courier.\nA courier needs a full street address for the location your deliveries leave from (Products → Settings → Inventory locations) and the buyer\'s street address and phone number on the order. The order must be paid and not yet out for delivery or delivered.\nA delivery has one courier at a time: a second Send courier, or a retry after a lost connection, never books a second Dasher. If DoorDash doesn\'t answer, Aglyn checks with DoorDash within a few minutes and updates the order either way — don\'t book again.\nCancel a courier {#cancel}\nChoose Cancel courier on the order. The delivery stays in your own queue, where you can deliver it yourself or send another courier. DoorDash may still charge your account if the Dasher was already on the way; see DoorDash\'s cancellation terms.\nCanceling or fully refunding an order cancels its courier on Aglyn\'s next check, within 15 minutes.'
4373
+ text: '1. On the Orders page, in the Pickup & delivery card, choose Send a courier on a local delivery\'s row — or open the order and find its Courier section.\n2. Choose Get a DoorDash quote. Aglyn shows DoorDash\'s price and arrival estimate. The price is good for five minutes.\n3. Choose Send courier.\nA courier needs a full street address for the location your deliveries leave from (Products → Shipping & delivery → Inventory locations) and the buyer\'s street address and phone number on the order. The order must be paid and not yet out for delivery or delivered.\nA delivery has one courier at a time: a second Send courier, or a retry after a lost connection, never books a second Dasher. If DoorDash doesn\'t answer, Aglyn checks with DoorDash within a few minutes and updates the order either way — don\'t book again.\nCancel a courier {#cancel}\nChoose Cancel courier on the order. The delivery stays in your own queue, where you can deliver it yourself or send another courier. DoorDash may still charge your account if the Dasher was already on the way; see DoorDash\'s cancellation terms.\nCanceling or fully refunding an order cancels its courier on Aglyn\'s next check, within 15 minutes.'
4374
4374
  },
4375
4375
  {
4376
4376
  path: '/commerce-and-bookings/commerce/couriers',
@@ -4379,6 +4379,146 @@ export const DOCS_SECTION_INDEX = [
4379
4379
  anchor: '#what-your-buyer-sees',
4380
4380
  text: 'While a courier is on the way, your buyer\'s order status page shows DoorDash, where the courier is, the arrival estimate and a Track your courier link to DoorDash\'s live map. The Out for delivery and Delivered emails are the ones your own driver\'s steps send.'
4381
4381
  },
4382
+ {
4383
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4384
+ title: 'Discounts and coupons',
4385
+ heading: '',
4386
+ anchor: '',
4387
+ text: 'Discounts and coupons\nDiscounts take money off an order: either a code a shopper types at checkout, or an automatic promotion that applies to every cart that qualifies, with nothing to type. You set them up on your site\'s Products page, in its Promotions section.\nAnyone who can edit the site can add, change and delete discounts. Shoppers pay through your own Stripe account, so connect Stripe before you promote a sale.\nThe Promotions section holds two cards for money off:\n| Card | What it makes |\n| -- | -- |\n| Discounts | Codes and automatic promotions: percent off, a fixed amount off, or free shipping, with a minimum subtotal, a use limit and dates. Use this one for anything new. |\n| Coupons | Simple percent-off codes with a use limit and an expiry date. Codes you made here before Discounts existed keep working. |\nGift cards and store credit sit in the same section; see Gift cards & store credit.'
4388
+ },
4389
+ {
4390
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4391
+ title: 'Discounts and coupons',
4392
+ heading: 'Add a discount',
4393
+ anchor: '#add-a-discount',
4394
+ text: 'The Discounts card takes money off with a code or automatically: select Add discount, choose a percent off, an amount off or free shipping, and select Save.\n1. Open your site\'s Products page and choose Promotions.\n2. On the Discounts card, select Add discount.\n3. Fill in the New discount dialog:\n- Code (blank = automatic): the code shoppers type, such as SAVE10. It is saved in capital letters, and anything other than letters, numbers,\n- and is dropped. Leave it empty to make an automatic promotion, and give it a Promotion name instead, such as "Summer sale".\n- Type: Percent off, Fixed amount off or Free shipping. A percent or fixed discount asks for its amount in the % or $ off field next to it.\n- Min subtotal ($): optional. The cart\'s items must add up to at least this much.\n- Max uses: optional. Leave it empty for no limit. See Use limits.\n- Starts and Ends: optional dates. A discount works from the start of its Starts day to the end of its Ends day.\n4. Select Save. Save stays unavailable until a percent or fixed discount has an amount above zero.\nEach discount on the card reads as one line: its code or name, what it takes off, whether it is store-wide or limited to some products, any minimum, and how many times it has been used. A switched-off discount ends in · disabled. Disable stops a discount without deleting it, and Enable switches it back on. Edit opens the same dialog and Delete removes the discount straight away.\nDiscount types {#discount-types}\n- Percent off takes that share off the items in the cart.\n- Fixed amount off takes that amount off the items, never more than they cost.\n- Free shipping charges the shopper no shipping, whichever rate they pick.\nDiscounts come off the items before tax, so tax is worked out on the discounted price. They never come off '
4395
+ },
4396
+ {
4397
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4398
+ title: 'Discounts and coupons',
4399
+ heading: 'Automatic promotions',
4400
+ anchor: '#automatic-promotions',
4401
+ text: 'A discount with no code is an automatic promotion. It shows on the card as a chip with its Promotion name, or Automatic when it has none.\nEvery cart that meets an automatic promotion\'s minimum and dates gets it, without the shopper doing anything. When several could apply, the cart gets the one that takes the most off. Discounts never stack: when a shopper enters a valid code, the code applies instead of any automatic promotion.'
4402
+ },
4403
+ {
4404
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4405
+ title: 'Discounts and coupons',
4406
+ heading: 'Discount codes',
4407
+ anchor: '#discount-codes',
4408
+ text: 'A shopper types a code into the code field on your cart or product page. If the code can\'t be used, checkout stops and tells them why, rather than charging the full price. See What shoppers see.\nCodes are matched without regard to capital letters, so save10 works for SAVE10. A code that isn\'t one of your discounts is checked against your Coupons next.'
4409
+ },
4410
+ {
4411
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4412
+ title: 'Discounts and coupons',
4413
+ heading: 'Use limits',
4414
+ anchor: '#use-limits',
4415
+ text: 'Max uses counts orders, not items: one order uses a discount once, however many items it covers.\nWhile a shopper is on the payment page, their use is held for them, so a limited discount can\'t be handed out more times than its limit allows. The card shows held uses separately, for example 97/100 used · 3 held in checkout. A held use is given back when that checkout expires or is abandoned, and counted when it\'s paid.\nWhen every use is taken or held, the next shopper is told This discount has been fully redeemed. If someone else\'s checkout lets go of a held use, the code works again.'
4416
+ },
4417
+ {
4418
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4419
+ title: 'Discounts and coupons',
4420
+ heading: 'Where discounts apply',
4421
+ anchor: '#where-discounts-apply',
4422
+ text: '| Where | Codes | Automatic promotions |\n| -- | -- | -- |\n| Cart checkout | Yes | Yes |\n| A product\'s Buy button | Yes | Yes |\n| A draft order\'s payment link | No | Yes |\n| The register and the self-service kiosk | No | Yes, except free shipping |\nAt the register, an automatic promotion is added to the cashier\'s own Discount %. The cashier\'s percentage is limited by the store\'s Maximum register discount (%) setting; your promotions are not. See POS & reservations.'
4423
+ },
4424
+ {
4425
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4426
+ title: 'Discounts and coupons',
4427
+ heading: 'Coupons',
4428
+ anchor: '#coupons',
4429
+ text: 'The Coupons card makes simple percent-off codes for online checkout: select Add coupon, enter the code and the percent off, and select Create. For anything more, use a discount.\n1. On the Coupons card, select Add coupon.\n2. Enter the Code (letters and numbers; it is saved in capital letters), the Percent off, and optionally Max redemptions and an Expires date. The code works through the end of the day it expires.\n3. Select Create.\nEach coupon\'s line shows its code, how much it takes off, how many times it has been used, and its expiry, or expired once that day has passed. Use Disable to stop a coupon working and Enable to turn it back on.\nWhen a code matches both a discount and a coupon, the discount wins.'
4430
+ },
4431
+ {
4432
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4433
+ title: 'Discounts and coupons',
4434
+ heading: 'Import and export',
4435
+ anchor: '#import-and-export',
4436
+ text: 'The Discounts and Coupons cards each have Import and Export in their header. A discount or coupon you import starts switched off, unless the file has an Active column that says otherwise. Switch it on with Enable on its row. How many times one has been used is exported but never imported. See Import and export store data.\nAglyn AI can also propose discounts for your store. They are created switched off, so nothing changes at checkout until you select Enable. See Products with AI.'
4437
+ },
4438
+ {
4439
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4440
+ title: 'Discounts and coupons',
4441
+ heading: 'Show the code field to shoppers',
4442
+ anchor: '#show-the-code-field',
4443
+ text: 'Shoppers can only enter a code where your site shows a code field. In Besigner, select the element and turn on its setting:\n- Cart and Cart page: Show coupon and gift card fields. This one setting shows both the Coupon code field and the Gift card field.\n- Product detail and Product page: Show discount code field. This shows a Discount code field above the Buy button.\nAutomatic promotions need no field: they apply on their own.'
4444
+ },
4445
+ {
4446
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4447
+ title: 'Discounts and coupons',
4448
+ heading: 'What shoppers see',
4449
+ anchor: '#what-shoppers-see',
4450
+ text: 'A shopper whose code works pays the discounted price. When a code can\'t be used, checkout stops before payment and the shopper sees one of these messages:\n| Message | Why |\n| -- | -- |\n| This discount has not started yet | Today is before its Starts date. |\n| This discount has expired | Its Ends date has passed. |\n| This discount is disabled | The discount is switched off. |\n| Spend $… to use this | The cart\'s items add up to less than Min subtotal. |\n| This discount does not apply to your items | The discount covers only some products, and none of them are in the cart. |\n| This discount has been fully redeemed | Every use is taken or held in someone else\'s checkout. |\n| Invalid or expired coupon | The code is neither a discount nor a coupon, or the coupon is switched off or past its expiry. |\n| A promotion on your cart has just been fully redeemed. Refresh your cart to see the current price. | An automatic promotion ran out while the shopper was checking out. Refreshing prices the cart without it. |'
4451
+ },
4452
+ {
4453
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4454
+ title: 'Discounts and coupons',
4455
+ heading: 'Troubleshooting',
4456
+ anchor: '#troubleshooting',
4457
+ text: '| What happens | What to do |\n| -- | -- |\n| A shopper can\'t find where to type the code | Turn on the code field on your cart or product page. See Show the code field to shoppers. |\n| A discount ends in · disabled | It was imported or proposed by Aglyn AI, which start switched off, or someone selected Disable. Select Enable on its row. |\n| A capped discount says it is used up but you have fewer orders | Some uses are held by shoppers on the payment page. They come back when those checkouts expire. |\n| A code works online but not at the register | Codes aren\'t entered at the register. Make it an automatic promotion, or use the cashier\'s Discount %. |\n| A free shipping promotion didn\'t apply at the register | Register sales don\'t ship, so free shipping has nothing to take off there. |'
4458
+ },
4459
+ {
4460
+ path: '/commerce-and-bookings/commerce/discounts-and-coupons',
4461
+ title: 'Discounts and coupons',
4462
+ heading: 'Related',
4463
+ anchor: '#related',
4464
+ text: '- Commerce\n- Gift cards & store credit\n- Rewards, referrals and store credit\n- Import and export store data'
4465
+ },
4466
+ {
4467
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4468
+ title: 'Dropship suppliers',
4469
+ heading: '',
4470
+ anchor: '',
4471
+ text: 'Dropship suppliers\nWhen a supplier ships some of your products for you, Aglyn can send each paid order for those products straight to them. The supplier gets the items, the shipping address and a link to record the tracking number, and the order is marked shipped when they use it. Suppliers need no Aglyn account.\nDropship suppliers are part of the Pro plan and above. On a lower plan the Dropship suppliers card offers an upgrade instead, and no order is sent.'
4472
+ },
4473
+ {
4474
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4475
+ title: 'Dropship suppliers',
4476
+ heading: 'Add a supplier',
4477
+ anchor: '#add-a-supplier',
4478
+ text: 'The Dropship suppliers card, on Products → Shipping & delivery, lists the partners that ship orders for you: select Add supplier, enter its name and how it hears about orders, and select Save.\n1. Open your site\'s Products page and choose Shipping & delivery.\n2. On the Dropship suppliers card, select Add supplier.\n3. Enter the supplier\'s Name.\n4. Choose how it hears about orders. Fill in one or both:\n- Notification email: gets each order\'s details and a tracking link.\n- Webhook URL: an address on the supplier\'s own system that receives each order as JSON. See Webhook orders.\n5. Select Save.\nEach supplier\'s row shows its email and webhook address, or No delivery method set. Edit changes a supplier. Remove deletes it after you confirm: its products stop being sent, and orders already sent are not affected.'
4479
+ },
4480
+ {
4481
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4482
+ title: 'Dropship suppliers',
4483
+ heading: 'Assign products to a supplier',
4484
+ anchor: '#assign-products',
4485
+ text: 'A supplier is told only about the products you assign to it.\n1. On the Catalog, open a product the supplier ships.\n2. Choose the supplier under Supplier. None (self-fulfilled) keeps the product with you. The field appears once you have added a supplier.\n3. Save the product.\nRepeat for each of the supplier\'s products. A product has one supplier at a time.'
4486
+ },
4487
+ {
4488
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4489
+ title: 'Dropship suppliers',
4490
+ heading: 'What happens when an order is paid',
4491
+ anchor: '#when-an-order-is-paid',
4492
+ text: 'As soon as an order is paid, each supplier with products on it is sent that order, once. This happens for cart orders and for a product\'s Buy button.\n- A supplier is told about its own items only. An order with products from two suppliers, and some you ship yourself, sends each supplier just its lines; the rest wait for you on the Orders page.\n- The order\'s timeline shows a Sent to supplier entry for each supplier that was told.\n- If the order has no shipping address, because nothing on it needed shipping at checkout, the email says so and asks the supplier to contact you for it.\nThe supplier email {#supplier-email}\nThe email is sent in your store\'s name, with the subject New order to fulfill for your store. It gives the order number, what to ship and how many (with each item\'s option and SKU on a cart order), who it ships to and their address, and a link to record the shipment.'
4493
+ },
4494
+ {
4495
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4496
+ title: 'Dropship suppliers',
4497
+ heading: 'Record the shipment',
4498
+ anchor: '#record-the-shipment',
4499
+ text: 'The link in the email, also sent in each webhook order as updateUrl, opens a Record this shipment page:\n1. The supplier enters the Carrier and Tracking number.\n2. They select Mark as shipped.\nThe supplier\'s lines are then marked shipped with that tracking, the customer is sent their shipping email, and you get a notification. When other lines on the order are still to ship, the order shows as partly fulfilled, and the notification says how many lines are left. Each supplier\'s link covers only its own lines, and a supplier who already recorded its lines is told so.'
4500
+ },
4501
+ {
4502
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4503
+ title: 'Dropship suppliers',
4504
+ heading: 'Webhook orders',
4505
+ anchor: '#webhook-orders',
4506
+ text: 'For a supplier with a Webhook URL, Aglyn sends a POST with a JSON body for each order:\n| Field | What it holds |\n| -- | -- |\n| hostId, orderId | Which store and order this is. |\n| lines | Cart orders: each of this supplier\'s items, with productId, productName, variantLabel, sku and quantity. |\n| productId, productName, quantity | Buy button orders: the one product bought. |\n| customerEmail, shippingName | Who the order is for. |\n| shippingAddress | line1, line2, city, state, postalCode and country, or null when none was collected. |\n| updateUrl | The link to record the shipment. |\nTo record the shipment from the supplier\'s system, POST to updateUrl with a JSON body holding carrier and trackingNumber.\nSigned webhooks {#signed-webhooks}\nEnter a Webhook secret on the supplier, a value you share with it, and each order carries an x-aglyn-signature header: the hex HMAC-SHA256 of the raw body, keyed with that secret. The supplier checks the header to know the order came from your store. Without a secret, orders are sent unsigned.\nWhen the supplier\'s system is down {#webhook-retries}\nAn order that the supplier\'s address does not accept with a 2xx answer is tried again after about 1 minute, 5 minutes, 15 minutes, 1 hour and 6 hours. After six failed tries the order\'s timeline says it was never sent, and you get a notification to send it yourself or ship it by hand. Fixing the Webhook URL on the supplier also fixes orders still waiting to be retried.'
4507
+ },
4508
+ {
4509
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4510
+ title: 'Dropship suppliers',
4511
+ heading: 'Troubleshooting',
4512
+ anchor: '#troubleshooting',
4513
+ text: '| What happens | What to do |\n| -- | -- |\n| The card offers an upgrade | Dropship suppliers need the Pro plan or above. |\n| There is no Supplier field in the product editor | Add a supplier first. The field appears once one exists. |\n| A supplier didn\'t hear about an order | Check the product was assigned to the supplier before the order was paid, and that the supplier has an email or webhook address. Orders paid earlier are not sent again. |\n| The timeline says an order was never sent | The supplier\'s webhook address failed six times. Check the address, then send the order to the supplier yourself. |\n| The supplier says the link reports Invalid token | The link was changed or belongs to another order. Ask them to use the link from that order\'s email. |'
4514
+ },
4515
+ {
4516
+ path: '/commerce-and-bookings/commerce/dropship-suppliers',
4517
+ title: 'Dropship suppliers',
4518
+ heading: 'Related',
4519
+ anchor: '#related',
4520
+ text: '- Commerce\n- Product catalog\n- Orders and returns'
4521
+ },
4382
4522
  {
4383
4523
  path: '/commerce-and-bookings/commerce/fulfillment-networks',
4384
4524
  title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
@@ -4391,7 +4531,7 @@ export const DOCS_SECTION_INDEX = [
4391
4531
  title: 'Fulfillment networks (ShipBob, ShipMonk and Amazon MCF)',
4392
4532
  heading: 'Connect a network',
4393
4533
  anchor: '#connect-a-network',
4394
- text: '1. Open your store\'s Settings and find the Fulfillment networks card.\n2. Next to ShipBob or Amazon Multi-Channel Fulfillment (when the card offers them), select Connect.\n3. Sign in to that account and allow Aglyn access. You come back to the store settings with the network connected.\nYou need to be an admin of the site to connect, change or disconnect a network. Aglyn never sees your ShipBob or Amazon password; it keeps only the access the network grants, encrypted.\nShipMonk: connect with your API key\nShipMonk connects with an API key from your own ShipMonk account instead of a sign-in:\n1. In ShipMonk, open Account Settings, then Integration API Keys. If you have no API store yet, ShipMonk sets one up for you when you ask under Stores.\n2. Create an API key for your API store, and note the store\'s id shown beside it.\n3. In your store\'s Settings, select Connect ShipMonk, paste the key, enter the store id and select Connect.\nAglyn checks the key with ShipMonk before keeping it, keeps it encrypted, and never shows it again. To use a new key, revoke the old one in ShipMonk: the card asks you to Connect again, and you paste the new one.\nAfter you connect, the card shows a webhook address and a signing secret, once. Give both to ShipMonk (its webhook settings under Integrations, or ShipMonk support) so it tells Aglyn the moment an order ships. Aglyn checks every webhook\'s signature and ignores any that does not match. Without webhooks, Aglyn still reads each order back from ShipMonk every 15 minutes. New webhook secret makes a new secret and ends the old one at once.\n- ShipBob creates a channel for Aglyn in your ShipBob account. Orders appear under it.\n- Amazon asks you to choose the marketplace whose FBA inventory ships your orders, if your seller account sells in more than o'
4534
+ text: '1. Open Products → Shipping & delivery and find the Fulfillment networks card.\n2. Next to ShipBob or Amazon Multi-Channel Fulfillment (when the card offers them), select Connect.\n3. Sign in to that account and allow Aglyn access. You come back to the store settings with the network connected.\nYou need to be an admin of the site to connect, change or disconnect a network. Aglyn never sees your ShipBob or Amazon password; it keeps only the access the network grants, encrypted.\nShipMonk: connect with your API key\nShipMonk connects with an API key from your own ShipMonk account instead of a sign-in:\n1. In ShipMonk, open Account Settings, then Integration API Keys. If you have no API store yet, ShipMonk sets one up for you when you ask under Stores.\n2. Create an API key for your API store, and note the store\'s id shown beside it.\n3. On Products → Shipping & delivery, select Connect ShipMonk, paste the key, enter the store id and select Connect.\nAglyn checks the key with ShipMonk before keeping it, keeps it encrypted, and never shows it again. To use a new key, revoke the old one in ShipMonk: the card asks you to Connect again, and you paste the new one.\nAfter you connect, the card shows a webhook address and a signing secret, once. Give both to ShipMonk (its webhook settings under Integrations, or ShipMonk support) so it tells Aglyn the moment an order ships. Aglyn checks every webhook\'s signature and ignores any that does not match. Without webhooks, Aglyn still reads each order back from ShipMonk every 15 minutes. New webhook secret makes a new secret and ends the old one at once.\n- ShipBob creates a channel for Aglyn in your ShipBob account. Orders appear under it.\n- Amazon asks you to choose the marketplace whose FBA inventory ships your orders, if your seller account se'
4395
4535
  },
4396
4536
  {
4397
4537
  path: '/commerce-and-bookings/commerce/fulfillment-networks',
@@ -4482,7 +4622,7 @@ export const DOCS_SECTION_INDEX = [
4482
4622
  title: 'Fulfillment, returns and webhooks',
4483
4623
  heading: '',
4484
4624
  anchor: '',
4485
- text: 'Fulfillment, returns and webhooks\nWhat happens to an order after it is paid: shipping it, in one parcel or several; taking items back; printing its paperwork; and telling your other systems about it. Everything here is in the order\'s dialog on the Orders tab of the Products hub, and under Returns and Settings beside it.'
4625
+ text: 'Fulfillment, returns and webhooks\nWhat happens to an order after it is paid: shipping it, in one parcel or several; taking items back; printing its paperwork; and telling your other systems about it. Everything here is in the order\'s dialog on the Orders tab of the Products hub, under Returns beside it, and on its Checkout and Notifications settings pages.'
4486
4626
  },
4487
4627
  {
4488
4628
  path: '/commerce-and-bookings/commerce/orders-and-returns',
@@ -4503,14 +4643,14 @@ export const DOCS_SECTION_INDEX = [
4503
4643
  title: 'Fulfillment, returns and webhooks',
4504
4644
  heading: 'Returns',
4505
4645
  anchor: '#returns',
4506
- text: 'A return is its own record beside the order: what is coming back and why, what you decided, the return label, what went back in stock, and the refund. Every return is listed under Returns in the Products hub, newest first; the Status filter shows one state at a time.\nHow a buyer asks {#buyer-requests}\nA buyer asks for a return themselves, from either of two places:\n- the Request a return link beside an order in their account on your store, when they are signed in;\n- the Request a return button on the order\'s status page — the View your order link in every order email — which needs no account. The button shows only while the return window is open and something on the order can still come back.\nBoth open the return page at /order-return in your site\'s header and footer. The page is unlisted, so search engines leave it out; to design your own, make a page at /order-return and place the Return request block on it. The buyer chooses how many of each item to send back and a reason for each — Arrived damaged, Wrong item, Not as described, Size or fit, No longer needed or Other — and can add a note. Only items that have shipped can be returned, and never more than were bought or are already coming back. You and the site\'s managers are told by email and in the console\'s notifications.\nUnder Settings → Returns:\n- Accept return requests online — turn it off to take returns only by contact. You can still start a return for a buyer from the order.\n- Return window in days — counted from the last shipment, or from the order date for an order with nothing to ship. 0 to 365.\n- Returnable product types — physical products only, by default.\nRun a return {#run-a-return}\nOpen a return from the list, or from the Returns section of its order\'s dialog, where Start return opens one for the buye'
4646
+ text: 'A return is its own record beside the order: what is coming back and why, what you decided, the return label, what went back in stock, and the refund. Every return is listed under Returns in the Products hub, newest first; the Status filter shows one state at a time.\nHow a buyer asks {#buyer-requests}\nA buyer asks for a return themselves, from either of two places:\n- the Request a return link beside an order in their account on your store, when they are signed in;\n- the Request a return button on the order\'s status page — the View your order link in every order email — which needs no account. The button shows only while the return window is open and something on the order can still come back.\nBoth open the return page at /order-return in your site\'s header and footer. The page is unlisted, so search engines leave it out; to design your own, make a page at /order-return and place the Return request block on it. The buyer chooses how many of each item to send back and a reason for each — Arrived damaged, Wrong item, Not as described, Size or fit, No longer needed or Other — and can add a note. Only items that have shipped can be returned, and never more than were bought or are already coming back. You and the site\'s managers are told by email and in the console\'s notifications.\nUnder Checkout → Returns:\n- Accept return requests online — turn it off to take returns only by contact. You can still start a return for a buyer from the order.\n- Return window in days — counted from the last shipment, or from the order date for an order with nothing to ship. 0 to 365.\n- Returnable product types — physical products only, by default.\nRun a return {#run-a-return}\nOpen a return from the list, or from the Returns section of its order\'s dialog, where Start return opens one for the buye'
4507
4647
  },
4508
4648
  {
4509
4649
  path: '/commerce-and-bookings/commerce/orders-and-returns',
4510
4650
  title: 'Fulfillment, returns and webhooks',
4511
4651
  heading: 'Order webhooks',
4512
4652
  anchor: '#order-webhooks',
4513
- text: 'An order webhook posts each order event to an address you choose, as it happens: a warehouse system, an ERP, a spreadsheet script. Add them under Settings → Order webhooks in the Products hub. Managing webhooks needs the admin role and organization-wide membership, the same as refunds.\nAdd endpoint asks for:\n- Endpoint URL — an https:// address on a public server. Redirects are not followed, so give the final address.\n- Events — any of the events below.\nWhen you add an endpoint, its signing secret is shown once. Copy it into your endpoint\'s settings; Roll secret makes a new one if it is lost. A store can keep 10 endpoints. Pause stops deliveries to one without deleting it, and Send test event posts a webhook.test event now.\n| Event | When |\n| order.paid | An order was paid: online, buy-now, a payment link, a POS sale or a subscription renewal. |\n| order.fulfilled | A shipment was recorded, once per shipment. |\n| order.delivered | The order was marked delivered. |\n| order.refunded | Money went back to the buyer, once per refund, including a refund made in the Stripe Dashboard. |\n| order.cancelled | The order was canceled. |\n| return.requested | A buyer asked for a return, or you opened one. |\n| return.approved | You approved a return, or opened one yourself. |\n| return.declined | You declined a return request. |\n| return.received | The returned items arrived. |\n| return.refunded | A return was refunded. |\nWhen an endpoint is down\nAn endpoint has 8 seconds to answer each event. One that doesn\'t is sent the event again, on a schedule that lasts about a day, and the site\'s managers are told if the last try fails.\nWhoever builds your endpoint needs Order webhooks for developers: what each event carries and how to check that it came from your store.\nDeliveries on an endpoint '
4653
+ text: 'An order webhook posts each order event to an address you choose, as it happens: a warehouse system, an ERP, a spreadsheet script. Add them under Notifications → Order webhooks in the Products hub. Managing webhooks needs the admin role and organization-wide membership, the same as refunds.\nAdd endpoint asks for:\n- Endpoint URL — an https:// address on a public server. Redirects are not followed, so give the final address.\n- Events — any of the events below.\nWhen you add an endpoint, its signing secret is shown once. Copy it into your endpoint\'s settings; Roll secret makes a new one if it is lost. A store can keep 10 endpoints. Pause stops deliveries to one without deleting it, and Send test event posts a webhook.test event now.\n| Event | When |\n| order.paid | An order was paid: online, buy-now, a payment link, a POS sale or a subscription renewal. |\n| order.fulfilled | A shipment was recorded, once per shipment. |\n| order.delivered | The order was marked delivered. |\n| order.refunded | Money went back to the buyer, once per refund, including a refund made in the Stripe Dashboard. |\n| order.cancelled | The order was canceled. |\n| return.requested | A buyer asked for a return, or you opened one. |\n| return.approved | You approved a return, or opened one yourself. |\n| return.declined | You declined a return request. |\n| return.received | The returned items arrived. |\n| return.refunded | A return was refunded. |\nWhen an endpoint is down\nAn endpoint has 8 seconds to answer each event. One that doesn\'t is sent the event again, on a schedule that lasts about a day, and the site\'s managers are told if the last try fails.\nWhoever builds your endpoint needs Order webhooks for developers: what each event carries and how to check that it came from your store.\nDeliveries on an endp'
4514
4654
  },
4515
4655
  {
4516
4656
  path: '/commerce-and-bookings/commerce/orders-and-returns',
@@ -4531,14 +4671,14 @@ export const DOCS_SECTION_INDEX = [
4531
4671
  title: 'Commerce',
4532
4672
  heading: 'Products hub',
4533
4673
  anchor: '#products-hub',
4534
- text: 'The Products page is the catalog manager:\n- Products with up to 3 options and 100 variants each — per-variant SKU, barcode, price, compare-at (sale badge), weight, and stock. See Product catalog.\n- Categories & collections — a category tree plus manual and smart (rule-based) collections with a live match preview.\n- Import and export: a Shopify product export uploads as it is, a product a file matches by handle or SKU is updated, and every step shows its choices and a dry run first. Gift cards move over by issuing each card. Products, categories, orders, discounts, coupons and gift cards export with the fields you pick. See Import and export store data.\n- Payments — Stripe Connect onboarding status and your plan\'s fee ladder.\nThe product list filters through its own toolbar, and every filter and the search reach the whole catalog, not only the rows on screen. The list is in name order and pages through whatever matches.\n- Search matches the start of a word in a product\'s name, using the first word you type.\n- Filters offers Product (the name contains a word, is, or starts with), Status (Active, Draft, Archived), Type (Physical, Digital, Service), Slug, SKU and Barcode. A SKU or barcode is matched whole, the way you copy or scan it; is any of takes several, separated by commas.\nFilters combine. The one exception: the search, a Product contains filter, and a SKU or Barcode filter each look a word or code up in a list, and only one of those lookups can apply at a time. The list says which one it set aside, above the table, rather than applying it to some products and not others. Each filter in force shows as a chip above the table; remove the chip to clear it. See Filter and search a list.\nExport writes every product the filters and search match, in the same order — up to 1'
4674
+ text: 'The Products page is the catalog manager:\n- Products with up to 3 options and 100 variants each — per-variant SKU, barcode, price, compare-at (sale badge), weight, and stock. See Product catalog.\n- Categories & collections — a category tree plus manual and smart (rule-based) collections with a live match preview.\n- Import and export: a Shopify product export uploads as it is, a product a file matches by handle or SKU is updated, and every step shows its choices and a dry run first. Gift cards move over by issuing each card. Products, categories, orders, discounts, coupons and gift cards export with the fields you pick. See Import and export store data.\n- Payments — Stripe Connect onboarding status and your plan\'s fee ladder.\nThe store\'s settings sit under Settings at the foot of the Products rail, a page each:\n- Payments — your Stripe account and the payment methods shoppers may use.\n- Checkout — the Store settings card (templates, currency, guest checkout, terms, receipt footer) and online returns.\n- Taxes — your tax rates, and a tax service where one is set up.\n- Shipping & delivery — shipping rates, inventory locations and pickup, local delivery, dropship suppliers, and shipping and fulfillment services.\n- Notifications — which emails customers get, and order webhooks.\n- Point of sale — registers, staff PINs, register hardware and POS devices.\n- Sales channels and Integrations — the shopping channels, marketplaces and other services you connect. Each appears only once there is something on it for your store.\nAn old link to the single Settings page opens Payments.\nThe product list filters through its own toolbar, and every filter and the search reach the whole catalog, not only the rows on screen. The list is in name order and pages through whatever matches.\n- Search '
4535
4675
  },
4536
4676
  {
4537
4677
  path: '/commerce-and-bookings/commerce/overview',
4538
4678
  title: 'Commerce',
4539
4679
  heading: 'Inventory',
4540
4680
  anchor: '#inventory',
4541
- text: '- Per-variant stock; blank = untracked, 0 = sold out.\n- Oversell policy per product: stop selling or allow backorders.\n- Low-stock alerts notify managers once per threshold crossing.\n- Adjustment history with reason codes (sale, restock, correction…).\n- Locations split stock across warehouses/storefronts (plan-capped); adjustments and POS sales bucket per location.\n- Reserved in checkout holds units for a shopper who has reached the payment page, so the last one cannot be sold twice.\nInventory locations {#inventory-locations}\nThe Inventory locations card, in the store\'s settings, splits your stock across warehouses or storefronts: add a location for each place you keep stock, then set each variant\'s count per location.\nWithout locations, every variant has a single stock count. How many locations you can add depends on your plan; the card says when you reach the limit.\n1. Type a name under New location and select Add. The first location you add becomes the Default; Make default on another row moves it.\n2. Select Add address on a row to give the location its postal address. Shipping labels use it as the address parcels ship from (see Where parcels ship from), and buyers who pick up are sent there.\n3. Optionally select Pickup on a row to let buyers collect orders there, with pickup hours and arrival instructions — see Set up pickup.\n4. In the products hub, enter each variant\'s stock for each location.\nPOS registers sell from the location you give them, so a sale at the till takes stock from that location. Remove deletes a location after you confirm.\nReserved stock {#reserved-stock}\nWhen a shopper reaches the payment page, the units in their basket are reserved — the next shopper is offered what is left, not the same unit. It is what stops two people paying for the last one'
4681
+ text: '- Per-variant stock; blank = untracked, 0 = sold out.\n- Oversell policy per product: stop selling or allow backorders.\n- Low-stock alerts notify managers once per threshold crossing.\n- Adjustment history with reason codes (sale, restock, correction…).\n- Locations split stock across warehouses/storefronts (plan-capped); adjustments and POS sales bucket per location.\n- Reserved in checkout holds units for a shopper who has reached the payment page, so the last one cannot be sold twice.\nInventory locations {#inventory-locations}\nThe Inventory locations card, on Products → Shipping & delivery, splits your stock across warehouses or storefronts: add a location for each place you keep stock, then set each variant\'s count per location.\nWithout locations, every variant has a single stock count. How many locations you can add depends on your plan; the card says when you reach the limit.\n1. Type a name under New location and select Add. The first location you add becomes the Default; Make default on another row moves it.\n2. Select Add address on a row to give the location its postal address. Shipping labels use it as the address parcels ship from (see Where parcels ship from), and buyers who pick up are sent there.\n3. Optionally select Pickup on a row to let buyers collect orders there, with pickup hours and arrival instructions — see Set up pickup.\n4. In the products hub, enter each variant\'s stock for each location.\nPOS registers sell from the location you give them, so a sale at the till takes stock from that location. Remove deletes a location after you confirm.\nReserved stock {#reserved-stock}\nWhen a shopper reaches the payment page, the units in their basket are reserved — the next shopper is offered what is left, not the same unit. It is what stops two people paying for th'
4542
4682
  },
4543
4683
  {
4544
4684
  path: '/commerce-and-bookings/commerce/overview',
@@ -4566,14 +4706,14 @@ export const DOCS_SECTION_INDEX = [
4566
4706
  title: 'Commerce',
4567
4707
  heading: 'Payment methods',
4568
4708
  anchor: '#payment-methods',
4569
- text: 'The Payment methods card, in the store\'s settings, chooses what shoppers may pay with besides a card, once your Stripe account is connected on the Payments card. Cards are always on. Every other method is on unless you turn it off, except stablecoins, which you turn on. Stripe shows a method only on orders it suits: the right currency, an amount inside its limits, and a shopper in a country it serves.\n| Method | What the shopper needs | Limits |\n| Apple Pay | Safari on a Mac, iPhone or iPad with a card in Apple Wallet | Same as cards |\n| Google Pay | Chrome or an Android device with a card in Google Pay | Same as cards |\n| Link | A card or bank saved with Link | Same as cards |\n| Klarna | A US shopper paying in USD | From $10 |\n| Afterpay | A US shopper paying in USD | $1 to $4,000, one-time purchases only |\n| Affirm | A US shopper paying in USD | $50 to $30,000, one-time purchases only |\n| Cash App Pay | A US shopper with Cash App | USD only |\n| Amazon Pay | An Amazon account with a saved card | USD only |\n| Stablecoins | A crypto wallet holding USDC or another supported stablecoin | USD only, up to $10,000 |\nThe card only lists the methods the platform offers. A method missing from your card is not available for storefronts yet. Anyone who manages the store can read the card; only a site admin can change it.\nWhat each chip means. Buy-now-pay-later, Cash App Pay, Amazon Pay and stablecoins also need Stripe to enable them on your payout account. Saving the card asks Stripe for that. Stripe is reviewing means it is still checking, and Stripe needs more details means Stripe wants more information. The organization owner presses Finish in Stripe on that method to give it. A method Stripe has not enabled on your account may not be offered to shoppers.\nApple Pay needs your d'
4709
+ text: 'The Payment methods card, on Products → Payments, chooses what shoppers may pay with besides a card, once your Stripe account is connected on the Payments card. Cards are always on. Every other method is on unless you turn it off, except stablecoins, which you turn on. Stripe shows a method only on orders it suits: the right currency, an amount inside its limits, and a shopper in a country it serves.\n| Method | What the shopper needs | Limits |\n| Apple Pay | Safari on a Mac, iPhone or iPad with a card in Apple Wallet | Same as cards |\n| Google Pay | Chrome or an Android device with a card in Google Pay | Same as cards |\n| Link | A card or bank saved with Link | Same as cards |\n| Klarna | A US shopper paying in USD | From $10 |\n| Afterpay | A US shopper paying in USD | $1 to $4,000, one-time purchases only |\n| Affirm | A US shopper paying in USD | $50 to $30,000, one-time purchases only |\n| Cash App Pay | A US shopper with Cash App | USD only |\n| Amazon Pay | An Amazon account with a saved card | USD only |\n| Stablecoins | A crypto wallet holding USDC or another supported stablecoin | USD only, up to $10,000 |\nThe card only lists the methods the platform offers. A method missing from your card is not available for storefronts yet. Anyone who manages the store can read the card; only a site admin can change it.\nWhat each chip means. Buy-now-pay-later, Cash App Pay, Amazon Pay and stablecoins also need Stripe to enable them on your payout account. Saving the card asks Stripe for that. Stripe is reviewing means it is still checking, and Stripe needs more details means Stripe wants more information. The organization owner presses Finish in Stripe on that method to give it. A method Stripe has not enabled on your account may not be offered to shoppers.\nApple Pay needs your do'
4570
4710
  },
4571
4711
  {
4572
4712
  path: '/commerce-and-bookings/commerce/overview',
4573
4713
  title: 'Commerce',
4574
4714
  heading: 'Shipping & taxes',
4575
4715
  anchor: '#shipping--taxes',
4576
- text: '- Shipping zones own countries (\'\' = rest of world); rates are flat, free-over-subtotal, or subtotal/weight tiers; optional local pickup. See Shipping.\n- Taxes: manual per-region rates (state beats country, VAT-style inclusive pricing supported) or Stripe Tax automatic calculation; products can be tax-exempt.\nTax settings {#tax-settings}\nThe Taxes card, in the store\'s settings, decides how your store charges sales tax: rates you enter, Stripe Tax, or none at all. Checkout stays off until you choose an option and save, so no order is taken that cannot be taxed correctly.\n1. Choose the Calculation:\n- Manual rates — you enter the rates.\n- Stripe Tax (automatic) — Stripe works out the tax for each buyer\'s location at checkout. Activate Stripe Tax in your Stripe dashboard first.\n- Don\'t collect sales tax — no tax is added to any order, and orders still go through. Choose it when you have no obligation to collect.\n2. For manual rates, enter the Origin country and Origin state: where the store ships or sells from. It is not the address Aglyn bills your workspace at, and not where your payouts go.\n3. Select Add rate for each region you collect in: a Country, an optional State, the rate in % and the Label buyers see. A state rate beats a country rate.\n4. Turn on Prices include tax if your prices already include it, VAT-style.\n5. Optionally set a Lodging tax rate for reservations (see below) and a Service tax rate for paid bookings (see Bookings).\n6. Select Save tax settings.\nWhat the store has collected is reported on the Storefront sales tax card. A store that uses Avalara or TaxJar sets that up separately: see Tax services.\nAsk Aglyn AI. You can ask Aglyn Assist to set up tax, such as charge 8.25% Texas sales tax, we sell from Austin, calculate tax automatically or we don\'t co'
4716
+ text: '- Shipping zones own countries (\'\' = rest of world); rates are flat, free-over-subtotal, or subtotal/weight tiers; optional local pickup. See Shipping.\n- Taxes: manual per-region rates (state beats country, VAT-style inclusive pricing supported) or Stripe Tax automatic calculation; products can be tax-exempt.\nTax settings {#tax-settings}\nThe Taxes card, on Products → Taxes, decides how your store charges sales tax: rates you enter, Stripe Tax, or none at all. Checkout stays off until you choose an option and save, so no order is taken that cannot be taxed correctly.\n1. Choose the Calculation:\n- Manual rates — you enter the rates.\n- Stripe Tax (automatic) — Stripe works out the tax for each buyer\'s location at checkout. Activate Stripe Tax in your Stripe dashboard first.\n- Don\'t collect sales tax — no tax is added to any order, and orders still go through. Choose it when you have no obligation to collect.\n2. For manual rates, enter the Origin country and Origin state: where the store ships or sells from. It is not the address Aglyn bills your workspace at, and not where your payouts go.\n3. Select Add rate for each region you collect in: a Country, an optional State, the rate in % and the Label buyers see. A state rate beats a country rate.\n4. Turn on Prices include tax if your prices already include it, VAT-style.\n5. Optionally set a Lodging tax rate for reservations (see below) and a Service tax rate for paid bookings (see Bookings).\n6. Select Save tax settings.\nWhat the store has collected is reported on the Storefront sales tax card. A store that uses Avalara or TaxJar sets that up separately: see Tax services.\nAsk Aglyn AI. You can ask Aglyn Assist to set up tax, such as charge 8.25% Texas sales tax, we sell from Austin, calculate tax automatically or we don\'t collec'
4577
4717
  },
4578
4718
  {
4579
4719
  path: '/commerce-and-bookings/commerce/overview',
@@ -4587,21 +4727,21 @@ export const DOCS_SECTION_INDEX = [
4587
4727
  title: 'Commerce',
4588
4728
  heading: 'Dropshipping',
4589
4729
  anchor: '#dropshipping',
4590
- text: 'Assign a supplier to a product and paid orders route automatically — by email and/or HMAC-signed webhook — with a token link the supplier uses to post tracking back, which fulfills the order. Pro plan and above.\nThe supplier needs no Aglyn account. To set it up:\n1. In the store\'s settings, find the Dropship suppliers card and select Add supplier.\n2. Enter the supplier\'s Name, and how it hears about orders: a Notification email, which gets the order details and a tracking link for each sale, a Webhook URL with its Webhook secret, or both.\n3. Open each product the supplier fulfills, and choose it under Supplier in the product editor. None (self-fulfilled) keeps the product with you.\nFrom then on, each paid order for that product is sent to the supplier. When the supplier posts tracking through its link, the order is fulfilled.'
4730
+ text: 'Add a supplier on the Dropship suppliers card, assign it to the products it ships, and each paid order is sent to it by email or webhook with a link to record the tracking, which marks its items shipped. Pro plan and above. See Dropship suppliers.'
4591
4731
  },
4592
4732
  {
4593
4733
  path: '/commerce-and-bookings/commerce/overview',
4594
4734
  title: 'Commerce',
4595
4735
  heading: 'Store settings',
4596
4736
  anchor: '#store-settings',
4597
- text: 'The Store settings card, in the store\'s settings, sets the pages product and collection links open, the currency prices show in, guest checkout, your terms link and the receipt footer.\n1. Choose the Product page template: a page you designed with the Product detail block, rendered at /products/{slug} for every product. With None, product links lead nowhere. See The product page template.\n2. Choose the Collection page template, a page with a Product grid, rendered at /collections/{slug}.\n3. Leave Currency at USD; charges settle in USD.\n4. Turn on Allow guest checkout to let buyers pay without an account.\n5. Optionally enter a Terms URL, linked from checkout, and a Receipt footer.\n6. Select Save store settings.\nTaxes and shipping have their own cards. Store password and maintenance mode live under Site Protection.'
4737
+ text: 'The Store settings card, on Products → Checkout, sets the pages product and collection links open, the currency prices show in, guest checkout, your terms link and the receipt footer.\n1. Choose the Product page template: a page you designed with the Product detail block, rendered at /products/{slug} for every product. With None, product links lead nowhere. See The product page template.\n2. Choose the Collection page template, a page with a Product grid, rendered at /collections/{slug}.\n3. Leave Currency at USD; charges settle in USD.\n4. Turn on Allow guest checkout to let buyers pay without an account.\n5. Optionally enter a Terms URL, linked from checkout, and a Receipt footer.\n6. Select Save store settings.\nTaxes and shipping have their own pages, Taxes and Shipping & delivery. Store password and maintenance mode live under Site Protection.'
4598
4738
  },
4599
4739
  {
4600
4740
  path: '/commerce-and-bookings/commerce/overview',
4601
4741
  title: 'Commerce',
4602
4742
  heading: 'Discounts and coupons',
4603
4743
  anchor: '#discounts-and-coupons',
4604
- text: 'Your store has two kinds of money-off code, both in the Promotions section of the products hub. They are your codes for your buyers — not the coupons Aglyn applies to your own subscription.\nDiscounts {#discounts}\nThe Discounts card makes codes buyers type at checkout, or automatic promotions that apply on their own, for a percent off, an amount off or free shipping.\n1. Select Add discount.\n2. Enter a Code, such as SAVE10, or leave it blank for an automatic promotion and give it a Promotion name instead.\n3. Choose the Type — Percent off, Fixed amount off or Free shipping — and its value.\n4. Optionally set a Min subtotal, a Max uses, and the dates it Starts and Ends.\n5. Select Save.\nDiscounts apply at your storefront checkout and at the register. Each row shows how many times it has been used; Edit changes it and Delete removes it. Import and Export in the card header move discounts in and out with a file.\nCoupons {#coupons}\nThe Coupons card makes simple percent-off codes buyers enter at checkout, with an optional limit on uses and an expiry date. For anything more, use a discount.\n1. Select Add coupon.\n2. Enter the Code: letters and numbers, saved in capitals, such as LAUNCH20.\n3. Enter the Percent off, and optionally Max redemptions (blank is unlimited) and the day it expires. The code still works on the day it expires.\n4. Select Create. The coupon is live at once.\nEach row shows the code, the percent off, its uses and its expiry. Disable stops a coupon without deleting it, and Enable brings it back.'
4744
+ text: 'Money off lives on the Promotions tab of your site\'s Products page. Discounts and coupons is the full setup guide.\nDiscounts {#discounts}\nDiscounts are codes shoppers type at checkout, or automatic promotions with nothing to type, for a percent off, an amount off or free shipping, with an optional minimum, use limit and dates. See Add a discount.\nCoupons {#coupons}\nCoupons are the older, simpler percent-off codes, with an optional use limit and expiry date. See Coupons.'
4605
4745
  },
4606
4746
  {
4607
4747
  path: '/commerce-and-bookings/commerce/overview',
@@ -4636,14 +4776,14 @@ export const DOCS_SECTION_INDEX = [
4636
4776
  title: 'Pickup & local delivery',
4637
4777
  heading: 'Set up pickup',
4638
4778
  anchor: '#set-up-pickup',
4639
- text: 'Pickup is turned on per location, on the Inventory locations card in the store\'s settings, so buyers can collect orders there at the hours you set. On a location\'s row, choose Pickup, then:\n1. Turn on Buyers can pick up orders here.\n2. Under Pickup hours, switch on each day buyers can collect, then pick the From and To times. For a split day, such as a lunch break, select Add hours on that day.\n3. Add Arrival instructions if buyers need them, such as which door to use.\n4. Choose how long an order is Usually ready in, or leave it unsaid.\nGive the location an address too (Add address on its row), so buyers know where to go. Every location with pickup on is offered at the cart, with your default location first.\nWhen a buyer picks up at a location, that location\'s stock is reserved while they check out and sold from that location when they pay. If the location doesn\'t have enough, the cart says so and the buyer can choose another location or have it shipped. Canceling the order puts the stock back at the same location.\nThe Offer free local pickup switch on the Shipping card is the older, unnamed pickup choice. Once any location offers pickup, the cart uses your locations instead.'
4779
+ text: 'Pickup is turned on per location, on the Inventory locations card on Products → Shipping & delivery, so buyers can collect orders there at the hours you set. On a location\'s row, choose Pickup, then:\n1. Turn on Buyers can pick up orders here.\n2. Under Pickup hours, switch on each day buyers can collect, then pick the From and To times. For a split day, such as a lunch break, select Add hours on that day.\n3. Add Arrival instructions if buyers need them, such as which door to use.\n4. Choose how long an order is Usually ready in, or leave it unsaid.\nGive the location an address too (Add address on its row), so buyers know where to go. Every location with pickup on is offered at the cart, with your default location first.\nWhen a buyer picks up at a location, that location\'s stock is reserved while they check out and sold from that location when they pay. If the location doesn\'t have enough, the cart says so and the buyer can choose another location or have it shipped. Canceling the order puts the stock back at the same location.\nThe Offer free local pickup switch on the Shipping card is the older, unnamed pickup choice. Once any location offers pickup, the cart uses your locations instead.'
4640
4780
  },
4641
4781
  {
4642
4782
  path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
4643
4783
  title: 'Pickup & local delivery',
4644
4784
  heading: 'Set up local delivery',
4645
4785
  anchor: '#set-up-local-delivery',
4646
- text: 'The Local delivery card, in the store\'s settings, lets your own driver deliver orders: buyers enter their postal code at the cart, pay your fee and book a delivery time. To set it up:\n1. Turn on Deliver orders yourself and enter the two-letter Country you deliver in.\n2. Optionally choose the location orders Leave from. Its stock is reserved and sold for delivery orders.\n3. Add one or more Zones. A zone lists the postal codes it covers: exact codes such as 10001, a prefix ending in such as 100, or a range such as 10010-10020. Each zone has its own Fee, an optional Minimum order and an optional Free over amount. When a postal code is in more than one zone, the zone listed first is used.\n4. Under Delivery windows, switch on each day you deliver and pick a window\'s From and To times. Select Add window for a second window on the same day. Each window is offered on its day.\n5. Choose how long before a window an order must be placed (Order at least) and how many days ahead buyers can book.\n6. Optionally add What buyers should know, such as "We text when we\'re 10 minutes away." It shows at the cart and on the receipt.\nThe card lists anything that stops checkout from offering delivery, such as a zone with no postal codes or no delivery windows.\nAt the cart, the buyer enters their postal code and sees the fee, or why delivery isn\'t available, such as an order below the zone\'s minimum. Checkout charges the fee as the order\'s shipping and asks for an address in your country only. If the address the buyer then enters is outside all of your zones, the order is flagged and you\'re notified, so you can contact the buyer or refund the delivery.'
4786
+ text: 'The Local delivery card, on Products → Shipping & delivery, lets your own driver deliver orders: buyers enter their postal code at the cart, pay your fee and book a delivery time. To set it up:\n1. Turn on Deliver orders yourself and enter the two-letter Country you deliver in.\n2. Optionally choose the location orders Leave from. Its stock is reserved and sold for delivery orders.\n3. Add one or more Zones. A zone lists the postal codes it covers: exact codes such as 10001, a prefix ending in such as 100, or a range such as 10010-10020. Each zone has its own Fee, an optional Minimum order and an optional Free over amount. When a postal code is in more than one zone, the zone listed first is used.\n4. Under Delivery windows, switch on each day you deliver and pick a window\'s From and To times. Select Add window for a second window on the same day. Each window is offered on its day.\n5. Choose how long before a window an order must be placed (Order at least) and how many days ahead buyers can book.\n6. Optionally add What buyers should know, such as "We text when we\'re 10 minutes away." It shows at the cart and on the receipt.\nThe card lists anything that stops checkout from offering delivery, such as a zone with no postal codes or no delivery windows.\nAt the cart, the buyer enters their postal code and sees the fee, or why delivery isn\'t available, such as an order below the zone\'s minimum. Checkout charges the fee as the order\'s shipping and asks for an address in your country only. If the address the buyer then enters is outside all of your zones, the order is flagged and you\'re notified, so you can contact the buyer or refund the delivery.'
4647
4787
  },
4648
4788
  {
4649
4789
  path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
@@ -4678,7 +4818,7 @@ export const DOCS_SECTION_INDEX = [
4678
4818
  title: 'POS & reservations',
4679
4819
  heading: 'Registers',
4680
4820
  anchor: '#registers',
4681
- text: 'Create your registers under Commerce → Settings → POS registers — one per till or device that takes in-person payments. Give each a name (and, if you use inventory locations, the location it sells from). Every POS sale is tagged with its register so you can reconcile end-of-day takings per till. Your plan caps how many registers you can run; add more with the register add-on in Billing. If you downgrade below your register count, the extra registers (newest first) stop taking payments and show Over plan limit until you remove them or upgrade again — none are deleted.'
4821
+ text: 'Create your registers under Products → Point of sale → POS registers — one per till or device that takes in-person payments. Before your first register exists, the register page and the POS devices card each show an Add a register button that takes you there. Give each a name (and, if you use inventory locations, the location it sells from). Every POS sale is tagged with its register so you can reconcile end-of-day takings per till. Your plan caps how many registers you can run; add more with the register add-on in Billing. If you downgrade below your register count, the extra registers (newest first) stop taking payments and show Over plan limit until you remove them or upgrade again — none are deleted.'
4682
4822
  },
4683
4823
  {
4684
4824
  path: '/commerce-and-bookings/commerce/pos-and-reservations',
@@ -4713,21 +4853,21 @@ export const DOCS_SECTION_INDEX = [
4713
4853
  title: 'POS & reservations',
4714
4854
  heading: 'Card readers',
4715
4855
  anchor: '#card-readers',
4716
- text: 'A card reader takes card payments at the counter: the customer taps, inserts or swipes, and the reader can ask for a tip. The register works with Stripe\'s smart readers, the Stripe Reader S700 (and S710) and the BBPOS WisePOS E. Card readers are shown only when they are available for your store; when they are not, the POS devices card has no card reader controls and the register has no Card reader button.\nTo add a reader:\n1. On the reader, open Settings and choose Generate pairing code.\n2. In the console, open Commerce → Settings → POS devices and choose Add card reader.\n3. Enter the registration code the reader shows, give the reader a name (such as "Front counter reader") and, optionally, pick the register it belongs to. A reader left on Any register can be used from every register.\n4. The first reader you add asks for the store\'s address — where the reader is used. Stripe sets the reader up for that country.\nEach reader is listed with its register and an Online or Offline status, and can be renamed, moved to another register, or removed. A removed reader has to be registered again with a new code to be used. A reader must be switched on and connected to the internet to take a payment; the register warns you when the selected reader looks offline. See POS hardware for setup notes.\nTrying it in test mode In test mode, add a reader with the code simulated-wpe to get Stripe\'s simulated reader. While a payment waits on it, the register shows Simulate tap to complete it with a test card.'
4856
+ text: 'A card reader takes card payments at the counter: the customer taps, inserts or swipes, and the reader can ask for a tip. The register works with Stripe\'s smart readers, the Stripe Reader S700 (and S710) and the BBPOS WisePOS E. Card readers are shown only when they are available for your store; when they are not, the POS devices card has no card reader controls and the register has no Card reader button.\nTo add a reader:\n1. On the reader, open Settings and choose Generate pairing code.\n2. In the console, open Products → Point of sale → POS devices and choose Add card reader.\n3. Enter the registration code the reader shows, give the reader a name (such as "Front counter reader") and, optionally, pick the register it belongs to. A reader left on Any register can be used from every register.\n4. The first reader you add asks for the store\'s address — where the reader is used. Stripe sets the reader up for that country.\nEach reader is listed with its register and an Online or Offline status, and can be renamed, moved to another register, or removed. A removed reader has to be registered again with a new code to be used. A reader must be switched on and connected to the internet to take a payment; the register warns you when the selected reader looks offline. See POS hardware for setup notes.\nTrying it in test mode In test mode, add a reader with the code simulated-wpe to get Stripe\'s simulated reader. While a payment waits on it, the register shows Simulate tap to complete it with a test card.'
4717
4857
  },
4718
4858
  {
4719
4859
  path: '/commerce-and-bookings/commerce/pos-and-reservations',
4720
4860
  title: 'POS & reservations',
4721
4861
  heading: 'Customer display',
4722
4862
  anchor: '#customer-display',
4723
- text: 'A customer display is a tablet facing your customer. It shows your store\'s logo (or name) and a welcome line between sales, the basket with its total as you ring it up, and it lets the customer choose a tip and a receipt themselves.\nTo pair one:\n1. On the register, tap Pair display next to the Register heading. It shows an address and a 6-digit code. The code works once and expires in 10 minutes.\n2. On the tablet, open that address — your console address followed by /kiosk/commerce/pos-display — and enter the code. No one signs in on the tablet.\nOnce paired, the register\'s button reads Display connected. During a sale the display shows:\n- The basket — each line, the subtotal, any discount, the total and what has been paid so far. Once a tip is added it is shown on its own line, with the Total with tip under it. Amounts are in your store\'s currency.\n- Tip choices — when tips are on and the cashier taps Ask on display: a button per percentage, an amount the customer types, or no tip.\n- "Tap, insert or swipe your card on the reader." while a card reader payment waits.\n- Receipt choice — when Receipts at the register is Ask the customer: email, text (shown only when text messages are available for your store), print or no receipt. When the customer asks for an email receipt and Offer email sign-up on the customer display is on (it is by default), an unticked Email me news and offers box is shown under the address. Only a ticked box adds them to your marketing audience.\nAfter the customer answers, the display thanks them and says the cashier will finish up. When the sale is paid and the receipt is handled, it shows Thank you! for a few seconds and then returns to the welcome screen. The email address or phone number the customer typed is not kept on the display: it is cleare'
4863
+ text: 'A customer display is a tablet facing your customer. It shows your store\'s logo (or name) and a welcome line between sales, the basket with its total as you ring it up, and it lets the customer choose a tip and a receipt themselves.\nTo pair one, start from either place:\n- On the register, tap Pair display next to the Register heading.\n- In the console, open Products → Point of sale → POS devices and tap Pair display beside the register the tablet belongs to. Use this when you are setting a tablet up away from the till.\nThen:\n1. Keep Customer display selected. You see an address and a 6-digit code. The code works once and expires in 10 minutes.\n2. On the tablet, open that address — your console address followed by /kiosk/commerce/pos-display — and enter the code. No one signs in on the tablet.\nOnce paired, the register\'s button reads Display connected. During a sale the display shows:\n- The basket — each line, the subtotal, any discount, the total and what has been paid so far. Once a tip is added it is shown on its own line, with the Total with tip under it. Amounts are in your store\'s currency.\n- Tip choices — when tips are on and the cashier taps Ask on display: a button per percentage, an amount the customer types, or no tip.\n- "Tap, insert or swipe your card on the reader." while a card reader payment waits.\n- Receipt choice — when Receipts at the register is Ask the customer: email, text (shown only when text messages are available for your store), print or no receipt. When the customer asks for an email receipt and Offer email sign-up on the customer display is on (it is by default), an unticked Email me news and offers box is shown under the address. Only a ticked box adds them to your marketing audience.\nAfter the customer answers, the display thanks them and sa'
4724
4864
  },
4725
4865
  {
4726
4866
  path: '/commerce-and-bookings/commerce/pos-and-reservations',
4727
4867
  title: 'POS & reservations',
4728
4868
  heading: 'Self-service kiosk',
4729
4869
  anchor: '#self-service-kiosk',
4730
- text: 'A self-service kiosk is a tablet your customers order from themselves. They browse your products by category, choose sizes and modifiers, review the total with tax, and pay — or send the order to the counter. It belongs to one register, and its orders are register sales: the same prices, tax, automatic promotions and stock as a sale you ring up.\nTo pair one:\n1. On the register, tap Pair display, then choose Self-service kiosk. It shows an address and a 6-digit code that works once and expires in 10 minutes.\n2. On the tablet, open that address — your console address followed by /kiosk/commerce/pos-kiosk — and enter the code. No one signs in on the tablet. A customer display code does not pair a kiosk, and a kiosk code does not pair a display.\nThe kiosk keeps working for as long as the person who paired it can use the register. If they are removed from the site or lose access to the register, or the plan no longer includes POS, the kiosk stops taking orders until someone pairs it again.\nA customer\'s order goes like this:\n1. Start order, then tap products to add them. A product with sizes, options or modifiers opens its choices first. Sold-out items cannot be added.\n2. Checkout shows each line with the subtotal, any discount, the tax and the total. Prices and tax always come from your store, never from the tablet.\n3. The customer pays:\n- Pay with card sends the total to the register\'s card reader. It is shown only when card readers are available for your store and one is assigned to the kiosk\'s register. When Ask for tips at the register is on, the kiosk asks for the tip first, so the reader does not ask again.\n- Pay at counter sends the order to the register (see below). It is on by default; turn it off with Kiosk: let customers pay at the counter.\n4. After a card payment'
4870
+ text: 'A self-service kiosk is a tablet your customers order from themselves. They browse your products by category, choose sizes and modifiers, review the total with tax, and pay — or send the order to the counter. It belongs to one register, and its orders are register sales: the same prices, tax, automatic promotions and stock as a sale you ring up.\nTo pair one:\n1. Tap Pair display on the register, or beside the register under Products → Point of sale → POS devices, then choose Self-service kiosk. It shows an address and a 6-digit code that works once and expires in 10 minutes.\n2. On the tablet, open that address — your console address followed by /kiosk/commerce/pos-kiosk — and enter the code. No one signs in on the tablet. A customer display code does not pair a kiosk, and a kiosk code does not pair a display.\nThe kiosk keeps working for as long as the person who paired it can use the register. If they are removed from the site or lose access to the register, or the plan no longer includes POS, the kiosk stops taking orders until someone pairs it again.\nA customer\'s order goes like this:\n1. Start order, then tap products to add them. A product with sizes, options or modifiers opens its choices first. Sold-out items cannot be added.\n2. Checkout shows each line with the subtotal, any discount, the tax and the total. Prices and tax always come from your store, never from the tablet.\n3. The customer pays:\n- Pay with card sends the total to the register\'s card reader. It is shown only when card readers are available for your store and one is assigned to the kiosk\'s register. When Ask for tips at the register is on, the kiosk asks for the tip first, so the reader does not ask again.\n- Pay at counter sends the order to the register (see below). It is on by default; turn it off w'
4731
4871
  },
4732
4872
  {
4733
4873
  path: '/commerce-and-bookings/commerce/pos-and-reservations',
@@ -4769,7 +4909,7 @@ export const DOCS_SECTION_INDEX = [
4769
4909
  title: 'POS hardware',
4770
4910
  heading: 'Receipt printers',
4771
4911
  anchor: '#receipt-printers',
4772
- text: 'A cloud receipt printer collects its work from Aglyn over the internet, so a receipt prints from the register on any device, even one with no printer driver, and even when the printer is on a different network. Each printer belongs to one register.\nStar printers use CloudPRNT and Epson printers use Server Direct Print. Both come built into the models above.\nAdd a printer\n1. Open the store\'s settings. Each register has a Hardware card.\n2. Select Add printer on the register\'s card and choose the brand.\n3. Enter the model, a name such as Counter printer, and the printer\'s identity:\n- Star: the printer\'s MAC address. Hold the FEED button while you switch the printer on to print a self-test; the MAC address is on it. Use the Ethernet MAC even when the printer is on Wi-Fi.\n- Epson: any ID you choose, such as counter-1. You enter the same ID in the printer in step 5.\n4. Choose the paper width, whether the printer prints a receipt for every sale, whether it prints kitchen tickets, and whether a cash drawer is plugged into it. Select Add printer. The card shows the printer\'s URL. Copy it.\n5. Enter the URL in the printer\'s own settings page (open the printer\'s IP address, from the self-test, in a browser on the same network):\n- Star: sign in (user root; the password is public or the one on the printer\'s label), go to Settings → CloudPRNT, turn CloudPRNT on, paste the URL as the Server URL, set the polling interval to 5 seconds, then Submit and Save → Restart device.\n- Epson: in EPSON TMNet WebConfig, open Server Direct Print (under Web Service Settings on most models). Select Enable, enter the ID from step 3, paste the URL as the Server 1 URL, set the interval to 5 seconds, select Submit, and reset the printer.\n6. Within a minute the printer shows Online on the card. Select Test '
4912
+ text: 'A cloud receipt printer collects its work from Aglyn over the internet, so a receipt prints from the register on any device, even one with no printer driver, and even when the printer is on a different network. Each printer belongs to one register.\nStar printers use CloudPRNT and Epson printers use Server Direct Print. Both come built into the models above.\nAdd a printer\n1. Open Products → Point of sale. Each register has a Hardware card.\n2. Select Add printer on the register\'s card and choose the brand.\n3. Enter the model, a name such as Counter printer, and the printer\'s identity:\n- Star: the printer\'s MAC address. Hold the FEED button while you switch the printer on to print a self-test; the MAC address is on it. Use the Ethernet MAC even when the printer is on Wi-Fi.\n- Epson: any ID you choose, such as counter-1. You enter the same ID in the printer in step 5.\n4. Choose the paper width, whether the printer prints a receipt for every sale, whether it prints kitchen tickets, and whether a cash drawer is plugged into it. Select Add printer. The card shows the printer\'s URL. Copy it.\n5. Enter the URL in the printer\'s own settings page (open the printer\'s IP address, from the self-test, in a browser on the same network):\n- Star: sign in (user root; the password is public or the one on the printer\'s label), go to Settings → CloudPRNT, turn CloudPRNT on, paste the URL as the Server URL, set the polling interval to 5 seconds, then Submit and Save → Restart device.\n- Epson: in EPSON TMNet WebConfig, open Server Direct Print (under Web Service Settings on most models). Select Enable, enter the ID from step 3, paste the URL as the Server 1 URL, set the interval to 5 seconds, select Submit, and reset the printer.\n6. Within a minute the printer shows Online on the card. Select T'
4773
4913
  },
4774
4914
  {
4775
4915
  path: '/commerce-and-bookings/commerce/pos-hardware',
@@ -4797,7 +4937,7 @@ export const DOCS_SECTION_INDEX = [
4797
4937
  title: 'POS hardware',
4798
4938
  heading: 'Customer display tablet',
4799
4939
  anchor: '#customer-display-tablet',
4800
- text: 'Any tablet with a modern browser can be the customer display. It needs an internet connection, but not a sign-in: you pair it with a code from the register, as described in Customer display.\nFor a counter that runs all day:\n- Put the tablet on a stand facing the customer; landscape gives the basket and the tip buttons the most room.\n- Keep it plugged in, and set the tablet not to sleep or lock while the display page is open.\n- Use the tablet\'s own single-app or guided-access mode, if it has one, so customers cannot leave the display page.\n- Add the display page to the home screen or bookmark it, so it can be reopened quickly after a restart. A paired display stays paired until you sign it out on the POS devices card in the store\'s settings, remove its register, or clear the tablet browser\'s data for the console.'
4940
+ text: 'Any tablet with a modern browser can be the customer display. It needs an internet connection, but not a sign-in: you pair it with a code from the register, as described in Customer display.\nFor a counter that runs all day:\n- Put the tablet on a stand facing the customer; landscape gives the basket and the tip buttons the most room.\n- Keep it plugged in, and set the tablet not to sleep or lock while the display page is open.\n- Use the tablet\'s own single-app or guided-access mode, if it has one, so customers cannot leave the display page.\n- Add the display page to the home screen or bookmark it, so it can be reopened quickly after a restart. A paired display stays paired until you sign it out on the POS devices card on Products → Point of sale, remove its register, or clear the tablet browser\'s data for the console.'
4801
4941
  },
4802
4942
  {
4803
4943
  path: '/commerce-and-bookings/commerce/pos-hardware',
@@ -4811,7 +4951,7 @@ export const DOCS_SECTION_INDEX = [
4811
4951
  title: 'Running the register',
4812
4952
  heading: '',
4813
4953
  anchor: '',
4814
- text: 'Running the register\nEverything a till needs between the first sale of the day and the last: a counted cash drawer, a quick way to change who is ringing, the customer in front of you, returns, and a proper printed receipt. All of it runs from the register at /{site}/pos. Staff PINs are set in the store\'s settings, and the register\'s rules under the site\'s Admin → Plugins → Commerce.\nPlan availability These are part of the point of sale, so they need Pro or above, like the register itself. Only members who can use the register — a site admin or editor whose Manage POS permission is on — can open shifts, switch in, look customers up or take returns.'
4954
+ text: 'Running the register\nEverything a till needs between the first sale of the day and the last: a counted cash drawer, a quick way to change who is ringing, the customer in front of you, returns, and a proper printed receipt. All of it runs from the register at /{site}/pos. Staff PINs are set on Products → Point of sale, and the register\'s rules under the site\'s Admin → Plugins → Commerce.\nPlan availability These are part of the point of sale, so they need Pro or above, like the register itself. Only members who can use the register — a site admin or editor whose Manage POS permission is on — can open shifts, switch in, look customers up or take returns.'
4815
4955
  },
4816
4956
  {
4817
4957
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -4825,7 +4965,7 @@ export const DOCS_SECTION_INDEX = [
4825
4965
  title: 'Running the register',
4826
4966
  heading: 'Staff PINs',
4827
4967
  anchor: '#staff-pins',
4828
- text: 'A shared tablet stays signed in; each person switches in with their own PIN instead of signing out.\n- Set your 4–6 digit PIN on the Staff PINs card in the store\'s settings. A PIN that is one digit repeated or a straight run like 1234 is refused.\n- At the register, tap Switch cashier, pick your name and enter your PIN. Every sale, shift and return you ring is recorded under you until someone else switches in.\n- A PIN never grants more than your role: the register checks your role and your Manage POS permission each time it is used, so removing someone\'s access takes effect on their next tap.\n- Five wrong PINs in a row lock that person out for 15 minutes. A workspace admin can reset or remove anyone\'s PIN, which also lifts a lockout.\n- Lock the register after (minutes idle) in Admin → Plugins → Commerce locks the register after that long without a tap, so the next person has to enter their PIN. Tap Lock to lock it yourself.\nPINs are stored only as salted hashes and nobody can read them back, not even a workspace admin.'
4968
+ text: 'A shared tablet stays signed in; each person switches in with their own PIN instead of signing out.\n- Set your 4–6 digit PIN on the Staff PINs card on Products → Point of sale. A PIN that is one digit repeated or a straight run like 1234 is refused.\n- At the register, tap Switch cashier, pick your name and enter your PIN. Every sale, shift and return you ring is recorded under you until someone else switches in.\n- A PIN never grants more than your role: the register checks your role and your Manage POS permission each time it is used, so removing someone\'s access takes effect on their next tap.\n- Five wrong PINs in a row lock that person out for 15 minutes. A workspace admin can reset or remove anyone\'s PIN, which also lifts a lockout.\n- Lock the register after (minutes idle) in Admin → Plugins → Commerce locks the register after that long without a tap, so the next person has to enter their PIN. Tap Lock to lock it yourself.\nPINs are stored only as salted hashes and nobody can read them back, not even a workspace admin.'
4829
4969
  },
4830
4970
  {
4831
4971
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -4846,7 +4986,7 @@ export const DOCS_SECTION_INDEX = [
4846
4986
  title: 'Running the register',
4847
4987
  heading: 'Printed receipts',
4848
4988
  anchor: '#printed-receipts',
4849
- text: 'Receipts print on any 80 mm receipt printer through your browser\'s print dialog. Each receipt has your logo and store name, the order number and its barcode, the date, cashier and register, the customer\'s name, every item, discounts, tax, the total, how it was paid (card with its last four digits), the tip and change, and your receipt footer from the store\'s settings. Two more lines are set in Admin → Plugins → Commerce: Address on printed receipts, printed under your store name, and Return policy on printed receipts, printed at the foot.\n- After each sale, the register shows Print receipt and Gift receipt for that sale until the next one completes.\n- Gift receipt prints the items and the barcode without any prices.\n- Reprint any register sale from its order on the Orders page: open the order and use Print receipt or Gift receipt.\nMost network receipt printers open the cash drawer cabled to them whenever they print, so printing a cash sale\'s receipt also opens the drawer. That is a setting on the printer.'
4989
+ text: 'Receipts print on any 80 mm receipt printer through your browser\'s print dialog. Each receipt has your logo and store name, the order number and its barcode, the date, cashier and register, the customer\'s name, every item, discounts, tax, the total, how it was paid (card with its last four digits), the tip and change, and your receipt footer from Products → Checkout. Two more lines are set in Admin → Plugins → Commerce: Address on printed receipts, printed under your store name, and Return policy on printed receipts, printed at the foot.\n- After each sale, the register shows Print receipt and Gift receipt for that sale until the next one completes.\n- Gift receipt prints the items and the barcode without any prices.\n- Reprint any register sale from its order on the Orders page: open the order and use Print receipt or Gift receipt.\nMost network receipt printers open the cash drawer cabled to them whenever they print, so printing a cash sale\'s receipt also opens the drawer. That is a setting on the printer.'
4850
4990
  },
4851
4991
  {
4852
4992
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -4881,14 +5021,14 @@ export const DOCS_SECTION_INDEX = [
4881
5021
  title: 'Review platforms (Trustpilot and Yotpo)',
4882
5022
  heading: 'Trustpilot',
4883
5023
  anchor: '#trustpilot',
4884
- text: 'Invite customers to review your store on Trustpilot after their order ships or arrives, by copying one order email to your Trustpilot invitation address.\nGo to Commerce → Settings and find the Trustpilot card. Under How Trustpilot hears about orders, choose one way, and under When to invite, choose:\n- When the order ships, goes out for delivery or is picked up, or\n- When the order is delivered or picked up.\nTrustpilot\'s own delay setting still applies after that.\nBy your invitation address {#trustpilot-invitation-address}\nTrustpilot gives every business an Automatic Feedback Service address that ends in @invite.trustpilot.com. No key is needed:\n1. Copy that address from your Trustpilot Business account.\n2. On the Trustpilot card, choose Copy an order email to my Trustpilot invitation address and paste it in Trustpilot invitation address. Only an address on invite.trustpilot.com is accepted.\n3. Select Save in the card\'s header.\nThe customer\'s Order shipped, Order out for delivery, Order picked up or Order delivered email (whichever comes first at the moment you chose) is then blind-copied to Trustpilot, with the customer\'s name, email and order number in a part of the email only Trustpilot reads. The customer does not see the copy. If you turn that email off under Order notifications, no copy is sent.\nBy your Trustpilot API key {#trustpilot-api}\nIf your Trustpilot plan includes API access, you can send invitations through it instead:\n1. In Trustpilot Business, under Integrations → Developers → APIs, create or copy an API key and secret.\n2. On the Trustpilot card, choose Trustpilot API, with my API key, and paste the API key, API secret and your Business unit ID. Add your Business user ID, a Language such as en-US, and an Invitation template ID if you use them.\n3. Select '
5024
+ text: 'Invite customers to review your store on Trustpilot after their order ships or arrives, by copying one order email to your Trustpilot invitation address.\nGo to Products → Promotions and find the Trustpilot card. Under How Trustpilot hears about orders, choose one way, and under When to invite, choose:\n- When the order ships, goes out for delivery or is picked up, or\n- When the order is delivered or picked up.\nTrustpilot\'s own delay setting still applies after that.\nBy your invitation address {#trustpilot-invitation-address}\nTrustpilot gives every business an Automatic Feedback Service address that ends in @invite.trustpilot.com. No key is needed:\n1. Copy that address from your Trustpilot Business account.\n2. On the Trustpilot card, choose Copy an order email to my Trustpilot invitation address and paste it in Trustpilot invitation address. Only an address on invite.trustpilot.com is accepted.\n3. Select Save in the card\'s header.\nThe customer\'s Order shipped, Order out for delivery, Order picked up or Order delivered email (whichever comes first at the moment you chose) is then blind-copied to Trustpilot, with the customer\'s name, email and order number in a part of the email only Trustpilot reads. The customer does not see the copy. If you turn that email off under Order notifications, no copy is sent.\nBy your Trustpilot API key {#trustpilot-api}\nIf your Trustpilot plan includes API access, you can send invitations through it instead:\n1. In Trustpilot Business, under Integrations → Developers → APIs, create or copy an API key and secret.\n2. On the Trustpilot card, choose Trustpilot API, with my API key, and paste the API key, API secret and your Business unit ID. Add your Business user ID, a Language such as en-US, and an Invitation template ID if you use them.\n3. Selec'
4885
5025
  },
4886
5026
  {
4887
5027
  path: '/commerce-and-bookings/commerce/review-platforms',
4888
5028
  title: 'Review platforms (Trustpilot and Yotpo)',
4889
5029
  heading: 'Yotpo Reviews',
4890
5030
  anchor: '#yotpo-reviews',
4891
- text: 'Send each shipped order to your Yotpo Reviews account, so Yotpo asks the customer for a review.\n1. In your Yotpo Reviews settings, copy the app key and secret key. These are not the keys of Yotpo Loyalty & Referrals, which connects under Rewards.\n2. On the Yotpo Reviews card under Commerce → Settings, paste both, turn on Send shipped orders to Yotpo for review requests, and select Save.\nWhen an order first ships or is picked up, Aglyn sends it to Yotpo with its items, marked fulfilled, and Yotpo sends the customer its review request after the delay set in your Yotpo account.'
5031
+ text: 'Send each shipped order to your Yotpo Reviews account, so Yotpo asks the customer for a review.\n1. In your Yotpo Reviews settings, copy the app key and secret key. These are not the keys of Yotpo Loyalty & Referrals, which connects under Rewards.\n2. On the Yotpo Reviews card under Products → Promotions, paste both, turn on Send shipped orders to Yotpo for review requests, and select Save.\nWhen an order first ships or is picked up, Aglyn sends it to Yotpo with its items, marked fulfilled, and Yotpo sends the customer its review request after the delay set in your Yotpo account.'
4892
5032
  },
4893
5033
  {
4894
5034
  path: '/commerce-and-bookings/commerce/review-platforms',
@@ -4993,14 +5133,14 @@ export const DOCS_SECTION_INDEX = [
4993
5133
  title: 'Sales channels',
4994
5134
  heading: '',
4995
5135
  anchor: '',
4996
- text: 'Sales channels\nSales channels put your catalog in front of shoppers on Google (Shopping, free listings, Search, Images and YouTube), Meta (Facebook and Instagram), TikTok, Pinterest, Snapchat and Microsoft Shopping (Bing and Copilot). Each channel reads its own product feed from your store on a schedule you set on the channel\'s side, so a price, photo or stock change reaches it without another upload.\nSales channels come with every plan that sells online. They are set up in the store\'s settings, under Sales channels, with one card per channel.'
5136
+ text: 'Sales channels\nSales channels put your catalog in front of shoppers on Google (Shopping, free listings, Search, Images and YouTube), Meta (Facebook and Instagram), TikTok, Pinterest, Snapchat and Microsoft Shopping (Bing and Copilot). Each channel reads its own product feed from your store on a schedule you set on the channel\'s side, so a price, photo or stock change reaches it without another upload.\nSales channels come with every plan that sells online. They are set up on Products → Sales channels, with one card per channel.'
4997
5137
  },
4998
5138
  {
4999
5139
  path: '/commerce-and-bookings/commerce/sales-channels',
5000
5140
  title: 'Sales channels',
5001
5141
  heading: 'Set up sales channels',
5002
5142
  anchor: '#set-up-sales-channels',
5003
- text: 'The Sales channels card, in the store\'s settings, lists your products on shopping channels: set the feed defaults, check your products, then turn on each channel and paste its feed address there.\nYou need the store selling, a web address for the site, and an account with each channel you want — Google Merchant Center, Meta Commerce Manager and so on.\n1. Fill in Defaults for every feed — the brand and other values sent for a product that leaves them blank — and select Save. See Brand, barcode and category.\n2. Select Check products. Each channel\'s card counts what it would list, leave out and list with suggestions. See Check your products.\n3. On each channel you want, switch the feed On and paste its address into the channel. See Turn on a channel.\nAfter that, the channel reads your feed on its own schedule, and each card shows when it last did.'
5143
+ text: 'The Sales channels card, on Products → Sales channels, lists your products on shopping channels: set the feed defaults, check your products, then turn on each channel and paste its feed address there.\nYou need the store selling, a web address for the site, and an account with each channel you want — Google Merchant Center, Meta Commerce Manager and so on.\n1. Fill in Defaults for every feed — the brand and other values sent for a product that leaves them blank — and select Save. See Brand, barcode and category.\n2. Select Check products. Each channel\'s card counts what it would list, leave out and list with suggestions. See Check your products.\n3. On each channel you want, switch the feed On and paste its address into the channel. See Turn on a channel.\nAfter that, the channel reads your feed on its own schedule, and each card shows when it last did.'
5004
5144
  },
5005
5145
  {
5006
5146
  path: '/commerce-and-bookings/commerce/sales-channels',
@@ -5021,7 +5161,7 @@ export const DOCS_SECTION_INDEX = [
5021
5161
  title: 'Sales channels',
5022
5162
  heading: 'Check your products',
5023
5163
  anchor: '#check-your-products',
5024
- text: 'Select Check products on the Sales channels card. Each channel\'s card then counts the products it lists, leaves out and lists with suggestions, and Show products names each one with what to fix.\nA product is left out of a channel\'s feed when the channel would refuse it anyway:\n- it has no photo or no price;\n- it is a service, or sold only as a subscription — shopping channels list goods sold at one price;\n- the site has no web address yet, or no product page template is chosen in the store settings, so the product\'s link would not open.\nA suggestion means the product is listed but may show less widely: no barcode or part number, no description (its name is sent instead), a name longer than the channel shows, clothing without a Color and a Size option, or missing shipping.'
5164
+ text: 'Select Check products on the Sales channels card. Each channel\'s card then counts the products it lists, leaves out and lists with suggestions, and Show products names each one with what to fix.\nA product is left out of a channel\'s feed when the channel would refuse it anyway:\n- it has no photo or no price;\n- it is a service, or sold only as a subscription — shopping channels list goods sold at one price;\n- the site has no web address yet, or no product page template is chosen on Products → Checkout, so the product\'s link would not open.\nA suggestion means the product is listed but may show less widely: no barcode or part number, no description (its name is sent instead), a name longer than the channel shows, clothing without a Color and a Size option, or missing shipping.'
5025
5165
  },
5026
5166
  {
5027
5167
  path: '/commerce-and-bookings/commerce/sales-channels',
@@ -5056,21 +5196,21 @@ export const DOCS_SECTION_INDEX = [
5056
5196
  title: 'Shipping',
5057
5197
  heading: '',
5058
5198
  anchor: '',
5059
- text: 'Shipping\nShipping is set up in the store\'s settings, on the Shipping card. Every order that ships is priced from the zones and rates you save there, at the storefront\'s cart, on a product\'s Buy button, and on a draft order\'s payment link.'
5199
+ text: 'Shipping\nShipping is set up on Products → Shipping & delivery, on the Shipping card. Every order that ships is priced from the zones and rates you save there, at the storefront\'s cart, on a product\'s Buy button, and on a draft order\'s payment link.'
5060
5200
  },
5061
5201
  {
5062
5202
  path: '/commerce-and-bookings/commerce/shipping',
5063
5203
  title: 'Shipping',
5064
5204
  heading: 'Zones and rates',
5065
5205
  anchor: '#zones-and-rates',
5066
- text: 'The Shipping card, in the store\'s settings, prices every parcel: group the countries you ship to into zones, then give each zone one or more rates.\n1. Under Zones, select Add zone, enter a Zone name and its Countries as two-letter codes, such as US, CA, or for everywhere else.\n2. Under Rates, select Add rate, choose its Zone, give it a Name buyers see (a rate without one is dropped at checkout), and choose its Type and price.\n3. Optionally turn on Offer free local pickup.\n4. Check the Coverage line, which names any destination no rate reaches, then select Save shipping settings.\nA zone owns countries; is the rest of the world. A rate belongs to one zone and prices a parcel in one of four ways:\n| Rate type | What the shopper pays |\n| -- | -- |\n| Flat | One price. |\n| Free over subtotal | One price, or nothing once the cart reaches the subtotal you set. |\n| Subtotal tiers | The price of the first tier the cart\'s subtotal fits under. |\n| Weight tiers | The price of the first tier the cart\'s weight fits under. Weight is each variant\'s weight times its quantity. |\nLocal pickup adds a free collection choice beside your rates. It does not widen where you ship: a destination no rate reaches is still refused. To let buyers choose which location to collect from, with pickup hours and a ready-for-pickup email, turn on pickup for the location instead: see Pickup & local delivery.\nCheckout charges only the rates of the zone the destination falls in, and narrows the address it collects to that destination, so a shopper cannot pick another zone\'s cheaper rate. The destination coverage rules explain what your zones make checkout ask and refuse.'
5206
+ text: 'The Shipping card, on Products → Shipping & delivery, prices every parcel: group the countries you ship to into zones, then give each zone one or more rates.\n1. Under Zones, select Add zone, enter a Zone name and its Countries as two-letter codes, such as US, CA, or for everywhere else.\n2. Under Rates, select Add rate, choose its Zone, give it a Name buyers see (a rate without one is dropped at checkout), and choose its Type and price.\n3. Optionally turn on Offer free local pickup.\n4. Check the Coverage line, which names any destination no rate reaches, then select Save shipping settings.\nA zone owns countries; is the rest of the world. A rate belongs to one zone and prices a parcel in one of four ways:\n| Rate type | What the shopper pays |\n| -- | -- |\n| Flat | One price. |\n| Free over subtotal | One price, or nothing once the cart reaches the subtotal you set. |\n| Subtotal tiers | The price of the first tier the cart\'s subtotal fits under. |\n| Weight tiers | The price of the first tier the cart\'s weight fits under. Weight is each variant\'s weight times its quantity. |\nLocal pickup adds a free collection choice beside your rates. It does not widen where you ship: a destination no rate reaches is still refused. To let buyers choose which location to collect from, with pickup hours and a ready-for-pickup email, turn on pickup for the location instead: see Pickup & local delivery.\nCheckout charges only the rates of the zone the destination falls in, and narrows the address it collects to that destination, so a shopper cannot pick another zone\'s cheaper rate. The destination coverage rules explain what your zones make checkout ask and refuse.'
5067
5207
  },
5068
5208
  {
5069
5209
  path: '/commerce-and-bookings/commerce/shipping',
5070
5210
  title: 'Shipping',
5071
5211
  heading: 'Ask Aglyn AI',
5072
5212
  anchor: '#ask-aglyn-ai',
5073
- text: 'You can ask Aglyn Assist to set up shipping in plain words, such as free shipping over $50, otherwise $5 flat in the US, add $15 express to Canada or stop shipping to the UK. The plan card lists each change, and Confirm plan saves it.\n- Aglyn AI saves exactly what this card saves: a zone with its countries, and a flat, free-over-subtotal, subtotal-tier or weight-tier rate in it. A zone or rate you already have is changed in place, found by its name.\n- It uses only the prices you give. A rate you do not price is not added; Aglyn AI asks instead.\n- If the change leaves some destinations with no rate, the build says so, as the Coverage line does.\n- Carrier rates need a carrier account, so you set those up yourself.\n- Changes work as soon as they are saved, like a save on this card. They cost no AI credits.\n- Only an admin or editor on the site can ask Aglyn AI for these changes. An author can still make them on the card.'
5213
+ text: 'You can ask Aglyn Assist to set up shipping in plain words, such as free shipping over $50, otherwise $5 flat in the US, add $15 express to Canada or stop shipping to the UK. The plan card lists each change, and Confirm plan saves it.\n- Aglyn AI saves exactly what this card saves: a zone with its countries, and a flat, free-over-subtotal, subtotal-tier or weight-tier rate in it. A zone or rate you already have is changed in place, found by its name.\n- It uses only the prices you give. A rate you do not price is not added; Aglyn AI asks instead.\n- If the change leaves some destinations with no rate, the build says so, as the Coverage line does.\n- Changes work as soon as they are saved, like a save on this card. They cost no AI credits.\n- Only an admin or editor on the site can ask Aglyn AI for these changes. An author can still make them on the card.'
5074
5214
  },
5075
5215
  {
5076
5216
  path: '/commerce-and-bookings/commerce/shipping',
@@ -5079,20 +5219,6 @@ export const DOCS_SECTION_INDEX = [
5079
5219
  anchor: '#where-parcels-ship-from',
5080
5220
  text: 'Each inventory location (the Inventory locations card in the store\'s settings) can carry a postal address: choose Add address on its row, or Edit address once it has one. The address is the street, an optional apartment or suite, city, state or region, postal code, the two-letter country code and a phone number, saved beside the location\'s name.'
5081
5221
  },
5082
- {
5083
- path: '/commerce-and-bookings/commerce/shipping',
5084
- title: 'Shipping',
5085
- heading: 'Carrier accounts',
5086
- anchor: '#carrier-accounts',
5087
- text: 'The Carrier accounts card lists the carriers your labels and checkout rates come from, for every site in the workspace. By default these are Aglyn\'s own accounts, marked Discounted rates. A switch on each row turns that carrier on or off.\nIf you have your own negotiated carrier account, choose Connect your own account and pick the carrier. Which carriers are listed depends on the shipping provider behind your labels. For UPS and FedEx you enter the account number, a contact and the account\'s address, and UPS then asks you to sign in at UPS; a row that still needs it shows Sign-in needed or Reconnect needed. Other carriers, such as DHL Express or Canada Post, ask for the credentials that carrier issued you, which are passed to the provider to connect the account and not kept by Aglyn. Labels bought on your own account are billed to you by the carrier, so Aglyn charges nothing for them.'
5088
- },
5089
- {
5090
- path: '/commerce-and-bookings/commerce/shipping',
5091
- title: 'Shipping',
5092
- heading: 'Shipping labels',
5093
- anchor: '#shipping-labels',
5094
- text: 'A label bought on Aglyn\'s carrier accounts is charged to the workspace at the carrier\'s price, with nothing added. It is taken from your Stripe balance when the label is bought, once a member has agreed to that; when Stripe cannot take it, the label goes on the workspace\'s monthly invoice instead. A voided label that the carrier refunds is given back the same way it was paid.\nBilling → Usage shows a Shipping labels card once the workspace has bought a label: for each month, how many labels, how much came from the Stripe balance, how much went on the invoice, and what voided labels returned.'
5095
- },
5096
5222
  {
5097
5223
  path: '/commerce-and-bookings/commerce/store-import-and-export',
5098
5224
  title: 'Import and export store data',
@@ -5126,14 +5252,14 @@ export const DOCS_SECTION_INDEX = [
5126
5252
  title: 'Tax services (Avalara AvaTax and TaxJar)',
5127
5253
  heading: 'Before you start',
5128
5254
  anchor: '#before-you-start',
5129
- text: '- Set your store\'s Taxes to Manual rates (the Taxes card in the store\'s settings), with a rate for where you sell, and leave Prices include tax off. A tax service is used only then — see When the service is not used. Your own rates stay as the fallback: when the service does not answer, the sale is taxed at them instead.\n- Avalara AvaTax: your account id (a number) and a license key, from AvaTax → Settings → License and API keys. If your AvaTax account has more than one company, the company code to file under.\n- TaxJar: an API token, from TaxJar → Account → TaxJar API. List the states where you collect tax (your nexus) in TaxJar: it charges no tax anywhere else.\nBoth vendors offer a free sandbox account for testing. Connect it as a sandbox first, place a test order, then connect your production account.'
5255
+ text: '- Set your store\'s Taxes to Manual rates (the Taxes card on Products → Taxes), with a rate for where you sell, and leave Prices include tax off. A tax service is used only then — see When the service is not used. Your own rates stay as the fallback: when the service does not answer, the sale is taxed at them instead.\n- Avalara AvaTax: your account id (a number) and a license key, from AvaTax → Settings → License and API keys. If your AvaTax account has more than one company, the company code to file under.\n- TaxJar: an API token, from TaxJar → Account → TaxJar API. List the states where you collect tax (your nexus) in TaxJar: it charges no tax anywhere else.\nBoth vendors offer a free sandbox account for testing. Connect it as a sandbox first, place a test order, then connect your production account.'
5130
5256
  },
5131
5257
  {
5132
5258
  path: '/commerce-and-bookings/commerce/tax-services',
5133
5259
  title: 'Tax services (Avalara AvaTax and TaxJar)',
5134
5260
  heading: 'Connect',
5135
5261
  anchor: '#connect',
5136
- text: '1. Open the store\'s settings and find the Tax service card.\n2. Choose Avalara AvaTax or TaxJar, and Sandbox or Production.\n3. Enter your credentials and select Connect. Aglyn tests them with the vendor first and stores nothing they refuse. The credentials are encrypted on the server and are never shown again, not even to you.\n4. Enter the ship-from address: the street, city, state and postal code you ship or sell from. Aglyn checks it with the service. It is the origin of every sale and the place an in-person sale is taxed.\nOnly an admin of the site can connect, test or disconnect a service and change its address. Test connection checks the stored credentials again whenever you like; the card shows the answer.'
5262
+ text: '1. Open Products → Taxes and find the Tax service card.\n2. Choose Avalara AvaTax or TaxJar, and Sandbox or Production.\n3. Enter your credentials and select Connect. Aglyn tests them with the vendor first and stores nothing they refuse. The credentials are encrypted on the server and are never shown again, not even to you.\n4. Enter the ship-from address: the street, city, state and postal code you ship or sell from. Aglyn checks it with the service. It is the origin of every sale and the place an in-person sale is taxed.\nOnly an admin of the site can connect, test or disconnect a service and change its address. Test connection checks the stored credentials again whenever you like; the card shows the answer.'
5137
5263
  },
5138
5264
  {
5139
5265
  path: '/commerce-and-bookings/commerce/tax-services',
@@ -5238,7 +5364,7 @@ export const DOCS_SECTION_INDEX = [
5238
5364
  title: 'Use ShippingEasy with Aglyn',
5239
5365
  heading: 'Connect ShippingEasy',
5240
5366
  anchor: '#connect',
5241
- text: 'The ShippingEasy card, in the store\'s settings, sends each paid order to your ShippingEasy account and takes each label back, using the API keys from Before you start. You need to be a site admin.\n1. In Aglyn, open the store\'s settings and find the ShippingEasy card.\n2. Select Connect ShippingEasy and paste the API key, API secret and store API key. Aglyn checks them with ShippingEasy before it saves them, and keeps the secret encrypted. Nobody can see the secret in Aglyn again, including you.\n3. The card shows a Callback URL. Copy it and paste it into your API store\'s settings in ShippingEasy, so each label you buy there comes back to Aglyn.\n4. Select Send open orders to send the orders that were paid before you connected.'
5367
+ text: 'The ShippingEasy card, on Products → Shipping & delivery, sends each paid order to your ShippingEasy account and takes each label back, using the API keys from Before you start. You need to be a site admin.\n1. In Aglyn, open Products → Shipping & delivery and find the ShippingEasy card.\n2. Select Connect ShippingEasy and paste the API key, API secret and store API key. Aglyn checks them with ShippingEasy before it saves them, and keeps the secret encrypted. Nobody can see the secret in Aglyn again, including you.\n3. The card shows a Callback URL. Copy it and paste it into your API store\'s settings in ShippingEasy, so each label you buy there comes back to Aglyn.\n4. Select Send open orders to send the orders that were paid before you connected.'
5242
5368
  },
5243
5369
  {
5244
5370
  path: '/commerce-and-bookings/commerce/use-shippingeasy',
@@ -5287,7 +5413,7 @@ export const DOCS_SECTION_INDEX = [
5287
5413
  title: 'Use ShipStation with Aglyn',
5288
5414
  heading: 'Connect ShipStation',
5289
5415
  anchor: '#connect',
5290
- text: 'The ShipStation card, in the store\'s settings, connects your store to ShipStation as a Custom Store, so ShipStation imports your paid orders and sends each shipment back. You need to be a site admin.\n1. In Aglyn, open the store\'s settings and find the ShipStation card.\n2. Select Connect ShipStation. The card shows the URL to custom XML page, a username and a password. Aglyn keeps the password encrypted, and a site admin can select Show on the card to see it again later.\n3. In ShipStation, go to Settings → Selling Channels → Store Setup, select Connect a Store or Marketplace and choose Custom Store.\n4. Paste the URL, username and password from Aglyn.\n5. Type the status names exactly as the Aglyn card shows them. ShipStation matches them letter for letter:\n| ShipStation field | Type |\n| Unpaid Status | unpaid |\n| Paid Status | paid |\n| Shipped Status | shipped |\n| Canceled Status | canceled |\n| On-Hold Status | onhold |\n6. Select Test Connection, then Connect.'
5416
+ text: 'The ShipStation card, on Products → Shipping & delivery, connects your store to ShipStation as a Custom Store, so ShipStation imports your paid orders and sends each shipment back. You need to be a site admin.\n1. In Aglyn, open Products → Shipping & delivery and find the ShipStation card.\n2. Select Connect ShipStation. The card shows the URL to custom XML page, a username and a password. Aglyn keeps the password encrypted, and a site admin can select Show on the card to see it again later.\n3. In ShipStation, go to Settings → Selling Channels → Store Setup, select Connect a Store or Marketplace and choose Custom Store.\n4. Paste the URL, username and password from Aglyn.\n5. Type the status names exactly as the Aglyn card shows them. ShipStation matches them letter for letter:\n| ShipStation field | Type |\n| Unpaid Status | unpaid |\n| Paid Status | paid |\n| Shipped Status | shipped |\n| Canceled Status | canceled |\n| On-Hold Status | onhold |\n6. Select Test Connection, then Connect.'
5291
5417
  },
5292
5418
  {
5293
5419
  path: '/commerce-and-bookings/commerce/use-shipstation',
@@ -7107,7 +7233,7 @@ export const DOCS_SECTION_INDEX = [
7107
7233
  title: 'Forms & Lead Capture',
7108
7234
  heading: 'Where submissions go',
7109
7235
  anchor: '#where-submissions-go',
7110
- text: '- Inbox — every submission is captured; open it in the console\'s mail reader dialog.\n- Datasets — bind a form to a dataset (Write to dataset on the Form element) and each submission is also appended as a record. The inbox always gets its copy, and each submission\'s own detail dialog carries chips saying where it went — including saying nothing about a dataset when the record wasn\'t created.\n- Contacts — every submission that carries an email address updates the person in the CRM at stage Lead: a new contact when the address is new, an interaction on their timeline when it is not, and a customer stays a customer. A field can also save its answer into one of your custom contact fields — pick the field under Saves to contact fields on the form\'s own page.\n- Leads — only when the form\'s CRM routing card has the lead switch on. See What makes a lead.\nThe inbox\nThe site\'s Inbox page collects everything visitors send, in three tabs — Submissions, Members & leads, and Campaigns. The Form Submissions table reads as a list of people, not of forms: From, Message, Received, and the row actions.\n- From shows the sender — a colored initials avatar and their name, with the form name as a caption underneath (the Form element\'s Form name attribute, so name your forms distinctly: "Contact", "Newsletter", "Survey"). The avatar\'s color is derived from the name, so one sender keeps one color on every machine.\n- Unread submissions are bold with a dot at the left of the row. There is no "New" chip — bold text and a chip saying New are the same fact twice. Site managers also get an in-app notification per submission, and an email too for anyone who switched that on. It names the form, the page and the campaign, and opens that submission rather than the list — see What an open submission links '
7236
+ text: '- Inbox — every submission is captured; open it in the console\'s mail reader dialog.\n- Datasets — bind a form to a dataset (Write to dataset on the Form element) and each submission is also appended as a record. The inbox always gets its copy, and each submission\'s own detail dialog carries chips saying where it went — including saying nothing about a dataset when the record wasn\'t created.\n- Contacts — every submission that carries an email address updates the person in the CRM at stage Lead: a new contact when the address is new, an interaction on their timeline when it is not, and a customer stays a customer. A field can also save its answer into one of your custom contact fields — pick the field under Saves to contact fields on the form\'s own page.\n- Leads — only when the form\'s CRM routing card has the lead switch on. See What makes a lead.\nThe inbox\nThe site\'s Inbox page collects everything visitors send, in three tabs — Submissions, Members & leads, and Campaigns. The Form Submissions table reads as a list of people, not of forms: From, Message, Received, and the row actions.\n- From shows the sender — a colored initials avatar and their name, with the form name as a caption underneath (the Form element\'s Form name attribute, so name your forms distinctly: "Contact", "Newsletter", "Survey"). The avatar\'s color is derived from the name, so one sender keeps one color on every machine.\n- Unread submissions are bold with a dot at the left of the row. There is no "New" chip — bold text and a chip saying New are the same fact twice. Site managers also get an in-app notification per submission, and an email too unless they switched that off. It names the form, the page and the campaign, and opens that submission rather than the list — see What an open submission links to'
7111
7237
  },
7112
7238
  {
7113
7239
  path: '/content-and-data/forms/overview',
@@ -7282,7 +7408,7 @@ export const DOCS_SECTION_INDEX = [
7282
7408
  title: 'Order webhooks',
7283
7409
  heading: '',
7284
7410
  anchor: '',
7285
- text: 'Order webhooks for developers\nA store\'s managers add an endpoint under Settings → Order webhooks in the Products hub, choose its events, and copy its signing secret — see Order webhooks for that side and the list of events. This page is for whoever builds the endpoint.'
7411
+ text: 'Order webhooks for developers\nA store\'s managers add an endpoint under Notifications → Order webhooks in the Products hub, choose its events, and copy its signing secret — see Order webhooks for that side and the list of events. This page is for whoever builds the endpoint.'
7286
7412
  },
7287
7413
  {
7288
7414
  path: '/developers/order-webhooks',
@@ -9221,7 +9347,7 @@ export const DOCS_SECTION_INDEX = [
9221
9347
  title: 'The console tour',
9222
9348
  heading: 'Workspace settings & notifications',
9223
9349
  anchor: '#workspace-settings--notifications',
9224
- text: 'Organization-wide settings (name, workspace URL) live under Organization → Settings, which also holds Profile, API keys, Branding, Single sign-on, Privacy, Ownership and Delete. Turning plugins on and off for the workspace is its own section, Organization → Plugins — Marketplace is for finding and installing new ones, not for administering what you already run:\nOrganization settings {#organization-settings}\nOrganization → Settings is where you run the workspace itself: its name and workspace URL under General, then — for owners and admins — Profile, Plugins, API keys, Branding, Single sign-on, Privacy, Holds & reviews and Import & export, each a section in the rail on the left. Ownership and Delete appear to the workspace owner only.\nGeneral {#organization-general}\nThe General card renames the organization, changes its workspace URL and sets the time zone its sites inherit — "workspace" is the console\'s word for your organization\'s home.\nChanging the workspace URL changes the address teammates use to reach the workspace, so share the new one after you save.\nThe notifications feed\nYour in-app notification feed — billing, publishing, workflow failures — lives under Notifications, which has two sections in the rail on the left: All notifications and Settings. The first shows what arrived, newest first, with Mark all read above it. The feed\'s Filters narrows it by Type (is one type, or is any of up to thirty — a larger pick is refused, with a note above the feed) and by Status (is New or Read), and both can stand together. Each filter in force shows as a chip above the feed; remove the chip to drop it. The filters apply to the whole feed, not just the page on screen, and the pager then turns through the matches; see Filter and search a list. There is no search box, because '
9350
+ text: 'Organization-wide settings (name, workspace URL) live under Organization → Settings, which also holds Profile, API keys, Branding, Single sign-on, Privacy, Ownership and Delete. Turning plugins on and off for the workspace is its own section, Organization → Plugins — Marketplace is for finding and installing new ones, not for administering what you already run:\nOrganization settings {#organization-settings}\nOrganization → Settings is where you run the workspace itself: its name and workspace URL under General, then — for owners and admins — Profile, Plugins, API keys, Branding, Single sign-on, Privacy, Holds & reviews and Import & export, each a section in the rail on the left. Integrations follows Single sign-on once a plugin adds workspace settings there. Privacy, Holds & reviews and Import & export are grouped under Data & compliance. Ownership and Delete, under Danger zone, appear to the workspace owner only.\nGeneral {#organization-general}\nThe General card renames the organization, changes its workspace URL and sets the time zone its sites inherit — "workspace" is the console\'s word for your organization\'s home.\nChanging the workspace URL changes the address teammates use to reach the workspace, so share the new one after you save.\nThe notifications feed\nYour in-app notification feed — billing, publishing, workflow failures — lives under Notifications, which has two sections in the rail on the left: All notifications and Settings. The first shows what arrived, newest first, with Mark all read above it. The feed\'s Filters narrows it by Type (is one type, or is any of up to thirty — a larger pick is refused, with a note above the feed) and by Status (is New or Read), and both can stand together. Each filter in force shows as a chip above the feed; remove the chip to '
9225
9351
  },
9226
9352
  {
9227
9353
  path: '/getting-started/create-a-site',
@@ -9445,7 +9571,7 @@ export const DOCS_SECTION_INDEX = [
9445
9571
  title: 'Commerce end to end',
9446
9572
  heading: '1. Connect payments',
9447
9573
  anchor: '#1-connect-payments',
9448
- text: 'The Payments card, in the store\'s settings, connects your own Stripe account so buyers pay you directly; checkout stays off until Stripe reports charges enabled.\nYou need a paid plan, and only the workspace owner can connect the account.\n1. On the Payments card, select Set up payments.\n2. Finish Stripe\'s Express onboarding: your business details, identity and the bank account your payouts go to.\n3. Back in Aglyn, the card\'s Stripe account line reads Charges enabled. Refresh status checks again if it does not yet.\nUntil then checkout says "This site has not enabled payments yet". Aglyn adds its per-sale platform fee automatically per your plan, and the card shows the fee your plan carries.'
9574
+ text: 'The Payments card, on Products → Payments, connects your own Stripe account so buyers pay you directly; checkout stays off until Stripe reports charges enabled.\nYou need a paid plan, and only the workspace owner can connect the account.\n1. On the Payments card, select Set up payments.\n2. Finish Stripe\'s Express onboarding: your business details, identity and the bank account your payouts go to.\n3. Back in Aglyn, the card\'s Stripe account line reads Charges enabled. Refresh status checks again if it does not yet.\nUntil then checkout says "This site has not enabled payments yet". Aglyn adds its per-sale platform fee automatically per your plan, and the card shows the fee your plan carries.'
9449
9575
  },
9450
9576
  {
9451
9577
  path: '/guides/commerce-end-to-end',
@@ -9809,7 +9935,7 @@ export const DOCS_SECTION_INDEX = [
9809
9935
  title: 'Build a newsletter sign-up band',
9810
9936
  heading: '5. Create the live audience',
9811
9937
  anchor: '#5-create-the-live-audience',
9812
- text: '1. Open your site\'s Emails tab → Audiences and choose Create audience. Name it Product updates and create it.\n2. On the audience\'s page choose Edit list.\n3. Set Membership to Live — keeps growing.\n4. Set People from to Form submissions, and Submitted form to Product updates, the form\'s display name from step 1.\n5. Choose Save. The This audience box reads Submitted any of: Product updates.\nThe audience refreshes about every fifteen minutes. Its chip reads Rule · not yet evaluated until the first refresh. After that, everyone who has submitted the form is on it. Submitted form matches the form\'s display name exactly (ignoring case), so if you rename the form, update the audience too.\nThe Consent column on a live audience The members table shows the consent recorded on the membership. A live audience never writes consent onto its members, because matching a rule is not an opt-in. So its rows read No basis on record even for people who signed up.\nTheir opt-in is on their contact (step 8), and that is what a campaign checks before it sends. See Lists built from a rule.'
9938
+ text: '1. Open your site\'s Emails tab → Audiences and choose Create audience. Name it Product updates and create it.\n2. On the audience\'s page choose Edit list.\n3. Set Membership to Live — keeps growing.\n4. Set People from to Form submissions, and Submitted form to Product updates, the form\'s display name from step 1.\n5. Choose Save. The This audience box reads Submitted any of: Product updates.\nThe audience refreshes about once an hour (sooner right after you save it). Its chip reads Rule · not yet evaluated until the first refresh. After that, everyone who has submitted the form is on it. Submitted form matches the form\'s display name exactly (ignoring case), so if you rename the form, update the audience too.\nThe Consent column on a live audience Matching a rule is not an opt-in, so a live audience records no consent of its own. For the people it added, the Consent column shows the opt-in on their contact (step 8), and that is the same opt-in a campaign checks before it sends. Someone who signed up through the form reads Opted in. See Lists built from a rule.'
9813
9939
  },
9814
9940
  {
9815
9941
  path: '/guides/newsletter-sign-up-band',
@@ -9830,14 +9956,14 @@ export const DOCS_SECTION_INDEX = [
9830
9956
  title: 'Build a newsletter sign-up band',
9831
9957
  heading: '8. Check it on the live site',
9832
9958
  anchor: '#8-check-it-on-the-live-site',
9833
- text: 'Open the published page. On a wide screen the field and button share a row. On a phone they stack at full width:\nSign up with an address of your own, then open CRM → Contacts and the contact. Check two things:\n- The Stage chip reads Subscriber.\n- In the Relationship card, Marketing email reads Opted in · recorded with the date. Its timeline shows Submitted "Product updates".\nWithin about fifteen minutes the address also appears on the Product updates audience. It is ready for your next email campaign.'
9959
+ text: 'Open the published page. On a wide screen the field and button share a row. On a phone they stack at full width:\nSign up with an address of your own, then open CRM → Contacts and the contact. Check two things:\n- The Stage chip reads Subscriber.\n- In the Relationship card, Marketing email reads Opted in · recorded with the date. Its timeline shows Submitted "Product updates".\nWithin about an hour the address also appears on the Product updates audience, with Opted in in its Consent column. It is ready for your next email campaign.'
9834
9960
  },
9835
9961
  {
9836
9962
  path: '/guides/newsletter-sign-up-band',
9837
9963
  title: 'Build a newsletter sign-up band',
9838
9964
  heading: 'Troubleshooting',
9839
9965
  anchor: '#troubleshooting',
9840
- text: '| What you see | Why, and what to do |\n| The audience stays empty | Wait for the fifteen-minute refresh. Then check that Submitted form matches the form\'s Display name exactly. A rename breaks the match. |\n| The contact has no opt-in | The sign-up switch was off, or not saved, when they submitted. Turn it on and Save. It applies to new submissions, not past ones. |\n| The field and button stack on a wide screen | Flex direction row is set at the wrong breakpoint. Select the saved form\'s Form, switch the breakpoint picker to SM – Tablet, and check Flexbox & Grid. Then publish the form. |\n| Two buttons show | The Button\'s Type is not Submit. Only a Submit button replaces the form\'s built-in one. |\n| The band shows the wrong colors | Its gradient stops are bound to your theme\'s Primary and Secondary colors. Change them in the theme, not in the band. |\n| A gray outline shows around the field | Set the Input\'s Border Color to the same color as its Background Color. |'
9966
+ text: '| What you see | Why, and what to do |\n| The audience stays empty | Wait for the hourly refresh. Then check that Submitted form matches the form\'s Display name exactly. A rename breaks the match. |\n| The contact has no opt-in | The sign-up switch was off, or not saved, when they submitted. Turn it on and Save. It applies to new submissions, not past ones. |\n| The field and button stack on a wide screen | Flex direction row is set at the wrong breakpoint. Select the saved form\'s Form, switch the breakpoint picker to SM – Tablet, and check Flexbox & Grid. Then publish the form. |\n| Two buttons show | The Button\'s Type is not Submit. Only a Submit button replaces the form\'s built-in one. |\n| The band shows the wrong colors | Its gradient stops are bound to your theme\'s Primary and Secondary colors. Change them in the theme, not in the band. |\n| A gray outline shows around the field | Set the Input\'s Border Color to the same color as its Background Color. |'
9841
9967
  },
9842
9968
  {
9843
9969
  path: '/guides/newsletter-sign-up-band',
@@ -10565,7 +10691,7 @@ export const DOCS_SECTION_INDEX = [
10565
10691
  title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
10566
10692
  heading: 'Connect a platform',
10567
10693
  anchor: '#connect',
10568
- text: '1. Open the site, then Setup. Scroll to Email platforms.\n2. On the platform\'s card, select Connect.\n3. Paste your API key, then Check and connect. Aglyn checks the key with the platform before it saves it, and stores it encrypted; it is never shown again.\n- Mailchimp: in Mailchimp, Profile → Extras → API keys → Create a key. It ends in your data center, like -us21.\n- Klaviyo: in Klaviyo, Settings → API keys → Create private API key, with full access to Profiles, Lists, Subscriptions and Events.\n- Omnisend: in Omnisend, Store settings → API keys → Create API key, with access to Contacts and Events.\n4. For Mailchimp and Klaviyo, choose the audience or list contacts go into. If your account has only one, it is chosen for you.\nThe first sync starts within 15 minutes. Sync now runs it straight away.\nOnly a site admin can connect, change or disconnect a platform; editors can see the card and its log.'
10694
+ text: '1. Open the site, then Setup → Integrations. The Email platforms card lists each platform on a row of its own.\n2. On the platform\'s row, select Connect.\n3. Paste your API key, then Check and connect. Aglyn checks the key with the platform before it saves it, and stores it encrypted; it is never shown again.\n- Mailchimp: in Mailchimp, Profile → Extras → API keys → Create a key. It ends in your data center, like -us21.\n- Klaviyo: in Klaviyo, Settings → API keys → Create private API key, with full access to Profiles, Lists, Subscriptions and Events.\n- Omnisend: in Omnisend, Store settings → API keys → Create API key, with access to Contacts and Events.\n4. For Mailchimp and Klaviyo, choose the audience or list contacts go into. If your account has only one, it is chosen for you.\nThe first sync starts within 15 minutes. Sync now runs it straight away.\nOnly a site admin can connect, change or disconnect a platform; editors can see the card and each platform\'s sync log.'
10569
10695
  },
10570
10696
  {
10571
10697
  path: '/marketing-and-automation/email-campaigns/email-platforms',
@@ -10593,7 +10719,7 @@ export const DOCS_SECTION_INDEX = [
10593
10719
  title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
10594
10720
  heading: 'The sync log, and when something goes wrong',
10595
10721
  anchor: '#sync-log',
10596
- text: 'Each connected platform has a sync log under its card: what each run sent and read back, and every error, newest first.\n- Syncing — working normally; it runs about every 15 minutes.\n- Stopped — the platform failed many times in a row (it was retried with growing waits). Fix the cause shown, then Sync now.\n- Connect again — the platform refused the key (it was deleted, or its access changed). Create a new key and connect again; your settings are kept.\nWhen the platform asks Aglyn to slow down, the sync waits as long as it was told and carries on — nothing is lost. A person the platform will not take (for example an address it has permanently deleted) is skipped and named in the log, and the rest go on.'
10722
+ text: 'Each connected platform has a sync log: select Sync log on its row to open it. It lists what each run sent and read back, and every error, newest first.\n- Syncing — working normally; it runs about every 15 minutes.\n- Stopped — the platform failed many times in a row (it was retried with growing waits). Fix the cause shown, then Sync now.\n- Connect again — the platform refused the key (it was deleted, or its access changed). Create a new key and connect again; your settings are kept.\nWhen the platform asks Aglyn to slow down, the sync waits as long as it was told and carries on — nothing is lost. A person the platform will not take (for example an address it has permanently deleted) is skipped and named in the log, and the rest go on.'
10597
10723
  },
10598
10724
  {
10599
10725
  path: '/marketing-and-automation/email-campaigns/email-platforms',
@@ -11503,7 +11629,7 @@ export const DOCS_SECTION_INDEX = [
11503
11629
  title: 'Signing In & Sessions',
11504
11630
  heading: 'Verifying your email',
11505
11631
  anchor: '#verifying-your-email',
11506
- text: 'A new email-and-password account is verified before it can open a workspace. Right after you sign up, the console emails you a link and waits on a Verify your email page.\n- Open the link from the email. It opens a new tab (on a phone, often inside your mail app) that confirms Email verified. You can close that tab: the tab you signed up in moves on by itself as soon as you return to it. If you would rather carry on in the new tab, choose Continue to Aglyn, or Sign in to continue if that browser isn\'t signed in.\n- Opened it twice? A link works once. If the account signed in on that browser is already verified, the page says You\'re already verified and offers to continue, so there is nothing to fix.\n- No email? Choose Resend verification email on the waiting page. If a link has expired, the same button sends a fresh one.'
11632
+ text: 'A new email-and-password account is verified before it can open a workspace. Right after you sign up, the console emails you a link and waits on a Verify your email page.\n- Open the link from the email, then choose Confirm my email. The link opens a new tab (on a phone, often inside your mail app). Opening it doesn\'t verify anything on its own, so a mail security scanner that checks links can\'t verify an address for you. Once you confirm, the page says Email verified. You can close that tab: the tab you signed up in moves on by itself as soon as you return to it. If you would rather carry on in the new tab, choose Continue to Aglyn, or Sign in to continue if that browser isn\'t signed in.\n- Opened it twice? A link works once. If the account signed in on that browser is already verified, the page says You\'re already verified and offers to continue, so there is nothing to fix.\n- No email? Choose Resend verification email on the waiting page. If a link has expired, the same button sends a fresh one.'
11507
11633
  },
11508
11634
  {
11509
11635
  path: '/workspace-and-billing/signing-in-and-sessions',