@aglyn/aglyn 1.0.0-beta.231 → 1.0.0-beta.233

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 (88) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/account-acquisition.d.ts +15 -2
  3. package/src/lib/app-utils/account-acquisition.js +20 -1
  4. package/src/lib/app-utils/account-acquisition.js.map +1 -1
  5. package/src/lib/app-utils/admin-audit-index.d.ts +3 -1
  6. package/src/lib/app-utils/admin-audit-index.js +9 -1
  7. package/src/lib/app-utils/admin-audit-index.js.map +1 -1
  8. package/src/lib/app-utils/analytics-summary.d.ts +95 -0
  9. package/src/lib/app-utils/analytics-summary.js +113 -0
  10. package/src/lib/app-utils/analytics-summary.js.map +1 -0
  11. package/src/lib/app-utils/artifact-list-keys.js +12 -0
  12. package/src/lib/app-utils/artifact-list-keys.js.map +1 -1
  13. package/src/lib/app-utils/artifact-list-queries.d.ts +51 -0
  14. package/src/lib/app-utils/artifact-list-queries.js +321 -0
  15. package/src/lib/app-utils/artifact-list-queries.js.map +1 -0
  16. package/src/lib/app-utils/business-profile.d.ts +171 -0
  17. package/src/lib/app-utils/business-profile.js +277 -0
  18. package/src/lib/app-utils/business-profile.js.map +1 -0
  19. package/src/lib/app-utils/child-contract.d.ts +4 -1
  20. package/src/lib/app-utils/child-contract.js +5 -2
  21. package/src/lib/app-utils/child-contract.js.map +1 -1
  22. package/src/lib/app-utils/console-routes.d.ts +5 -0
  23. package/src/lib/app-utils/console-routes.js +1 -0
  24. package/src/lib/app-utils/console-routes.js.map +1 -1
  25. package/src/lib/app-utils/content-schema-type.d.ts +9 -0
  26. package/src/lib/app-utils/content-schema-type.js +4 -0
  27. package/src/lib/app-utils/content-schema-type.js.map +1 -1
  28. package/src/lib/app-utils/crm.d.ts +30 -2
  29. package/src/lib/app-utils/crm.js +77 -15
  30. package/src/lib/app-utils/crm.js.map +1 -1
  31. package/src/lib/app-utils/docs-help.generated.d.ts +58 -10
  32. package/src/lib/app-utils/docs-help.generated.js +118 -4
  33. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  34. package/src/lib/app-utils/docs-index.generated.js +320 -19
  35. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  36. package/src/lib/app-utils/entry-list-declaration.d.ts +33 -0
  37. package/src/lib/app-utils/entry-list-declaration.js +172 -0
  38. package/src/lib/app-utils/entry-list-declaration.js.map +1 -0
  39. package/src/lib/app-utils/first-version-seed.d.ts +19 -0
  40. package/src/lib/app-utils/first-version-seed.js +53 -0
  41. package/src/lib/app-utils/first-version-seed.js.map +1 -0
  42. package/src/lib/app-utils/local-business.d.ts +8 -0
  43. package/src/lib/app-utils/local-business.js +4 -0
  44. package/src/lib/app-utils/local-business.js.map +1 -1
  45. package/src/lib/app-utils/lockdown.js +1 -1
  46. package/src/lib/app-utils/lockdown.js.map +1 -1
  47. package/src/lib/app-utils/message-search.js +5 -2
  48. package/src/lib/app-utils/message-search.js.map +1 -1
  49. package/src/lib/app-utils/name-search.js +15 -3
  50. package/src/lib/app-utils/name-search.js.map +1 -1
  51. package/src/lib/app-utils/page-markdown.js +3 -0
  52. package/src/lib/app-utils/page-markdown.js.map +1 -1
  53. package/src/lib/app-utils/screen-analytics-aggregate.d.ts +70 -0
  54. package/src/lib/app-utils/screen-analytics-aggregate.js +82 -0
  55. package/src/lib/app-utils/screen-analytics-aggregate.js.map +1 -0
  56. package/src/lib/app-utils/screen-kind.d.ts +25 -0
  57. package/src/lib/app-utils/screen-kind.js +25 -0
  58. package/src/lib/app-utils/screen-kind.js.map +1 -0
  59. package/src/lib/app-utils/screen-route.d.ts +1 -5
  60. package/src/lib/app-utils/screen-route.js +2 -4
  61. package/src/lib/app-utils/screen-route.js.map +1 -1
  62. package/src/lib/app-utils/site-journey-steps.d.ts +38 -0
  63. package/src/lib/app-utils/site-journey-steps.js +54 -0
  64. package/src/lib/app-utils/site-journey-steps.js.map +1 -0
  65. package/src/lib/app-utils/site-journey.d.ts +2 -22
  66. package/src/lib/app-utils/site-journey.js +2 -32
  67. package/src/lib/app-utils/site-journey.js.map +1 -1
  68. package/src/lib/plugin-manager/feature-plugins.d.ts +19 -0
  69. package/src/lib/plugin-manager/feature-plugins.js +8 -0
  70. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  71. package/src/lib/plugin-manager/first-party-plugins.generated.js +124 -2
  72. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  73. package/src/lib/plugin-manager/plugin-channel-orders.d.ts +262 -0
  74. package/src/lib/plugin-manager/plugin-channel-orders.js +32 -0
  75. package/src/lib/plugin-manager/plugin-channel-orders.js.map +1 -0
  76. package/src/lib/plugin-manager/plugin-checkout-credits.d.ts +288 -0
  77. package/src/lib/plugin-manager/plugin-checkout-credits.js +196 -0
  78. package/src/lib/plugin-manager/plugin-checkout-credits.js.map +1 -0
  79. package/src/lib/plugin-manager/plugin-product-catalog.d.ts +5 -0
  80. package/src/lib/plugin-manager/plugin-product-catalog.js.map +1 -1
  81. package/src/lib/plugin-manager/plugin-product-writer.d.ts +166 -0
  82. package/src/lib/plugin-manager/plugin-product-writer.js +31 -0
  83. package/src/lib/plugin-manager/plugin-product-writer.js.map +1 -0
  84. package/src/lib/plugin-manager/plugin-shipping-rates.d.ts +10 -0
  85. package/src/lib/plugin-manager/plugin-shipping-rates.js.map +1 -1
  86. package/src/lib/plugin-manager/plugin-theme-presets.d.ts +40 -0
  87. package/src/lib/plugin-manager/plugin-theme-presets.js +44 -0
  88. package/src/lib/plugin-manager/plugin-theme-presets.js.map +1 -0
@@ -235,6 +235,55 @@ export const DOCS_SECTION_INDEX = [
235
235
  anchor: '#related',
236
236
  text: '- Actions builder\n- Aglyn AI\n- How Aglyn AI builds'
237
237
  },
238
+ {
239
+ path: '/ai/business-profile',
240
+ title: 'Business profile',
241
+ heading: '',
242
+ anchor: '',
243
+ text: 'Business profile\nEvery AI job for a site starts from what the site already knows about the business: its name, what it does, its services, the area it serves, who it is for, its tone of voice, and the contact details you entered. Aglyn AI writes for this business instead of guessing, and it never makes up a way to reach you.'
244
+ },
245
+ {
246
+ path: '/ai/business-profile',
247
+ title: 'Business profile',
248
+ heading: 'Where to edit it',
249
+ anchor: '#where-to-edit-it',
250
+ text: 'Open the site, go to Setup → Business profile. The page has three cards:\n- Business profile: what the business does, its services (one per line), who it is for, the area it serves, the tone of voice and any notes on tone.\n- From your site settings: the facts Aglyn AI reads from your other settings, each with a link to the card that edits it.\n- What Aglyn AI learned: the preferences it took from edits you applied.'
251
+ },
252
+ {
253
+ path: '/ai/business-profile',
254
+ title: 'Business profile',
255
+ heading: 'Where the values come from',
256
+ anchor: '#where-the-values-come-from',
257
+ text: 'When a site is started with Aglyn AI, the profile is filled from your answers to the guided start, and from what the plan wrote about the business. Each field says where its value came from:\n- Your answers when the site was started, or Suggested by Aglyn AI: a suggestion. Edit it and it becomes yours.\n- An empty field that Aglyn AI still has a value for says so: the description in your SEO settings, or the workspace\'s default.\nWhat you type is never replaced. A later job can fill an empty field, but it never overwrites one you wrote, and a field you cleared stays clear.\nWorkspace defaults\nSettings → Profile has a Business profile defaults card. A site uses those values wherever its own profile is empty, so a workspace that runs many sites for one business writes them once. Only managers can change them.'
258
+ },
259
+ {
260
+ path: '/ai/business-profile',
261
+ title: 'Business profile',
262
+ heading: 'Contact details are never invented',
263
+ anchor: '#contact-details-are-never-invented',
264
+ text: 'The name, business type, email, phone, address, opening hours and social profiles come only from Setup → Basic details and Setup → SEO, exactly as entered. A detail you have not entered reads Not entered, and Aglyn AI writes around it, or leaves a bracketed placeholder such as [phone number] for you to fill, instead of making one up. The same goes for prices, reviews and testimonials.'
265
+ },
266
+ {
267
+ path: '/ai/business-profile',
268
+ title: 'Business profile',
269
+ heading: 'What Aglyn AI learned',
270
+ anchor: '#what-aglyn-ai-learned',
271
+ text: 'When you apply an Assist edit that shows a preference, such as asking for shorter copy, a friendlier tone, no emoji, or removing a testimonials section, Aglyn AI keeps that as a short preference for the site. Later jobs read it.\nThe What Aglyn AI learned card lists each preference and how many applied edits it was seen in. Choose the close button beside one to forget it, or Forget all to clear the list. A preference replaces an opposite one: asking for detailed copy after asking for shorter copy keeps only the newer one.'
272
+ },
273
+ {
274
+ path: '/ai/business-profile',
275
+ title: 'Business profile',
276
+ heading: 'Which jobs read it',
277
+ anchor: '#which-jobs-read-it',
278
+ text: 'The site\'s plan, every build Assist plans for the site, Assist\'s edit turns, and analytics insights read the profile. Insights read what the business is, never its contact details. Free and paid workspaces get the same profile.\nThe profile is sent as one short block, at most about 400 tokens, that is cached for the site, so it adds almost nothing to what a job costs.'
279
+ },
280
+ {
281
+ path: '/ai/business-profile',
282
+ title: 'Business profile',
283
+ heading: 'Related',
284
+ anchor: '#related',
285
+ text: '- How Aglyn AI builds\n- Generate a site'
286
+ },
238
287
  {
239
288
  path: '/ai/copy-assist',
240
289
  title: 'Rewrite and write copy with AI',
@@ -282,42 +331,42 @@ export const DOCS_SECTION_INDEX = [
282
331
  title: 'Create images with AI',
283
332
  heading: '',
284
333
  anchor: '',
285
- text: 'Create images with AI\nCreate with AI in the media library makes pictures from a description and adds them to the library you have open. There are two kinds:\n- Illustration or icon: a picture drawn as an SVG, sharp at any size. Choose an Illustration (a spot illustration or small scene), an Icon (one color, or two tones), a Pattern (a seamless background that tiles) or a Logo mark (a simple symbol without lettering). Available wherever Aglyn AI is.\n- Photo: a picture made by Google\'s image models. Offered only where photo creation is turned on for the deployment your workspace runs on; where it is not, the window shows only Illustration or icon.\nEach picture is stored the way a file you upload is stored: in the open folder, counted toward your storage, served from the same addresses, and with alt text you can edit.'
334
+ text: 'Create images with AI\nCreate with AI in the media library makes pictures from a description and adds them to the library you have open. The Kind menu lists what it can make, in four sections:\n| Section | Kinds | Made as |\n| Vector | Illustration (a spot illustration or small scene), Icon (one color, or two tones), Pattern (a seamless background that tiles), Logo mark (a simple symbol without lettering) | An SVG, sharp at any size. Available wherever Aglyn AI is. |\n| Photo | Photo (your description decides the style), Natural photo, Studio product shot, Lifestyle with people, Architecture & interiors, Food, Aerial & landscape | A picture made by Google\'s image models |\n| Art | 3D render, Watercolor, Oil painting, Flat vector art, Line drawing, Cartoon or anime | A picture made by Google\'s image models |\n| Design | Background or texture, Banner or hero image, Social post graphic, Mockup (your design on a device screen or packaging) | A picture made by Google\'s image models |\nEvery kind but Photo adds its own style to your description: a photographic kind asks for the lens, light and composition that genre is shot with, an art kind for its medium and strokes, and a design kind for its layout, such as a banner\'s calm space for a headline. The Photo, Art and Design sections are offered only where photo creation is turned on for the deployment your workspace runs on; where it is not, the menu lists the Vector kinds alone.\nEach picture is stored the way a file you upload is stored: in the open folder, counted toward your storage, served from the same addresses, and with alt text you can edit.'
286
335
  },
287
336
  {
288
337
  path: '/ai/create-images',
289
338
  title: 'Create images with AI',
290
339
  heading: 'Make a picture',
291
340
  anchor: '#make-a-picture',
292
- text: '1. Open Media, on a site or for the organization, and open the folder the pictures should land in.\n2. Choose Create with AI, beside Upload media. An empty library offers it beside its own Upload media button too.\n3. Where photos are on, choose Photo or Illustration or icon. For an illustration, choose its Kind.\n4. Describe the picture: what is in it, the setting, and the style you want.\n5. Choose a shape: Square 1:1, Landscape 4:3, Portrait 3:4, Wide 16:9 or Tall 9:16, and how many pictures to make, from one to four.\n6. For an illustration, choose its colors: Use my site\'s theme colors, which reads your site\'s theme, or Choose colors to pick up to six. The organization\'s library belongs to no single site, so there you choose the colors.\n7. The window shows what the pictures will cost in credits before you start. Choose Create.\nThe pictures appear in the library a few seconds later, selected, so you can move, tag or open them at once. Nothing is placed on a page: a picture is used only when you put it in an Image element, a gallery or anywhere else a media field asks for one.'
341
+ text: '1. Open Media, on a site or for the organization, and open the folder the pictures should land in.\n2. Choose Create with AI, beside Upload media. An empty library offers it beside its own Upload media button too.\n3. Choose a Kind. Each one shows what a picture of it costs, and choosing it picks a shape that suits it — Wide 16:9 for a banner, Square 1:1 for a social post — which you can change.\n4. Describe the picture: what is in it and the setting. For a Photo, describe the style too.\n5. Choose a shape: Square 1:1, Landscape 4:3, Portrait 3:4, Wide 16:9 or Tall 9:16, and how many pictures to make, from one to four.\n6. For a Vector kind, choose its colors: Use my site\'s theme colors, which reads your site\'s theme, or Choose colors to pick up to six. The organization\'s library belongs to no single site, so there you choose the colors. For an Art or Design kind, name the colors in your description if you want particular ones; a Photo kind takes the colors of the scene.\n7. The window shows what the pictures will cost in credits before you start. Choose Create.\nThe pictures appear in the library a few seconds later, selected, so you can move, tag or open them at once. Nothing is placed on a page: a picture is used only when you put it in an Image element, a gallery or anywhere else a media field asks for one.'
293
342
  },
294
343
  {
295
344
  path: '/ai/create-images',
296
345
  title: 'Create images with AI',
297
346
  heading: 'What each picture gets',
298
347
  anchor: '#what-each-picture-gets',
299
- text: '- Alt text. A photo\'s is your description; an illustration\'s is a sentence the AI writes about what it drew. Edit it in the picture\'s details like any other alt text.\n- A file name made from the first few words of your description, starting ai- and numbered within the set: .svg for an illustration, the picture\'s own type for a photo.\n- A record of how it was made: the model, your description, the mode, the kind of illustration and the shape, kept with the file.\n- For a photo, an invisible watermark. Google marks every picture its image models make with its SynthID watermark, so the picture can later be identified as generated. You cannot see it, and it does not change how the picture looks.'
348
+ text: '- Alt text. A picture from the Photo, Art or Design sections takes your description; a Vector picture gets a sentence the AI writes about what it drew. Edit it in the picture\'s details like any other alt text.\n- A file name made from the first few words of your description, starting ai- and numbered within the set: .svg for a Vector kind, the picture\'s own type for the others.\n- A record of how it was made: the model, your description, the kind and the shape, kept with the file.\n- For a picture from Google\'s image models, an invisible watermark. Google marks every picture its image models make with its SynthID watermark, so the picture can later be identified as generated. You cannot see it, and it does not change how the picture looks.'
300
349
  },
301
350
  {
302
351
  path: '/ai/create-images',
303
352
  title: 'Create images with AI',
304
353
  heading: 'Credits',
305
354
  anchor: '#credits',
306
- text: 'Pictures are metered in AI credits from the workspace\'s pool. The window shows an estimate before you create anything:\n| Mode | About, per picture | What it is made of |\n| Illustration or icon | 18 credits | The words the AI reads and writes to draw the SVG, at the same rates as other AI text |\n| Photo | 108 credits | The picture, plus the description and the thinking the image model does before it draws |\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.'
355
+ 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.'
307
356
  },
308
357
  {
309
358
  path: '/ai/create-images',
310
359
  title: 'Create images with AI',
311
360
  heading: 'Safe by construction',
312
361
  anchor: '#safety',
313
- text: 'An illustration is checked before it is stored. It has to be one SVG in the shape you chose, no larger than 200 KB, and self-contained: no scripts, no links, no embedded images or web pages, and nothing loaded from anywhere else, such as a font. An illustration that fails the check is drawn again once with the problem pointed out; if the second one fails too, it is not stored and not charged. The media library then removes anything unsafe from every SVG it stores, as it does for an SVG you upload.\nThe AI declines to draw a real company\'s or organization\'s logo, a trademark or a recognizable brand symbol, a real, named person, and anything sexual, hateful, violent or otherwise unsafe; the window says why, and a declined request on a Free workspace costs nothing. A Logo mark is always a symbol without lettering.\nPhotos are checked by Google\'s safety filters, set to block content they rate as a medium risk or higher, and Google\'s own policies refuse some content whatever is asked, such as photorealistic depictions of children or celebrities that its policies do not allow. A description that is declined is answered with a message and no picture is charged.'
362
+ text: 'An illustration is checked before it is stored. It has to be one SVG in the shape you chose, no larger than 200 KB, and self-contained: no scripts, no links, no embedded images or web pages, and nothing loaded from anywhere else, such as a font. An illustration that fails the check is drawn again once with the problem pointed out; if the second one fails too, it is not stored and not charged. The media library then removes anything unsafe from every SVG it stores, as it does for an SVG you upload.\nThe AI declines to draw a real company\'s or organization\'s logo, a trademark or a recognizable brand symbol, a real, named person, and anything sexual, hateful, violent or otherwise unsafe; the window says why, and a declined request on a Free workspace costs nothing. A Logo mark is always a symbol without lettering.\nPictures from the Photo, Art and Design sections are checked by Google\'s safety filters, set to block content they rate as a medium risk or higher, and Google\'s own policies refuse some content whatever is asked, such as photorealistic depictions of children or celebrities that its policies do not allow. The window says so for those kinds: pictures of real, identifiable people, celebrities or brands may be declined. The people in a Lifestyle with people picture are asked for as made-up people, and a Cartoon or anime picture as original characters. A description that is declined is answered with a message and no picture is charged.'
314
363
  },
315
364
  {
316
365
  path: '/ai/create-images',
317
366
  title: 'Create images with AI',
318
367
  heading: 'What is sent',
319
368
  anchor: '#what-is-sent',
320
- text: '- Illustration or icon: your description, the kind and shape of picture, and your site\'s theme colors or the colors you chose are sent to the AI service every other Aglyn AI feature uses.\n- Photo: your description and the shape you chose are sent to Google\'s image models on Vertex AI.\nNothing else is sent: no other content of your site, no file from your library, and no name, email address or account identifier. The pictures come back to Aglyn and are stored in your library; your description is kept with each picture as part of its record of how it was made.'
369
+ text: '- Vector kinds: your description, the kind and shape of picture, and your site\'s theme colors or the colors you chose are sent to the AI service every other Aglyn AI feature uses.\n- Photo, Art and Design kinds: your description, followed by the kind\'s fixed style wording, and the shape you chose are sent to Google\'s image models on Vertex AI.\nNothing else is sent: no other content of your site, no file from your library, and no name, email address or account identifier. The pictures come back to Aglyn and are stored in your library; your description is kept with each picture as part of its record of how it was made.'
321
370
  },
322
371
  {
323
372
  path: '/ai/create-images',
@@ -709,7 +758,7 @@ export const DOCS_SECTION_INDEX = [
709
758
  title: 'Aglyn AI: the AI website builder',
710
759
  heading: 'What it can build',
711
760
  anchor: '#what-it-can-build',
712
- text: 'Each capability has its own page, next to the thing it builds:\n| You want | Where you start | The page |\n| A page from a brief | Pages → Create with AI | Generate a page |\n| A whole small site | Pages, or Sites for several at once | Generate a site |\n| Many client sites, run as an agency | Sites | An AI website builder for agencies |\n| A layout — header, navigation, footer | Layouts → Create with AI | Generate a layout |\n| A page template | Templates → Create with AI | Generate a page template |\n| A reusable component | Components → Create with AI | Generate a component |\n| A form | Forms → Create with AI | Generate a form |\n| Illustrations, icons, patterns, logo marks and photos | Media → Create with AI | Create images with AI |\n| A section on the canvas | The Besigner | Generate a section |\n| Copy, rewritten or fresh | Any text in the Besigner | Rewrite and write copy |\n| A change to your theme | Setup → Theme | Change your theme with AI |\n| Search titles and descriptions | SEO | SEO by AI |\n| Product copy, catalog and discount ideas | Products → Create with AI, and Build your catalog with AI on the products page | Products with AI |\n| Help working the CRM | A record, the composer, an import | CRM by AI |\n| A designed email | Emails → Templates → Create with AI | Generate an email |\n| A campaign | Marketing → Campaigns → Create with AI, or Also draft a campaign on an email | Generate an email |\n| Variants for an A/B test, and its result in words | Marketing → Experiments | A/B tests by AI |\n| Announcement bar and popup copy, or a new overlay | Marketing → Overlays | Marketing with AI |\n| What your analytics mean | Analytics → Insights | Insights |\n| What your campaigns caused and earned | Marketing → Conversions, or a campaign\'s report | Marketing with AI |\n| An autom'
761
+ text: 'Each capability has its own page, next to the thing it builds:\n| You want | Where you start | The page |\n| A page from a brief | Pages → Create with AI | Generate a page |\n| A whole small site | Pages, or Sites for several at once | Generate a site |\n| Many client sites, run as an agency | Sites | An AI website builder for agencies |\n| A layout — header, navigation, footer | Layouts → Create with AI | Generate a layout |\n| A page template | Templates → Create with AI | Generate a page template |\n| A reusable component | Components → Create with AI | Generate a component |\n| A form | Forms → Create with AI | Generate a form |\n| Illustrations, icons, patterns, logo marks, photos, art and design images | Media → Create with AI | Create images with AI |\n| A section on the canvas | The Besigner | Generate a section |\n| Copy, rewritten or fresh | Any text in the Besigner | Rewrite and write copy |\n| A change to your theme | Setup → Theme | Change your theme with AI |\n| Search titles and descriptions | SEO | SEO by AI |\n| Product copy, catalog and discount ideas | Products → Create with AI, and Build your catalog with AI on the products page | Products with AI |\n| Help working the CRM | A record, the composer, an import | CRM by AI |\n| A designed email | Emails → Templates → Create with AI | Generate an email |\n| A campaign | Marketing → Campaigns → Create with AI, or Also draft a campaign on an email | Generate an email |\n| Variants for an A/B test, and its result in words | Marketing → Experiments | A/B tests by AI |\n| Announcement bar and popup copy, or a new overlay | Marketing → Overlays | Marketing with AI |\n| What your analytics mean | Analytics → Insights | Insights |\n| What your campaigns caused and earned | Marketing → Conversions, or a campaign\'s report | Marketing '
713
762
  },
714
763
  {
715
764
  path: '/ai/overview',
@@ -751,7 +800,7 @@ export const DOCS_SECTION_INDEX = [
751
800
  title: 'Aglyn AI: the AI website builder',
752
801
  heading: 'Related',
753
802
  anchor: '#related',
754
- text: '- How Aglyn AI builds\n- Aglyn Assist\n- AI allotments, usage and model choice\n- Add-ons\n- The Besigner'
803
+ text: '- How Aglyn AI builds\n- Business profile\n- Aglyn Assist\n- AI allotments, usage and model choice\n- Add-ons\n- The Besigner'
755
804
  },
756
805
  {
757
806
  path: '/ai/products-with-ai',
@@ -989,7 +1038,7 @@ export const DOCS_SECTION_INDEX = [
989
1038
  title: 'Drag-and-drop hierarchy',
990
1039
  heading: 'Containers vs. leaf elements',
991
1040
  anchor: '#containers-vs-leaf-elements',
992
- text: 'Whether the center zone means "drop inside" depends on the kind of element you\'re over.\nContainers accept children\nContainers are built to hold other elements: Stack, Box, Section, Card, App Bar, Toolbar, and similar. Dropping onto a container\'s center nests your element inside it. This is how you build structure — a Stack of buttons, a Section full of blocks, and so on.\nLeaf elements don\'t — dropping on one makes a sibling\nLeaf elements have no slot for child elements. There are three kinds:\n- Text elements render their content as inline text — a Page Link, a Button, or a Text element. Their words are their content; there\'s nowhere to nest a child.\n- Self-closing elements draw themselves and take no children at all — an Image, an Icon, or a Video.\n- Elements whose content is an attribute look like containers but draw only what their attributes say — a Markdown block (its document is the Content attribute), a List Item Text row (its words are Primary/Secondary), a Reusable Component instance (its content lives in the definition), and a Layout Slot (filled by the page bound to the layout). Anything nested inside one of these has nowhere to appear on the published page.\nDropping onto a leaf places your element as a sibling right after it, inside the leaf\'s parent — never nested inside the leaf. Over a leaf you\'ll only ever see a before/after placement marker, never an "inside" one, so the marker always matches where the element actually lands.\nWhy this matters Aiming at the middle of a small element like a Page Link used to tuck the new element inside it, where it wouldn\'t render as expected. Now a leaf\'s center reads as "place next to me," which is almost always what you want — and you don\'t have to aim precisely at its edges.\nThe third kind is the one that used to bite '
1041
+ text: 'Whether the center zone means "drop inside" depends on the kind of element you\'re over.\nContainers accept children\nContainers are built to hold other elements: Stack, Box, Section, Card, App Bar, Toolbar, and similar. Dropping onto a container\'s center nests your element inside it. This is how you build structure — a Stack of buttons, a Section full of blocks, and so on.\nTypography is a container too. Drop an element on its center and it nests inside, after the Typography\'s own text: a heading can carry a badge, an icon, or a second line of text. A Typography nested inside another continues the same line, the way a phrase continues a sentence, so add a space at the start of its text if you want one between them. Double-click the outer text to edit it as usual; the elements inside are left alone.\nLeaf elements don\'t — dropping on one makes a sibling\nLeaf elements have no slot for child elements. There are three kinds:\n- Text elements render their content as inline text — a Page Link, a Button, or an Inline Text run. Their words are their content; there\'s nowhere to nest a child.\n- Self-closing elements draw themselves and take no children at all — an Image, an Icon, or a Video.\n- Elements whose content is an attribute look like containers but draw only what their attributes say — a Markdown block (its document is the Content attribute), a List Item Text row (its words are Primary/Secondary), a Reusable Component instance (its content lives in the definition), and a Layout Slot (filled by the page bound to the layout). Anything nested inside one of these has nowhere to appear on the published page.\nDropping onto a leaf places your element as a sibling right after it, inside the leaf\'s parent — never nested inside the leaf. Over a leaf you\'ll only ever see a before/after p'
993
1042
  },
994
1043
  {
995
1044
  path: '/building-sites/besigner/drag-drop-hierarchy',
@@ -3474,7 +3523,7 @@ export const DOCS_SECTION_INDEX = [
3474
3523
  title: 'Order emails & status page',
3475
3524
  heading: 'What your customers get',
3476
3525
  anchor: '#customer-emails',
3477
- text: '| When | Email | What it says |\n| -- | -- | -- |\n| An order is paid | Order receipt | The items, the total, any license keys and download links, and your receipt footer. Sent for checkout and Buy buttons, for payment links you send from a draft order, and for register sales when the customer gives an email. |\n| You ship part or all of an order | Order shipped | The items in that package, the carrier and tracking number with a tracking link, and how many items are still to ship. One email per package. |\n| You mark an order delivered | Order delivered | The order and its items. |\n| You refund an order | Order refunded | The amount, the items you refunded by name (if you picked any), and whether the order is now refunded in full. One email per refund. |\n| You cancel an order | Order canceled | The order and its items. Canceling doesn\'t refund a payment: refund first if the customer paid. |\nA dropship supplier who posts tracking for their part of an order sends the customer the same Order shipped email.\nEach email is sent once. If a payment confirmation arrives twice, or you click a button twice, the customer still gets one email. A second package or a second partial refund is a new email.\nRegister sales and orders with only digital or service items don\'t send a shipping or delivery email unless you add a tracking number.\nTracking links\nTracking links are built from the carrier you type when you fulfill: USPS, UPS, FedEx, DHL, Canada Post, Royal Mail and Australia Post are recognized, including spellings like "UPS Ground" or "Fed Ex". For any other carrier the email shows the carrier and tracking number without a link.\nTurning emails off\nAll five emails are on for every store. To turn one off, open Commerce → Settings → Customer notifications and switch it off. Switching th'
3526
+ text: '| When | Email | What it says |\n| -- | -- | -- |\n| An order is paid | Order receipt | The items, the total, any license keys and download links, and your receipt footer. Sent for checkout and Buy buttons, for payment links you send from a draft order, and for register sales when the customer gives an email. |\n| You ship part or all of an order | Order shipped | The items in that package, the carrier and tracking number with a tracking link, and how many items are still to ship. One email per package. |\n| You mark an order delivered | Order delivered | The order and its items. |\n| You refund an order | Order refunded | The amount, the items you refunded by name (if you picked any), and whether the order is now refunded in full. One email per refund. |\n| You cancel an order | Order canceled | The order and its items. Canceling doesn\'t refund a payment: refund first if the customer paid. |\n| You mark a pickup order ready | Order ready for pickup | The location and its address, your pickup hours and arrival instructions. See Pickup & local delivery. |\n| A pickup order is collected | Order picked up | A short confirmation, with the items. |\n| Your driver takes a local delivery out | Order out for delivery | The items and the delivery time the customer booked. When you mark it delivered, they get Order delivered. |\nA dropship supplier who posts tracking for their part of an order sends the customer the same Order shipped email.\nEach email is sent once. If a payment confirmation arrives twice, or you click a button twice, the customer still gets one email. A second package or a second partial refund is a new email.\nRegister sales and orders with only digital or service items don\'t send a shipping or delivery email unless you add a tracking number.\nTracking links\nTracking links'
3478
3527
  },
3479
3528
  {
3480
3529
  path: '/commerce-and-bookings/commerce/order-notifications',
@@ -3602,6 +3651,13 @@ export const DOCS_SECTION_INDEX = [
3602
3651
  anchor: '#shipping--taxes',
3603
3652
  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.\nLodging tax on reservations\nA stay is not goods. The sales-tax settings above configure a goods rate resolved against an address; occupancy (lodging/hotel) tax is a separate regime with its own rates, its own registration and its own return, so reservations do not use them.\nCommerce → Settings → Taxes → Lodging tax is where you set your own rate for it. It is off by default — leave it blank and reservations charge no lodging tax, exactly as before.\nWhen you set a rate, Aglyn adds it to the reservation charge as its own receipt line using the label you choose, and records the amount and the rate on the reservation. It is always your own rate: Stripe Tax cannot compute occupancy tax from a reservation session, so a store using Stripe Tax for goods still sets this one by hand.\nAglyn does not provide tax advice Aglyn applies the rate you enter and records what was charged. It does not determine whether lodging tax applies to you, at what rate, or where it should be paid. Confirm your obligations with a qualified tax professional.\nDeposits. A reservation usually charges a deposit rather than the whole stay, and the rate is applied to the amount actually charged — the deposit. Aglyn does not decide whether your jurisdiction wants occupancy tax on the full stay at booking, on the deposit, or at check-out. If tax is due on more than the deposit, collect the difference the way you collect the rest of the balance.\nStorefront sales tax\nAnalytics → Storefront sales tax shows w'
3604
3653
  },
3654
+ {
3655
+ path: '/commerce-and-bookings/commerce/overview',
3656
+ title: 'Commerce',
3657
+ heading: 'Pickup and local delivery',
3658
+ anchor: '#pickup-and-local-delivery',
3659
+ text: 'Buyers can choose to pick up an order at one of your locations, or have your own driver deliver it, instead of shipping. Pickup is turned on per location, with its hours and arrival instructions; local delivery has zones by postal code, each with a fee, a minimum order and a free-over amount, and the delivery times buyers book at the cart. The Pickup & delivery card on the Orders page lists what to prepare, what is waiting to be collected and what is out for delivery, and the buyer is emailed at each step. See Pickup & local delivery.'
3660
+ },
3605
3661
  {
3606
3662
  path: '/commerce-and-bookings/commerce/overview',
3607
3663
  title: 'Commerce',
@@ -3616,6 +3672,41 @@ export const DOCS_SECTION_INDEX = [
3616
3672
  anchor: '#related',
3617
3673
  text: '- Product catalog\n- Use ShipStation with Aglyn\n- Use ShippingEasy with Aglyn\n- Use Pirate Ship with Aglyn\n- Billing & plans\n- Bookings & scheduling'
3618
3674
  },
3675
+ {
3676
+ path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
3677
+ title: 'Pickup & local delivery',
3678
+ heading: '',
3679
+ anchor: '',
3680
+ text: 'Pickup & local delivery\nBesides shipping, your storefront cart and a product\'s Buy now button can offer two more ways to get an order:\n- Pick up in store — the buyer chooses one of your locations, and you email them when the order is ready to collect.\n- Local delivery — your own driver brings the order. The buyer enters their postal code, sees your delivery fee, and books a delivery time.\nBoth are part of every plan that includes Commerce. A store that sets up neither keeps its cart exactly as it was.\nLocal delivery is your own delivery. Orders that a marketplace courier collects are covered by Delivery apps, which work separately.'
3681
+ },
3682
+ {
3683
+ path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
3684
+ title: 'Pickup & local delivery',
3685
+ heading: 'Set up pickup',
3686
+ anchor: '#set-up-pickup',
3687
+ text: 'Pickup is set per location under Products → Settings → Inventory locations. On a location\'s row, choose Pickup, then:\n1. Turn on Buyers can pick up orders here.\n2. Enter the Pickup hours, one line per set of days, like Mo-Fr 09:00-17:00 and Sa 10:00-14:00. A line that doesn\'t read as days and times is flagged before you save.\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.'
3688
+ },
3689
+ {
3690
+ path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
3691
+ title: 'Pickup & local delivery',
3692
+ heading: 'Set up local delivery',
3693
+ anchor: '#set-up-local-delivery',
3694
+ text: 'Local delivery is set up on the Local delivery card under Products → Settings:\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. Enter your Delivery windows, one per line, like Mo-Fr 09:00-12:00. Each line is offered on each of its days.\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.'
3695
+ },
3696
+ {
3697
+ path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
3698
+ title: 'Pickup & local delivery',
3699
+ heading: 'The pickup & delivery queue',
3700
+ anchor: '#queue',
3701
+ text: 'The Pickup & delivery card on the Orders page lists what needs doing, soonest first:\n| Tab | What\'s in it |\n| -- | -- |\n| To prepare | Pickup orders you haven\'t marked ready. |\n| Ready for pickup | Pickup orders waiting to be collected. |\n| To deliver | Local deliveries, by delivery time. |\n| Out for delivery | Deliveries your driver has taken out. |\n| Delivery failed | Deliveries that couldn\'t be completed, to send out again. |\nPick a location at the top of the card to see only that location\'s orders. Each row has its next step as a button, and Open shows the whole order. The same steps are in the order\'s dialog.\n| Step | What happens |\n| -- | -- |\n| Mark ready | The buyer gets the Order ready for pickup email with the location, your pickup hours and instructions. Not ready yet takes it back. |\n| Picked up | The order is fulfilled and delivered, and the buyer gets a short confirmation. |\n| Out for delivery | The buyer gets the Order out for delivery email with their delivery time. |\n| Delivered | The order is fulfilled and delivered, and the buyer gets the Order delivered email. |\n| Couldn\'t deliver | The delivery moves to Delivery failed, with an optional note. Send it out again when you\'re ready. |\nEach email is sent once per step, and each can be turned off on the Customer notifications card. When text messages are available, buyers can add a mobile number at the cart to get these updates by text as well. Picked up and delivered orders count as fulfilled for your reports, outbound webhooks and accounting, exactly like shipped ones.\nThe buyer\'s order status page shows where to pick up, the pickup hours, or the delivery time, and each step as it happens.'
3702
+ },
3703
+ {
3704
+ path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
3705
+ title: 'Pickup & local delivery',
3706
+ heading: 'Related',
3707
+ anchor: '#related',
3708
+ text: '- Shipping\n- Order emails & status page\n- Orders & returns\n- Delivery apps'
3709
+ },
3619
3710
  {
3620
3711
  path: '/commerce-and-bookings/commerce/pos-and-reservations',
3621
3712
  title: 'POS & reservations',
@@ -3672,6 +3763,13 @@ export const DOCS_SECTION_INDEX = [
3672
3763
  anchor: '#customer-display',
3673
3764
  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'
3674
3765
  },
3766
+ {
3767
+ path: '/commerce-and-bookings/commerce/pos-and-reservations',
3768
+ title: 'POS & reservations',
3769
+ heading: 'Self-service kiosk',
3770
+ anchor: '#self-service-kiosk',
3771
+ 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'
3772
+ },
3675
3773
  {
3676
3774
  path: '/commerce-and-bookings/commerce/pos-and-reservations',
3677
3775
  title: 'POS & reservations',
@@ -3791,6 +3889,13 @@ export const DOCS_SECTION_INDEX = [
3791
3889
  anchor: '#printed-receipts',
3792
3890
  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 Commerce → 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.'
3793
3891
  },
3892
+ {
3893
+ path: '/commerce-and-bookings/commerce/pos-operations',
3894
+ title: 'Running the register',
3895
+ heading: 'Selling while offline',
3896
+ anchor: '#selling-while-offline',
3897
+ text: 'When the register loses its connection it keeps selling cash. A banner across the top of the register says it is offline and how many sales are waiting on the device.\n- What still works: the product grid, search and barcode scans (from the catalog the register saved while it was online), the basket, the cashier\'s discount up to your register limit, your store\'s own tax rate, and cash. The receipt prints through the browser\'s print dialog, and its barcode is the one the order answers to once it syncs.\n- What is off until the connection returns: card readers, Tap to Pay, typed cards, the QR card link, gift cards, store credit and rewards, room charges, discount codes and store promotions. Card payments need the connection, a gift card or store credit balance can only be checked online, so neither is redeemed offline, and codes and promotions are counted against their limits online.\n- When the connection returns, the register sends its saved sales on its own. Each one becomes a paid order, dated when it was rung, in the shift it was rung in and under the cashier who rang it. The emailed receipt goes to the customer then. Cloud receipt printers print nothing for a synced sale, and its drawer does not open again.\n- A sale is never lost and never counted twice. It stays on the device until your store has recorded it, and sending it again (a connection that comes and goes) records it once.\nWhat the sync checks\nThe customer has already paid, so the sync records the sale as it was rung and says what you should look at, on the order and in the register:\n- Stock that went short: more was sold than the shelf held, for example because the website sold the last one meanwhile. The order lists the item and how many were short.\n- A price that changed after the register saved the catalog'
3898
+ },
3794
3899
  {
3795
3900
  path: '/commerce-and-bookings/commerce/pos-operations',
3796
3901
  title: 'Running the register',
@@ -3798,6 +3903,83 @@ export const DOCS_SECTION_INDEX = [
3798
3903
  anchor: '#related',
3799
3904
  text: '- POS & reservations\n- Commerce overview'
3800
3905
  },
3906
+ {
3907
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3908
+ title: 'Rewards, referrals and store credit',
3909
+ heading: '',
3910
+ anchor: '',
3911
+ text: 'Rewards, referrals and store credit\nRewards is your store\'s own loyalty program. Customers earn points on every order — online and at the register — and spend them like store credit. Members can share a referral code that takes money off a friend\'s first order and earns the member store credit. You can also give any customer store credit by hand, beside your gift cards.\nRewards comes with every plan that includes selling, at no extra cost. It is off until you turn it on, so nothing changes for your customers until you do.'
3912
+ },
3913
+ {
3914
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3915
+ title: 'Rewards, referrals and store credit',
3916
+ heading: 'Set up your program',
3917
+ anchor: '#set-up-your-program',
3918
+ text: '1. Go to Products → Promotions and find the Rewards card.\n2. Turn on Customers earn and spend rewards.\n3. Set the rates:\n- Points per dollar spent — how many points each whole dollar of goods earns.\n- Points for $1 off — what points are worth when a customer spends them. With the defaults, 5 points per dollar and 100 points for $1 off, a customer gets back 5% of what they spend. The card shows the rate as you change it.\n- Points needed to redeem — a customer spends points once they hold at least this many.\n- Welcome points — given with a customer\'s first order. Leave it at 0 for none.\n4. Select Save in the card\'s header.\nThe card also shows how many members you have, the points they hold and what those points are worth, and the store credit they hold. Points and store credit are money your store owes, so keep an eye on these figures.\nOnly a site admin can change the program; anyone on the site can read it.'
3919
+ },
3920
+ {
3921
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3922
+ title: 'Rewards, referrals and store credit',
3923
+ heading: 'How customers earn',
3924
+ anchor: '#how-customers-earn',
3925
+ text: 'A customer joins the first time they place an order with an email address while rewards are on. Each order earns points on the goods they paid for: the items, less any discount and less any rewards they spent. Shipping, tax and tips never earn points, and points spent on an order never earn more points.\nPoints are added once per order, shortly after it is paid, whether the order came from your online store or your register. A register sale earns points when you attach a customer with an email address to it.'
3926
+ },
3927
+ {
3928
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3929
+ title: 'Rewards, referrals and store credit',
3930
+ heading: 'Spending rewards online',
3931
+ anchor: '#spending-rewards-online',
3932
+ text: 'Every member has a rewards code, such as RW-7K3P-Q9XZ-2M4D, sent in each rewards email. When rewards are on, your cart shows a Rewards code field. A customer enters their code and checkout takes their store credit first, then their points, up to what is left to pay on the goods after other discounts and gift cards.\nThe balance is held while the customer pays, so the same points cannot be spent twice at once. If they leave without paying, the hold is let go.\nA rewards code is like a gift card code: anyone who has it can spend the balance. Customers should keep it private.'
3933
+ },
3934
+ {
3935
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3936
+ title: 'Rewards, referrals and store credit',
3937
+ heading: 'At the register',
3938
+ anchor: '#at-the-register',
3939
+ text: 'When rewards are on, the register\'s tender buttons include Rewards. Select it, then either:\n- type the customer\'s email (or the start of it) or their rewards code and select Find, then pick their account to take what it can pay; or\n- type a code the customer reads out and select Apply code.\nRewards can pay part of a sale and another tender the rest. Void sale gives back any rewards it took.'
3940
+ },
3941
+ {
3942
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3943
+ title: 'Rewards, referrals and store credit',
3944
+ heading: 'Referrals',
3945
+ anchor: '#referrals',
3946
+ text: 'Turn on Members can refer friends in the Rewards card, then set:\n- Friend\'s first-order credit — taken off a friend\'s first order when they use a member\'s referral code.\n- Friend\'s minimum order — the smallest order the credit applies to. 0 for any.\n- Member\'s reward — store credit the member earns once the friend\'s order is paid.\nEach member has a referral code, such as RF-7K3P9X, shown in their rewards emails. A friend enters it in the Rewards code field in the cart, with their own email. The credit is for a friend\'s first order only: it is refused for an email that has already ordered or already used a referral, and a member cannot use their own code. At the register, attach the friend\'s email to the sale before applying the code.'
3947
+ },
3948
+ {
3949
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3950
+ title: 'Rewards, referrals and store credit',
3951
+ heading: 'Members and store credit',
3952
+ anchor: '#members-and-store-credit',
3953
+ text: 'The Rewards members card under Products → Promotions lists every member, newest first. Sort by most points, or type the start of an email to find someone. Select a member to see their points, store credit, rewards and referral codes, and their last fifty changes.\n- Adjust adds or takes away points or store credit for a member, with a note kept in their history.\n- Give store credit in the card\'s header does the same for any email, and makes them a member if they are not one yet. Turn on Email the customer when credit is added to send them their new balance and rewards code.\nAdjusting balances needs an editor or admin on the site.'
3954
+ },
3955
+ {
3956
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3957
+ title: 'Rewards, referrals and store credit',
3958
+ heading: 'On an order',
3959
+ anchor: '#on-an-order',
3960
+ text: 'An order\'s dialog shows a Rewards section when rewards touched it: the points it earned and for whom, the rewards it spent, and anything a refund changed.'
3961
+ },
3962
+ {
3963
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3964
+ title: 'Rewards, referrals and store credit',
3965
+ heading: 'Refunds and cancellations',
3966
+ anchor: '#refunds-and-cancellations',
3967
+ text: '- Points earned come back off the member in proportion to the money refunded, and all of them when an order is fully refunded or canceled. A member who already spent those points can end up with a negative balance, which new orders fill back in.\n- Rewards spent online are given back in the same proportion.\n- Rewards spent at the register go back to the member when you refund that payment in a register return, and when you void the sale.\n- A friend\'s referral credit is a discount, so nothing is given back for it.'
3968
+ },
3969
+ {
3970
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3971
+ title: 'Rewards, referrals and store credit',
3972
+ heading: 'Emails',
3973
+ anchor: '#emails',
3974
+ text: 'Rewards sends members three emails, on by default:\n- Rewards points earned — the points an order earned, their balance and their codes.\n- Store credit given — when you give them store credit.\n- Referral reward — when a friend\'s first order earns them store credit.\nDesign them like your other store emails, in your site\'s theme. To stop all three, turn off Email members what they earn and are given in the Rewards card.'
3975
+ },
3976
+ {
3977
+ path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3978
+ title: 'Rewards, referrals and store credit',
3979
+ heading: 'Switching it off for a site',
3980
+ anchor: '#switching-it-off-for-a-site',
3981
+ text: 'Turn off Customers earn and spend rewards to stop new points and hide the rewards field and tender. Members keep their points and store credit, and refunds still take back points from orders placed while it was on.'
3982
+ },
3801
3983
  {
3802
3984
  path: '/commerce-and-bookings/commerce/sales-channels',
3803
3985
  title: 'Sales channels',
@@ -3866,7 +4048,7 @@ export const DOCS_SECTION_INDEX = [
3866
4048
  title: 'Shipping',
3867
4049
  heading: 'Zones and rates',
3868
4050
  anchor: '#zones-and-rates',
3869
- text: 'A 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.\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.'
4051
+ text: 'A 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.'
3870
4052
  },
3871
4053
  {
3872
4054
  path: '/commerce-and-bookings/commerce/shipping',
@@ -3910,6 +4092,69 @@ export const DOCS_SECTION_INDEX = [
3910
4092
  anchor: '#import',
3911
4093
  text: 'Import opens an eight-step wizard:\n1. Upload a CSV, JSON or NDJSON file. The separator, encoding and header row are detected, and you can change any of them.\n2. Columns: each column is matched to a field, with how sure the match is and why. A Shopify product export is recognized column for column. Remap or ignore any column.\n3. Values: list values the store does not hold. For a product\'s Kind, Status or When sold out, map each unknown value to one the store has, leave it blank, or refuse the rows. For Categories, you can also add a name as a new category.\n4. Matching: how many rows find an existing record, how many are new, and which are ambiguous.\n5. Conflicts: what happens on a match (update, skip or make a copy), on no match (create or skip), and per field (overwrite, fill only blank fields, keep what is there). Rules the store keeps are shown locked with the reason. A gift card import adds a Confirm the cards step here (see Gift cards).\n6. Review: a dry run of every row, with a before → after table and every class of warning. Each class needs an "I understand" before Import is enabled.\n7. Import writes in chunks. You can pause and resume it.\n8. Results: a result file of every row, and Undo for seven days. A record edited since the import is shown to you rather than overwritten.\nBy default an import fills blank fields and never overwrites what a record already has. To change prices, stock or anything else that is set, choose Overwrite for those fields in the Conflicts step.\nProducts\nRows that share a Handle are one product: the first row\'s product fields, every row\'s variant, every row\'s image. A row without a handle is a product of its own, and its handle is made from its title.\n- Matching tries the Handle, then the SKU, then the Aglyn ID. A matched product is updat'
3912
4094
  },
4095
+ {
4096
+ path: '/commerce-and-bookings/commerce/tax-services',
4097
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4098
+ heading: '',
4099
+ anchor: '',
4100
+ text: 'Tax services: Avalara AvaTax and TaxJar\nIf you already calculate sales tax in an Avalara AvaTax or TaxJar account, connect it and Aglyn asks it for the tax on every sale — at your storefront\'s checkout and at the register — instead of using a flat rate. Your paid orders and refunds are recorded in that account, so its reports and filings start from what you actually sold.\nYou remain responsible for your sales tax Aglyn asks your tax service for a figure and records your sales there. It does not register you anywhere, file your returns or pay the tax you collect. Where you are registered, what you file and when are decisions for you, your tax service and your own advisor. This is different from Stripe Tax mode, where the platform collects and remits the tax for you.\nTax services come with every plan that includes selling, at no extra cost. You need your own AvaTax or TaxJar account; Aglyn does not sell one.'
4101
+ },
4102
+ {
4103
+ path: '/commerce-and-bookings/commerce/tax-services',
4104
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4105
+ heading: 'Before you start',
4106
+ anchor: '#before-you-start',
4107
+ text: '- Set your store\'s Taxes to collect at your own rates (Commerce → Settings → Taxes), with a rate for where you sell. A tax service is used only in that mode. 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.'
4108
+ },
4109
+ {
4110
+ path: '/commerce-and-bookings/commerce/tax-services',
4111
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4112
+ heading: 'Connect',
4113
+ anchor: '#connect',
4114
+ text: '1. Go to Commerce → 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.'
4115
+ },
4116
+ {
4117
+ path: '/commerce-and-bookings/commerce/tax-services',
4118
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4119
+ heading: 'How sales are taxed',
4120
+ anchor: '#how-sales-are-taxed',
4121
+ text: '| Where | What the service is asked |\n| -- | -- |\n| Storefront cart and Buy now | The tax on each line, after discounts, at your ship-from address. The shopper\'s address is collected inside the payment page, after the tax is set, so these online sales are taxed at your address, as your own rates are. |\n| Register | The tax on each line, after the cashier\'s discount, at your ship-from address. |\n- A product you marked tax-exempt is sent as non-taxable and charged no tax.\n- A subscription keeps your own recurring rate: a quote taken today cannot price next month\'s renewal.\n- Shipping charges are not taxed at checkout, as with your own rates.\n- If the service does not answer within 5 seconds, or refuses, the sale is taxed at your own rates and goes through. The order says which service was asked and that it fell back, so you can review those sales.'
4122
+ },
4123
+ {
4124
+ path: '/commerce-and-bookings/commerce/tax-services',
4125
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4126
+ heading: 'Product tax codes',
4127
+ anchor: '#product-tax-codes',
4128
+ text: 'Each vendor has codes for kinds of goods taxed differently from the general rate, such as clothing or food. Set a product\'s Tax code in the product editor, and a Default tax code on the Tax service card for products without one. A product with neither is sent as general goods.'
4129
+ },
4130
+ {
4131
+ path: '/commerce-and-bookings/commerce/tax-services',
4132
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4133
+ heading: 'Exempt customers',
4134
+ anchor: '#exempt-customers',
4135
+ text: 'Under Exempt customers on the Tax service card, record a customer who does not pay sales tax — a reseller, a nonprofit, a school, a government buyer — by their email address, with the reason, their certificate number and, if the exemption covers only some states, those states. A sale to that email address is sent to the service with the exemption, and the service decides the tax. AvaTax receives the reason and certificate number; TaxJar receives the reason. Keep the certificates themselves: the service and your auditors may ask for them.'
4136
+ },
4137
+ {
4138
+ path: '/commerce-and-bookings/commerce/tax-services',
4139
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4140
+ heading: 'Recording orders and refunds',
4141
+ anchor: '#recording-orders-and-refunds',
4142
+ text: 'With Record paid orders and refunds on (the default), each paid order is recorded in your account under its order id, at the tax the buyer actually paid. Recording it again — a retry — updates the same record rather than adding one.\n- A refund, in full or in part, and a return at the register reverse their share of the sale in the service.\n- A canceled order that was never refunded is voided.\n- The order\'s Tax service record shows where it stands: Recorded, Recording (the service was busy; Aglyn tries again), Not recorded (with the service\'s reason, and Record it again once you have fixed it) or Voided.'
4143
+ },
4144
+ {
4145
+ path: '/commerce-and-bookings/commerce/tax-services',
4146
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4147
+ heading: 'Disconnect',
4148
+ anchor: '#disconnect',
4149
+ text: 'Disconnect forgets your credentials. Sales are then taxed at your own rates again. What was already recorded stays in your account, and your product tax codes and exempt customers are kept for when you connect again.'
4150
+ },
4151
+ {
4152
+ path: '/commerce-and-bookings/commerce/tax-services',
4153
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4154
+ heading: 'What is sent to the vendor',
4155
+ anchor: '#what-is-sent-to-the-vendor',
4156
+ text: 'For each quote and each recorded sale: your ship-from address, the buyer\'s address (or yours for an in-person sale), the order id, each line\'s product, name, quantity, amount and tax code, and any exemption you recorded. AvaTax also receives the buyer\'s email address as its customer code. No payment details are sent. The data goes to your own Avalara or TaxJar account, with your own credentials, so the vendor acts for you and is not an Aglyn subprocessor; the subprocessors page names both among the services a merchant connects.'
4157
+ },
3913
4158
  {
3914
4159
  path: '/commerce-and-bookings/commerce/use-pirate-ship',
3915
4160
  title: 'Use Pirate Ship with Aglyn',
@@ -4398,7 +4643,7 @@ export const DOCS_SECTION_INDEX = [
4398
4643
  title: 'Companies',
4399
4644
  heading: 'The companies list',
4400
4645
  anchor: '#the-companies-list',
4401
- text: 'The list shows every company your site may see, most recently changed first, with its domain, how many contacts are linked to it, its owner, when it was last changed and its next activity — when the earliest open task against it is due. The table\'s Search box finds a company by a word of its name or its domain. Filters › Company finds one whose name equals what you type, or starts with it — which orders the list by name — Filters › Owner shows one teammate\'s accounts, or any of several, Filters › Type, Industry and Rating show the companies holding one value of that list, or any of several, and Next activity › is empty keeps only the companies with nothing scheduled.\nType, Industry, Rating, Account source, Employees and Annual revenue are optional columns: turn one on from a column\'s menu (⋮ › Manage columns), and a saved view that shows it keeps it.\nEvery filter and the search are answered by the list\'s query, so they reach every company, a page at a time, not only the page on screen, and filters on different columns add up. The search matches whole words from their start — "cof" finds Coffee, a fragment from the middle of a word does not — one word at a time: type several and it searches the first, and says so. Under a site, a member whose access is limited to particular sites searches by the start of a company\'s name, and a notice says so. When a combination cannot be answered by one query, the list does not apply that filter, and a notice above the table names it and says why; see Filter and search a list. The Company column\'s header sorts only the rows of the page on screen; the pages keep the list\'s own order. Clicking a row opens the company\'s page.\nThe Contacts column is a count kept on the company and moved with every link and unlink, so a page of companies cos'
4646
+ text: 'The list shows every company your site may see, most recently changed first, with its domain, how many contacts are linked to it, its owner, when it was last changed and its next activity — when the earliest open task against it is due. The table\'s Search box finds a company by a word of its name or its domain. Filters › Company finds one whose name equals what you type, or starts with it — which orders the list by name — Filters › Owner shows one teammate\'s accounts, or any of several, Filters › Type, Industry and Rating show the companies holding one value of that list, or any of several, and Next activity › is empty keeps only the companies with nothing scheduled.\nType, Industry, Rating, Account source, Employees and Annual revenue are optional columns: turn one on from a column\'s menu (⋮ › Manage columns), and a saved view that shows it keeps it.\nEvery filter and the search are answered by the list\'s query, so they reach every company, a page at a time, not only the page on screen, and filters on different columns add up. The search matches whole words from their start — "cof" finds Coffee, a fragment from the middle of a word does not — one word at a time: type several and it searches the first, and says so. Under a site, a member whose access is limited to particular sites searches by the start of a company\'s name, and a notice says so. When a combination cannot be answered by one query, the list does not apply that filter, and a notice above the table names it and says why; see Filter and search a list. The Company, Updated and Next activity headers sort the whole list; the other headers sort the rows of the page on screen and say so (see Columns and sort). Clicking a row opens the company\'s page.\nThe Contacts column is a count kept on the company and moved with '
4402
4647
  },
4403
4648
  {
4404
4649
  path: '/content-and-data/crm/companies',
@@ -4902,7 +5147,7 @@ export const DOCS_SECTION_INDEX = [
4902
5147
  title: 'Leads',
4903
5148
  heading: 'The Leads list',
4904
5149
  anchor: '#the-leads-list',
4905
- text: 'The list shows the most recently seen leads first — a person who booked yesterday sits above one who signed up last month, whichever came first. It keeps that order: the column headers do not re-sort it. Each row carries:\n| Column | What it shows |\n| Lead | The name the person gave, with their email beneath it — or the email alone. |\n| Company, Title | The lead\'s own company and job title, as text. |\n| Status | New, Nurturing, Working, Qualified or Unqualified — see Lead statuses. Change it in place from the row. |\n| Email | The last verdict on the lead\'s address — see Email state — or a dash when nothing is known. |\n| Owner | The team member working the lead, or Unassigned. A lead inherits its contact\'s owner when one is assigned on capture. |\n| Source | Every surface that captured this person: Booking, the form they submitted, an import, New lead, or the API — and Sign-up on leads filed before sign-ups stopped making leads. |\n| Lead source | The lead\'s lead source. |\n| Industry, Rating | Off until you turn them on from the column menu. |\n| Tags | The lead\'s tags. |\n| Campaign | The campaigns the lead is filed under, by name. Under a site only — a campaign belongs to one site. |\n| Last seen | When the person last did something on your site. |\nLead statuses {#lead-statuses}\nA lead moves through its statuses in the order a person works one:\n| Status | What it means |\n| New | Nobody and nothing has touched the lead yet. A lead your site captured carries no status of its own and reads as New. |\n| Nurturing | Automated email is reaching the lead — a sequence sent it a step, or a campaign email was delivered to it — and nobody has engaged yet. |\n| Working | A person is in a conversation with the lead: it replied to a sequence, or a teammate set it to Working. |\n| Qualified |'
5150
+ text: 'The list shows the most recently seen leads first — a person who booked yesterday sits above one who signed up last month, whichever came first. A column header sorts it another way — see Columns and sort. Each row carries:\n| Column | What it shows |\n| Lead | The name the person gave, with their email beneath it — or the email alone. |\n| Company, Title | The lead\'s own company and job title, as text. |\n| Status | New, Nurturing, Working, Qualified or Unqualified — see Lead statuses. Change it in place from the row. |\n| Email | The last verdict on the lead\'s address — see Email state — or a dash when nothing is known. |\n| Owner | The team member working the lead, or Unassigned. A lead inherits its contact\'s owner when one is assigned on capture. |\n| Source | Every surface that captured this person: Booking, the form they submitted, an import, New lead, or the API — and Sign-up on leads filed before sign-ups stopped making leads. |\n| Lead source | The lead\'s lead source. |\n| Industry, Rating | Off until you turn them on from the column menu. |\n| Tags | The lead\'s tags. |\n| Campaign | The campaigns the lead is filed under, by name. Under a site only — a campaign belongs to one site. |\n| Last seen | When the person last did something on your site. |\nLead statuses {#lead-statuses}\nA lead moves through its statuses in the order a person works one:\n| Status | What it means |\n| New | Nobody and nothing has touched the lead yet. A lead your site captured carries no status of its own and reads as New. |\n| Nurturing | Automated email is reaching the lead — a sequence sent it a step, or a campaign email was delivered to it — and nobody has engaged yet. |\n| Working | A person is in a conversation with the lead: it replied to a sequence, or a teammate set it to Working. |\n| Qualified'
4906
5151
  },
4907
5152
  {
4908
5153
  path: '/content-and-data/crm/leads',
@@ -5511,7 +5756,7 @@ export const DOCS_SECTION_INDEX = [
5511
5756
  title: 'Saved views',
5512
5757
  heading: 'Columns and sort',
5513
5758
  anchor: '#columns-and-sort',
5514
- text: 'Manage columns in any list\'s column menu chooses what shows, and Move left / Move right in the same menu put a column where you want it. A view keeps both — the choice and the order — and a view saved before a column existed shows the new column too, after the ones it names. On the Leads, Contacts and Tasks lists the column headers do not sort: each keeps its query\'s order — newest first, or for tasks soonest due first (Done: most recently due first). On the Companies and Deals tables a column header sorts the rows of the page on screen only; the pages themselves keep the list\'s own order.'
5759
+ text: 'Manage columns in any list\'s column menu chooses what shows, and Move left / Move right in the same menu put a column where you want it. A view keeps both — the choice and the order — and a view saved before a column existed shows the new column too, after the ones it names.\nEvery column header sorts, and a view keeps the order you pick. Each list opens in its own order — newest first, or for tasks soonest due first (Done: most recently due first) — and a header sorts one of two ways:\n- The whole list. A column the list stores on every record — a name, a title, a company, a date, an amount, the email verdict, a task\'s priority — re-reads the list in that order, every page of it. Such an order holds while no filter or search narrows the list (the Leads list\'s Status and the My tasks, All open and Done task views don\'t count; the dated task views keep their due order); add one and the list goes back to its own order, and a notice above the table says so.\n- This page. A column read from somewhere else — an owner\'s or a campaign\'s name, a picklist value in the order your organization keeps its values, a contact\'s per-site stage, tags or custom fields — sorts only the rows of the page on screen. Its header says so, and so does a notice; the pages keep the list\'s order.\nA view saved sorted by a column the list cannot sort as a whole opens in the list\'s own order, and a notice says so.'
5515
5760
  },
5516
5761
  {
5517
5762
  path: '/content-and-data/crm/views',
@@ -5868,7 +6113,7 @@ export const DOCS_SECTION_INDEX = [
5868
6113
  title: 'Media Library & CDN',
5869
6114
  heading: 'Upload',
5870
6115
  anchor: '#upload',
5871
- text: '- Upload images, PDFs, ZIP archives and documents (Word, Excel, PowerPoint, CSV, RTF, plain text, Markdown and JSON). Click Upload media, or drag files straight from your desktop onto the library — dropped files land in the folder you have open.\n- Video uploads are paused. New MP4, WebM and QuickTime files are not accepted on any plan for now, from the console or the API, and a video\'s file cannot be replaced. Videos already in your library keep playing, and the Video element can still use them. While the pause lasts, the library shows a Video uploads paused chip beside Upload media.\n- Create images with AI. Create with AI, beside Upload media, draws an illustration, icon, pattern or logo mark as an SVG from a description, or makes a photo where photos are on, and adds it to the folder you have open with alt text. Each picture is stored like an upload and costs AI credits — see Create images with AI.\n- Web fonts (WOFF2) are accepted too. The usual way to add one is Upload your own font in the theme editor, which checks the font\'s license, converts a TTF, OTF or WOFF to WOFF2 and stores it here.\n- Documents and archives are stored and served exactly as you uploaded them — nothing is opened, extracted or converted. Macro-enabled Office files (.docm, .xlsm, .pptm) are not accepted.\n- Rename, replace the file behind an asset, and edit images in place. Replace works for images, PDFs, archives and documents alike, and for video once video uploads resume — it is available from the asset\'s details drawer and straight from the card\'s overflow menu, and it keeps the asset\'s link, folder, tags, alt text, custom fields and sharing exactly as they were. Swapping one kind of file for another is not allowed: upload that as a new file. Cropping, rotating and resizing stay images-only, '
6116
+ text: '- Upload images, PDFs, ZIP archives and documents (Word, Excel, PowerPoint, CSV, RTF, plain text, Markdown and JSON). Click Upload media, or drag files straight from your desktop onto the library — dropped files land in the folder you have open.\n- Video uploads are paused. New MP4, WebM and QuickTime files are not accepted on any plan for now, from the console or the API, and a video\'s file cannot be replaced. Videos already in your library keep playing, and the Video element can still use them. While the pause lasts, the library shows a Video uploads paused chip beside Upload media.\n- Create images with AI. Create with AI, beside Upload media, draws an illustration, icon, pattern or logo mark as an SVG from a description, or, where photos are on, makes a photo, a piece of art such as a watercolor or a 3D render, or a design asset such as a banner or a social post graphic, and adds it to the folder you have open with alt text. Each picture is stored like an upload and costs AI credits — see Create images with AI.\n- Web fonts (WOFF2) are accepted too. The usual way to add one is Upload your own font in the theme editor, which checks the font\'s license, converts a TTF, OTF or WOFF to WOFF2 and stores it here.\n- Documents and archives are stored and served exactly as you uploaded them — nothing is opened, extracted or converted. Macro-enabled Office files (.docm, .xlsm, .pptm) are not accepted.\n- Rename, replace the file behind an asset, and edit images in place. Replace works for images, PDFs, archives and documents alike, and for video once video uploads resume — it is available from the asset\'s details drawer and straight from the card\'s overflow menu, and it keeps the asset\'s link, folder, tags, alt text, custom fields and sharing exactly as they were. Swapping one kin'
5872
6117
  },
5873
6118
  {
5874
6119
  path: '/content-and-data/media/overview',
@@ -8689,7 +8934,7 @@ export const DOCS_SECTION_INDEX = [
8689
8934
  title: 'Funnels',
8690
8935
  heading: 'What counts as a visit, and its limits',
8691
8936
  anchor: '#what-is-a-visit',
8692
- text: 'A visit is one browser tab on your site, until it is closed. When a visitor\'s first step is recorded, their browser makes up a random visit id and keeps it in that tab\'s session storage — not a cookie, not shared with other sites, never derived from their address or device. Every step that tab takes is recorded under that id.\nThat means:\n- Two tabs are two visits, and a visitor who closes the tab and comes back tomorrow is a new visit. Nothing links one visit to another, or to a person — unless the visitor identifies themselves by submitting a form (see below).\n- Consent comes first. The visit id leaves the browser, so it is analytics storage: a step is recorded only once the visitor\'s cookie consent allows analytics. A visitor who declines, opts out or sends Global Privacy Control is never recorded, and steps taken before someone accepts are not recorded later. Funnels therefore count fewer visits than the traffic panel, and in regions where your site asks first, noticeably fewer.\n- Recording starts with your first funnel. A site with no funnels records nothing. Saving the first funnel turns recording on, and earlier visits cannot be measured. Deleting the last funnel turns it off.\n- Up to 60 steps per visit are recorded; a very long visit stops adding steps after that.\n- Visits are kept for 90 days and then deleted automatically.\n- Very busy sites: a result reads at most the 20,000 most recent visits in the range and says so when it stops there.\n- Visits from preview builds and from browsers marked as your own traffic are not recorded, the same as page views.'
8937
+ text: 'A visit is one browser tab on your site, until it is closed. When a visitor\'s first step is recorded, their browser makes up a random visit id and keeps it in that tab\'s session storage — not a cookie, not shared with other sites, never derived from their address or device. Every step that tab takes is recorded under that id.\nThat means:\n- Two tabs are two visits, and a visitor who closes the tab and comes back tomorrow is a new visit. Nothing links one visit to another, or to a person — unless the visitor identifies themselves by submitting a form (see below).\n- Consent comes first. The visit id leaves the browser, so it is analytics storage: a step is recorded only once the visitor\'s cookie consent allows analytics. A visitor who declines, opts out or sends Global Privacy Control is never recorded, and steps taken before someone accepts are not recorded later. Funnels therefore count fewer visits than the traffic panel, and in regions where your site asks first, noticeably fewer.\n- Recording starts with your first funnel. A site with no funnels records nothing. Saving the first funnel turns recording on, and earlier visits cannot be measured. Deleting the last funnel turns it off. A draft funnel never turns recording on.\n- Up to 60 steps per visit are recorded; a very long visit stops adding steps after that.\n- Visits are kept for 90 days and then deleted automatically.\n- Very busy sites: a result reads at most the 20,000 most recent visits in the range and says so when it stops there.\n- Visits from preview builds and from browsers marked as your own traffic are not recorded, the same as page views.'
8693
8938
  },
8694
8939
  {
8695
8940
  path: '/marketing-and-automation/analytics/funnels',
@@ -8703,7 +8948,7 @@ export const DOCS_SECTION_INDEX = [
8703
8948
  title: 'Funnels',
8704
8949
  heading: 'Create a funnel',
8705
8950
  anchor: '#create',
8706
- text: '1. Open your site\'s Analytics page and find Funnels.\n2. Select New funnel, name it, and add steps with the pickers.\n3. Save. Saving needs a site admin or editor.\nCreate with AI {#create-with-ai}\nWhen Aglyn AI is available to your workspace, Create with AI turns a description — "people who read a blog post, then booked a consultation" — into a draft funnel. The draft uses only the pages, forms, services, products and bars or popups your site has; a step the model suggests that your site does not have is left out and listed. Nothing is saved until you review the draft and select Save. It uses AI credits like other generation.'
8951
+ text: '1. Open your site\'s Analytics page and find Funnels.\n2. Select New funnel, name it, and add steps with the pickers.\n3. Save. Saving needs a site admin or editor.\nCreate with AI {#create-with-ai}\nWhen Aglyn AI is available to your workspace, Create with AI turns a description — "people who read a blog post, then booked a consultation" — into a draft funnel. The draft uses only the pages, forms, services, products and bars or popups your site has; a step the model suggests that your site does not have is left out and listed. Nothing is saved until you review the draft and select Save. It uses AI credits like other generation.\nDraft funnels {#drafts}\nWhen Aglyn AI builds part of your site from one request, it can set a funnel up too. That funnel arrives as a draft, marked Draft on the Funnels card, and changes nothing on your live site: it does not turn recording on, it has no results, Insights does not read it, and it cannot be followed up on. Its steps use only pages your site already publishes, and forms, services, products or bars and popups your site has — including ones the same request made.\nSelect the draft to review its steps, edit it if you like (it stays a draft), then select Activate. Activating checks every step against your site again, makes the funnel live and turns recording on if it was off, so it counts visits from then on. Activating needs a site admin or editor. A draft counts towards the 20 funnels a site keeps.'
8707
8952
  },
8708
8953
  {
8709
8954
  path: '/marketing-and-automation/analytics/funnels',
@@ -9020,6 +9265,62 @@ export const DOCS_SECTION_INDEX = [
9020
9265
  anchor: '#start-from-a-brief-instead',
9021
9266
  text: 'Generate an email with AI writes a draft design from a description — blocks, copy, and three subject lines to choose between — which you then edit here like any other.'
9022
9267
  },
9268
+ {
9269
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9270
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9271
+ heading: '',
9272
+ anchor: '',
9273
+ text: 'Email platforms: Mailchimp, Klaviyo and Omnisend\nIf you already send newsletters or automated flows from Mailchimp, Klaviyo or Omnisend, connect your account to a site and Aglyn keeps it in step with the site\'s contacts:\n- Contacts go out. Everyone the site holds that it may send marketing to is added or updated in your account, with their name, phone number, tags, lifetime value and order count. The first sync copies everyone; after that, only the people who changed.\n- Unsubscribes go both ways. Someone who unsubscribes from your site\'s emails is unsubscribed in your account. Someone who unsubscribes in Mailchimp, Klaviyo or Omnisend is unsubscribed from the site\'s own campaigns too, and your contact\'s record says where they left.\n- Orders go to Klaviyo and Omnisend. Started checkouts, paid orders (with each product), fulfillments with tracking, refunds and cancellations, for the abandoned-cart and post-purchase flows those platforms build on.\nEmail platform connections come with every plan that includes the CRM, at no extra cost.'
9274
+ },
9275
+ {
9276
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9277
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9278
+ heading: 'Connect a platform',
9279
+ anchor: '#connect',
9280
+ 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.'
9281
+ },
9282
+ {
9283
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9284
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9285
+ heading: 'Who is sent, and as what',
9286
+ anchor: '#who-is-sent',
9287
+ text: 'Each person is sent with the answer the site\'s own campaigns would give them:\n| On the site | In your platform |\n| Gave consent to marketing (or is covered by your workspace\'s consent policy), and has not unsubscribed, bounced or complained | Subscribed — but only when they are new to your platform. Someone who unsubscribed there is never subscribed again by Aglyn. |\n| Unsubscribed, declined, bounced, complained or was erased | Unsubscribed |\n| No consent on record that the site may use | Not sent at all. Aglyn does not copy an address it has no standing to market to. |\nOrder events are sent only for people the site may market to, and an event more than a week old is not sent.'
9288
+ },
9289
+ {
9290
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9291
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9292
+ heading: 'When someone unsubscribes in your platform',
9293
+ anchor: '#unsubscribes-from-the-platform',
9294
+ text: 'Every sync reads back who unsubscribed in your account since the last one, before it sends anything, and adds them to the site\'s unsubscribe list. The site\'s campaigns, sequences and automated emails stop for them, and their contact record shows Unsubscribed in Mailchimp (or Klaviyo, or Omnisend).\nIf they later resubscribe in that same platform, the next sync lifts that unsubscribe again. Nothing else is lifted that way: an unsubscribe the person made on your site, a bounce, a complaint or an unsubscribe another platform reported stays in place.\nOmnisend reports unsubscribes but not resubscribes, so a return in Omnisend does not lift the site\'s unsubscribe.'
9295
+ },
9296
+ {
9297
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9298
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9299
+ heading: 'Settings',
9300
+ anchor: '#settings',
9301
+ text: '- Audience / List — where contacts go. Choosing a different one copies everyone into it on the next sync.\n- Tag — every contact this site sends carries it, so you can build a segment of them. Aglyn unless you change it.\n- Sync contacts and unsubscribes — turn off to stop contacts and consent syncing while keeping the connection.\n- Send orders and started checkouts — Klaviyo and Omnisend only.\n- Pause — stops the sync until you Resume. Orders that happen while it is paused are not sent later.'
9302
+ },
9303
+ {
9304
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9305
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9306
+ heading: 'The sync log, and when something goes wrong',
9307
+ anchor: '#sync-log',
9308
+ 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.'
9309
+ },
9310
+ {
9311
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9312
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9313
+ heading: 'Disconnect',
9314
+ anchor: '#disconnect',
9315
+ text: 'Disconnect deletes the stored key, the log and any orders not yet sent. Nothing more is sent to the platform. Contacts already in your account stay there, and unsubscribes already read back stay on the site\'s list.'
9316
+ },
9317
+ {
9318
+ path: '/marketing-and-automation/email-campaigns/email-platforms',
9319
+ title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
9320
+ heading: 'One-off imports',
9321
+ anchor: '#one-off-imports',
9322
+ text: 'To bring a list in once, without connecting — for example an old Mailchimp audience export — use Import on the site\'s contacts or suppressions instead.'
9323
+ },
9023
9324
  {
9024
9325
  path: '/marketing-and-automation/email-campaigns/generate-with-ai',
9025
9326
  title: 'Generate an email campaign with AI',
@@ -9431,7 +9732,7 @@ export const DOCS_SECTION_INDEX = [
9431
9732
  title: 'Webhooks',
9432
9733
  heading: 'Outbound webhooks',
9433
9734
  anchor: '#outbound-webhooks',
9434
- text: 'Send an HTTP request to a URL you control when a site event fires — for example, post to a Slack endpoint or your own API when a form is submitted or a new booking comes in.\n1. Add an outbound webhook and paste the destination URL.\n2. Choose the event that should fire it.\n3. Save. Aglyn calls your URL with the event payload each time it fires.'
9735
+ text: 'Send an HTTP request to a URL you control when a site event fires — for example, post to a Slack endpoint or your own API when a form is submitted or a new booking comes in.\n1. Add an outbound webhook and paste the destination URL.\n2. Choose the event that should fire it.\n3. Save. Aglyn calls your URL with the event payload each time it fires.\nEach delivery is a POST of JSON with four keys: event (such as formSubmission), payload (the event\'s data — for a form, formName, path and every submitted field), sentAt, and text, a readable summary of the same event. When the webhook has a secret, the X-Aglyn-Signature header is the HMAC-SHA256 of the body under it.\nPost every form submission to Slack {#slack}\nSlack, Google Chat and Microsoft Teams incoming webhooks post the text key as the message, so no translating service is needed in between.\n1. In Slack, create an app with Incoming Webhooks turned on, add a webhook to the channel you want, and copy its https://hooks.slack.com/services/… URL.\n2. Under Automation → Webhooks, add an outbound webhook named e.g. Slack and paste the URL.\n3. Under Automation → Workflows, choose New workflow, pick Form submitted as the trigger, and add one step: Send a webhook, picking Slack. Save.\nEach submission then arrives as:\nThe workflow\'s Runs read webhook 200 for each one Slack accepted. To post only one form\'s submissions, build it as an action on Form submitted with a Form is condition and the same Send a webhook step instead.'
9435
9736
  },
9436
9737
  {
9437
9738
  path: '/marketing-and-automation/workflows-and-actions/webhooks',
@@ -9914,7 +10215,7 @@ export const DOCS_SECTION_INDEX = [
9914
10215
  title: 'Signing In & Sessions',
9915
10216
  heading: 'Automatic sign-out after inactivity',
9916
10217
  anchor: '#automatic-sign-out-after-inactivity',
9917
- text: 'For security, an idle console session expires after 1 hour of no activity (in any open tab, on any of your workspace subdomains). When that happens you\'re returned to the sign-in page, and the page you were on is preserved — after signing back in you resume exactly where you left off.\nActivity means any interaction: pointer movement, typing, scrolling, or touching. Active work in one tab keeps your other tabs alive too.\nInactivity is the only thing that ends a session early: a background tab losing its own authentication (a laptop waking from sleep, a suspended tab, a network blip) recovers silently from the shared session instead of signing you out everywhere. Only an explicit sign-out — yours, or a staff-initiated revocation — retires the shared session.\nSelf-hosting The idle window is configurable via the NEXTPUBLICAUTHIDLETIMEOUTMINUTES environment variable (default 60; set 0 to disable).'
10218
+ text: 'For security, an idle console session expires after 2 hours of no activity (in any open tab, on any of your workspace subdomains). When that happens you\'re returned to the sign-in page, and the page you were on is preserved — after signing back in you resume exactly where you left off.\nActivity means any interaction: pointer movement, typing, scrolling, or touching. Active work in one tab keeps your other tabs alive too.\nInactivity is the only thing that ends a session early: a background tab losing its own authentication (a laptop waking from sleep, a suspended tab, a network blip) recovers silently from the shared session instead of signing you out everywhere. Only an explicit sign-out — yours, or a staff-initiated revocation — retires the shared session.\nSelf-hosting The idle window is configurable via the NEXTPUBLICAUTHIDLETIMEOUTMINUTES environment variable (default 120; set 0 to disable).'
9918
10219
  },
9919
10220
  {
9920
10221
  path: '/workspace-and-billing/signing-in-and-sessions',