@aglyn/aglyn 1.0.0-beta.228 → 1.0.0-beta.230

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 (29) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/analytics-events.d.ts +18 -0
  3. package/src/lib/app-utils/analytics-events.js +2 -0
  4. package/src/lib/app-utils/analytics-events.js.map +1 -1
  5. package/src/lib/app-utils/docs-help.generated.d.ts +31 -7
  6. package/src/lib/app-utils/docs-help.generated.js +63 -2
  7. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  8. package/src/lib/app-utils/docs-index.generated.js +295 -43
  9. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  10. package/src/lib/app-utils/plan-entitlements.js +20 -0
  11. package/src/lib/app-utils/plan-entitlements.js.map +1 -1
  12. package/src/lib/app-utils/plugin-host-events.generated.d.ts +1 -1
  13. package/src/lib/app-utils/plugin-host-events.generated.js +15 -0
  14. package/src/lib/app-utils/plugin-host-events.generated.js.map +1 -1
  15. package/src/lib/app-utils/site-journey.d.ts +143 -0
  16. package/src/lib/app-utils/site-journey.js +282 -0
  17. package/src/lib/app-utils/site-journey.js.map +1 -0
  18. package/src/lib/foundation/definitions/org-billing.types.d.ts +16 -0
  19. package/src/lib/foundation/definitions/org-billing.types.js.map +1 -1
  20. package/src/lib/plugin-manager/feature-plugins.d.ts +85 -0
  21. package/src/lib/plugin-manager/feature-plugins.js +18 -1
  22. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  23. package/src/lib/plugin-manager/first-party-plugins.generated.js +29 -0
  24. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  25. package/src/lib/plugin-manager/plugin-ai-capabilities.d.ts +192 -0
  26. package/src/lib/plugin-manager/plugin-ai-capabilities.js +157 -0
  27. package/src/lib/plugin-manager/plugin-ai-capabilities.js.map +1 -0
  28. package/src/lib/plugin-manager/plugin-events.d.ts +21 -0
  29. package/src/lib/plugin-manager/plugin-events.js.map +1 -1
@@ -37,7 +37,7 @@ export const DOCS_SECTION_INDEX = [
37
37
  title: 'A/B tests by AI: write variants, read the result',
38
38
  heading: 'Write variants',
39
39
  anchor: '#write-variants',
40
- text: 'The card sits in the experiment editor, beneath the list of variants it writes for.\n1. Give it the copy under test — the headline and copy as they stand on the page, or the subject line and message as they stand. For an email the control\'s subject and body are filled in from the first variant, so usually there is nothing to paste.\n2. Write variants. It writes between two and four: a test needs a first variant and at least one to compare against it, and the card stores no more than four. The first one it writes is your copy unchanged, so the test has something to measure against.\n3. Each variant comes back with a name, its copy, and one sentence saying what it changes and what that is testing.\nWhat a variant varies depends on what the test varies. An email variant varies its subject line, its preheader and its body; a page or a section variant varies the copy on it. A variant that fills the other kind\'s fields has them dropped.\nPutting them in {#putting-them-in}\nPut into the variants places the proposal in the editor\'s own fields, unsaved:\n- For an email, each variant takes its name, subject and body.\n- For a page or a section, each variant takes its name only. The copy itself is a page version, so you make one per variant in the editor and pin it above — read the proposed copy on the card and build from it.\nThen review them and Save the experiment, or Cancel.\nThe editor\'s list is the test\'s shape, and the card does not change it: a proposal is mapped onto the variants you already have, in order, and anything past them is ignored. Add a variant row first if you want a fourth.\nTwo things are refused rather than pasted. The fields are plain text, so a variant carrying markup is dropped; and a variant whose copy repeats another\'s is dropped, since two identical arms are not'
40
+ text: 'The card sits in the experiment editor, beneath the list of variants it writes for.\n1. Give it the copy under test — the headline and copy as they stand on the page, or the subject line and message as they stand. For an email the control\'s subject and body are filled in from the first variant, so usually there is nothing to paste.\n2. Write variants. It writes between two and four: a test needs a first variant and at least one to compare against it, and the card stores no more than four. The first one it writes is your copy unchanged, so the test has something to measure against.\n3. Each variant comes back with a name, its copy, and one sentence saying what it changes and what that is testing.\nWhat a variant varies depends on what the test varies. An email variant varies its subject line, its preheader and its body; a page or a section variant varies the copy on it. A variant that fills the other kind\'s fields has them dropped.\nPutting them in {#putting-them-in}\nPut into the variants places the proposal in the editor\'s own fields, unsaved:\n- For an email, each variant takes its name, subject and body.\n- For a page or a section, each variant takes its name. The copy itself lives in a version of the page, so the card also offers Make draft versions.\nDraft versions for a page or a section {#draft-versions}\nOnce the page under test — and, for a section test, the section — is picked in the editor, Make draft versions copies the page\'s published version once for every variant after the first, puts that variant\'s headline into the first heading and its body into the first plain text after it (inside the section for a section test, in the page\'s content for a page test), and saves each copy as a new unpublished version named A/B: and the variant\'s name. Each version is pinned to'
41
41
  },
42
42
  {
43
43
  path: '/ai/ab-tests-with-ai',
@@ -174,49 +174,63 @@ export const DOCS_SECTION_INDEX = [
174
174
  },
175
175
  {
176
176
  path: '/ai/automations-with-ai',
177
- title: 'Explain automations with AI',
177
+ title: 'Automations with AI',
178
178
  heading: '',
179
179
  anchor: '',
180
- text: 'Explain automations with AI\nOn Automation → Actions, Aglyn AI can explain an automation you already have, and tell you why one of its runs failed. Neither of them changes or runs an automation.'
180
+ text: 'Automations with AI\nOn the Automation page, Aglyn AI can draft an automation from a description, change or fix one you already have, explain what one does, and tell you why one of its runs failed. None of them runs an automation, switches one on, or changes one you have saved: what it drafts arrives as a new automation, switched off.'
181
181
  },
182
182
  {
183
183
  path: '/ai/automations-with-ai',
184
- title: 'Explain automations with AI',
185
- heading: 'Drafting an automation is not available yet',
184
+ title: 'Automations with AI',
185
+ heading: 'Draft an automation from a description',
186
186
  anchor: '#draft',
187
- text: 'Describing an automation and having Aglyn AI build it — "when someone submits the newsletter form, add them to the newsletter list, make them a lead and send them a welcome email" — is not open yet, on any plan.\nThe work is done up to a point a draft is not yet worth handing you: a description asking for several steps can come back as a draft holding one, because the answer is cut short at its size ceiling rather than re-asked. A one-step draft of a three-step description is worse than no draft, so the door stays shut until that is fixed.\nWhat follows on this page — Explain it and Why did this fail? — does not depend on it and is unaffected. When drafting opens, this section is replaced by how to use it.'
187
+ text: 'Choose Create with AI beside Add action and Recipes on Automation → Actions, or at the top of Automation → Workflows (in its empty state while it has none). Describe what should happen, and when — "when someone submits the newsletter form, add them to the newsletter list, make them a lead and send them a welcome email".\nThe automation is drafted switched off, using only the triggers and steps your plan includes. A list, campaign or other record your site does not have — or that the words could mean more than one of — is left as a placeholder for you to pick. When it is ready, Review it opens it in the Actions editor; from Workflows, that takes you to Actions, where it is listed.'
188
188
  },
189
189
  {
190
190
  path: '/ai/automations-with-ai',
191
- title: 'Explain automations with AI',
191
+ title: 'Automations with AI',
192
+ heading: 'Draft an org automation',
193
+ anchor: '#org-automations',
194
+ text: 'An org automation is written once for your workspace and runs on the sites you choose. On your workspace\'s Automation → Org automations, choose Create with AI in the card\'s header and describe what should happen, and when — "when someone books on any of our sites, make them a contact, tag them booked and send them a welcome email".\nThe automation is drafted from what an org automation can do: it starts only on something the server sees — a form, a lead, a booking, a member or a CRM event — and uses only the steps every site runs the same way, so nothing that belongs to one site\'s pages, workflows or webhooks. It opens placed on every site, so a campaign or dataset is filled in only when it is shared with every site. A list, campaign or dataset your workspace does not have, that is shared with only some sites, or that the words could mean more than one of, is left as a placeholder for you to pick once you have chosen the sites.\nNothing is saved for you. Open in the editor opens it in the org automation editor as a new automation, switched off. Choose the sites it runs on, check its steps, and save it with the editor\'s own Save — or close the editor, and nothing changes. When it is right, switch it on from the list.'
195
+ },
196
+ {
197
+ path: '/ai/automations-with-ai',
198
+ title: 'Automations with AI',
199
+ heading: 'Change or fix an automation',
200
+ anchor: '#change',
201
+ text: 'Open a saved action and use the box under Explain it:\n- Change with AI — describe the change: "also tag them newsletter, and wait a day before the email".\n- Fix with AI — asks Aglyn AI to fix whatever would stop the automation working as intended, such as a list your site no longer has, and to change nothing else.\nEither way you get a changed copy, switched off, beside the action you started from, which is left exactly as it is. The copy says what changed from the original — steps added, removed or changed, and whether its trigger or conditions changed — worked out by comparing the two, not taken from the AI\'s account of itself. Review the copy opens it in the editor. When it is right, switch the copy on and the original off.\nIt reads the action as it is saved, so save your edits first. An action that does something Aglyn AI does not write — starts on something a visitor does on a page, has a step that runs on the page, or only runs when an expression is true — cannot be changed this way, so that nothing you did not ask to lose goes missing; edit it in the editor instead. Workflows (lists of function calls) can be explained, not changed.'
202
+ },
203
+ {
204
+ path: '/ai/automations-with-ai',
205
+ title: 'Automations with AI',
192
206
  heading: 'Explain an automation',
193
207
  anchor: '#explain',
194
208
  text: 'Open a saved action or workflow and choose Explain it at the top of the editor. In a few minutes you get a plain-words account of what it does, step by step, and anything worth checking, such as a list your site no longer has or a placeholder nobody has filled in. It reads the automation as it is saved, so save your changes first.'
195
209
  },
196
210
  {
197
211
  path: '/ai/automations-with-ai',
198
- title: 'Explain automations with AI',
212
+ title: 'Automations with AI',
199
213
  heading: 'Find out why a run failed',
200
214
  anchor: '#why-a-run-failed',
201
215
  text: 'In an automation\'s Runs log, a failed run has Why did this fail?. It reads what the run history recorded about that run, together with the automation\'s settings, and answers with the most likely cause and how to fix it. Opening it again shows the same answer.'
202
216
  },
203
217
  {
204
218
  path: '/ai/automations-with-ai',
205
- title: 'Explain automations with AI',
219
+ title: 'Automations with AI',
206
220
  heading: 'What Aglyn AI is sent',
207
221
  anchor: '#what-is-sent',
208
- text: '- To explain an automation: how it is set up, including the text of its emails and messages and the names of the records it uses. Email addresses are removed first, a teammate is described only as a teammate, and on-page code is left out.\n- To explain a failed run: also when the run happened, what it did and the errors it recorded, with email addresses removed. What a visitor submitted, such as what they entered in a form, is never read.\nNo contact, lead, deal, form submission or list member is read for any of them.'
222
+ text: '- To draft an automation: your description, what your plan lets automations use, and the names of your site\'s forms (with their field names) and datasets. The names of your lists, campaigns, workflows, webhooks and pipeline stages are not sent; the words of the answer are matched to them on Aglyn\'s side.\n- To draft an org automation: your description, what your plan lets automations use, what an org automation can start on and do, and the names of your workspace\'s datasets. No site\'s forms are sent; the names of your lists, campaigns and pipeline stages are matched on Aglyn\'s side, as for a site\'s automation.\n- To change or fix one: the same, plus how the action is set up, as for an explanation below.\n- To explain an automation: how it is set up, including the text of its emails and messages and the names of the records it uses. Email addresses are removed first, a teammate is described only as a teammate, and on-page code is left out.\n- To explain a failed run: also when the run happened, what it did and the errors it recorded, with email addresses removed. What a visitor submitted, such as what they entered in a form, is never read.\nNo contact, lead, deal, form submission or list member is read for any of them.'
209
223
  },
210
224
  {
211
225
  path: '/ai/automations-with-ai',
212
- title: 'Explain automations with AI',
226
+ title: 'Automations with AI',
213
227
  heading: 'Who can use it',
214
228
  anchor: '#who-can-use-it',
215
- text: 'These jobs need the Generate with AI permission, on a site whose Automation plugin is on. See who can use Aglyn AI. A site that has switched AI off shows none of these controls. Each job spends AI credits; an automation\'s own runs count against your workspace\'s action runs, never your AI credits.'
229
+ text: 'These jobs need the Generate with AI permission, on a site whose Automation plugin is on. Drafting an org automation needs the same permission in the workspace, Automation switched on for it, and a plan with org automations; only members who can edit org automations see Create with AI there. See who can use Aglyn AI. A site that has switched AI off shows none of these controls. Each job spends AI credits; an automation\'s own runs count against your workspace\'s action runs, never your AI credits.'
216
230
  },
217
231
  {
218
232
  path: '/ai/automations-with-ai',
219
- title: 'Explain automations with AI',
233
+ title: 'Automations with AI',
220
234
  heading: 'Related',
221
235
  anchor: '#related',
222
236
  text: '- Actions builder\n- Aglyn AI\n- How Aglyn AI builds'
@@ -263,6 +277,62 @@ export const DOCS_SECTION_INDEX = [
263
277
  anchor: '#related',
264
278
  text: '- Generate a section\n- Aglyn AI\n- How Aglyn AI builds'
265
279
  },
280
+ {
281
+ path: '/ai/create-images',
282
+ title: 'Create images with AI',
283
+ heading: '',
284
+ 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.'
286
+ },
287
+ {
288
+ path: '/ai/create-images',
289
+ title: 'Create images with AI',
290
+ heading: 'Make a picture',
291
+ 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.'
293
+ },
294
+ {
295
+ path: '/ai/create-images',
296
+ title: 'Create images with AI',
297
+ heading: 'What each picture gets',
298
+ 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.'
300
+ },
301
+ {
302
+ path: '/ai/create-images',
303
+ title: 'Create images with AI',
304
+ heading: 'Credits',
305
+ 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.'
307
+ },
308
+ {
309
+ path: '/ai/create-images',
310
+ title: 'Create images with AI',
311
+ heading: 'Safe by construction',
312
+ 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.'
314
+ },
315
+ {
316
+ path: '/ai/create-images',
317
+ title: 'Create images with AI',
318
+ heading: 'What is sent',
319
+ 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.'
321
+ },
322
+ {
323
+ path: '/ai/create-images',
324
+ title: 'Create images with AI',
325
+ heading: 'Who can use it',
326
+ anchor: '#who-can-use-it',
327
+ text: 'Creating images needs the Generate with AI permission and a plan that includes AI generation — see who can use Aglyn AI. It also needs permission to upload to the library you have open, and on a site whose AI is switched off it is not offered.'
328
+ },
329
+ {
330
+ path: '/ai/create-images',
331
+ title: 'Create images with AI',
332
+ heading: 'Related',
333
+ anchor: '#related',
334
+ text: '- Media Library & CDN\n- Aglyn AI overview\n- AI allotments, usage and model choice'
335
+ },
266
336
  {
267
337
  path: '/ai/crm-by-ai',
268
338
  title: 'The AI CRM built into Aglyn',
@@ -429,7 +499,7 @@ export const DOCS_SECTION_INDEX = [
429
499
  title: 'Generate a section on the canvas',
430
500
  heading: 'What it builds',
431
501
  anchor: '#what-it-builds',
432
- text: 'The section is built from your site\'s real components and follows the building rules, so it drops into your design rather than sitting on top of it:\n- Your theme\'s colors, spacing and text styles, never a fixed color value.\n- A grid that breaks down, showing one column on a phone and stepping up on larger screens, at your theme\'s own breakpoints.\n- Headings in order, so the page still reads well to screen readers and search engines.\n- Images from your media library, each with alt text, or an empty slot for you to fill. Never an image linked from another site.\n- A repeat built once. A block that appears three or more times becomes one reusable component placed as instances — or, on a plan without reusable components, is built into the page each time.'
502
+ text: 'The section is built from your site\'s real components and follows the building rules, so it drops into your design rather than sitting on top of it:\n- Your theme\'s colors, spacing and text styles, never a fixed color value.\n- A grid that breaks down, showing one column on a phone and stepping up on larger screens, at your theme\'s own breakpoints.\n- Headings in order, so the page still reads well to screen readers and search engines.\n- Images from your media library, each with alt text, or an empty slot for you to fill. Never an image linked from another site.\n- A repeat built once. A block that appears three or more times becomes one reusable component placed as instances — or, on Free, whose one component per site is yours to spend, is built into the page each time.'
433
503
  },
434
504
  {
435
505
  path: '/ai/generate-section',
@@ -485,7 +555,7 @@ export const DOCS_SECTION_INDEX = [
485
555
  title: 'How Aglyn AI builds',
486
556
  heading: 'The building rules',
487
557
  anchor: '#the-building-rules',
488
- text: '1. Repeats become one reusable component. A block that appears three or more times on a page, such as the same card with different words, is built once as a reusable component and placed as instances. The AI looks for a component you already have first, and never makes a second copy of one. On a plan without reusable components, such as Free, the block is built into the page each time it repeats instead. Either way, a list of such blocks is one section of the page, never a section for each block.\n2. Site-wide regions live in the layout. Headers, navigation, footers, announcement bars and cookie notices belong to the site\'s layout. A generated page sits in your layout and never carries its own copy of them.\n3. Forms are built on the Forms page, then placed. A form is created with its fields, validation, consent and routing on the Forms page, and a page places it by reference, so you edit it in one place. A generated page never draws form fields of its own: when your site has no saved form to place and no room for another, the page goes without one. A search is never built as a form, because a form collects submissions: the AI places a Search Box for your site search, or a Collection Search for the entries of one collection.\n4. Similar pages share one template. Pages that share a structure and differ by content, such as products, locations, team members or services, are built from one template or bound to a collection.\n5. Colors, spacing and type come from your theme. Generated content uses your theme\'s colors, spacing scale and text styles, never a fixed color value. A color your theme lacks is proposed as a theme change for you to review. A link or button on a colored band, such as a footer in your primary color, uses the band\'s text color, so it stays readable.\n6. Emai'
558
+ text: '1. Repeats become one reusable component. A block that appears three or more times on a page, such as the same card with different words, is built once as a reusable component and placed as instances. The AI looks for a component you already have first, and never makes a second copy of one. On Free, which includes one reusable component per site and leaves it for you to spend, the block is built into the page each time it repeats instead. Either way, a list of such blocks is one section of the page, never a section for each block.\n2. Site-wide regions live in the layout. Headers, navigation, footers, announcement bars and cookie notices belong to the site\'s layout. A generated page sits in your layout and never carries its own copy of them.\n3. Forms are built on the Forms page, then placed. A form is created with its fields, validation, consent and routing on the Forms page, and a page places it by reference, so you edit it in one place. A generated page never draws form fields of its own: when your site has no saved form to place and no room for another, the page goes without one. A search is never built as a form, because a form collects submissions: the AI places a Search Box for your site search, or a Collection Search for the entries of one collection.\n4. Similar pages share one template. Pages that share a structure and differ by content, such as products, locations, team members or services, are built from one template or bound to a collection.\n5. Colors, spacing and type come from your theme. Generated content uses your theme\'s colors, spacing scale and text styles, never a fixed color value. A color your theme lacks is proposed as a theme change for you to review. A link or button on a colored band, such as a footer in your primary color, uses the band\'s text c'
489
559
  },
490
560
  {
491
561
  path: '/ai/how-aglyn-ai-builds',
@@ -508,6 +578,118 @@ export const DOCS_SECTION_INDEX = [
508
578
  anchor: '#related',
509
579
  text: '- AI Assist\n- AI Generate Section\n- Generate a layout\n- Generate a page template\n- Generate a reusable component\n- Generate a page from a brief\n- Generate an email with AI'
510
580
  },
581
+ {
582
+ path: '/ai/logic-with-ai',
583
+ title: 'Functions and variables with AI',
584
+ heading: '',
585
+ anchor: '',
586
+ text: 'Functions and variables with AI\nOn Logic — the Functions & Variables page — Aglyn AI can write a function or a variable from a description, change or fix a function you already have, and explain what one works out. On the same page, a broken reference an automation holds offers Fix with AI.\nNothing is saved for you. What Aglyn AI writes opens in the function or variable editor, unsaved, exactly as if you had typed it. Test it, change anything, and save it with the editor\'s own Save — or close the editor and nothing changes.'
587
+ },
588
+ {
589
+ path: '/ai/logic-with-ai',
590
+ title: 'Functions and variables with AI',
591
+ heading: 'Write a function from a description',
592
+ anchor: '#function',
593
+ text: 'Choose Create with AI at the top of the Functions card and describe what it should work out — "a shipping quote: free over our free-shipping amount, otherwise the flat rate plus 2 per kilo".\nThe function is written only from what the editor\'s evaluator runs: + - /, parentheses, the built-ins the editor lists, the function\'s own parameters and locals, and your site\'s variables by name (a dictionary\'s members as name.member). Before you see it, it is checked — every expression must parse, every name it reads must be its own or one of your site\'s variables, it may set only its own parameters and locals, and it is run once with each parameter at a starting value. One that fails is sent back to be rewritten, saying why. Where your description needs a number your site does not hold, it becomes a parameter rather than a guess.\nWhen it is ready, Open in the editor opens it as a new function, unsaved. A plan\'s function limit applies as it does to Add function.'
594
+ },
595
+ {
596
+ path: '/ai/logic-with-ai',
597
+ title: 'Functions and variables with AI',
598
+ heading: 'Write a variable',
599
+ anchor: '#variable',
600
+ text: 'Create with AI at the top of the Variables card writes one site variable — a name, a type and a value in that type\'s stored form, such as a dictionary of plan prices {"starter":19,"pro":49}. It opens in the variable editor, unsaved.'
601
+ },
602
+ {
603
+ path: '/ai/logic-with-ai',
604
+ title: 'Functions and variables with AI',
605
+ heading: 'Change, fix or explain a function',
606
+ anchor: '#change',
607
+ text: 'Open a saved function. The box at the top of its editor offers:\n- Explain it — what the function works out from what it is given, operation by operation, and anything worth checking, such as a condition that can never hold.\n- Change with AI — describe the change: "add a 10% discount when the order is over 200".\n- Fix with AI — fixes whatever would stop the function working, such as a name your site does not have, and changes nothing else.\nA change is checked exactly as a new function is. Put it in the editor replaces what the editor holds with the changed function, unsaved; Cancel leaves the saved function as it was. Each reads the function as it is saved, so save your edits first.'
608
+ },
609
+ {
610
+ path: '/ai/logic-with-ai',
611
+ title: 'Functions and variables with AI',
612
+ heading: 'Fix a broken reference',
613
+ anchor: '#broken-references',
614
+ text: 'The Reference health card lists references that point at something your site no longer has. On a reference an automation holds — a list, a campaign, a workflow, a dataset or a webhook it names — Fix with AI drafts a changed copy of that automation, switched off, beside the original, which is left as it is: see Change or fix an automation. Review it on the Automation page and switch it on in place of the old one. A workflow\'s, a variable\'s and a page\'s references are fixed by hand.'
615
+ },
616
+ {
617
+ path: '/ai/logic-with-ai',
618
+ title: 'Functions and variables with AI',
619
+ heading: 'What Aglyn AI is sent',
620
+ anchor: '#what-is-sent',
621
+ text: 'Your description; your site\'s variables, by name, type and value; the names of your site\'s functions; and, to change, fix or explain a function, that function\'s definition. Nothing a visitor entered is read.'
622
+ },
623
+ {
624
+ path: '/ai/logic-with-ai',
625
+ title: 'Functions and variables with AI',
626
+ heading: 'Who can use it',
627
+ anchor: '#who-can-use-it',
628
+ text: 'These jobs need the Generate with AI permission, on a site whose Logic plugin is on. See who can use Aglyn AI. A site that has switched AI off shows none of these controls. Each job spends AI credits.'
629
+ },
630
+ {
631
+ path: '/ai/logic-with-ai',
632
+ title: 'Functions and variables with AI',
633
+ heading: 'Related',
634
+ anchor: '#related',
635
+ text: '- Bindings, variables & functions\n- Automations with AI\n- Aglyn AI'
636
+ },
637
+ {
638
+ path: '/ai/marketing-with-ai',
639
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
640
+ heading: '',
641
+ anchor: '',
642
+ text: 'Marketing with AI\nYour site\'s Marketing page has its own AI doors. Each one sits beside the thing it works on, and each one stops short of anything a visitor or a recipient would see: an overlay it creates is switched off, a campaign it drafts is aimed at nobody, and copy it writes waits in the editor until you save it.'
643
+ },
644
+ {
645
+ path: '/ai/marketing-with-ai',
646
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
647
+ heading: 'Write overlay copy',
648
+ anchor: '#write-overlay-copy',
649
+ text: 'Open an announcement bar or a popup from Marketing → Overlays and the editor carries a Write with AI box among its fields.\n1. Say what the overlay is for — the offer, the news, who it is for. When the overlay already has copy, that copy is sent too, so it can be improved rather than replaced; you can leave the box empty to ask for exactly that.\n2. Write with AI. It writes a bar\'s one line, or a popup\'s headline, body and button label, inside the lengths the editor allows.\n3. For a popup it also suggests when it opens — after a delay, on scroll or on exit intent, the triggers the editor itself offers, with a value inside that trigger\'s range — or leaves the trigger as it is.\n4. Put in the fields fills the editor\'s own fields. Nothing is saved until you press Save; Cancel leaves the overlay as it was.\nIt never writes the button\'s link, the pages the overlay shows on, its schedule, or whether it is switched on. Those are yours, in the same editor.'
650
+ },
651
+ {
652
+ path: '/ai/marketing-with-ai',
653
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
654
+ heading: 'Create an overlay',
655
+ anchor: '#create-an-overlay',
656
+ text: 'Beside New bar and New popup, and on the list while it is empty, Create with AI turns a brief into a new overlay.\n1. Choose Popup or Announcement bar, and say what it is for.\n2. Create the overlay. The copy is written as above, and the overlay is saved switched off and opened in the editor.\n3. Add its link, its pages and its schedule, then turn it on from the list when you are ready. Until then no visitor sees it.\nA fact the brief did not give — a discount, a date, a price — arrives in square brackets for you to fill rather than invented.'
657
+ },
658
+ {
659
+ path: '/ai/marketing-with-ai',
660
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
661
+ heading: 'Create a campaign',
662
+ anchor: '#create-a-campaign',
663
+ text: 'On Marketing → Campaigns, beside Create campaign and on the list while it is empty, Create with AI turns a brief into a campaign.\n1. On your organization\'s Marketing page, pick the site the campaign is placed on and sent as. On a site\'s own page it is that site.\n2. Give it a name if you like, and say what the campaign is for.\n3. Write the campaign. The job writes an email design — with three subject lines and three preheaders — and a draft campaign holding that email. Follow it in the dialog or in AI jobs, then open the draft campaign.\n4. Pick who receives it, check the email and schedule it. Until you do, nothing is sent, scheduled or queued, and the campaign is aimed at nobody.\nWhen your brief names one of your lists, the campaign\'s note says which one, and when that list\'s past campaigns were opened most — see who receives it.\nA plan that sends no campaign email gets Write a campaign email with AI instead: the same dialog writes the email design on its own, which you can use once your plan sends campaigns. Upgrading is done in Billing.'
664
+ },
665
+ {
666
+ path: '/ai/marketing-with-ai',
667
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
668
+ heading: 'Ask about these numbers',
669
+ anchor: '#ask-about-these-numbers',
670
+ text: 'The Conversions section and each campaign\'s report carry Ask AI about these numbers in their header. It opens Insights on the site the figures are — on your organization\'s Conversions section, the site you picked; on a campaign\'s report, the site the email was sent as — with a question about what the page shows already in the box. Change it if you like, pick a window, and ask.\nThe answer reads your site\'s figures, the same ones these pages show:\n- Campaign conversions — form submissions, leads, contacts and bookings credited to a campaign in the window, one row each, by the touch that earned the credit: a campaign email, a page filed under a campaign, a labeled link or a sequence email. The rows are never added together, because one visit can make a submission, a lead and a contact. A conversion credited to nothing has no record and is not counted.\n- Campaign revenue — for each campaign email sent in the window, the orders credited to it and the gross, refunded and net amounts, one row per currency; different currencies are never added together.\n- Beside those, your campaign emails\' delivery and engagement, your A/B tests, your forms, your traffic and your store\'s sales, where your plan includes them.\nEvery insight cites the rows its numbers come from. Nothing is changed or sent. The same question can be asked from the Assist panel anywhere on a site\'s Marketing page.'
671
+ },
672
+ {
673
+ path: '/ai/marketing-with-ai',
674
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
675
+ heading: 'What is sent',
676
+ anchor: '#what-is-sent',
677
+ text: 'For overlay copy: your brief, whether it is a bar or a popup, the triggers the editor offers, and the overlay\'s current copy when there is some. Nothing about your visitors, your figures or your other overlays is sent.\nFor a campaign: your brief, the name you gave it and what your site already has — the same as generating an email. Your lists, contacts and past send figures are read on the server and are not sent.\nFor a question about your numbers: the question, the window and the tables of totals the answer reads — never a visitor, contact, order or submission. See Insights → Privacy.'
678
+ },
679
+ {
680
+ path: '/ai/marketing-with-ai',
681
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
682
+ heading: 'Who can use it',
683
+ anchor: '#who-can-use-it',
684
+ text: 'The doors appear for a member who may generate with AI, on a workspace whose plan includes AI generation and on a site with AI switched on. The overlay doors also need marketing overlays in the plan. A campaign also needs the Email plugin on for the site. Each request is metered in AI credits like any other — see credits and caps.'
685
+ },
686
+ {
687
+ path: '/ai/marketing-with-ai',
688
+ title: 'Marketing with AI: overlays, campaigns and your numbers',
689
+ heading: 'Related',
690
+ anchor: '#related',
691
+ text: '- Marketing overlays — the bars and popups themselves.\n- Aglyn AI — every AI door, and the rule that it only ever writes drafts.'
692
+ },
511
693
  {
512
694
  path: '/ai/overview',
513
695
  title: 'Aglyn AI: the AI website builder',
@@ -527,7 +709,7 @@ export const DOCS_SECTION_INDEX = [
527
709
  title: 'Aglyn AI: the AI website builder',
528
710
  heading: 'What it can build',
529
711
  anchor: '#what-it-can-build',
530
- 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| 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 | Commerce | Products with AI |\n| Help working the CRM | A record, the composer, an import | CRM by AI |\n| A designed email | Email → Create with AI | Generate an email |\n| A campaign | Campaigns | Generate an email |\n| Variants for an A/B test, and its result in words | Marketing → Experiments | A/B tests by AI |\n| What your analytics mean | Analytics → Insights | Insights |\n| A change to the page you have open | The Assist panel, in the Besigner | Edits in the Besigner |\nEverything in that table follows the same building rules — reuse before creating, your theme\'s colors and spacing, one reusable component for a repeat, images from your media library with alt text, and a measured size. They are written out on How Aglyn AI builds, and every plan and every generated document is checked against them before you see it.\nNot available yet {#not-ye'
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'
531
713
  },
532
714
  {
533
715
  path: '/ai/overview',
@@ -555,14 +737,14 @@ export const DOCS_SECTION_INDEX = [
555
737
  title: 'Aglyn AI: the AI website builder',
556
738
  heading: 'Switch AI off for one site',
557
739
  anchor: '#switch-ai-off-for-one-site',
558
- text: 'AI is on for every site in a workspace. A site admin can switch it off for one site on that site\'s Admin → Plugins → AI page, and the page says, beside the switch, what switching it off stops and what it leaves running.\nWith AI off for a site:\n- the assistant, Create with AI on the Pages, Templates, Layouts, Forms and Components pages, the SEO and theme cards, the editor\'s Rewrite with AI, Generate a section with AI and Make a reusable component with AI controls, and the AI columns on the site\'s collaborators card are gone from that site;\n- every AI request made for the site is refused with AI is switched off for this site., including one sent from a tab that was open before the switch;\n- an AI job already queued for the site stops with the same sentence, and spends no credits. A job that stopped does not restart when AI is switched back on.\nSwitching AI off for a site does not stop the workspace\'s AI add-on, credits, allotments or overage billing. AI keeps working on the workspace\'s other sites and on workspace pages such as Billing, and an agency batch still builds the sites in it that have AI on.'
740
+ text: 'AI is on for every site in a workspace. A site admin can switch it off for one site on that site\'s Admin → Plugins → AI page, and the page says, beside the switch, what switching it off stops and what it leaves running.\nWith AI off for a site:\n- the assistant, Create with AI on the Pages, Templates, Layouts, Forms, Components and Media pages, the SEO and theme cards, the editor\'s Rewrite with AI, Generate a section with AI and Make a reusable component with AI controls, and the AI columns on the site\'s collaborators card are gone from that site;\n- every AI request made for the site is refused with AI is switched off for this site., including one sent from a tab that was open before the switch;\n- an AI job already queued for the site stops with the same sentence, and spends no credits. A job that stopped does not restart when AI is switched back on.\nSwitching AI off for a site does not stop the workspace\'s AI add-on, credits, allotments or overage billing. AI keeps working on the workspace\'s other sites and on workspace pages such as Billing, and an agency batch still builds the sites in it that have AI on.'
559
741
  },
560
742
  {
561
743
  path: '/ai/overview',
562
744
  title: 'Aglyn AI: the AI website builder',
563
745
  heading: 'What happens to what you send',
564
746
  anchor: '#what-is-sent',
565
- text: 'A build job is sent your brief and what it needs to build against it — the names of the components, layouts, forms and datasets your site already has, your theme\'s values, and the copy of anything it is starting from. Each capability\'s page says exactly what its own job is sent: the CRM page lists what a record sends, and the automation page what is removed first.\nYour brief is customer text and is kept with the job for 180 days, then deleted. No contact, lead, deal, form submission or list member is read to build a page.'
747
+ text: 'A build job is sent your brief and what it needs to build against it — the names of the components, layouts, forms and datasets your site already has, your theme\'s values, and the copy of anything it is starting from. Each capability\'s page says exactly what its own job is sent: the CRM page lists what a record sends, and the automation page what is removed first.\nA photo made with Create images with AI is the one thing served by Google rather than by the assistant\'s own model: it sends the description you type and the shape you choose, and nothing else of your site.\nYour brief is customer text and is kept with the job for 180 days, then deleted. No contact, lead, deal, form submission or list member is read to build a page.'
566
748
  },
567
749
  {
568
750
  path: '/ai/overview',
@@ -597,7 +779,7 @@ export const DOCS_SECTION_INDEX = [
597
779
  title: 'Product copy and catalogs with AI',
598
780
  heading: 'Propose a first catalog',
599
781
  anchor: '#propose-a-first-catalog',
600
- text: 'Propose products takes a brief, such as "a candle studio: hand-poured soy candles in 8 oz and 16 oz jars, and wax melts", and proposes up to twelve products, usually six or more unless your brief says how many: each with a name, type, description, tags, options, a search listing and a sentence saying what its photo should show.\nReview the table, untick any you do not want, and press Create drafts. Each product is created as a draft:\n- Its price is left empty, and the table marks it Set a price. The product editor will not save the product until every variant has a price, and a product with an empty price is never sold.\n- It has no photo, and the table marks it Needs a photo with the suggested shot. Nothing is uploaded or linked for you.\n- Nothing is on your storefront until you price it and set it to Active.\nA proposed product with the same name as one already in your catalog is left out.'
782
+ text: 'On the products page, press Create with AI beside Add product (and beside Add your first product while the catalog is empty), or Propose products in Build your catalog with AI — both open the same brief. Propose products takes a brief, such as "a candle studio: hand-poured soy candles in 8 oz and 16 oz jars, and wax melts", and proposes up to twelve products, usually six or more unless your brief says how many: each with a name, type, description, tags, options, a search listing and a sentence saying what its photo should show.\nReview the table, untick any you do not want, and press Create drafts. Each product is created as a draft:\n- Its price is left empty, and the table marks it Set a price. The product editor will not save the product until every variant has a price, and a product with an empty price is never sold.\n- It has no photo, and the table marks it Needs a photo with the suggested shot. Nothing is uploaded or linked for you.\n- Nothing is on your storefront until you price it and set it to Active.\nA proposed product with the same name as one already in your catalog is left out.'
601
783
  },
602
784
  {
603
785
  path: '/ai/products-with-ai',
@@ -1472,7 +1654,7 @@ export const DOCS_SECTION_INDEX = [
1472
1654
  title: 'Reusable components',
1473
1655
  heading: '',
1474
1656
  anchor: '',
1475
- text: 'Reusable components\nBuild something once — a card, a call-to-action, a footer block — and reuse it everywhere as a reusable component.\nAn instance is not a copy. It grafts the source at render time, so editing the component updates every page that places it. Change a font size once and the whole site follows.\nA component is content you repeat inside a page. If what you want is the frame around the page — header, navigation, footer — that is a layout, not a component. And if you want a starting point you copy once, with no live link back to the source, that is a template.\nPlan availability Starter and above. On Free, promoting an element answers "Reusable components require a Starter plan — see Billing to upgrade." There is no cap on how many components a site can have.'
1657
+ text: 'Reusable components\nBuild something once — a card, a call-to-action, a footer block — and reuse it everywhere as a reusable component.\nAn instance is not a copy. It grafts the source at render time, so editing the component updates every page that places it. Change a font size once and the whole site follows.\nA component is content you repeat inside a page. If what you want is the frame around the page — header, navigation, footer — that is a layout, not a component. And if you want a starting point you copy once, with no live link back to the source, that is a template.\nPlan availability One per site on Free; unlimited on Starter and above. The site\'s Components page shows how many a site has used, for example 0/1 components on your plan on Free. The limit applies when you create, promote, duplicate or install a component: at the limit, the next one is refused with "Your plan includes 1 reusable component — upgrade in Billing for more." A deleted component frees its place. A site that holds more components than its plan includes, for example after moving to Free, keeps every one of them, and they keep rendering.'
1476
1658
  },
1477
1659
  {
1478
1660
  path: '/building-sites/besigner/reusable-components',
@@ -1535,7 +1717,7 @@ export const DOCS_SECTION_INDEX = [
1535
1717
  title: 'Reusable components',
1536
1718
  heading: 'Duplicate',
1537
1719
  anchor: '#duplicate',
1538
- text: 'To start a new component from an existing one, choose Duplicate… in its row menu on the Components page, or More → Duplicate on its detail page. The copy carries the definition, its properties and the latest saved version, under the name you give it. It has no instances: every page keeps pointing at the original, and you place the copy where you want it. Duplicating needs the same plan as creating a component.'
1720
+ text: 'To start a new component from an existing one, choose Duplicate… in its row menu on the Components page, or More → Duplicate on its detail page. The copy carries the definition, its properties and the latest saved version, under the name you give it. It has no instances: every page keeps pointing at the original, and you place the copy where you want it. A copy counts toward your plan\'s components per site, the same as creating one.'
1539
1721
  },
1540
1722
  {
1541
1723
  path: '/building-sites/besigner/reusable-components',
@@ -1780,7 +1962,7 @@ export const DOCS_SECTION_INDEX = [
1780
1962
  title: 'Bindings, Variables & Functions',
1781
1963
  heading: 'No-code functions',
1782
1964
  anchor: '#no-code-functions',
1783
- text: 'Build functions in the in-editor function builder with a safe evaluator — no arbitrary code execution. Compose variables and other functions, and call them inline with {{fn:name(args)}}.\nA function is parameters in, numbered if / then / otherwise steps, and one value out. Inside a step, an expression can use:\n- + - / and parentheses, on numbers; + also joins text.\n- Any site variable, by its name. A function that prices a plan can read extrasiteprice directly, so changing the variable changes every page and every calculator that uses it. A function can read a variable and never set one, and a parameter or local variable with the same name wins.\n- A dictionary variable\'s members, as name.member. Keep one dictionary per plan — {"name": "Pro", "annual": 39, "sites": 3} — and read planpro.annual. A text variable inside the function can hold a copy of one (chosen = planpro), so the function can pick a plan and then read chosen.sites.\n- These built-ins: min(a, b, …), max(a, b, …), round(value, places), floor(value), ceil(value), abs(value), and format(value, places), which writes a number with thousands separators — \'$\' + format(1396) is $1,396.\nThere are no loops and no way to add a built-in, which is what keeps the evaluator safe to run on a page.\nParameters a visitor can answer\nWhen a function is placed on a page in a Function Widget, each parameter becomes an input. Under What visitors see in the function builder, give a parameter a Label (instead of its identifier), a value it Starts as, and Choices written as value: Label, value: Label. A parameter with choices is asked as a list, a number as a number box, and a true/false as a switch.\nA widget runs in the visitor\'s browser, so the function\'s definition is part of the page, along with the site variables that function na'
1965
+ text: 'Build functions in the in-editor function builder with a safe evaluator — no arbitrary code execution. Compose variables and other functions, and call them inline with {{fn:name(args)}}.\nA function is parameters in, numbered if / then / otherwise steps, and one value out. Inside a step, an expression can use:\n- + - / and parentheses, on numbers; + also joins text.\n- Any site variable, by its name. A function that prices a plan can read extrasiteprice directly, so changing the variable changes every page and every calculator that uses it. A function can read a variable and never set one, and a parameter or local variable with the same name wins.\n- A dictionary variable\'s members, as name.member. Keep one dictionary per plan — {"name": "Pro", "annual": 39, "sites": 3} — and read planpro.annual. A text variable inside the function can hold a copy of one (chosen = planpro), so the function can pick a plan and then read chosen.sites.\n- These built-ins: min(a, b, …), max(a, b, …), round(value, places), floor(value), ceil(value), abs(value), and format(value, places), which writes a number with thousands separators — \'$\' + format(1396) is $1,396.\nThere are no loops and no way to add a built-in, which is what keeps the evaluator safe to run on a page.\nCreate with AI on the Functions and Variables cards writes one from a description, and a saved function\'s editor can explain, change or fix it — each opens unsaved in the editor. See Functions and variables with AI.\nParameters a visitor can answer\nWhen a function is placed on a page in a Function Widget, each parameter becomes an input. Under What visitors see in the function builder, give a parameter a Label (instead of its identifier), a value it Starts as, and Choices written as value: Label, value: Label. A parameter with choi'
1784
1966
  },
1785
1967
  {
1786
1968
  path: '/building-sites/bindings/overview',
@@ -1808,7 +1990,7 @@ export const DOCS_SECTION_INDEX = [
1808
1990
  title: 'Generate a reusable component with Aglyn AI',
1809
1991
  heading: '',
1810
1992
  anchor: '',
1811
- text: 'Generate a reusable component with Aglyn AI\nAglyn AI makes a reusable component two ways: from a brief, such as "a testimonial card with the customer\'s name, their role, their quote and a photo," or from a section you already have on a page. Either way you get one component built the way you would build it yourself: the elements, and a property for each value that changes from one page to the next, already bound to the element that shows it.\nAvailability Aglyn AI build jobs are released gradually, and need the Generate with AI permission. Reusable components come with the Starter plan and above: on a plan without them, the job says so before it starts, and spends nothing.'
1993
+ text: 'Generate a reusable component with Aglyn AI\nAglyn AI makes a reusable component two ways: from a brief, such as "a testimonial card with the customer\'s name, their role, their quote and a photo," or from a section you already have on a page. Either way you get one component built the way you would build it yourself: the elements, and a property for each value that changes from one page to the next, already bound to the element that shows it.\nAvailability Aglyn AI build jobs are released gradually, and need the Generate with AI permission. Free includes one reusable component per site, and Starter and above include as many as you need: on a site already holding the components its plan includes, the job says so before it starts, and spends nothing.'
1812
1994
  },
1813
1995
  {
1814
1996
  path: '/building-sites/components/generate-a-component-with-aglyn-ai',
@@ -1822,7 +2004,7 @@ export const DOCS_SECTION_INDEX = [
1822
2004
  title: 'Generate a reusable component with Aglyn AI',
1823
2005
  heading: 'From a section on your page',
1824
2006
  anchor: '#from-a-section-on-your-page',
1825
- text: 'A section you have already built and want to reuse does not need describing: select it in the Besigner and use Make a reusable component with AI, under the element\'s own settings in the Attributes panel. Name the component, and Aglyn AI reads the section and suggests which of its values each page should be able to change.\nThe suggestion is shown before anything happens, with what every page will be able to set. The kinds, the pairings and the Hide … rule above are the same ones, except that a section\'s icon stays part of the section rather than becoming an Icon property.\nApply then does what Save as reusable component does, with the properties already in place:\n1. the component is saved to your library, with each suggested value replaced by its property;\n2. the section on your page is swapped for one that follows the component.\nEach property\'s default is the value that was on the page, so the page looks exactly as it did a moment before — the section now follows the component instead of being a copy of it. A Hide … property starts as No, because the part it hides is on the page.\nThe swap is an unsaved change on the version you have open, and one undo takes it back. Nothing is published, and on the version your live site shows, the Besigner asks you to make a new version first. If the component cannot be saved — a plan without reusable components, for instance — nothing on your page changes at all.\nPick the section, not the page Save the part you want to repeat. Aglyn AI declines a selection that is the whole page, one carrying the page\'s main region, or one with more than one top-level heading, because a component is placed inside pages rather than being one.'
2007
+ text: 'A section you have already built and want to reuse does not need describing: select it in the Besigner and use Make a reusable component with AI, under the element\'s own settings in the Attributes panel. Name the component, and Aglyn AI reads the section and suggests which of its values each page should be able to change.\nThe suggestion is shown before anything happens, with what every page will be able to set. The kinds, the pairings and the Hide … rule above are the same ones, except that a section\'s icon stays part of the section rather than becoming an Icon property.\nApply then does what Save as reusable component does, with the properties already in place:\n1. the component is saved to your library, with each suggested value replaced by its property;\n2. the section on your page is swapped for one that follows the component.\nEach property\'s default is the value that was on the page, so the page looks exactly as it did a moment before — the section now follows the component instead of being a copy of it. A Hide … property starts as No, because the part it hides is on the page.\nThe swap is an unsaved change on the version you have open, and one undo takes it back. Nothing is published, and on the version your live site shows, the Besigner asks you to make a new version first. If the component cannot be saved — a site already holding the components its plan includes, for instance — nothing on your page changes at all.\nPick the section, not the page Save the part you want to repeat. Aglyn AI declines a selection that is the whole page, one carrying the page\'s main region, or one with more than one top-level heading, because a component is placed inside pages rather than being one.'
1826
2008
  },
1827
2009
  {
1828
2010
  path: '/building-sites/components/generate-a-component-with-aglyn-ai',
@@ -2242,7 +2424,7 @@ export const DOCS_SECTION_INDEX = [
2242
2424
  title: 'Generate a page from a prompt',
2243
2425
  heading: 'Review the plan',
2244
2426
  anchor: '#review-the-plan',
2245
- text: 'The job proposes a plan before it builds anything: the layout the page renders in, the components and forms it places, anything it needs to create first, the page\'s address and search title, and its sections from top to bottom. The window shows it when it is ready, with what the whole job is estimated to use: choose Confirm plan to build it, or Cancel job. Open AI jobs follows the job in the Assist panel instead, and the AI chip in the top bar says AI · plan ready while the plan waits for you. When the page is built, Open the draft page opens it in the editor.\nWhen the page needs something your site does not have yet, such as a layout, a reusable component for cards that repeat, or a form, the plan lists it, and confirming builds it first, in the same job, before the page that uses it. A plan only proposes what your workspace can create: what your plan includes and what your site has room for. Something a page job does not build, such as a page template or a dataset, is not offered for confirmation: the job stops before you confirm anything and tells you what to create first and where.\nOn a plan without reusable components, such as Free, the page is built from what that plan can make: a block that repeats, such as a row of service cards, is built into the page each time, in one section, and a form is part of the page, with its fields, collecting submissions into your inbox like any form.'
2427
+ text: 'The job proposes a plan before it builds anything: the layout the page renders in, the components and forms it places, anything it needs to create first, the page\'s address and search title, and its sections from top to bottom. The window shows it when it is ready, with what the whole job is estimated to use: choose Confirm plan to build it, or Cancel job. Open AI jobs follows the job in the Assist panel instead, and the AI chip in the top bar says AI · plan ready while the plan waits for you. When the page is built, Open the draft page opens it in the editor.\nWhen the page needs something your site does not have yet, such as a layout, a reusable component for cards that repeat, or a form, the plan lists it, and confirming builds it first, in the same job, before the page that uses it. A plan only proposes what your workspace can create: what your plan includes and what your site has room for. Something a page job does not build, such as a page template or a dataset, is not offered for confirmation: the job stops before you confirm anything and tells you what to create first and where.\nOn Free, which includes one reusable component per site and leaves it for you to spend, the page is built without one: a block that repeats, such as a row of service cards, is built into the page each time, in one section, and a form is part of the page, with its fields, collecting submissions into your inbox like any form.'
2246
2428
  },
2247
2429
  {
2248
2430
  path: '/building-sites/screens-and-layouts/generate-a-page',
@@ -3173,7 +3355,7 @@ export const DOCS_SECTION_INDEX = [
3173
3355
  title: 'Bookings & Scheduling',
3174
3356
  heading: 'Set up bookings',
3175
3357
  anchor: '#set-up-bookings',
3176
- text: '1. Define services (what can be booked, duration, price).\n2. Configure availability — the windows when slots are offered.\n3. Add the booking widget to a page as a canvas element.\nPrice varies, free estimate, or contact for price {#price-labels}\nA service that is quoted at the job doesn\'t need a price. In the service\'s dialog, Show the price as picks how the widget states it:\n- The price (the default): the widget shows the price, and a priced service is paid through Stripe when it\'s booked.\n- Price varies, Free estimate or Contact for price: the widget shows that label instead, and the service books with no charge, like an estimate appointment. Any price typed in the dialog is neither shown nor charged, and you quote the visitor afterwards.\nA labeled service needs no connected Stripe account, because nothing is charged.\nAsking for a phone number and an address {#phone-and-address}\nThe booking widget always asks for a name and an email. A service can also ask for a phone number and an address — the place the job is, for a service done on site. Set each one in the service\'s dialog under Booking form:\n- Don\'t ask (the default) — the field does not appear.\n- Optional — the field appears and the visitor may leave it empty.\n- Required — the visitor cannot confirm the booking without it.\nThe booking is checked again when it arrives, so a required field cannot be skipped. A phone number has to look like one: a US or Canadian number is stored in international form (+15125550107), and a number written another country\'s way is kept as typed.\nWhat the visitor gives shows:\n- on the booking in Upcoming bookings;\n- in the New booking notification the site\'s managers get, by email too if they have email notifications on — for paid bookings as well, once the payment clears;\n- on the meet'
3358
+ text: '1. Define services (what can be booked, duration, price).\n2. Configure availability — the windows when slots are offered.\n3. Add the booking widget to a page as a canvas element.\nDraft services {#draft-services}\nA service is either active — it takes bookings — or a draft: set up, and offered nowhere. A draft is left out of the booking widget\'s list, shows no open times, and a booking for it is refused, even through a link that names it.\n- A service you add with Add service is active as soon as you save it.\n- A service set up for you elsewhere in Aglyn, rather than added on this page, starts as a draft, so nothing goes live before you have looked at it. If no price was given, it is set to Contact for price.\n- On the Bookings page a draft carries a Draft label and an Activate button. Activate puts it on your site straight away.\n- Deactivate turns an active service back into a draft: it stops taking bookings without being deleted, and the bookings it already has stay.\nA draft counts toward your plan\'s service allowance, like an active service.\nPrice varies, free estimate, or contact for price {#price-labels}\nA service that is quoted at the job doesn\'t need a price. In the service\'s dialog, Show the price as picks how the widget states it:\n- The price (the default): the widget shows the price, and a priced service is paid through Stripe when it\'s booked.\n- Price varies, Free estimate or Contact for price: the widget shows that label instead, and the service books with no charge, like an estimate appointment. Any price typed in the dialog is neither shown nor charged, and you quote the visitor afterwards.\nA labeled service needs no connected Stripe account, because nothing is charged.\nAsking for a phone number and an address {#phone-and-address}\nThe booking widget always ask'
3177
3359
  },
3178
3360
  {
3179
3361
  path: '/commerce-and-bookings/bookings/overview',
@@ -3215,7 +3397,7 @@ export const DOCS_SECTION_INDEX = [
3215
3397
  title: 'Product catalog',
3216
3398
  heading: 'Products, options, and variants',
3217
3399
  anchor: '#products-options-and-variants',
3218
- text: 'A product is what you manage; a variant is what a customer actually buys. Products define up to 3 options (like Size or Color, each with up to 25 values), and the products hub expands them into a variants matrix — up to 100 variants per product, each with its own SKU, barcode, price, compare-at price, weight, image, and inventory count.\n- Types: physical (shippable), digital (delivered as downloads), or service.\n- Status: draft (invisible to visitors), active, or archived.\n- Pricing: a variant with a compare-at price above its price shows a sale badge on storefront blocks.\n- Inventory: leave blank for untracked, 0 means sold out — the same semantics the original product block used. Stock is not tracked on a digital or service subscription-only product: nothing decrements it, on the first charge or on any renewal, so the field is disabled there. A physical subscription tracks normally — every paid cycle decrements one unit per box shipped — and Both — buyer chooses keeps tracking on the one-time sales.\nProducts created with the earlier single-price product block are lifted into this model automatically as a single default variant — nothing breaks and no migration step is needed.'
3400
+ text: 'A product is what you manage; a variant is what a customer actually buys. Products define up to 3 options (like Size or Color, each with up to 25 values), and the products hub expands them into a variants matrix — up to 100 variants per product, each with its own SKU, barcode, price, compare-at price, weight, image, and inventory count.\n- Types: physical (shippable), digital (delivered as downloads), or service.\n- Status: draft (invisible to visitors), active, or archived. A product created for you rather than added in the editor — a proposed product, for one — starts as a draft with no photo, and its price stays empty unless one was given. It counts toward your plan\'s product allowance like any other product.\n- Pricing: a variant with a compare-at price above its price shows a sale badge on storefront blocks.\n- Inventory: leave blank for untracked, 0 means sold out — the same semantics the original product block used. Stock is not tracked on a digital or service subscription-only product: nothing decrements it, on the first charge or on any renewal, so the field is disabled there. A physical subscription tracks normally — every paid cycle decrements one unit per box shipped — and Both — buyer chooses keeps tracking on the one-time sales.\nProducts created with the earlier single-price product block are lifted into this model automatically as a single default variant — nothing breaks and no migration step is needed.'
3219
3401
  },
3220
3402
  {
3221
3403
  path: '/commerce-and-bookings/commerce/catalog',
@@ -5203,7 +5385,7 @@ export const DOCS_SECTION_INDEX = [
5203
5385
  title: 'Media Library & CDN',
5204
5386
  heading: 'Upload',
5205
5387
  anchor: '#upload',
5206
- 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- 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, for the obvious reason.\nSize and plan limits\n| Upload | Cap | Plan |\n| Images | 15 MB per file | Every plan |\n| PDFs | 25 MB per file | Pro and above |\n| Documents (Word, Excel, CSV, RTF, text, Markdown, JSON) | 25 MB per file | Pro and above |\n| Presentations (PowerPoint) | 50 MB per file | Pro and above |\n| ZIP archives | 50 MB per file | Pro and above |\n| Video | 200 MB per file | Paused on every plan |\nAny file over 3 MB automatically uses signed-URL uploads, so big files go straight to storage without tying up '
5388
+ 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- 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, for the obvious reason.\nSize and plan limits\n| Upload | Cap | Plan |\n| Images | 15 MB per file | Every plan |\n| PDFs | 25 MB per file | Pro and above |\n| Documents (Word, Excel, CSV, RTF, text, Mark'
5207
5389
  },
5208
5390
  {
5209
5391
  path: '/content-and-data/media/overview',
@@ -5931,21 +6113,21 @@ export const DOCS_SECTION_INDEX = [
5931
6113
  title: 'Injection zones',
5932
6114
  heading: '',
5933
6115
  anchor: '',
5934
- text: 'Injection zones\nRegister a widget with ConsoleExtension.widgets: [{ slot, widgetId, title?, Component }]; the shell renders it through PluginWidgetSlot. The guaranteed zones are the exported CONSOLEWIDGETSLOTS catalog — slot stays an open string so custom zones don\'t need a core release.\n| Zone | Where it renders | Props your widget receives |\n| hostActivity | Host dashboard + a page\'s detail view: the activity column | hostId, targetId?, header?, viewAllHref? |\n| hostDashboard | Host dashboard glance row, one card per capability | hostId |\n| orgDashboard | The organization\'s Sites page, above the site grid — the org-level twin of hostDashboard, rendered only for an org-wide member who may open the org-level CRM | hostId (always null), orgMount, basePath (the org-level hub\'s path) |\n| commerceGlance | Host dashboard commerce summary | hostId |\n| orgData | Organization → Data page body | orgId, org |\n| besignerFunctions | Besigner ƒx panel | hostId |\n| hostArtifactPublish | Wherever a console page offers to publish something it holds (a site\'s layouts, the organization\'s publish panel): the dialog that publishes it. The page keeps the control that opens it, and leaves that control out when no widget is registered here | artifact ({ kind, hostId?, orgId?, artifactId?, displayName?, description? }, or null while nothing is open), onClose() |\n| orgPluginInstalls | Organization → Plugins, above the built-in plugins: the plugins your plugin installed into the workspace, one row per installation, each linking to /[orgSlug]/plugins/[pluginRef] | orgId, orgSlug, hosts ({ id, label } for each site the reader can see) |\n| pluginInstallStatus | An installation\'s own page, above where it runs: what the installing plugin says about the version the workspace runs. Drawn only for an in'
6116
+ text: 'Injection zones\nRegister a widget with ConsoleExtension.widgets: [{ slot, widgetId, title?, Component }]; the shell renders it through PluginWidgetSlot. The guaranteed zones are the exported CONSOLEWIDGETSLOTS catalog — slot stays an open string so custom zones don\'t need a core release.\n| Zone | Where it renders | Props your widget receives |\n| hostActivity | Host dashboard + a page\'s detail view: the activity column | hostId, targetId?, header?, viewAllHref? |\n| hostDashboard | Host dashboard glance row, one card per capability | hostId |\n| orgDashboard | The organization\'s Sites page, above the site grid — the org-level twin of hostDashboard, rendered only for an org-wide member who may open the org-level CRM | hostId (always null), orgMount, basePath (the org-level hub\'s path) |\n| commerceGlance | Host dashboard commerce summary | hostId |\n| hostAnalytics | A site\'s Analytics page, below its traffic cards: a whole section a plugin computes, such as Funnels | hostId, orgId |\n| orgData | Organization → Data page body | orgId, org |\n| besignerFunctions | Besigner ƒx panel | hostId |\n| hostArtifactPublish | Wherever a console page offers to publish something it holds (a site\'s layouts, the organization\'s publish panel): the dialog that publishes it. The page keeps the control that opens it, and leaves that control out when no widget is registered here | artifact ({ kind, hostId?, orgId?, artifactId?, displayName?, description? }, or null while nothing is open), onClose() |\n| orgPluginInstalls | Organization → Plugins, above the built-in plugins: the plugins your plugin installed into the workspace, one row per installation, each linking to /[orgSlug]/plugins/[pluginRef] | orgId, orgSlug, hosts ({ id, label } for each site the reader can see) |\n| pluginInstallStatus | An'
5935
6117
  },
5936
6118
  {
5937
6119
  path: '/developers/plugins/reference/injection-zones',
5938
6120
  title: 'Injection zones',
5939
6121
  heading: 'Zones a plugin hosts',
5940
6122
  anchor: '#zones-a-plugin-hosts',
5941
- text: 'A zone can sit on a plugin\'s own surface rather than on a console page, such as hostForms on the forms plugin\'s Forms page, hostAutomations, automationEditor and automationRun on the workflows plugin\'s Automation page, or recordInsights, recordEmail and importMapping on the CRM plugin\'s record pages, one-to-one composer and import drawers, and in the import wizard. A plugin cannot import the console\'s PluginWidgetSlot, so the shell hands its renderer down: read it with useConsoleWidgetSlot() from @aglyn/aglyn and draw the zone through it.\nThe renderer is the same gated slot a console page mounts, so a widget there passes the same enablement, entitlement and permission gates. Outside the console shell it is null, and the zone draws nothing.\nA plugin that hosts a zone also declares it, with registerPluginZone and a token that carries the props it hands each widget (see Zones a plugin hosts in the plugin-manager reference). The forms, workflows and commerce plugins declare these on their own surfaces; a widget from another plugin restates the props it reads rather than importing the host\'s package:\n| Zone | Where it renders | Props your widget receives |\n| hostForms | A site\'s Forms page, the forms plugin\'s, beside Create Form: another way to start a form | hostId, orgId |\n| hostAutomations | The workflows plugin\'s Automation page, its Actions, beside Add action and Recipes: another way to start an automation | hostId, orgId, openAction(actionId) — opens a listed action in the Actions editor, and answers false for one the list has not read yet |\n| automationEditor | Inside the editor of one saved automation, an action or a workflow, on the Automation page | hostId, orgId, target ({ type: \'action\' \\| \'workflow\', id, name }, the automation as it is stored) |\n| automationRun '
6123
+ text: 'A zone can sit on a plugin\'s own surface rather than on a console page, such as hostForms on the forms plugin\'s Forms page, hostEmailTemplates on the email plugin\'s templates list, hostCampaigns on the marketing plugin\'s Campaigns, hostAutomations, automationEditor and automationRun on the workflows plugin\'s Automation page, orgAutomations on its Org automations section, hostLogic, logicFunctionEditor and logicReferenceIssue on the logic plugin\'s Functions & Variables page, or recordInsights, recordEmail and importMapping on the CRM plugin\'s record pages, one-to-one composer and import drawers, and in the import wizard. A plugin cannot import the console\'s PluginWidgetSlot, so the shell hands its renderer down: read it with useConsoleWidgetSlot() from @aglyn/aglyn and draw the zone through it.\nThe renderer is the same gated slot a console page mounts, so a widget there passes the same enablement, entitlement and permission gates. Outside the console shell it is null, and the zone draws nothing.\nA plugin that hosts a zone also declares it, with registerPluginZone and a token that carries the props it hands each widget (see Zones a plugin hosts in the plugin-manager reference). The forms, email, marketing, workflows and commerce plugins declare these on their own surfaces; a widget from another plugin restates the props it reads rather than importing the host\'s package:\n| Zone | Where it renders | Props your widget receives |\n| hostForms | A site\'s Forms page, the forms plugin\'s, beside Create Form: another way to start a form | hostId, orgId |\n| hostEmailTemplates | A site\'s email templates, the email plugin\'s, beside New template and in the empty list: another way to start an email design | hostId, orgId |\n| hostAutomations | The workflows plugin\'s Automation page: on A'
5942
6124
  },
5943
6125
  {
5944
6126
  path: '/developers/plugins/reference/injection-zones',
5945
6127
  title: 'Injection zones',
5946
6128
  heading: 'How a zone spaces your widget',
5947
6129
  anchor: '#how-a-zone-spaces-your-widget',
5948
- text: 'Most zones are a stack. The shell draws their widgets one under another, with the same gap the page puts between its own cards, and keeps that gap between the zone and the page\'s cards beside it. Render your card with no outer margin: the zone spaces it, and a margin on your widget\'s root is reset.\nThe other zones hand each widget to a layout the page draws itself, and the page spaces it there:\n- hostDashboard, commerceGlance and orgDashboard: a tile of a dashboard grid.\n- hostScreens, hostTemplates, hostLayouts, hostForms, hostComponents and besignerToolbar: a control in a row.\n- hostAutomations, automationEditor and automationRun: a control the workflows plugin places beside its Actions buttons, in an automation\'s editor, and on a failed run.\n- siteMember: a section of a site user\'s drawer.\n- besignerInspector and seoFields: a section among a panel\'s own fields.\n- besignerPageProperties: a section of the Page Properties drawer\'s column.\n- hostScreenRow: a chip in a Pages list row, beside the page\'s own chips.\n- productEditor, productsHub and productImport: a section the commerce plugin places among its product editor\'s fields, above its catalog table, and in its import wizard\'s After import step.\n- recordEmail and importMapping: a section the CRM plugin places under its one-to-one composer\'s message and under an import drawer\'s or the import wizard\'s column matching.\n- besignerFunctions, orgData, orgMarketplace, orgAddons and marketplaceListing: the body of a dialog or a page.\n- consoleDock: a floating dock.\n- consoleTopBar: a control in the top bar\'s row.\n- besignerInteractions: nothing; a widget there reports to the section and renders null.\n- orgMembersListColumn, staffOrgsListColumn and staffOrgUsageColumn: a column of a table, or, on staffOrgUsageColumn, a line a'
6130
+ text: 'Most zones are a stack. The shell draws their widgets one under another, with the same gap the page puts between its own cards, and keeps that gap between the zone and the page\'s cards beside it. Render your card with no outer margin: the zone spaces it, and a margin on your widget\'s root is reset.\nThe other zones hand each widget to a layout the page draws itself, and the page spaces it there:\n- hostDashboard, commerceGlance and orgDashboard: a tile of a dashboard grid.\n- hostScreens, hostTemplates, hostLayouts, hostForms, hostEmailTemplates, productsCreate, hostComponents, mediaLibrary and besignerToolbar: a control in a row.\n- hostAutomations, automationEditor and automationRun: a control the workflows plugin places beside its Actions buttons and in its Workflows card\'s header, in an automation\'s editor, and on a failed run.\n- orgAutomations: a control the workflows plugin places in its Org automations card\'s header.\n- hostLogic, logicFunctionEditor and logicReferenceIssue: a control the logic plugin places in its Functions and Variables cards\' headers, in a function\'s editor, and on a broken reference.\n- funnelsCreate and funnelInsight: a control the funnels plugin places beside New funnel and under a funnel\'s results.\n- siteMember: a section of a site user\'s drawer.\n- besignerInspector and seoFields: a section among a panel\'s own fields.\n- besignerPageProperties: a section of the Page Properties drawer\'s column.\n- hostScreenRow: a chip in a Pages list row, beside the page\'s own chips.\n- productEditor, productsHub and productImport: a section the commerce plugin places among its product editor\'s fields, above its catalog table, and in its import wizard\'s After import step.\n- hostOverlays, hostCampaigns, marketingInsights and overlayEditor: a control the marketing pl'
5949
6131
  },
5950
6132
  {
5951
6133
  path: '/developers/plugins/reference/injection-zones',
@@ -6428,7 +6610,7 @@ export const DOCS_SECTION_INDEX = [
6428
6610
  title: 'Plugin-manager API reference',
6429
6611
  heading: 'Platform events — `plugin-events` (`/server`)',
6430
6612
  anchor: '#platform-events--plugin-events-server',
6431
- text: 'Core raises the events; a plugin that must react to what a core route did subscribes from its serverDeclarations entry, so the subscription is in place before the first request. Payloads carry the actor and the before / after, never a reference to the plugin.\n| Event | Raised by | Payload |\n| org.seatAddons.changed | the add-on checkout and the billing webhook | { orgId, actor, before, after } — the org.seatAddons maps |\n| org.permissions.changed | the member, role and host-member routes | { orgId, actor, subject: { type, id?, name? }, permission, granted } |\n| host.records.removed | the public API\'s deletes and a person\'s erasure, after the delete lands | { orgId, hostIds, collection, records: [{ id, data }] } — each removed document as it stood |\n| billing.invoice.paid | the billing webhook, once the invoice resolves to a workspace | { orgId, invoiceId, amountPaidCents, currency, paidOutOfBand, metadata } |\n| billing.invoice.failed | the billing webhook | { orgId, invoiceId, amountDueCents, metadata } |\n| billing.invoice.closed | the billing webhook, on voided and on markeduncollectible | { orgId, invoiceId, reason: \'voided\' \\| \'uncollectible\', metadata } |\n| billing.dispute.opened | the billing webhook, on a dispute that matched a workspace | { orgId, chargeId, invoiceId, amountCents } |\n| billing.paymentMethod.changed | the billing webhook, after reading the customer\'s default | { orgId, defaultType } |\nThe five billing events carry the Stripe object\'s own metadata, which core does not read. A plugin that stamped its own id on an invoice it created recognizes its own by it; every other handler ignores the event. They are awaited in the route rather than deferred, because a plugin\'s decision about whether a workspace may keep spending must not lag the payment that se'
6613
+ text: 'Core raises the events; a plugin that must react to what a core route did subscribes from its serverDeclarations entry, so the subscription is in place before the first request. Payloads carry the actor and the before / after, never a reference to the plugin.\n| Event | Raised by | Payload |\n| org.seatAddons.changed | the add-on checkout and the billing webhook | { orgId, actor, before, after } — the org.seatAddons maps |\n| org.permissions.changed | the member, role and host-member routes | { orgId, actor, subject: { type, id?, name? }, permission, granted } |\n| host.records.removed | the public API\'s deletes and a person\'s erasure, after the delete lands | { orgId, hostIds, collection, records: [{ id, data }] } — each removed document as it stood |\n| host.email.engaged | the email delivery webhook, for a message tagged with a site, after the delivery log records it | { hostId, events: [{ to, type, at, firstOfType }] } — opens and clicks only; firstOfType marks the first of its type for that message |\n| billing.invoice.paid | the billing webhook, once the invoice resolves to a workspace | { orgId, invoiceId, amountPaidCents, currency, paidOutOfBand, metadata } |\n| billing.invoice.failed | the billing webhook | { orgId, invoiceId, amountDueCents, metadata } |\n| billing.invoice.closed | the billing webhook, on voided and on markeduncollectible | { orgId, invoiceId, reason: \'voided\' \\| \'uncollectible\', metadata } |\n| billing.dispute.opened | the billing webhook, on a dispute that matched a workspace | { orgId, chargeId, invoiceId, amountCents } |\n| billing.paymentMethod.changed | the billing webhook, after reading the customer\'s default | { orgId, defaultType } |\nThe five billing events carry the Stripe object\'s own metadata, which core does not read. A plugin that stamped '
6432
6614
  },
6433
6615
  {
6434
6616
  path: '/developers/plugins/reference/plugin-manager-api',
@@ -7037,7 +7219,7 @@ export const DOCS_SECTION_INDEX = [
7037
7219
  title: 'Aglyn Assist',
7038
7220
  heading: 'Edits in the Besigner',
7039
7221
  anchor: '#edits-in-the-besigner',
7040
- text: 'With a page, a reusable component or a layout open in the Besigner, you can ask the assistant for a change: "make this hero darker", "add a testimonial band below", "point this button at the pricing page". When your plan includes AI generation — the Aglyn AI add-on, or the AI credits a Free workspace gets — it answers with a Proposed change card listing what would change: elements added, removed, moved or restyled, settings changed, and a page\'s search title or description filled in. Anything it could not match to your canvas is listed under Left out.\n- Nothing changes until you apply. Apply as draft puts the changes on the open canvas as unsaved edits, all in one step, so a single Undo takes the whole change back. Nothing is saved or published until you do that yourself. A proposed search title or description is filled into Page Properties, where Save SEO stores it.\n- The live version is never edited in place. When the version open is the one your live site shows, the card offers Make a new version instead — the same New version you would use yourself. Once the new version opens, the card offers Apply as draft there.\n- Select the element you mean. The assistant sees the element you have selected, everything inside it, what surrounds it and the page\'s sections — not your whole site — and it can only change elements it was shown. With nothing selected it sees only the top of the page and asks you to select one. If the canvas changes before you apply, the card says so and applies nothing.\n- Who can use it. Your role needs the Generate with AI permission (a site collaborator needs it on that site). Asking uses AI credits like any other assistant message; applying uses none. Each applied change is recorded in the site\'s activity log under your name.'
7222
+ text: 'With a page, a reusable component or a layout open in the Besigner, you can ask the assistant for a change: "make this hero darker", "add a testimonial band below", "point this button at the pricing page". When your plan includes AI generation — the Aglyn AI add-on, or the AI credits a Free workspace gets — it answers with a Proposed change card listing what would change: elements added, removed, moved or restyled, settings changed, interactions added, and a page\'s search title or description filled in. Anything it could not match to your canvas is listed under Left out.\n- Interactions on the selected element. Ask "when this is clicked, show the panel below" and the assistant proposes an interaction on the element: something a visitor does to it — a click, a hover, scrolling it into view — and the steps that follow, chosen from the presentational ones every plan runs (show, hide or toggle an element, add or remove a class, scroll to or play an element, open or close a drawer or menu, go to a page, show a message). It is added beside anything the element already does, never in place of it; edit or remove it under Interactions like any other. Ask "what does this do?" and it explains the interactions the element carries.\n- Nothing changes until you apply. Apply as draft puts the changes on the open canvas as unsaved edits, all in one step, so a single Undo takes the whole change back. Nothing is saved or published until you do that yourself. A proposed search title or description is filled into Page Properties, where Save SEO stores it.\n- The live version is never edited in place. When the version open is the one your live site shows, the card offers Make a new version instead — the same New version you would use yourself. Once the new version opens, the card offers Apply '
7041
7223
  },
7042
7224
  {
7043
7225
  path: '/getting-started/aglyn-assist',
@@ -7933,7 +8115,7 @@ export const DOCS_SECTION_INDEX = [
7933
8115
  title: 'Cookie consent',
7934
8116
  heading: 'What needs consent',
7935
8117
  anchor: '#what-needs-consent',
7936
- text: 'Consent-gated — held back unless the visitor\'s recorded state grants analytics:\n- Google Analytics (your configured measurement ID) and every event Aglyn sends to it — see Google Analytics events.\n- Google Tag Manager (your configured container ID). The container is gated the same way and never more loosely, so it cannot be used to install a tag that runs before consent.\n- Core Web Vitals reporting. Page-speed metrics reach your property only through the same tag, and are discarded rather than held if consent is refused while a page is open.\n- Cross-visit A/B test identity: without an analytics grant, experiment variant assignment is remembered only for the visit (sessionStorage) instead of across visits.\n- Remembering the campaign that last touched a visitor. Reading it on the page they are on needs no grant; keeping it across visits does. See The campaign a visitor came from.\n- A Wistia player loaded with the page — see Videos that load with the page.\n- Advertising storage (adstorage, aduserdata, adpersonalization), on sites that have turned the advertising question on. Where it starts depends on the visitor\'s region, and it is the same split analytics uses:\n- Prior-consent regions. The EU/EEA, the UK, and any visitor whose region cannot be determined see the banner first, and advertising storage is denied until they tick that specific box. Not objecting is never a yes here.\n- Everywhere else. Advertising runs from their first visit, alongside analytics, on the same implied basis — these visitors see no banner, and Your Privacy Choices is where they turn it off. That is the opt-out posture the Privacy Policy and the Cookie Policy both describe.\n- A visitor who declines, opts out, or arrives with a Global Privacy Control signal gets no advertising storage anywhere in t'
8118
+ text: 'Consent-gated — held back unless the visitor\'s recorded state grants analytics:\n- Google Analytics (your configured measurement ID) and every event Aglyn sends to it — see Google Analytics events.\n- Google Tag Manager (your configured container ID). The container is gated the same way and never more loosely, so it cannot be used to install a tag that runs before consent.\n- Core Web Vitals reporting. Page-speed metrics reach your property only through the same tag, and are discarded rather than held if consent is refused while a page is open.\n- Cross-visit A/B test identity: without an analytics grant, experiment variant assignment is remembered only for the visit (sessionStorage) instead of across visits.\n- Funnel visits. On a site with a funnel, each visit\'s steps are tied together by a random id kept in that browser tab\'s session storage, and the id is sent with each step. No step is recorded until the visitor\'s state grants analytics; a refusal deletes the id. See What counts as a visit.\n- Remembering the campaign that last touched a visitor. Reading it on the page they are on needs no grant; keeping it across visits does. See The campaign a visitor came from.\n- A Wistia player loaded with the page — see Videos that load with the page.\n- Advertising storage (adstorage, aduserdata, adpersonalization), on sites that have turned the advertising question on. Where it starts depends on the visitor\'s region, and it is the same split analytics uses:\n- Prior-consent regions. The EU/EEA, the UK, and any visitor whose region cannot be determined see the banner first, and advertising storage is denied until they tick that specific box. Not objecting is never a yes here.\n- Everywhere else. Advertising runs from their first visit, alongside analytics, on the same implied basis — '
7937
8119
  },
7938
8120
  {
7939
8121
  path: '/marketing-and-automation/analytics/cookie-consent',
@@ -7984,6 +8166,62 @@ export const DOCS_SECTION_INDEX = [
7984
8166
  anchor: '#turn-the-banner-off',
7985
8167
  text: 'The switch at the top of the Cookie consent card turns the whole tool off. That means Google Analytics loads for every visitor without being asked — do this only if you run your own consent solution, and remember you remain responsible for the consent your visitors\' jurisdictions require.'
7986
8168
  },
8169
+ {
8170
+ path: '/marketing-and-automation/analytics/funnels',
8171
+ title: 'Funnels',
8172
+ heading: '',
8173
+ anchor: '',
8174
+ text: 'Funnels\nA funnel is an ordered list of two to eight steps you expect a visitor to take on your site — say, viewed a pricing page → viewed the sign-up page → submitted the sign-up form. Aglyn counts how many visitors reached each step in that order, how many dropped off between steps, and how long the steps took.\nFunnels are on your site\'s Analytics page, below the traffic cards.\nPlan availability Funnels come with per-page analytics, on Pro and higher plans. On other plans the Funnels card says so and shows nothing else.'
8175
+ },
8176
+ {
8177
+ path: '/marketing-and-automation/analytics/funnels',
8178
+ title: 'Funnels',
8179
+ heading: 'What a step can be',
8180
+ anchor: '#step-types',
8181
+ text: 'Only things your site already sees happen:\n| Step | Matches |\n| Viewed a page | A page at an exact path, or a path and everything under it (/blog and /blog/any-post) |\n| Submitted a form | A successful submission of one form, or of any form |\n| Made a booking | A booking for one service, or any booking — a free one when it is confirmed, a paid one when its payment settles |\n| Added a product to the cart | One product, or any product |\n| Placed an order | A storefront order that was paid |\n| Clicked a bar or popup | A click on one announcement bar or popup, or any |\n| Custom event | An event an interaction sends with Send an analytics event, by its name |\n| Email from the site | A person who identified themselves opened an email your site sent them, or clicked a link in one, when your email service reports it |\nThe step pickers list your site\'s real pages, forms, services, products and overlays, and a funnel can only be saved with steps your site has.\nAn Email from the site step is what lets a funnel show whether a follow-up worked — for example submitted the quote form → opened an email from the site → made a booking. It only ever counts people who submitted a form, because an email can only be tied to them.'
8182
+ },
8183
+ {
8184
+ path: '/marketing-and-automation/analytics/funnels',
8185
+ title: 'Funnels',
8186
+ heading: 'How a visit moves through a funnel',
8187
+ anchor: '#how-it-counts',
8188
+ text: 'For each visit, Aglyn looks at its steps in time order. A visit reaches step 1 the first time it matches step 1, reaches step 2 the first time it matches step 2 after that, and so on. A step done before the step ahead of it does not count, and a visit counts once per step no matter how often it repeats one.\nThe results show, over the dates you pick (up to 90 days):\n- Visitors at each step, as a bar, with the share of the previous step that reached it and the share of all visits that entered the funnel.\n- Drop-off — the visits at the previous step that never reached this one.\n- Median time from the previous step to this one.\n- Completed — the share of visits that entered and reached the last step.\n- By source — the same entered/completed counts by where the visit arrived from: its utmsource (and utmcampaign) when the link had them, otherwise the site that referred it, otherwise Direct.\nA visit belongs to the range it started in. Results are kept for a few minutes (a day for a range that has ended) so reopening the card is quick; Refresh recomputes them.'
8189
+ },
8190
+ {
8191
+ path: '/marketing-and-automation/analytics/funnels',
8192
+ title: 'Funnels',
8193
+ heading: 'What counts as a visit, and its limits',
8194
+ anchor: '#what-is-a-visit',
8195
+ 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.'
8196
+ },
8197
+ {
8198
+ path: '/marketing-and-automation/analytics/funnels',
8199
+ title: 'Funnels',
8200
+ heading: 'Visitors who submitted a form',
8201
+ anchor: '#identified-visitors',
8202
+ text: 'When a visitor submits a form on your site during a recorded visit, that visit is tied to the email address they typed in the form. From then on:\n- All their recorded visits count as one visitor, so someone who submitted a quote form in one tab and booked in another the next day reaches both steps.\n- Emails your site sends them can be funnel steps — opened, or a link clicked.\n- They can be followed up when they drop off (see Act on a drop-off).\nAnonymous visitors are never tied to anyone. A visit is only tied to an address while the visitor\'s consent allows analytics, the address goes when the visit expires after 90 days, and erasing a person from your workspace deletes every visit tied to them.'
8203
+ },
8204
+ {
8205
+ path: '/marketing-and-automation/analytics/funnels',
8206
+ title: 'Funnels',
8207
+ heading: 'Create a funnel',
8208
+ anchor: '#create',
8209
+ 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.'
8210
+ },
8211
+ {
8212
+ path: '/marketing-and-automation/analytics/funnels',
8213
+ title: 'Funnels',
8214
+ heading: 'Act on a drop-off',
8215
+ anchor: '#act-on-drop-off',
8216
+ text: 'Below each step after the first, Act on this drop-off drafts an automation for the people who reached the step before it and did not go on. Pick:\n- After — how long to wait for them to go on: 1 hour, 1 day, 3 days or 7 days.\n- Then — send them a follow-up email, or create a CRM task for your team.\nThe automation is saved switched off on your site\'s Automation page. Edit its words there, then switch it on. It starts on the trigger Left a funnel, with conditions for this funnel, this step and this wait, and it can use the funnel\'s name, the step\'s name, the next step\'s name and the person\'s email.\nWho it reaches:\n- Only people who submitted a form on your site. Anonymous visitors are never followed up.\n- Only once per person, for each funnel, step and wait, and only if they had not reached the next step in any of their recorded visits.\n- A follow-up email is a mailing, not a reply: it carries its unsubscribe link and is never sent to someone who unsubscribed or whose address is suppressed.\n- People who dropped off in the last wait period before you created the automation are included; earlier ones are not.\nAglyn checks for drop-offs every 15 minutes, so a follow-up can arrive up to a quarter of an hour after its wait. Drafting needs a site admin or editor and a plan that includes automations. Add an Email from the site step after the step you follow up on to see in the funnel how many people the follow-up brought back.'
8217
+ },
8218
+ {
8219
+ path: '/marketing-and-automation/analytics/funnels',
8220
+ title: 'Funnels',
8221
+ heading: 'Ask AI about a funnel',
8222
+ anchor: '#ask-ai',
8223
+ text: 'On a funnel\'s results, Ask AI about this funnel opens Insights with a question about that funnel. Aglyn AI reads the funnel\'s figures — visitors, drop-off and time at each step, and every funnel\'s completion rate — and every number in the answer links back to them.'
8224
+ },
7987
8225
  {
7988
8226
  path: '/marketing-and-automation/analytics/google-analytics',
7989
8227
  title: 'Google Analytics events',
@@ -8066,7 +8304,7 @@ export const DOCS_SECTION_INDEX = [
8066
8304
  title: 'Insights',
8067
8305
  heading: 'Asking a question',
8068
8306
  anchor: '#asking-a-question',
8069
- text: 'Open the Assist panel on one of these pages and choose Ask about your numbers under AI jobs:\n- a site\'s Analytics page — traffic, top pages, where visits came from, forms, bookings, campaigns, A/B tests and store sales;\n- a site\'s CRM → Reports page — the same figures, for questions about where people came from and what they did;\n- a site\'s Data page, or your organization\'s Data page — your datasets.\nType your question, pick the window it covers (the last 7, 14, 30 or 90 days), and choose Ask. Answers usually take about a minute. You can close the dialog while you wait: the answer stays under AI jobs, where View answer opens it again.'
8307
+ text: 'Choose Ask a question on the Ask AI about these numbers card — on a site\'s dashboard, its Analytics page, and your organization\'s Sites page — or open the Assist panel on one of these pages and choose Ask about your numbers under AI jobs:\n- a site\'s dashboard or Analytics page — traffic, top pages, where visits came from, forms, bookings, campaigns, A/B tests, announcement bars and popups, store sales, automation runs, the CRM pipeline and deals closed, and funnels;\n- a site\'s CRM → Reports page — the same figures, for questions about where people came from and what they did;\n- a site\'s Marketing page — campaigns, the conversions they were credited with and the revenue they earned, beside the traffic, forms and store sales they drove;\n- a site\'s Automation page — its automations\' runs: how many succeeded and failed, and which failed most;\n- a site\'s Bookings page — bookings by service, and how many were canceled;\n- a site\'s Data page, or your organization\'s Data page — your datasets;\n- your organization\'s Sites page or CRM → Reports — the pipeline across every site, the deals won and lost, and your datasets.\nPipeline figures count only the deals the site can see: on a site, the deals shared with it; on your organization\'s pages, every deal. Automation runs are counted from the site\'s run history, never from what a run was about. Announcement bars and popups are counted since each was made — the views, clicks and dismissals the Overlays list shows — whatever window you pick.\nThe Conversions section and a campaign\'s report on the Marketing page also carry Ask AI about these numbers in their header, which opens the same dialog with a question about what that page shows — see Marketing with AI.\nType your question, pick the window it covers (the last 7, 14, 30 or 90 days), a'
8070
8308
  },
8071
8309
  {
8072
8310
  path: '/marketing-and-automation/analytics/insights',
@@ -8094,7 +8332,7 @@ export const DOCS_SECTION_INDEX = [
8094
8332
  title: 'Insights',
8095
8333
  heading: 'Privacy',
8096
8334
  anchor: '#privacy',
8097
- text: '- Only totals, counts, rates and labels are sent to the AI provider: page paths, referring sites and campaign tags; the names of forms, services, products and A/B tests; the subjects of campaign emails; and for a dataset, its field names and types and, in a breakdown, the values that at least three records share. Email addresses and phone numbers are removed from every label before anything is sent.\n- An answer is kept with your workspace for 180 days, like other AI jobs. Only the person who asked can open it; weekly insights can be opened by the people who reach the site.\n- Nothing is changed, published or sent to your contacts. The weekly email goes only to people in your workspace who asked for it.'
8335
+ text: '- Only totals, counts, rates and labels are sent to the AI provider: page paths, referring sites and campaign tags; the names of forms, services, products and A/B tests; the subjects of campaign emails, with conversions counted by kind and revenue by currency; and for a dataset, its field names and types and, in a breakdown, the values that at least three records share. Email addresses and phone numbers are removed from every label before anything is sent.\n- An answer is kept with your workspace for 180 days, like other AI jobs. Only the person who asked can open it; weekly insights can be opened by the people who reach the site.\n- Nothing is changed, published or sent to your contacts. The weekly email goes only to people in your workspace who asked for it.'
8098
8336
  },
8099
8337
  {
8100
8338
  path: '/marketing-and-automation/analytics/overview',
@@ -8108,7 +8346,7 @@ export const DOCS_SECTION_INDEX = [
8108
8346
  title: 'Analytics',
8109
8347
  heading: 'Pageview tracking',
8110
8348
  anchor: '#pageview-tracking',
8111
- text: 'A lightweight pageview beacon records visits into daily counters. The site dashboard shows a traffic panel summarizing your site\'s activity. Tracking is cookieless — no visitor IDs, no fingerprinting.'
8349
+ text: 'A lightweight pageview beacon records visits into daily counters. The site dashboard shows a traffic panel summarizing your site\'s activity. Tracking is cookieless — no visitor IDs, no fingerprinting. (Funnels are the one exception, and only with the visitor\'s analytics consent: they tie one browser tab\'s steps together.)'
8112
8350
  },
8113
8351
  {
8114
8352
  path: '/marketing-and-automation/analytics/overview',
@@ -8292,12 +8530,19 @@ export const DOCS_SECTION_INDEX = [
8292
8530
  anchor: '',
8293
8531
  text: 'Generate an email campaign with AI\nDescribe the email you want and AI generation writes a draft design: one email built from the email blocks, with three subject lines and three preheaders to choose between. Ask for a campaign instead and it writes the same design plus the draft campaign that would send it.\nBoth are drafts. Nothing is sent, scheduled or queued, and the campaign is aimed at nobody until you pick an audience yourself.'
8294
8532
  },
8533
+ {
8534
+ path: '/marketing-and-automation/email-campaigns/generate-with-ai',
8535
+ title: 'Generate an email campaign with AI',
8536
+ heading: 'Where to start it',
8537
+ anchor: '#where-to-start-it',
8538
+ text: '- An email design: on a site\'s Emails page, open Templates and press Create with AI, beside New template (or beside Create your first template while the list is empty). Write the brief, optionally pick the kind of email, and press Plan the email. A plan comes first: review it in the dialog or in AI jobs, and confirm it to build. Tick Also draft a campaign that sends it to get the campaign too (the button then reads Plan the campaign).\n- A campaign: on Marketing → Campaigns, press Create with AI beside Create campaign (or on the list while it is empty) — on a site\'s Marketing page, or on your organization\'s, where it asks which site the campaign is placed on. Describe it and press Write the campaign. When your plan sends no campaign email, the same button writes the email design on its own. See Marketing with AI.\nNothing is sent, and nothing is aimed at anybody, until you choose. The organization-wide Emails page has no Create with AI, because an email design belongs to one site.'
8539
+ },
8295
8540
  {
8296
8541
  path: '/marketing-and-automation/email-campaigns/generate-with-ai',
8297
8542
  title: 'Generate an email campaign with AI',
8298
8543
  heading: 'What you get',
8299
8544
  anchor: '#what-you-get',
8300
- text: 'An email design. It appears under Marketing → Email beside the templates you made by hand, and opens in the besigner exactly as those do. Every block is an email block — sections, text, buttons, images, dividers, spacers and product cards — so it renders the same way in every mail client.\nThree subject lines and three preheaders. They are stored with the design, the strongest as the subject and the preheader, the rest as alternatives. Change which one leads at any time, or write your own.\nA campaign, when you asked for one. A draft campaign holding that one email, with the subject and preheader already filled in. Open it from Marketing → Campaigns.'
8545
+ text: 'An email design. It appears on the site\'s Emails page, under Templates, beside the templates you made by hand, and opens in the besigner exactly as those do. Every block is an email block — sections, text, buttons, images, dividers, spacers and product cards — so it renders the same way in every mail client.\nThree subject lines and three preheaders. They are stored with the design, the strongest as the subject and the preheader, the rest as alternatives. Change which one leads at any time, or write your own.\nA campaign, when you asked for one. A draft campaign holding that one email, with the subject and preheader already filled in. Open it from Marketing → Campaigns, or from the finished job.'
8301
8546
  },
8302
8547
  {
8303
8548
  path: '/marketing-and-automation/email-campaigns/generate-with-ai',
@@ -8339,7 +8584,7 @@ export const DOCS_SECTION_INDEX = [
8339
8584
  title: 'Generate an email campaign with AI',
8340
8585
  heading: 'Where it runs',
8341
8586
  anchor: '#where-it-runs',
8342
- text: 'Email generation needs AI generation switched on for your workspace, the Email plugin switched on for the site, and permission to generate. Drafting a campaign also needs the Marketing plugin on and a plan that sends campaign email — see Billing & Plans. Without that, you can still generate email designs.'
8587
+ text: 'Email generation needs AI generation switched on for your workspace and for the site, the Email plugin switched on for the site, and permission to generate. Without them, Create with AI does not appear. Drafting a campaign also needs the Marketing plugin on for the site and a plan that sends campaign email — the dialog says so if either is missing — see Billing & Plans. Without that, you can still generate email designs.'
8343
8588
  },
8344
8589
  {
8345
8590
  path: '/marketing-and-automation/email-campaigns/generate-with-ai',
@@ -8425,6 +8670,13 @@ export const DOCS_SECTION_INDEX = [
8425
8670
  anchor: '#multiple-overlays-scheduling--page-targeting',
8426
8671
  text: 'The Marketing page manages any number of bars and popups, each with:\n- A schedule window (show from / show until) — run a bar only during a sale.\n- Page targeting — comma-separated paths, with /blog/ matching a whole section, plus a "never show on" exclude list.\n- An enable switch and a status chip (Live / Scheduled / Off).\nWhen several overlays match a page, the first bar and the first popup (by order) show. The single announcement bar and popup on the same page remain as your always-on default surfaces; configured overlays take priority over them.'
8427
8672
  },
8673
+ {
8674
+ path: '/marketing-and-automation/marketing-overlays/overview',
8675
+ title: 'Marketing Overlays',
8676
+ heading: 'Write and create overlays with AI',
8677
+ anchor: '#with-ai',
8678
+ text: 'With Aglyn AI on your workspace, two more controls appear here:\n- Write with AI, among the overlay editor\'s fields, writes a bar\'s text or a popup\'s headline, body and button label from a brief, and for a popup suggests one of the triggers above. It fills the fields unsaved; Save is still yours.\n- Create with AI, beside New bar and New popup, turns a brief into a new overlay that is saved switched off and opened in the editor, so no visitor sees it until you add its link and turn it on.\nNeither writes a link, the pages an overlay shows on, its schedule or its on-switch. See Marketing with AI.'
8679
+ },
8428
8680
  {
8429
8681
  path: '/marketing-and-automation/marketing-overlays/overview',
8430
8682
  title: 'Marketing Overlays',
@@ -8465,7 +8717,7 @@ export const DOCS_SECTION_INDEX = [
8465
8717
  title: 'Actions builder',
8466
8718
  heading: 'Create an action',
8467
8719
  anchor: '#create-an-action',
8468
- text: '1. Open the actions builder from Automation → Actions.\n2. Choose the event (the trigger).\n3. Choose the steps to run in response.\n4. Save.\nThat\'s it — no multi-step logic to manage. Reach for a workflow when you need several steps, branching, or composition.\nStart from a recipe {#recipes}\nBeside Add action, the Recipes menu lists four ready-to-edit CRM automations: Welcome a new lead, Follow up a won deal, Re-engage a stale lead and Tag by form. Choosing one opens the same editor already filled in — trigger, conditions and steps — with a line saying which recipe it started from; change anything, then save. Nothing is saved until you do. Tag by form asks for one of this site\'s forms first, because the trigger is keyed on it. What each recipe builds, step by step, is in Automations for the CRM → Recipes. An organization with several sites can also install a recipe on any of them, without the editor, from the organization\'s CRM → Settings → Recipes.\nCreate with AI {#describe-it}\nBeside Recipes, Create with AI drafts an automation from a sentence, using only the triggers and steps your plan includes. The draft arrives in the list switched off, with anything your site is missing left in square brackets for you to fill in. A saved automation\'s editor also has Explain it, and a failed run has Why did this fail?. See Draft and explain automations with AI.'
8720
+ text: '1. Open the actions builder from Automation → Actions.\n2. Choose the event (the trigger).\n3. Choose the steps to run in response.\n4. Save.\nThat\'s it — no multi-step logic to manage. Reach for a workflow when you need several steps, branching, or composition.\nStart from a recipe {#recipes}\nBeside Add action, the Recipes menu lists four ready-to-edit CRM automations: Welcome a new lead, Follow up a won deal, Re-engage a stale lead and Tag by form. Choosing one opens the same editor already filled in — trigger, conditions and steps — with a line saying which recipe it started from; change anything, then save. Nothing is saved until you do. Tag by form asks for one of this site\'s forms first, because the trigger is keyed on it. What each recipe builds, step by step, is in Automations for the CRM → Recipes. An organization with several sites can also install a recipe on any of them, without the editor, from the organization\'s CRM → Settings → Recipes.\nCreate with AI {#describe-it}\nBeside Recipes, Create with AI drafts an automation from a sentence, using only the triggers and steps your plan includes. The draft arrives in the list switched off, with anything your site is missing left in square brackets for you to fill in. A saved automation\'s editor also has Explain it, a saved action\'s has Change with AI and Fix with AI — each drafts a changed copy, switched off, and leaves the action as it is — and a failed run has Why did this fail?. See Automations with AI to draft, change, fix or explain one.'
8469
8721
  },
8470
8722
  {
8471
8723
  path: '/marketing-and-automation/workflows-and-actions/actions-builder',
@@ -8591,7 +8843,7 @@ export const DOCS_SECTION_INDEX = [
8591
8843
  title: 'Org automations',
8592
8844
  heading: 'Create one',
8593
8845
  anchor: '#create-one',
8594
- text: '1. At the organization level, open Automation → Org automations and choose Add org automation.\n2. Name it and pick the trigger event. Optionally add a filter or conditions — the same ones the actions builder offers.\n3. Choose where it runs on: Every site — including sites you add later — or Chosen sites, up to 30 of them.\n4. Add the steps, then save.\nOnly an organization owner, admin or editor creates and edits org automations. An organization holds up to 100 of them; deleting one frees its place.\nTriggers\nOrg automations start on what the server records about a person: Form submitted, New lead, Contact created, Contact changed stage, New booking, Member signed up, Member signed in, Deal moved, Deal won, Deal lost and CRM task completed. What each event carries for filters and conditions is listed under the filter field as you pick it.\nPage views and on-page events (clicks, scroll depth, exit intent) are not offered: they belong to one site\'s pages. Build those as actions on the site.\nSteps\nSend an email, Notify site admins, Enroll in a list, Assign to a campaign, Write to a dataset, Update a dataset record, the five CRM steps, Fire a custom event, Wait, Wait for something to happen and End the flow here.\nWhat is left out belongs to one site, so an org automation cannot run it:\n- Run a workflow — a workflow calls its own site\'s functions and variables;\n- Send a webhook — a webhook holds its own site\'s address and secret;\n- every in-page step — popups, drawers, menus, show and hide, CSS classes, custom HTML and JavaScript, analytics events, redirects and site alerts.\nTo hand over to something site-specific, use Fire a custom event: it fires on the site the org automation is running on, and that site\'s own actions can start on it.\nA dataset or a campaign is offered only w'
8846
+ text: '1. At the organization level, open Automation → Org automations and choose Add org automation.\n2. Name it and pick the trigger event. Optionally add a filter or conditions — the same ones the actions builder offers.\n3. Choose where it runs on: Every site — including sites you add later — or Chosen sites, up to 30 of them.\n4. Add the steps, then save.\nTo start from a description instead, choose Create with AI in the card\'s header: Aglyn AI drafts one and opens it in the editor, switched off, for you to place on sites and save. See Automations with AI.\nOnly an organization owner, admin or editor creates and edits org automations. An organization holds up to 100 of them; deleting one frees its place.\nTriggers\nOrg automations start on what the server records about a person: Form submitted, New lead, Contact created, Contact changed stage, New booking, Member signed up, Member signed in, Deal moved, Deal won, Deal lost and CRM task completed. What each event carries for filters and conditions is listed under the filter field as you pick it.\nPage views and on-page events (clicks, scroll depth, exit intent) are not offered: they belong to one site\'s pages. Build those as actions on the site.\nSteps\nSend an email, Notify site admins, Enroll in a list, Assign to a campaign, Write to a dataset, Update a dataset record, the five CRM steps, Fire a custom event, Wait, Wait for something to happen and End the flow here.\nWhat is left out belongs to one site, so an org automation cannot run it:\n- Run a workflow — a workflow calls its own site\'s functions and variables;\n- Send a webhook — a webhook holds its own site\'s address and secret;\n- every in-page step — popups, drawers, menus, show and hide, CSS classes, custom HTML and JavaScript, analytics events, redirects and site alerts.\nTo '
8595
8847
  },
8596
8848
  {
8597
8849
  path: '/marketing-and-automation/workflows-and-actions/org-automations',
@@ -8738,7 +8990,7 @@ export const DOCS_SECTION_INDEX = [
8738
8990
  title: 'Add-ons',
8739
8991
  heading: 'Aglyn AI',
8740
8992
  anchor: '#aglyn-ai',
8741
- text: 'Aglyn AI is the generative add-on: with it on, the assistant builds for you — pages, components, emails, campaigns, products and more — rather than only answering questions about them. It is bought once for the workspace, on any paid plan, and applies to every member who has the permission to generate. What each door does is under Aglyn AI.\n- Everything it builds is a draft. The add-on cannot publish a page, change a live one or send an email. It writes drafts and unpublished versions, which a person reviews and publishes through the buttons that already exist — see the draft rule.\n- One pool, one meter. The add-on adds a band of AI credits to the band your plan already includes, every month. There is no second meter: the AI credits meter on Billing → Usage shows your plan\'s credits and the add-on\'s as one figure, and the same overage rate, stop switch and monthly ceiling apply to the whole band — see AI credits and overage.\n- Priced by plan. The add-on\'s monthly price and the credits it adds both rise with the plan. The figures are on aglyn.com/pricing and in Billing before you confirm; on annual billing it bills yearly with the plan, like every add-on. Enterprise workspaces carry generative building in their agreement instead of buying it.\n- Starter widens a band it already has. Starter includes its own monthly AI credits, and credits past them are sold at the same rate as Pro — so the stop switch and the ceiling are on its billing page with or without the add-on. Adding Aglyn AI increases the band and opens generative building.\n- Free workspaces do not buy it. They generate against the monthly taste instead, which stops at its band and never bills.\n- Removing it takes effect at the end of the period you already paid for, like every add-on removal. Then the band shrin'
8993
+ text: 'Aglyn AI is the generative add-on: with it on, the assistant builds for you — pages, components, emails, campaigns, products and more — rather than only answering questions about them. It is bought once for the workspace, on any paid plan, and applies to every member who has the permission to generate. What each door does is under Aglyn AI.\n- Everything it builds is a draft. The add-on cannot publish a page, change a live one or send an email. It writes drafts and unpublished versions, which a person reviews and publishes through the buttons that already exist — see the draft rule.\n- One pool, one meter. The add-on adds a band of AI credits to the band your plan already includes, every month. There is no second meter: the AI credits meter on Billing → Usage shows your plan\'s credits and the add-on\'s as one figure, and the same overage rate, stop switch and monthly ceiling apply to the whole band — see AI credits and overage.\n- Priced by plan. The add-on\'s monthly price and the credits it adds both rise with the plan. The figures are on aglyn.com/pricing and in Billing before you confirm; on annual billing it bills yearly with the plan, like every add-on. Enterprise workspaces carry generative building in their agreement instead of buying it.\n- Starter widens a band it already has. Starter includes its own monthly AI credits, and credits past them are sold at the same rate as Pro — so the stop switch and the ceiling are on its billing page with or without the add-on. Adding Aglyn AI increases the band and opens generative building.\n- You can see where it is used before you buy it. On a paid plan without it, Create with AI still shows on the Pages, Templates, Layouts, Forms, Components, Automation, Functions & Variables and email Templates pages, on Products, and on Marke'
8742
8994
  },
8743
8995
  {
8744
8996
  path: '/workspace-and-billing/billing-and-plans/add-ons',
@@ -8878,7 +9130,7 @@ export const DOCS_SECTION_INDEX = [
8878
9130
  title: 'Billing & Plans',
8879
9131
  heading: 'Tiers & entitlements',
8880
9132
  anchor: '#tiers--entitlements',
8881
- text: 'Prices live on one page Current prices — monthly, annual, transaction fees and per-unit overage rates — are on aglyn.com/pricing, and your own plan and next invoice are in Billing in the console. This page explains how billing WORKS; it deliberately does not restate the numbers, because a second copy is a copy that goes stale.\n| Plan | Commerce |\n| Free | Build & publish only — no selling |\n| Starter | Sell products, with the highest transaction fee of the paid tiers |\n| Pro | More products, a lower fee, POS, abandoned-cart recovery, reviews, dropshipping |\n| Business | More products again, a lower fee, subscriptions & paywalls, gift cards |\n| Scale | Higher product and site limits, lower fee again |\n| Advanced | Unlimited products, no transaction fee, high-volume commerce & API |\n| Agency | Many sites under one organization, white-label |\n| Enterprise | Twice Agency\'s capacity by default and more by agreement, SSO, white-label, no transaction fee |\nTransaction fees are Aglyn platform fees on the sales you take through your site — storefront orders, paid memberships and paid bookings alike — separate from Stripe\'s payment-processing fees. Upgrading is the way to reduce them.\nEvery plan also includes an amount of monthly traffic — 2 GB on Free, rising to 790 GB on Enterprise by default (an agreement can set more). Passing it is metered and billed on a paid plan, and pauses the site until the start of next month on Free. See Bandwidth for the table and for what a paused site shows a visitor.\nVideo, audio, file downloads and other media served from our servers count 1.6× toward bandwidth, because serving them costs more than serving pages. See how usage is counted.\nLinks on a new Free site {#leaving-notice}\nFor a Free workspace\'s first 14 days, its sites send links and red'
9133
+ text: 'Prices live on one page Current prices — monthly, annual, transaction fees and per-unit overage rates — are on aglyn.com/pricing, and your own plan and next invoice are in Billing in the console. This page explains how billing WORKS; it deliberately does not restate the numbers, because a second copy is a copy that goes stale.\n| Plan | Commerce |\n| Free | Build & publish only — no selling |\n| Starter | Sell products, with the highest transaction fee of the paid tiers |\n| Pro | More products, a lower fee, POS, abandoned-cart recovery, reviews, dropshipping |\n| Business | More products again, a lower fee, subscriptions & paywalls, gift cards |\n| Scale | Higher product and site limits, lower fee again |\n| Advanced | Unlimited products, no transaction fee, high-volume commerce & API |\n| Agency | Many sites under one organization, white-label |\n| Enterprise | Twice Agency\'s capacity by default and more by agreement, SSO, white-label, no transaction fee |\nTransaction fees are Aglyn platform fees on the sales you take through your site — storefront orders, paid memberships and paid bookings alike — separate from Stripe\'s payment-processing fees. Upgrading is the way to reduce them.\nEvery plan also includes an amount of monthly traffic — 2 GB on Free, rising to 790 GB on Enterprise by default (an agreement can set more). Passing it is metered and billed on a paid plan, and pauses the site until the start of next month on Free. See Bandwidth for the table and for what a paused site shows a visitor.\nVideo, audio, file downloads and other media served from our servers count 1.6× toward bandwidth, because serving them costs more than serving pages. See how usage is counted.\nEach site also holds a number of saved forms and reusable components: one of each on Free, more on every paid'
8882
9134
  },
8883
9135
  {
8884
9136
  path: '/workspace-and-billing/billing-and-plans/overview',