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

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 (95) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/activity-labels.d.ts +117 -0
  3. package/src/lib/app-utils/activity-labels.js +343 -0
  4. package/src/lib/app-utils/activity-labels.js.map +1 -0
  5. package/src/lib/app-utils/admin-audit-index.d.ts +11 -0
  6. package/src/lib/app-utils/admin-audit-index.js +12 -1
  7. package/src/lib/app-utils/admin-audit-index.js.map +1 -1
  8. package/src/lib/app-utils/advertising-consent.d.ts +111 -0
  9. package/src/lib/app-utils/advertising-consent.js +216 -0
  10. package/src/lib/app-utils/advertising-consent.js.map +1 -0
  11. package/src/lib/app-utils/advertising-events.d.ts +98 -0
  12. package/src/lib/app-utils/advertising-events.js +340 -0
  13. package/src/lib/app-utils/advertising-events.js.map +1 -0
  14. package/src/lib/app-utils/advertising-tag-mounts.js +15 -8
  15. package/src/lib/app-utils/advertising-tag-mounts.js.map +1 -1
  16. package/src/lib/app-utils/advertising-tags.d.ts +54 -8
  17. package/src/lib/app-utils/advertising-tags.js +126 -28
  18. package/src/lib/app-utils/advertising-tags.js.map +1 -1
  19. package/src/lib/app-utils/analytics-events.d.ts +15 -86
  20. package/src/lib/app-utils/analytics-events.js +21 -6
  21. package/src/lib/app-utils/analytics-events.js.map +1 -1
  22. package/src/lib/app-utils/consent-banner-ui.d.ts +14 -0
  23. package/src/lib/app-utils/consent-banner-ui.js +23 -2
  24. package/src/lib/app-utils/consent-banner-ui.js.map +1 -1
  25. package/src/lib/app-utils/docs-help-section-excerpt-text.d.ts +14 -0
  26. package/src/lib/app-utils/docs-help-section-excerpt-text.js +31 -0
  27. package/src/lib/app-utils/docs-help-section-excerpt-text.js.map +1 -0
  28. package/src/lib/app-utils/docs-help-section-excerpt.d.ts +13 -0
  29. package/src/lib/app-utils/docs-help-section-excerpt.js +37 -0
  30. package/src/lib/app-utils/docs-help-section-excerpt.js.map +1 -0
  31. package/src/lib/app-utils/docs-help-sections.generated.d.ts +31 -0
  32. package/src/lib/app-utils/docs-help-sections.generated.js +660 -0
  33. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -0
  34. package/src/lib/app-utils/docs-help.d.ts +16 -4
  35. package/src/lib/app-utils/docs-help.generated.d.ts +171 -34
  36. package/src/lib/app-utils/docs-help.generated.js +1104 -3
  37. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  38. package/src/lib/app-utils/docs-help.js +25 -6
  39. package/src/lib/app-utils/docs-help.js.map +1 -1
  40. package/src/lib/app-utils/docs-index.generated.js +1008 -91
  41. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  42. package/src/lib/app-utils/health-report.js +12 -0
  43. package/src/lib/app-utils/health-report.js.map +1 -1
  44. package/src/lib/app-utils/plugin-release-flags.generated.d.ts +1 -1
  45. package/src/lib/app-utils/plugin-release-flags.generated.js +7 -1
  46. package/src/lib/app-utils/plugin-release-flags.generated.js.map +1 -1
  47. package/src/lib/app-utils/realm-host-surface.generated.js +1 -0
  48. package/src/lib/app-utils/realm-host-surface.generated.js.map +1 -1
  49. package/src/lib/app-utils/variables.d.ts +2 -0
  50. package/src/lib/app-utils/variables.js +3 -0
  51. package/src/lib/app-utils/variables.js.map +1 -1
  52. package/src/lib/app-utils/visitor-consent.d.ts +34 -0
  53. package/src/lib/app-utils/visitor-consent.js +49 -2
  54. package/src/lib/app-utils/visitor-consent.js.map +1 -1
  55. package/src/lib/app-utils/where-used-summary.d.ts +41 -0
  56. package/src/lib/app-utils/where-used-summary.js +33 -0
  57. package/src/lib/app-utils/where-used-summary.js.map +1 -0
  58. package/src/lib/app-utils/where-used.d.ts +2 -20
  59. package/src/lib/app-utils/where-used.js +13 -12
  60. package/src/lib/app-utils/where-used.js.map +1 -1
  61. package/src/lib/foundation/definitions/platform.types.d.ts +33 -0
  62. package/src/lib/foundation/definitions/platform.types.js.map +1 -1
  63. package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +7 -0
  64. package/src/lib/plugin-manager/first-party-plugins.generated.js +166 -2
  65. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  66. package/src/lib/plugin-manager/plugin-activity-actions.d.ts +51 -0
  67. package/src/lib/plugin-manager/plugin-activity-actions.js +43 -0
  68. package/src/lib/plugin-manager/plugin-activity-actions.js.map +1 -1
  69. package/src/lib/plugin-manager/plugin-advertising-conversions.d.ts +84 -0
  70. package/src/lib/plugin-manager/plugin-advertising-conversions.js +86 -0
  71. package/src/lib/plugin-manager/plugin-advertising-conversions.js.map +1 -0
  72. package/src/lib/plugin-manager/plugin-config.d.ts +23 -0
  73. package/src/lib/plugin-manager/plugin-config.js.map +1 -1
  74. package/src/lib/plugin-manager/plugin-local-deliveries.d.ts +161 -0
  75. package/src/lib/plugin-manager/plugin-local-deliveries.js +46 -0
  76. package/src/lib/plugin-manager/plugin-local-deliveries.js.map +1 -0
  77. package/src/lib/plugin-manager/plugin-media-ingest.d.ts +87 -0
  78. package/src/lib/plugin-manager/plugin-media-ingest.js +34 -0
  79. package/src/lib/plugin-manager/plugin-media-ingest.js.map +1 -0
  80. package/src/lib/plugin-manager/plugin-order-email-copies.d.ts +93 -0
  81. package/src/lib/plugin-manager/plugin-order-email-copies.js +104 -0
  82. package/src/lib/plugin-manager/plugin-order-email-copies.js.map +1 -0
  83. package/src/lib/plugin-manager/plugin-shipment-records.d.ts +7 -0
  84. package/src/lib/plugin-manager/plugin-shipment-records.js.map +1 -1
  85. package/src/lib/plugin-manager/plugin-site-csp.d.ts +58 -0
  86. package/src/lib/plugin-manager/plugin-site-csp.js +103 -0
  87. package/src/lib/plugin-manager/plugin-site-csp.js.map +1 -0
  88. package/src/lib/plugin-manager/realm-host-aglyn.generated.js +1 -0
  89. package/src/lib/plugin-manager/realm-host-aglyn.generated.js.map +1 -1
  90. package/src/lib/plugin-manager/site-page-hooks.d.ts +13 -0
  91. package/src/lib/plugin-manager/site-page-hooks.js +31 -0
  92. package/src/lib/plugin-manager/site-page-hooks.js.map +1 -1
  93. package/src/lib/plugin-manager/stock-photo-provider.d.ts +141 -0
  94. package/src/lib/plugin-manager/stock-photo-provider.js +59 -0
  95. package/src/lib/plugin-manager/stock-photo-provider.js.map +1 -0
@@ -149,7 +149,7 @@ export const DOCS_SECTION_INDEX = [
149
149
  title: 'AI allotments, usage and model choice',
150
150
  heading: 'Who can set them',
151
151
  anchor: '#who-can-set-them',
152
- text: '- Billing → Usage → AI allotments lists team members and sites with this month\'s credits and their allotments. Select several to set one allotment for all of them, or use Same for every client site to give every site the same share at once. Seeing the section requires View billing; changing it requires Manage billing.\n- A member\'s page under Team shows their allotment — one across every site for a team member, one per site for a site collaborator.\n- A site\'s Users card has an AI allotment column for its collaborators and a Site AI allotment card for the site. A collaborator who is the site\'s Admin can set the other collaborators\' allotments on that site. Nobody can raise their own.\nEvery change is recorded in the organization\'s activity feed.'
152
+ text: '- Billing → Usage → AI allotments lists team members and sites with this month\'s credits and their allotments. Select several to set one allotment for all of them, or use Same for every client site to give every site the same share at once. Seeing the section requires View billing; changing it requires Manage billing.\n- A member\'s page under Team shows their allotment — one across every site for a team member, one per site for a site collaborator.\n- A site\'s Users card has an AI allotment column for its collaborators and a Site AI allotment card for the site. A collaborator who is the site\'s Admin can set the other collaborators\' allotments on that site. Nobody can raise their own.\nEvery change is recorded in the organization\'s activity feed.\nA member\'s allotment {#a-members-allotment}\nThe AI allotment card on a member\'s page under Team is that person\'s share of the workspace\'s credits each month: one figure across every site for a team member, or one per site for a site collaborator. It shows what they have drawn this month and whether the allotment is hard or soft. Changing it needs Manage billing, or, for a collaborator, the site\'s Admin role.\nA site\'s allotment {#a-sites-allotment}\nThe Site AI allotment card on a site\'s Users page is what everyone on that site may draw together each month. Use it to keep one client site from spending what the others need: when a hard site allotment is used, AI stops on that site and keeps working on the rest.'
153
153
  },
154
154
  {
155
155
  path: '/ai/ai-allotments',
@@ -170,7 +170,266 @@ export const DOCS_SECTION_INDEX = [
170
170
  title: 'AI allotments, usage and model choice',
171
171
  heading: 'Related',
172
172
  anchor: '#related',
173
- text: '- AI Assist\n- Billing & Plans: AI allotments\n- Invite teammates: AI usage per member'
173
+ text: '- AI credits\n- AI Assist\n- Billing & Plans: AI allotments\n- Invite teammates: AI usage per member'
174
+ },
175
+ {
176
+ path: '/ai/ai-credits',
177
+ title: 'AI credits',
178
+ heading: '',
179
+ anchor: '',
180
+ text: 'AI credits\nEvery AI request, from an answer in the chat to a whole site, is paid for in AI credits from one pool per workspace. There is no second meter for pictures, pages or emails: they all draw on the same credits.'
181
+ },
182
+ {
183
+ path: '/ai/ai-credits',
184
+ title: 'AI credits',
185
+ heading: 'Credits each month',
186
+ anchor: '#monthly-credits',
187
+ text: 'Each plan includes a band of credits every month, and the Aglyn AI add-on widens it:\n| Plan | Included each month | Added by the Aglyn AI add-on |\n| Free | 300 | Not sold on Free |\n| Starter | 750 | 4,000 |\n| Pro | 2,750 | 9,000 |\n| Business | 7,500 | 19,000 |\n| Scale | 10,000 | 34,000 |\n| Advanced | 13,000 | 49,000 |\n| Agency | 58,000 | 149,000 |\n| Enterprise | Set in your agreement | Included in your agreement |\nThe band resets on the first of each month (UTC). Credits you did not use do not carry over.\nOn Starter, the included credits pay for the assistant: answers, page-aware guidance and offers to open a page. Building pages, forms, emails and the rest needs the add-on.'
188
+ },
189
+ {
190
+ path: '/ai/ai-credits',
191
+ title: 'AI credits',
192
+ heading: 'The Free plan',
193
+ anchor: '#free-plan',
194
+ text: 'A Free workspace gets 300 AI credits a month for the assistant and AI generation together: enough to start a site with AI or try a few builds.\n- The credits belong to the person who owns the workspace. If you own several Free workspaces, they share the 300.\n- The 300 are a hard stop. When they are used, AI pauses until the first of the month or an upgrade, and nothing is ever billed.\n- Free requests are also capped per day, and Free generation can pause for a day across all Free workspaces when the platform\'s daily limit is reached. Each message says when it starts again.\n- A new account can use its credits straight away. There is no waiting period.'
195
+ },
196
+ {
197
+ path: '/ai/ai-credits',
198
+ title: 'AI credits',
199
+ heading: 'The Aglyn AI add-on',
200
+ anchor: '#the-aglyn-ai-add-on',
201
+ text: 'The Aglyn AI add-on is bought once for the whole workspace, on any paid plan. It adds the credits in the table above to the same pool and turns on building with AI on every site. Its price is on aglyn.com/pricing and in Billing before you confirm. See Add-ons.'
202
+ },
203
+ {
204
+ path: '/ai/ai-credits',
205
+ title: 'AI credits',
206
+ heading: 'What things cost',
207
+ anchor: '#what-things-cost',
208
+ text: 'What a request costs depends on how much the AI reads and writes, so the figures below are typical, not fixed. Every job shows its estimate before you confirm it.\n| Request | Typical cost |\n| An answer in the chat, a rewrite, a summary | A few credits |\n| An answer quoted straight from the docs | Free |\n| A vector illustration, icon or logo mark | About 18 credits a picture |\n| A photo, art or design picture | About 108 credits a picture (about 75 on Free) |\n| A new site\'s look | A few credits |\n| A page from a brief | About 50 credits for each section, plus planning |\n| A layout, form, component or email design | About 50 credits each |\n| A new site started with AI, paid plan | About 1,050 for 3 pages to 2,600 for 8 |\n| A new site started with AI, Free plan | Always within the 300 Free credits; the window shows the most it can cost |\n| Products, booking services, overlays, A/B tests, funnels, variables in a chat build | Almost nothing |\n| Stock photos in an AI site | Nothing |\nA model you choose with the Model switch can cost more or less than Auto; the switch shows each model\'s cost. See Choosing a model.'
209
+ },
210
+ {
211
+ path: '/ai/ai-credits',
212
+ title: 'AI credits',
213
+ heading: 'Before a job starts',
214
+ anchor: '#before-a-job-starts',
215
+ text: 'Every job tells you what it will cost before it spends anything:\n- A plan shows Estimated cost: about N credits beside Confirm plan. What it really costs is what its steps spend, and you can watch that add up on the job.\n- On the Free plan, a job is checked against the most it could cost, not a typical figure, and against the credits you have left this month. The Start your site window, for example, says Up to about N AI credits and how many of your free credits are left until they reset. If what is left cannot cover it, the start button is turned off and the window says so, with Upgrade. If fewer pages would fit, it says that too.\n- A picture shows its credits per picture and in total before Create.'
216
+ },
217
+ {
218
+ path: '/ai/ai-credits',
219
+ title: 'AI credits',
220
+ heading: 'When credits run out',
221
+ anchor: '#when-credits-run-out',
222
+ text: '- A job that is building pauses rather than failing. What it built so far is kept, and it carries on from there with Resume once there are credits again, or by itself within about an hour. See Paused, or out of credits.\n- A new request on a Free workspace, or on a paid workspace that stops at its band, is refused with a message saying when credits reset.'
223
+ },
224
+ {
225
+ path: '/ai/ai-credits',
226
+ title: 'AI credits',
227
+ heading: 'Past the band',
228
+ anchor: '#past-the-band',
229
+ text: 'On a paid plan, AI keeps working past the included band, and the extra credits are billed on your monthly invoice at your plan\'s rate per 1,000 credits. In Billing → Usage you can instead:\n- stop at the included band, so AI pauses there; or\n- set a ceiling, so overage stops at an amount you choose.\nOwners and admins are alerted on the way. See AI assist overage.'
230
+ },
231
+ {
232
+ path: '/ai/ai-credits',
233
+ title: 'AI credits',
234
+ heading: 'Credits given back',
235
+ anchor: '#credits-given-back',
236
+ text: 'When a job fails because of something on our side, such as an AI provider error, a step that timed out, or a plan that still broke the building rules after being asked again, its credits are given back automatically:\n- all of them, if it built nothing;\n- the failed step\'s, if it had already built something, which you keep.\nThe job says This one\'s on us — you weren\'t charged. and how many credits came back. Up to three jobs a day are given back this way.\nCredits are not given back when you cancel a job yourself (you pay for what ran until then), or when the AI declines what the brief asked for. A picture that is declined or does not come out is never charged in the first place.'
237
+ },
238
+ {
239
+ path: '/ai/ai-credits',
240
+ title: 'AI credits',
241
+ heading: 'See your credits',
242
+ anchor: '#see-your-credits',
243
+ text: '- Billing → Usage → AI credits shows the credits drawn this month against the included band, and what the add-on adds.\n- Who is generating what, on the same page, lists each member\'s credits by month. See Billing & Plans.\n- The usage line in the assistant and the AI dialogs shows your own credits, the workspace\'s and your last request. See Your usage while you work.\n- A site\'s AI jobs page shows what each job used. See AI jobs and activity.\nTo give one member or one site its own monthly share, see AI allotments.'
244
+ },
245
+ {
246
+ path: '/ai/ai-credits',
247
+ title: 'AI credits',
248
+ heading: 'Related',
249
+ anchor: '#related',
250
+ text: '- Aglyn AI overview\n- AI allotments, usage and model choice\n- Billing & Plans'
251
+ },
252
+ {
253
+ path: '/ai/ai-jobs-and-activity',
254
+ title: 'AI jobs and activity',
255
+ heading: '',
256
+ anchor: '',
257
+ text: 'AI jobs and activity\nEverything Aglyn AI builds is done by an AI job, and every job is kept where you can review it: what was asked, what was planned, what was built, what it cost and who started it.'
258
+ },
259
+ {
260
+ path: '/ai/ai-jobs-and-activity',
261
+ title: 'AI jobs and activity',
262
+ heading: 'The AI jobs page',
263
+ anchor: '#the-ai-jobs-page',
264
+ text: 'Each site has an AI jobs page: open it from AI jobs in the trail above a job\'s page, or from See this site\'s AI jobs. It lists the 50 most recent jobs on the site, newest first. Each row shows:\n- the kind of job, such as a page, a form, a site or a build from the chat;\n- its status;\n- the credits it used and when it ran;\n- the start of its brief, as you wrote it;\n- whether credits were given back.\nEach row opens the job\'s own page. The page needs the Generate with AI permission.'
265
+ },
266
+ {
267
+ path: '/ai/ai-jobs-and-activity',
268
+ title: 'AI jobs and activity',
269
+ heading: 'Statuses',
270
+ anchor: '#statuses',
271
+ text: '| Status | What it means |\n| Queued | Waiting to start, usually for a moment. |\n| Planning | Working out what to build. |\n| Plan ready | Waiting for you to read the plan and choose Confirm plan. Nothing is built until you do. |\n| Building | Building what the plan lists. |\n| Needs attention | Stopped for something only you can change, such as credits or a plan to confirm. |\n| Done | Finished. Its drafts are ready to open. |\n| Failed | Stopped before it finished. The job says why, and whether its credits were given back. |\n| Canceled | Canceled by a person. |'
272
+ },
273
+ {
274
+ path: '/ai/ai-jobs-and-activity',
275
+ title: 'AI jobs and activity',
276
+ heading: 'One job\'s page',
277
+ anchor: '#one-jobs-page',
278
+ text: 'A job\'s page shows each step as it happens, with its own state (Done, Waiting, In progress, Paused, Not built or Couldn\'t be built) and the credits each step used. From there you can:\n- Confirm plan, when a plan is waiting for you;\n- Resume a job that paused for credits, or Get more AI credits;\n- Try again, or Try again what failed to build only the parts that failed;\n- open what it built: View your site, Edit your pages, or the draft itself.\nFor a new site this is the Building your site page; see Start a new site with AI.'
279
+ },
280
+ {
281
+ path: '/ai/ai-jobs-and-activity',
282
+ title: 'AI jobs and activity',
283
+ heading: 'AI jobs in Assist',
284
+ anchor: '#ai-jobs-in-assist',
285
+ text: 'The AI jobs list at the top of the Assist panel follows the workspace\'s jobs wherever you are in the console. It opens on its own while a job is running or waiting for you, counts the jobs that need you and are running, and shows each job\'s steps, credits and plan, with Cancel while it runs.\nThe AI chip in the top bar, beside the notifications bell, appears while any job is running or waiting: AI · plan ready, AI · needs attention, AI · planning or AI · working. Choose it to open that job in the list.\nA notification arrives when a plan is ready, when a job finishes and when it stops. Turn them off under AI job needs you, AI job finished and AI job stopped in your notification settings.'
286
+ },
287
+ {
288
+ path: '/ai/ai-jobs-and-activity',
289
+ title: 'AI jobs and activity',
290
+ heading: 'Cancel a job',
291
+ anchor: '#cancel-a-job',
292
+ text: 'Cancel job in the window that started a job, or Cancel in the AI jobs list, stops it. What it built so far is kept as drafts. A canceled job is charged for what it spent until then.'
293
+ },
294
+ {
295
+ path: '/ai/ai-jobs-and-activity',
296
+ title: 'AI jobs and activity',
297
+ heading: 'AI activity',
298
+ anchor: '#ai-activity',
299
+ text: 'AI actions are recorded in the same activity logs as every other change, and each log has an AI filter:\n- A site\'s activity, under the site\'s Admin → Activity, lists the AI work on that site: Started an AI generation, AI generated, Canceled an AI generation, AI generation paused for input, Applied AI edits, Applied AI SEO fixes as drafts and AI generated a section.\n- The workspace\'s activity, under Team → Activity, also lists the AI settings changed: the stop at the included band, the overage ceiling, an AI allotment, an AI permission, and the Aglyn AI add-on being added or removed.\nEach entry names who did it, where and when. The workspace log needs the permission to view the organization\'s activity.'
300
+ },
301
+ {
302
+ path: '/ai/ai-jobs-and-activity',
303
+ title: 'AI jobs and activity',
304
+ heading: 'How long jobs are kept',
305
+ anchor: '#how-long-jobs-are-kept',
306
+ text: 'A job, with its brief, is kept for 180 days and then deleted. What it built is yours and stays until you delete it. See Privacy and Aglyn AI.'
307
+ },
308
+ {
309
+ path: '/ai/ai-jobs-and-activity',
310
+ title: 'AI jobs and activity',
311
+ heading: 'Related',
312
+ anchor: '#related',
313
+ text: '- How Aglyn AI builds\n- AI credits\n- Build from Assist chat'
314
+ },
315
+ {
316
+ path: '/ai/ai-privacy',
317
+ title: 'Privacy and Aglyn AI',
318
+ heading: '',
319
+ anchor: '',
320
+ text: 'Privacy and Aglyn AI\nThis page says, in plain terms, what leaves Aglyn when you use AI and where it goes. The terms that govern it are on Aglyn\'s legal pages; this page does not replace them.'
321
+ },
322
+ {
323
+ path: '/ai/ai-privacy',
324
+ title: 'Privacy and Aglyn AI',
325
+ heading: 'What is sent',
326
+ anchor: '#what-is-sent',
327
+ text: 'A request sends the AI what it needs to do that one job, and no more:\n- your words: the question, the brief or the description you typed;\n- what it builds against: the names of the components, layouts, forms and datasets the site already has, your theme\'s values, and the copy of anything it starts from;\n- your business profile: what the business does, who it is for, its tone, and the contact details you entered, plus the preferences Aglyn AI learned;\n- for a CRM summary or email, the record you have open.\nEach feature\'s guide lists exactly what its own requests send, under What is sent: for example CRM by AI, Automations with AI and Create images with AI.'
328
+ },
329
+ {
330
+ path: '/ai/ai-privacy',
331
+ title: 'Privacy and Aglyn AI',
332
+ heading: 'Who processes it',
333
+ anchor: '#who-processes-it',
334
+ text: '| What | Sent to |\n| Answers, plans, pages, copy, emails, every text request, and vector pictures | Aglyn\'s AI model provider |\n| Photo, art and design pictures | Google\'s image models on Vertex AI: only your description and the shape you chose |\n| Stock photos in AI sites | Pixabay: only the search words, never anything about you |\nThe providers, where they process data and what each receives are listed on the Subprocessors page.'
335
+ },
336
+ {
337
+ path: '/ai/ai-privacy',
338
+ title: 'Privacy and Aglyn AI',
339
+ heading: 'What is never sent',
340
+ anchor: '#what-is-never-sent',
341
+ text: '- No contact, lead, deal, form submission or list member is read to build a page.\n- No file from your media library is sent to make a picture.\n- Your name, email address and account identifiers are not sent with an image request or a stock photo search.'
342
+ },
343
+ {
344
+ path: '/ai/ai-privacy',
345
+ title: 'Privacy and Aglyn AI',
346
+ heading: 'How long it is kept',
347
+ anchor: '#how-long-it-is-kept',
348
+ text: '- Briefs are kept with their job for 180 days, then deleted.\n- Conversations with Aglyn Assist are kept with your workspace for 180 days, to improve answers and the documentation.\n- What AI built (pages, forms, emails, pictures) is your content, kept until you delete it. A picture\'s description is kept with it as a record of how it was made.'
349
+ },
350
+ {
351
+ path: '/ai/ai-privacy',
352
+ title: 'Privacy and Aglyn AI',
353
+ heading: 'Turn AI off',
354
+ anchor: '#turn-ai-off',
355
+ text: 'A site admin can switch AI off for one site; every AI request for that site is then refused. See Switch AI off for one site. A member whose role lacks the AI permissions cannot use AI at all; see Who can use it.'
356
+ },
357
+ {
358
+ path: '/ai/ai-privacy',
359
+ title: 'Privacy and Aglyn AI',
360
+ heading: 'Legal pages',
361
+ anchor: '#legal-pages',
362
+ text: '- Privacy Policy\n- Subprocessors\n- Data Processing Addendum\n- Terms of Service\n- Acceptable Use Policy'
363
+ },
364
+ {
365
+ path: '/ai/ai-privacy',
366
+ title: 'Privacy and Aglyn AI',
367
+ heading: 'Related',
368
+ anchor: '#related',
369
+ text: '- Aglyn AI overview\n- Security & compliance'
370
+ },
371
+ {
372
+ path: '/ai/assist-builds',
373
+ title: 'Build from Assist chat',
374
+ heading: '',
375
+ anchor: '',
376
+ text: 'Build from Assist chat\nThe Aglyn Assist chat answers questions. On a site with AI generation, it also builds: describe what you need in one message, such as "add a pricing page and a quote request form, and a welcome email for people who send it", and Assist plans all of it at once and builds it in one job.'
377
+ },
378
+ {
379
+ path: '/ai/assist-builds',
380
+ title: 'Build from Assist chat',
381
+ heading: 'Ask or build',
382
+ anchor: '#ask-or-build',
383
+ text: 'Assist decides from your message whether you are asking or asking for something to be made:\n- A question, such as how do I connect a domain?, gets an answer from the docs.\n- A change to the page you have open in the Besigner gets a proposed edit.\n- Something to make gets a plan card in the chat.\nIt builds only on a site, and only what your plan includes and the site has turned on. When you ask for something it cannot make from the chat, it says so plainly and plans the rest.'
384
+ },
385
+ {
386
+ path: '/ai/assist-builds',
387
+ title: 'Build from Assist chat',
388
+ heading: 'What one request can build',
389
+ anchor: '#what-it-can-build',
390
+ text: 'One message can ask for any mix of:\n- pages: home, about, services, contact, pricing, a landing page;\n- a header and footer shared by the pages;\n- a form: a contact form, a quote request, a sign-up form;\n- a reusable component: a card or block placed on several pages;\n- an email design, such as a welcome, a reply or an announcement, and an email campaign, drafted and left unsent;\n- a page template for blog posts, products or authors;\n- an automation: when a form is sent, do something;\n- a site function that works out a value, such as a price or a quote, and site variables, such as a phone number kept in one place;\n- products to sell, with a description, tags and options;\n- a booking service visitors can book online, with its length, hours and price;\n- an announcement bar or a popup;\n- an A/B test of a page or of an email\'s subject line;\n- a funnel that counts visits from one step to the next;\n- a change to a page or layout the site already has, saved as a new version visitors do not see until you publish it.\nOne build holds up to 16 things and 8 pages. On the Free plan it holds 2 pages, and some parts, such as templates, campaigns, automations, products and edits to existing pages, need a paid plan. The card says when your request goes past a limit; ask for the rest in a second message.'
391
+ },
392
+ {
393
+ path: '/ai/assist-builds',
394
+ title: 'Build from Assist chat',
395
+ heading: 'The plan card',
396
+ anchor: '#the-plan-card',
397
+ text: 'The card shows Planning what to build on this site… while the plan is made, then the Proposed plan, one line per part:\n- Reuses something the site already has, and what for;\n- Creates something new, and why nothing you have will do;\n- Builds the page with its title, address, layout and sections;\n- any video player a page will carry, and what loading it costs your visitors.\nUnder the lines is the Estimated cost in credits. It is an estimate: what the build costs is what its steps spend. If you asked for the new pages to go live, a Publish the new pages when they are built box is there too, unticked until you tick it.\nNothing is built while the card waits. The plan follows the building rules, and a plan that breaks them, or asks for more than your plan includes, is stopped before you are asked to confirm it.'
398
+ },
399
+ {
400
+ path: '/ai/assist-builds',
401
+ title: 'Build from Assist chat',
402
+ heading: 'Confirm the plan',
403
+ anchor: '#confirm-the-plan',
404
+ text: 'Confirm plan builds it. The card then shows Building each part in turn and a row per part, such as Page: Pricing — building, that reads built, building, waiting, failed or not built. You can close the chat; the job keeps going, and Open in AI jobs follows it in the AI jobs list.\nConfirming checks your permissions and credits again, so a plan confirmed after your credits ran out waits instead of building.'
405
+ },
406
+ {
407
+ path: '/ai/assist-builds',
408
+ title: 'Build from Assist chat',
409
+ heading: 'One job, many parts',
410
+ anchor: '#one-job-many-parts',
411
+ text: 'Everything in the plan is built by one job, each part by the same builder that makes it on its own page, in the order the parts need each other: the layout and the form before the page that places them.\n- Each part stands on its own. A part that fails does not undo the others. What depends on it is built without it, or not built, and the card says which.\n- Everything is a draft. Pages are unpublished drafts unless you ticked the publish box. Products have no photo and the price you stated, if any. Booking services and funnels are drafts to activate. Overlays and automations are switched off, A/B tests are stopped, and campaigns are unsent and aimed at nobody.\n- Names are your own. A new variable or function never takes a name the site already uses.\nWhen it is done the card says how many parts were built, such as 5 of 6 built; 1 failed. Try again what failed builds only the parts that failed.\nTo change something it made, ask in the chat, such as make the about page shorter. Assist opens that draft and proposes the change there.'
412
+ },
413
+ {
414
+ path: '/ai/assist-builds',
415
+ title: 'Build from Assist chat',
416
+ heading: 'What it costs',
417
+ anchor: '#what-it-costs',
418
+ text: 'A build spends AI credits for each part it makes, and the card shows the estimate before you confirm. Products, booking services, overlays, A/B tests, funnels and variables cost almost nothing. If the build fails because of something on our side, the credits are given back, and the card says so. See Credits given back.'
419
+ },
420
+ {
421
+ path: '/ai/assist-builds',
422
+ title: 'Build from Assist chat',
423
+ heading: 'Who can use it',
424
+ anchor: '#who-can-use-it',
425
+ text: 'Building from the chat needs AI generation on your plan, the Generate with AI permission, and AI on for the site. See Who can use Aglyn AI.'
426
+ },
427
+ {
428
+ path: '/ai/assist-builds',
429
+ title: 'Build from Assist chat',
430
+ heading: 'Related',
431
+ anchor: '#related',
432
+ text: '- Aglyn Assist\n- How Aglyn AI builds\n- AI jobs and activity\n- Create with AI on every list'
174
433
  },
175
434
  {
176
435
  path: '/ai/automations-with-ai',
@@ -247,14 +506,21 @@ export const DOCS_SECTION_INDEX = [
247
506
  title: 'Business profile',
248
507
  heading: 'Where to edit it',
249
508
  anchor: '#where-to-edit-it',
250
- text: 'Open the site, go to Setup → Business profile. The page has three cards:\n- Business profile: what the business does, its services (one per line), who it is for, the area it serves, the tone of voice and any notes on tone.\n- From your site settings: the facts Aglyn AI reads from your other settings, each with a link to the card that edits it.\n- What Aglyn AI learned: the preferences it took from edits you applied.'
509
+ text: 'Open the site, go to Setup → Business profile. The page has three cards:\n- Business profile: see the Business profile card.\n- From your site settings: the facts Aglyn AI reads from your other settings, each with a link to the card that edits it.\n- What Aglyn AI learned: the preferences it took from edits you applied.'
510
+ },
511
+ {
512
+ path: '/ai/business-profile',
513
+ title: 'Business profile',
514
+ heading: 'The Business profile card',
515
+ anchor: '#the-business-profile-card',
516
+ text: 'The Business profile card holds what Aglyn AI writes for:\n- What the business does, in a sentence or two;\n- Services, one per line, up to 12;\n- Who it is for and Area served;\n- Tone of voice: Friendly and warm, Professional and clear, Playful and upbeat, Premium and refined, or Plain and direct, and Notes on tone for anything else.\nAglyn AI reads it on every job for the site and never replaces what you write here.'
251
517
  },
252
518
  {
253
519
  path: '/ai/business-profile',
254
520
  title: 'Business profile',
255
521
  heading: 'Where the values come from',
256
522
  anchor: '#where-the-values-come-from',
257
- text: 'When a site is started with Aglyn AI, the profile is filled from your answers to the guided start, and from what the plan wrote about the business. Each field says where its value came from:\n- Your answers when the site was started, or Suggested by Aglyn AI: a suggestion. Edit it and it becomes yours.\n- An empty field that Aglyn AI still has a value for says so: the description in your SEO settings, or the workspace\'s default.\nWhat you type is never replaced. A later job can fill an empty field, but it never overwrites one you wrote, and a field you cleared stays clear.\nWorkspace defaults\nSettings → Profile has a Business profile defaults card. A site uses those values wherever its own profile is empty, so a workspace that runs many sites for one business writes them once. Only managers can change them.'
523
+ text: 'When a site is started with Aglyn AI, the profile is filled from your answers to the guided start, and from what the plan wrote about the business. Each field says where its value came from:\n- Your answers when the site was started, or Suggested by Aglyn AI: a suggestion. Edit it and it becomes yours.\n- An empty field that Aglyn AI still has a value for says so: the description in your SEO settings, or the workspace\'s default.\nWhat you type is never replaced. A later job can fill an empty field, but it never overwrites one you wrote, and a field you cleared stays clear.\nWorkspace defaults {#workspace-defaults}\nSettings → Profile has a Business profile defaults card. A site uses those values wherever its own profile is empty, so a workspace that runs many sites for one business writes them once. Only managers can change them.'
258
524
  },
259
525
  {
260
526
  path: '/ai/business-profile',
@@ -268,7 +534,7 @@ export const DOCS_SECTION_INDEX = [
268
534
  title: 'Business profile',
269
535
  heading: 'What Aglyn AI learned',
270
536
  anchor: '#what-aglyn-ai-learned',
271
- text: 'When you apply an Assist edit that shows a preference, such as asking for shorter copy, a friendlier tone, no emoji, or removing a testimonials section, Aglyn AI keeps that as a short preference for the site. Later jobs read it.\nThe What Aglyn AI learned card lists each preference and how many applied edits it was seen in. Choose the close button beside one to forget it, or Forget all to clear the list. A preference replaces an opposite one: asking for detailed copy after asking for shorter copy keeps only the newer one.'
537
+ text: 'When you apply an Assist edit that shows a preference, such as asking for shorter copy, a friendlier tone, no emoji, or removing a testimonials section, Aglyn AI keeps that as a short preference for the site. Later jobs read it.\nThis is Aglyn AI\'s memory for the site. It learns only from edits you applied, never from ones you dismissed, and by fixed rules rather than another AI request. It can learn:\n- a tone: Prefers a casual, friendly tone or Prefers a formal, professional tone;\n- a length: Prefers short, concise copy or Prefers detailed copy;\n- Does not want emoji in copy;\n- a kind of section you remove, such as testimonials and reviews, FAQs, pricing, stats, logo strips, newsletter sign-ups, team or gallery sections.\nIt keeps up to 12 preferences per site, and sends six of them with each job.\nThe What Aglyn AI learned card lists each preference and how many applied edits it was seen in. Choose Forget this beside one to forget it, or Forget all to clear the list. Later jobs stop using what you forget, and Aglyn AI learns again from the edits you apply next. Anyone who can edit the site can see and clear the list. A preference replaces an opposite one: asking for detailed copy after asking for shorter copy keeps only the newer one.'
272
538
  },
273
539
  {
274
540
  path: '/ai/business-profile',
@@ -338,7 +604,14 @@ export const DOCS_SECTION_INDEX = [
338
604
  title: 'Create images with AI',
339
605
  heading: 'Make a picture',
340
606
  anchor: '#make-a-picture',
341
- text: '1. Open Media, on a site or for the organization, and open the folder the pictures should land in.\n2. Choose Create with AI, beside Upload media. An empty library offers it beside its own Upload media button too.\n3. Choose a Kind. Each one shows what a picture of it costs, and choosing it picks a shape that suits it — Wide 16:9 for a banner, Square 1:1 for a social post — which you can change.\n4. Describe the picture: what is in it and the setting. For a Photo, describe the style too.\n5. Choose a shape: Square 1:1, Landscape 4:3, Portrait 3:4, Wide 16:9 or Tall 9:16, and how many pictures to make, from one to four.\n6. For a Vector kind, choose its colors: Use my site\'s theme colors, which reads your site\'s theme, or Choose colors to pick up to six. The organization\'s library belongs to no single site, so there you choose the colors. For an Art or Design kind, name the colors in your description if you want particular ones; a Photo kind takes the colors of the scene.\n7. The window shows what the pictures will cost in credits before you start. Choose Create.\nThe pictures appear in the library a few seconds later, selected, so you can move, tag or open them at once. Nothing is placed on a page: a picture is used only when you put it in an Image element, a gallery or anywhere else a media field asks for one.'
607
+ text: '1. Open Media, on a site or for the organization, and open the folder the pictures should land in.\n2. Choose Create with AI, beside Upload media. An empty library offers it beside its own Upload media button too.\n3. Choose a Kind. Each one shows what a picture of it costs, and choosing it picks a shape that suits it — Wide 16:9 for a banner, Square 1:1 for a social post — which you can change.\n4. Describe the picture: what is in it and the setting. For a Photo, describe the style too.\n5. Choose a shape and how many pictures to make; see Shapes and how many.\n6. For a Vector kind, choose its colors: Use my site\'s theme colors, which reads your site\'s theme, or Choose colors to pick up to six. The organization\'s library belongs to no single site, so there you choose the colors. For an Art or Design kind, name the colors in your description if you want particular ones; a Photo kind takes the colors of the scene.\n7. The window shows what the pictures will cost in credits before you start. Choose Create.\nThe pictures appear in the library a few seconds later, selected, so you can move, tag or open them at once. Nothing is placed on a page: a picture is used only when you put it in an Image element, a gallery or anywhere else a media field asks for one.'
608
+ },
609
+ {
610
+ path: '/ai/create-images',
611
+ title: 'Create images with AI',
612
+ heading: 'Shapes and how many',
613
+ anchor: '#shapes-and-how-many',
614
+ text: '- Shape: Square 1:1, Landscape 4:3, Portrait 3:4, Wide 16:9 or Tall 9:16. Choosing a kind picks the shape that suits it, which you can change.\n- How many: one to four pictures from one description. Each is charged on its own, and a picture that is declined or does not come out is not charged.\n- Size: 512 px on the longer side on the Free plan, about 1024 px on a paid plan. Your plan decides it.\n- Description: up to 1,000 characters.\nYou can make up to six requests a minute. If one set was partly declined, the window says how many were added, such as Added 2 of 4 to the library, and that the rest were not charged.'
342
615
  },
343
616
  {
344
617
  path: '/ai/create-images',
@@ -361,6 +634,13 @@ export const DOCS_SECTION_INDEX = [
361
634
  anchor: '#safety',
362
635
  text: 'An illustration is checked before it is stored. It has to be one SVG in the shape you chose, no larger than 200 KB, and self-contained: no scripts, no links, no embedded images or web pages, and nothing loaded from anywhere else, such as a font. An illustration that fails the check is drawn again once with the problem pointed out; if the second one fails too, it is not stored and not charged. The media library then removes anything unsafe from every SVG it stores, as it does for an SVG you upload.\nThe AI declines to draw a real company\'s or organization\'s logo, a trademark or a recognizable brand symbol, a real, named person, and anything sexual, hateful, violent or otherwise unsafe; the window says why, and a declined request on a Free workspace costs nothing. A Logo mark is always a symbol without lettering.\nPictures from the Photo, Art and Design sections are checked by Google\'s safety filters, set to block content they rate as a medium risk or higher, and Google\'s own policies refuse some content whatever is asked, such as photorealistic depictions of children or celebrities that its policies do not allow. The window says so for those kinds: pictures of real, identifiable people, celebrities or brands may be declined. The people in a Lifestyle with people picture are asked for as made-up people, and a Cartoon or anime picture as original characters. A description that is declined is answered with a message and no picture is charged.'
363
636
  },
637
+ {
638
+ path: '/ai/create-images',
639
+ title: 'Create images with AI',
640
+ heading: 'Declined pictures',
641
+ anchor: '#declined-pictures',
642
+ text: 'When the image service declines a whole description, the window says The image service declined this description. Try describing the scene differently, without real people, brands or anything unsafe. Nothing is charged. Pictures of real, identifiable people, celebrities and brands are the usual reason; describe a made-up person, or the scene without the brand.\nOn the Free plan, three declined requests in a day pause free AI generation until the next day (UTC).\nWhen the workspace has run out of credits, the window says so and how many the pictures need; make fewer pictures, or wait for the monthly reset. See AI credits.'
643
+ },
364
644
  {
365
645
  path: '/ai/create-images',
366
646
  title: 'Create images with AI',
@@ -382,6 +662,55 @@ export const DOCS_SECTION_INDEX = [
382
662
  anchor: '#related',
383
663
  text: '- Media Library & CDN\n- Aglyn AI overview\n- AI allotments, usage and model choice'
384
664
  },
665
+ {
666
+ path: '/ai/create-with-ai',
667
+ title: 'Create with AI on every list',
668
+ heading: '',
669
+ anchor: '',
670
+ text: 'Create with AI on every list\nWherever Aglyn AI can make the thing a list holds, the list has a Create with AI button with a sparkle icon, beside its own create button. An empty list shows it in its empty state too, so the first item can be one you describe.'
671
+ },
672
+ {
673
+ path: '/ai/create-with-ai',
674
+ title: 'Create with AI on every list',
675
+ heading: 'The button',
676
+ anchor: '#the-button',
677
+ text: 'Create with AI opens a window with one question, such as What is the page for?, and a box for your answer, up to 4,000 characters. Some lists ask one more thing beside it, such as the page\'s type or the kind of email. Then:\n1. Choose the window\'s plan button, such as Plan the page.\n2. The job plans first. The window shows the plan, its estimated cost and Confirm plan. Nothing is built until you confirm it.\n3. What it builds is a draft in the list you started from. The window\'s first button opens it.\nYou can close the window at any point; the job carries on in AI jobs.'
678
+ },
679
+ {
680
+ path: '/ai/create-with-ai',
681
+ title: 'Create with AI on every list',
682
+ heading: 'Where it appears',
683
+ anchor: '#where-it-appears',
684
+ text: '| List | What you describe | Guide |\n| Pages | A page, with an optional type: landing, about, pricing or contact | Generate a page |\n| Templates | What each page made from the template shows, and what it is one page for: a collection entry, a product or an author | Generate a page template |\n| Layouts | A header, navigation and footer | Generate a layout |\n| Forms | What the form is for | Generate a form |\n| Components | One reusable block | Generate a reusable component |\n| Emails → Templates | What the email is for, with an optional kind: welcome, newsletter, launch, cart reminder or event reminder | Generate an email |\n| Marketing → Campaigns | The campaign\'s email | Generate an email |\n| Automation, its actions and workflows, and the workspace\'s automations | What should happen, and when | Automations with AI |\n| Logic → Functions and Variables | A value to work out, or one to keep in one place | Functions and variables with AI |\n| Analytics → Funnels | The steps to count | Funnels |\n| Products | Products to sell, or a first catalog | Products with AI |\n| Marketing → Overlays | An announcement bar or a popup | Marketing with AI |\n| Media | A picture, illustration or icon | Create images with AI |\nBlog posts, datasets and CRM records have no Create with AI button. In the CRM, AI summarizes a record, drafts an email and matches import columns instead; see CRM by AI. To create several of these things from one request, ask the chat: see Build from Assist chat.'
685
+ },
686
+ {
687
+ path: '/ai/create-with-ai',
688
+ title: 'Create with AI on every list',
689
+ heading: 'What you get',
690
+ anchor: '#what-you-get',
691
+ text: 'Every button makes a draft: a page with no live address, a form that collects nothing until you place it, an email nothing sends, an automation that is switched off. It uses your theme and reuses what the site already has, following the building rules, and reads your business profile.'
692
+ },
693
+ {
694
+ path: '/ai/create-with-ai',
695
+ title: 'Create with AI on every list',
696
+ heading: 'Without the add-on',
697
+ anchor: '#without-the-add-on',
698
+ text: 'On a paid plan without the Aglyn AI add-on, the button is still there. It opens a short window saying what it would make and that Create with AI comes with the Aglyn AI add-on:\n- an owner or admin sees Add Aglyn AI, which opens Billing to add it, or Not now;\n- anyone else is asked to have a workspace owner or admin add it.\nA Free workspace does not buy the add-on: its buttons work from the 300 AI credits it gets each month.'
699
+ },
700
+ {
701
+ path: '/ai/create-with-ai',
702
+ title: 'Create with AI on every list',
703
+ heading: 'When it is not there',
704
+ anchor: '#when-it-is-not-there',
705
+ text: 'Create with AI is hidden when you lack the Generate with AI permission, or when AI is switched off for the site.'
706
+ },
707
+ {
708
+ path: '/ai/create-with-ai',
709
+ title: 'Create with AI on every list',
710
+ heading: 'Related',
711
+ anchor: '#related',
712
+ text: '- How Aglyn AI builds\n- AI credits\n- AI jobs and activity'
713
+ },
385
714
  {
386
715
  path: '/ai/crm-by-ai',
387
716
  title: 'The AI CRM built into Aglyn',
@@ -492,7 +821,7 @@ export const DOCS_SECTION_INDEX = [
492
821
  title: 'Generate a website from a prompt',
493
822
  heading: 'Starting a new site from a few questions',
494
823
  anchor: '#starting-a-new-site-from-a-few-questions',
495
- text: 'A site you have just created opens on its Setup page, and Start your site opens over it with one question first: how do you want to start?\n- Start from the starter site gives the site a ready-made home page with a header, footer and contact form, live at its address, for you to edit.\n- Start with AI asks a few questions instead: what kind of site you are creating, who it is for, which of the starter shapes you like, and where your contact form\'s submissions should go. It writes the brief for you and plans the site from it. Back returns to the first question.\nEach answer changes what gets built. Who the site is for is who every page\'s search listing is written for, and who the contact form asks its questions of. Where submissions go is the form\'s routing: the Inbox, or the Inbox and a lead in CRM for every message that carries an email address. You can change that on the form itself afterwards.\nSkip is in the bar at the top on both steps, and so are the close control and the Escape key. Before a site is being planned, all three do what the starter card does: the site gets the starter home page, and nothing else is created — no job, no half-built site behind you — and the site does not ask again. Once the site is being planned they only close the window; the job carries on.\nUntil one of those happens, a site that started this way has no page yet, and its address shows a short coming soon page with the site\'s name, which search engines are asked not to index.\nOn the Free plan\nA Free workspace\'s AI start builds one or two pages: the home page and the one page your business most needs, such as services, booking or contact. Paid plans can generate more pages. The questions show what the start can cost at most out of the 300 AI credits a Free workspace has each month, and a Fr'
824
+ text: 'A site you have just created opens on its Setup page, and Start your site opens over it with one question first: how do you want to start?\n- Start from the starter site gives the site a ready-made home page with a header, footer and contact form, live at its address, for you to edit.\n- Start with AI asks a few questions instead: what kind of site you are creating, who it is for, which of the starter shapes you like, and where your contact form\'s submissions should go. It writes the brief for you and plans the site from it. Back returns to the first question.\nEach answer changes what gets built. Who the site is for is who every page\'s search listing is written for, and who the contact form asks its questions of. Where submissions go is the form\'s routing: the Inbox, or the Inbox and a lead in CRM for every message that carries an email address. You can change that on the form itself afterwards.\nSkip is in the bar at the top on both steps, and so are the close control and the Escape key. Before a site is being planned, all three do what the starter card does: the site gets the starter home page, and nothing else is created — no job, no half-built site behind you — and the site does not ask again. Once the site is being planned they only close the window; the job carries on.\nUntil one of those happens, a site that started this way has no page yet, and its address shows a short coming soon page with the site\'s name, which search engines are asked not to index.\nEvery question, step and button of the guided start is walked through on Start a new site with AI.\nOn the Free plan\nA Free workspace\'s AI start builds one or two pages: the home page and the one page your business most needs, such as services, booking or contact. Paid plans can generate more pages. The questions show '
496
825
  },
497
826
  {
498
827
  path: '/ai/generate-a-site',
@@ -625,7 +954,7 @@ export const DOCS_SECTION_INDEX = [
625
954
  title: 'How Aglyn AI builds',
626
955
  heading: 'Related',
627
956
  anchor: '#related',
628
- 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'
957
+ text: '- AI jobs and activity\n- 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'
629
958
  },
630
959
  {
631
960
  path: '/ai/logic-with-ai',
@@ -758,7 +1087,7 @@ export const DOCS_SECTION_INDEX = [
758
1087
  title: 'Aglyn AI: the AI website builder',
759
1088
  heading: 'What it can build',
760
1089
  anchor: '#what-it-can-build',
761
- text: 'Each capability has its own page, next to the thing it builds:\n| You want | Where you start | The page |\n| A page from a brief | Pages → Create with AI | Generate a page |\n| A whole small site | Pages, or Sites for several at once | Generate a site |\n| Many client sites, run as an agency | Sites | An AI website builder for agencies |\n| A layout — header, navigation, footer | Layouts → Create with AI | Generate a layout |\n| A page template | Templates → Create with AI | Generate a page template |\n| A reusable component | Components → Create with AI | Generate a component |\n| A form | Forms → Create with AI | Generate a form |\n| Illustrations, icons, patterns, logo marks, photos, art and design images | Media → Create with AI | Create images with AI |\n| A section on the canvas | The Besigner | Generate a section |\n| Copy, rewritten or fresh | Any text in the Besigner | Rewrite and write copy |\n| A change to your theme | Setup → Theme | Change your theme with AI |\n| Search titles and descriptions | SEO | SEO by AI |\n| Product copy, catalog and discount ideas | Products → Create with AI, and Build your catalog with AI on the products page | Products with AI |\n| Help working the CRM | A record, the composer, an import | CRM by AI |\n| A designed email | Emails → Templates → Create with AI | Generate an email |\n| A campaign | Marketing → Campaigns → Create with AI, or Also draft a campaign on an email | Generate an email |\n| Variants for an A/B test, and its result in words | Marketing → Experiments | A/B tests by AI |\n| Announcement bar and popup copy, or a new overlay | Marketing → Overlays | Marketing with AI |\n| What your analytics mean | Analytics → Insights | Insights |\n| What your campaigns caused and earned | Marketing → Conversions, or a campaign\'s report | Marketing '
1090
+ text: 'Each capability has its own page, next to the thing it builds. Every list it can fill has a Create with AI button.\n| You want | Where you start | The page |\n| A page from a brief | Pages → Create with AI | Generate a page |\n| A new site, planned, written and published from a few questions | Start your site, when you create a site | Start a new site with AI |\n| A whole small site | Pages, or Sites for several at once | Generate a site |\n| Several things from one message — pages, a form, an email, products, an automation | The Assist chat | Build from Assist chat |\n| Many client sites, run as an agency | Sites | An AI website builder for agencies |\n| A layout — header, navigation, footer | Layouts → Create with AI | Generate a layout |\n| A page template | Templates → Create with AI | Generate a page template |\n| A reusable component | Components → Create with AI | Generate a component |\n| A form | Forms → Create with AI | Generate a form |\n| Illustrations, icons, patterns, logo marks, photos, art and design images | Media → Create with AI | Create images with AI |\n| A section on the canvas | The Besigner | Generate a section |\n| Copy, rewritten or fresh | Any text in the Besigner | Rewrite and write copy |\n| A change to your theme | Setup → Theme | Change your theme with AI |\n| Search titles and descriptions | SEO | SEO by AI |\n| Product copy, catalog and discount ideas | Products → Create with AI, and Build your catalog with AI on the products page | Products with AI |\n| Help working the CRM | A record, the composer, an import | CRM by AI |\n| A designed email | Emails → Templates → Create with AI | Generate an email |\n| A campaign | Marketing → Campaigns → Create with AI, or Also draft a campaign on an email | Generate an email |\n| Variants for an A/B test, and its resul'
762
1091
  },
763
1092
  {
764
1093
  path: '/ai/overview',
@@ -772,7 +1101,7 @@ export const DOCS_SECTION_INDEX = [
772
1101
  title: 'Aglyn AI: the AI website builder',
773
1102
  heading: 'Credits and caps',
774
1103
  anchor: '#credits-and-caps',
775
- text: 'Everything AI does — an answer from the assistant, a rewrite, a generated section, a whole site — is metered in AI credits from one workspace pool. There is no second meter per feature.\nWhat a request costs is not fixed: a rewrite of one headline is small, a site scaffold is large, and a job tells you its estimate before you confirm it. The shape of the limits is the part worth knowing:\n- An included band each month, from your plan plus the add-on, reset monthly.\n- Past the band, a paid workspace keeps working and the extra credits bill on the monthly invoice at your plan\'s rate. A switch under Billing → Usage stops AI at the included band instead; it is off unless you choose it.\n- A ceiling you set, so overage can never pass a figure you are comfortable with.\n- Alerts on the way there, to the workspace\'s owners and admins.\n- Allotments, which give one member, one site collaborator or one whole site its own monthly share of the pool, hard or soft — see AI allotments, usage and model choice. An agency can give each client site its own share so one site running out never touches another.\n- A short-term rate limit per person, which smooths bursts rather than capping your month. If you see "Too many AI requests", wait a moment and try again.\nA request that fails before the model answers does not spend credits. An answer that was generated and then refused for breaking a building rule does — the rules page says which, and why.\nThe figures behind all of that are on Billing & Plans, and your own usage is on Billing → Usage.'
1104
+ text: 'Everything AI does — an answer from the assistant, a rewrite, a generated section, a whole site — is metered in AI credits from one workspace pool. There is no second meter per feature.\nWhat a request costs is not fixed: a rewrite of one headline is small, a site scaffold is large, and a job tells you its estimate before you confirm it. The shape of the limits is the part worth knowing:\n- An included band each month, from your plan plus the add-on, reset monthly.\n- Past the band, a paid workspace keeps working and the extra credits bill on the monthly invoice at your plan\'s rate. A switch under Billing → Usage stops AI at the included band instead; it is off unless you choose it.\n- A ceiling you set, so overage can never pass a figure you are comfortable with.\n- Alerts on the way there, to the workspace\'s owners and admins.\n- Allotments, which give one member, one site collaborator or one whole site its own monthly share of the pool, hard or soft — see AI allotments, usage and model choice. An agency can give each client site its own share so one site running out never touches another.\n- A short-term rate limit per person, which smooths bursts rather than capping your month. If you see "Too many AI requests", wait a moment and try again.\nA request that fails before the model answers does not spend credits. An answer that was generated and then refused for breaking a building rule does — the rules page says which, and why.\nWhat each plan includes, what typical jobs cost and when credits are given back are on AI credits. The billing figures behind all of that are on Billing & Plans, and your own usage is on Billing → Usage.'
776
1105
  },
777
1106
  {
778
1107
  path: '/ai/overview',
@@ -800,7 +1129,7 @@ export const DOCS_SECTION_INDEX = [
800
1129
  title: 'Aglyn AI: the AI website builder',
801
1130
  heading: 'Related',
802
1131
  anchor: '#related',
803
- text: '- How Aglyn AI builds\n- Business profile\n- Aglyn Assist\n- AI allotments, usage and model choice\n- Add-ons\n- The Besigner'
1132
+ text: '- How Aglyn AI builds\n- Start a new site with AI\n- AI credits\n- AI jobs and activity\n- Privacy and Aglyn AI\n- Business profile\n- Aglyn Assist\n- AI allotments, usage and model choice\n- Add-ons\n- The Besigner'
804
1133
  },
805
1134
  {
806
1135
  path: '/ai/products-with-ai',
@@ -828,7 +1157,7 @@ export const DOCS_SECTION_INDEX = [
828
1157
  title: 'Product copy and catalogs with AI',
829
1158
  heading: 'Propose a first catalog',
830
1159
  anchor: '#propose-a-first-catalog',
831
- 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.'
1160
+ 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- It starts at a default price of $25 on every variant, for you to change in the product editor. You may clear a price on purpose: the product still saves, the table marks it Set a price, and your storefront shows Price coming soon with no way to buy it until it has one again.\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 set it to Active.\nA proposed product with the same name as one already in your catalog is left out.'
832
1161
  },
833
1162
  {
834
1163
  path: '/ai/products-with-ai',
@@ -865,6 +1194,216 @@ export const DOCS_SECTION_INDEX = [
865
1194
  anchor: '#related',
866
1195
  text: '- Product catalog\n- SEO by AI\n- How Aglyn AI builds'
867
1196
  },
1197
+ {
1198
+ path: '/ai/site-looks',
1199
+ title: 'Looks and themes for AI sites',
1200
+ heading: '',
1201
+ anchor: '',
1202
+ text: 'Looks and themes for AI sites\nEvery site started with AI gets a look of its own: a base theme, colors, a pair of fonts, and the style of its buttons, cards and forms. The style you choose decides the family that look comes from. The details are picked fresh for each site, so two sites with the same style and the same answers still look different.'
1203
+ },
1204
+ {
1205
+ path: '/ai/site-looks',
1206
+ title: 'Looks and themes for AI sites',
1207
+ heading: 'Choose a style',
1208
+ anchor: '#choose-a-style',
1209
+ text: 'The Style step of Start your site offers these styles. One is picked for you from what you said the site is; choose another to change it.\n| Style | For |\n| Business & services | A local business or service company. The fallback when nothing else fits. |\n| Home services & trades | Roofers, plumbers, electricians, cleaners and other trades. |\n| Law, finance & consulting | Professional practices. |\n| Health & wellness | Clinics, therapists and practitioners. |\n| Restaurant & café | Restaurants, cafés, bakeries and bars. |\n| Online store | A shop that sells products. On a paid plan it adds products. |\n| Portfolio | Showing your work. |\n| Design studio & agency | Studios and agencies. |\n| Photography | Photographers. |\n| Blog & writing | Reading-first pages. On a paid plan it adds posts. |\n| Events & weddings | An event, a venue or a planner. |\n| Fitness & sports | Gyms, trainers, teams and clubs. |\n| Yoga & mindfulness | Studios and teachers. |\n| Beauty & salon | Salons, barbers and spas. |\n| Real estate | Agents and agencies. |\n| Courses & education | Classes, tutors and schools. |\n| Nonprofit & community | Charities, groups and clubs. |\n| Music & bands | Musicians and bands. |\n| Personal & resume | A personal site or a resume. |\n| Landing page | One offer on one focused page. |\n| Coming soon | A placeholder that collects interest. |\nEach card says, in a line, what its look is like. A style also suggests the pages that kind of site usually has, such as a menu for a restaurant or services for a trade.'
1210
+ },
1211
+ {
1212
+ path: '/ai/site-looks',
1213
+ title: 'Looks and themes for AI sites',
1214
+ heading: 'How the look is made',
1215
+ anchor: '#how-the-look-is-made',
1216
+ text: 'The style sets the range the look is chosen within: which base themes suit it, the range of colors, how strong the palette is, the page backgrounds, the font pairings, how rounded the corners are, the style of the buttons, the size of the headings and how much space there is. The Designing your look step then picks one look from that range for your site:\n- Unique each time. Each job has its own variation, and a look that would repeat one of your workspace\'s other sites is drawn again.\n- Readable. The colors are checked for contrast, so text stays readable on its background. A palette that fails the check falls back to the starter colors.\n- Cheap. The look is one short step, a few credits of the start\'s total.'
1217
+ },
1218
+ {
1219
+ path: '/ai/site-looks',
1220
+ title: 'Looks and themes for AI sites',
1221
+ heading: 'Your theme afterwards',
1222
+ anchor: '#your-theme-afterwards',
1223
+ text: 'The look is saved as an ordinary theme: the base theme it started from, plus its changes. Setup → Theme names the base, and you edit every color, font and spacing value there as you would any theme. Every page, the header and footer, and the contact form use the theme\'s values rather than fixed colors, so a change in the theme editor changes the whole site.\nA site whose owner has already changed its theme keeps that theme: a guided start never replaces a theme you edited.'
1224
+ },
1225
+ {
1226
+ path: '/ai/site-looks',
1227
+ title: 'Looks and themes for AI sites',
1228
+ heading: 'Change the look later',
1229
+ anchor: '#change-the-look-later',
1230
+ text: 'To change the look with AI, describe the change in Setup → Theme, such as warmer colors and a serif for headings, and review the proposal before you save it. See Change your site\'s theme with AI.'
1231
+ },
1232
+ {
1233
+ path: '/ai/site-looks',
1234
+ title: 'Looks and themes for AI sites',
1235
+ heading: 'Related',
1236
+ anchor: '#related',
1237
+ text: '- Start a new site with AI\n- Stock photos in AI sites\n- How Aglyn AI builds'
1238
+ },
1239
+ {
1240
+ path: '/ai/start-with-ai',
1241
+ title: 'Start a new site with AI',
1242
+ heading: '',
1243
+ anchor: '',
1244
+ text: 'Start a new site with AI\nA site you have just created opens on its Setup page with Start your site over it. Start with AI asks a few questions, then plans the site, writes every page, gives it a look of its own and publishes it at its address. This page walks through each question and what happens after you choose Plan my site.\nTo scaffold pages for a site that already exists, or for several sites at once, see Generate a website from a prompt.'
1245
+ },
1246
+ {
1247
+ path: '/ai/start-with-ai',
1248
+ title: 'Start a new site with AI',
1249
+ heading: 'How do you want to start?',
1250
+ anchor: '#how-do-you-want-to-start',
1251
+ text: 'The first step offers two cards:\n- Start from the starter site gives the site a ready-made home page with a header, footer and contact form, live at its address, for you to edit.\n- Start with AI (marked Recommended) asks the questions below and builds the site for you. On the Free plan the card says how many pages a Free start makes.\nSkip, the close control and the Escape key all leave the window. Before anything is being planned, leaving gives the site the starter home page and nothing else, and the site does not ask again. If you have typed or picked something, the window first asks Leave without your answers?, because what you typed is not saved. Once the site is being planned, closing only closes the window; the job carries on.'
1252
+ },
1253
+ {
1254
+ path: '/ai/start-with-ai',
1255
+ title: 'Start a new site with AI',
1256
+ heading: 'Your business',
1257
+ anchor: '#your-business',
1258
+ text: 'What kind of site are you creating? is the one required answer. A few words is enough, such as a neighborhood dog groomer that takes bookings, or pick one of the suggestions under the field: a local service business, a restaurant or cafe, a professional practice, a trades business, a shop, a nonprofit, a personal portfolio or an event. Keep it under 120 characters.\nWhat you write here picks the site\'s style, which pages it usually has and what each page says.\nWho is it for? is optional. It is who every page and every search listing is written for, and it decides which questions the contact form asks. For example, local dog owners who want a regular groom booked online.\nBoth answers also fill your site\'s business profile, which every later AI job for the site reads.'
1259
+ },
1260
+ {
1261
+ path: '/ai/start-with-ai',
1262
+ title: 'Start a new site with AI',
1263
+ heading: 'Style',
1264
+ anchor: '#style',
1265
+ text: 'The Style cards decide how the site looks and which pages it usually has: an online store, a portfolio, a restaurant, a blog and so on. One is picked for you from your first answer; choose another to change it. Each style gives the site its own variation, so two sites with the same style still look different. See Looks and themes for AI sites.'
1266
+ },
1267
+ {
1268
+ path: '/ai/start-with-ai',
1269
+ title: 'Start a new site with AI',
1270
+ heading: 'Details',
1271
+ anchor: '#details',
1272
+ text: '- Where do form submissions go? decides where messages from the site\'s contact form land:\n- The Inbox (the default): every message is one to read and reply to.\n- The Inbox, and CRM as a lead: every message with an email address is also a lead to follow up.\nYou can change this on the form itself afterwards.\n- Pages is how many pages to write: 4 to 8 on a paid plan (5 unless you change it), 1 or 2 on the Free plan.\n- Welcome email (paid plans): Draft one writes a welcome email for the people who get in touch through the site, saying what became of their message. It is a draft design. Nothing sends it until you put it in an automation or a campaign. Free starts do not draft one.\nOn a paid plan a Model switch sits beside Plan my site. Leave it on Auto unless you have a reason to choose; see Choosing a model.'
1273
+ },
1274
+ {
1275
+ path: '/ai/start-with-ai',
1276
+ title: 'Start a new site with AI',
1277
+ heading: 'What it will cost',
1278
+ anchor: '#what-it-will-cost',
1279
+ text: 'The bar at the bottom shows what the start can cost before you begin. On a paid plan it is an estimate. On the Free plan it is the most the start can cost, next to how many of your free credits are left this month and when they reset. If what is left cannot cover it, Plan my site is turned off and the window says so. It also tells you if one page would fit. See Before a job starts.'
1280
+ },
1281
+ {
1282
+ path: '/ai/start-with-ai',
1283
+ title: 'Start a new site with AI',
1284
+ heading: 'What gets built',
1285
+ anchor: '#what-gets-built',
1286
+ text: 'Plan my site starts the job straight away. A guided start has no plan to approve. It builds, in this order:\n1. A look: a base theme, colors, fonts and the style of buttons, cards and forms, made for your kind of site. See Looks and themes.\n2. A header and footer, as the layout every page sits in, with a link to each page.\n3. A contact form, saved on the Forms page, routed the way you chose, and placed on the page that needs it.\n4. Your first posts or products, on paid plans, when the site is a blog or a store. See A store from the start and A blog from the start.\n5. Your pages, each with its sections, its address and its own search title and description. A home page opens with a hero and has several bands below it, such as services, about, social proof and a closing call to action. Photos come from your media library or a stock photo.\n6. A welcome email draft, if you asked for one.\n7. Publishing: see Published, and found by search engines.\nContact details are never made up. A phone number, address or opening hours appear only when you have entered them in your site settings.'
1287
+ },
1288
+ {
1289
+ path: '/ai/start-with-ai',
1290
+ title: 'Start a new site with AI',
1291
+ heading: 'Building your site',
1292
+ anchor: '#building-your-site',
1293
+ text: 'Plan my site takes you to the site\'s Building your site page. It shows one row per step as it happens:\n- Planning your pages\n- Designing your look\n- Building the header and footer\n- Building your contact form\n- Writing your first posts or Adding your first products (a paid blog or store)\n- Writing your pages, then Writing page 2 of 5: About as each page is written\n- Writing your welcome email\n- Publishing your site\nEach row reads In progress, Waiting, Done, Paused, Not built or Couldn\'t be built, and a finished row shows the credits it used. Credits used so far adds them up. What we\'re building opens the plan: every page and its sections. If one part fails, its row says so and the rest of the site keeps building.\nYou can leave the page: the job keeps going, the notification you get when it finishes opens the page again, and the AI chip in the top bar says what it is doing.\nWhen it is done the page says Your site is live, with the credits the site used, View your site, which opens it in a new tab, and Edit your pages. If some pages were not built, it says how many were and offers Try again what failed, which builds only those.'
1294
+ },
1295
+ {
1296
+ path: '/ai/start-with-ai',
1297
+ title: 'Start a new site with AI',
1298
+ heading: 'Paused, or out of credits',
1299
+ anchor: '#paused-or-out-of-credits',
1300
+ text: 'When the workspace runs out of AI credits partway through, the job pauses instead of failing, and the page says Your site is paused. Nothing is lost: what it built so far is saved. Once there are credits again, from Get more AI credits or when your monthly credits reset, choose Resume. If you do not, it carries on by itself within about an hour of credits being available.'
1301
+ },
1302
+ {
1303
+ path: '/ai/start-with-ai',
1304
+ title: 'Start a new site with AI',
1305
+ heading: 'If it does not work out',
1306
+ anchor: '#try-again',
1307
+ text: 'If the site cannot be built, the page says Your site was not built and why.\n- Try again reopens the questions with your answers filled in, so you can adjust them and start a fresh job.\n- Use the starter site instead gives the site the starter home page. It is offered only while nothing has been built.\nWhen a job fails because of something on our side, the credits it used are given back: all of them if it built nothing, or the failed step\'s if it had already built some pages. The page says so. A job you cancel yourself is not given back. See Credits given back.'
1308
+ },
1309
+ {
1310
+ path: '/ai/start-with-ai',
1311
+ title: 'Start a new site with AI',
1312
+ heading: 'Published, and found by search engines',
1313
+ anchor: '#published-and-indexable',
1314
+ text: 'A guided start publishes the site when it finishes, so it is live at its address:\n- the new home page takes the site\'s address, and an untouched starter home page is moved to the trash;\n- each page gets an entry in the header\'s navigation;\n- a page that cannot be published stays a draft, and Building your site names it with the reason, for you to fix in Edit your pages and publish.\nThe site is open to search engines from the start. A guided start never hides a site from search. If you want to keep it out of search results for now, use the site\'s search indexing setting.\nUntil the site is built, its address shows a short coming soon page with the site\'s name, which search engines are asked not to index.'
1315
+ },
1316
+ {
1317
+ path: '/ai/start-with-ai',
1318
+ title: 'Start a new site with AI',
1319
+ heading: 'The site\'s search listing',
1320
+ anchor: '#the-sites-search-listing',
1321
+ text: 'The site\'s own search title and description, the fallback for every page without its own, are not saved for you. The site\'s SEO section shows them in a card, The listing your answers describe. Put in the form stages them in the SEO form below as unsaved changes, and the form\'s Update saves them.'
1322
+ },
1323
+ {
1324
+ path: '/ai/start-with-ai',
1325
+ title: 'Start a new site with AI',
1326
+ heading: 'A store from the start',
1327
+ anchor: '#a-store-from-the-start',
1328
+ text: 'On a paid plan, a site with the Online store style also gets three to six products, each with a description and a photo, and a Cart button in the header. Each product gets a starting price of $25 so it can be bought; set its real price, and your own photo, in Products. A product without a price shows Price coming soon on the store, with no Add to cart, until you give it one. See Product copy and catalogs with AI.'
1329
+ },
1330
+ {
1331
+ path: '/ai/start-with-ai',
1332
+ title: 'Start a new site with AI',
1333
+ heading: 'A blog from the start',
1334
+ anchor: '#a-blog-from-the-start',
1335
+ text: 'On a paid plan, a site with the Blog & writing style also gets a Blog collection with three posts, signed with the business name and published with the site. Each post has a cover photo, and the blog\'s index page shows the covers on its cards. See Build a blog.'
1336
+ },
1337
+ {
1338
+ path: '/ai/start-with-ai',
1339
+ title: 'Start a new site with AI',
1340
+ heading: 'On the Free plan',
1341
+ anchor: '#on-the-free-plan',
1342
+ text: 'A Free start builds one or two pages: the home page and the one page your business most needs. It keeps the site within about eight sections in all, uses the same look, header, footer and contact form as a paid start, and drafts no welcome email, posts or products. It spends from the 300 AI credits a Free workspace has each month.'
1343
+ },
1344
+ {
1345
+ path: '/ai/start-with-ai',
1346
+ title: 'Start a new site with AI',
1347
+ heading: 'Who can use it',
1348
+ anchor: '#who-can-use-it',
1349
+ text: 'Start with AI appears when your workspace has AI generation, you have the Generate with AI permission, and AI is on for the site. Otherwise a new site opens on the starter site. See Who can use Aglyn AI.'
1350
+ },
1351
+ {
1352
+ path: '/ai/start-with-ai',
1353
+ title: 'Start a new site with AI',
1354
+ heading: 'Related',
1355
+ anchor: '#related',
1356
+ text: '- Looks and themes for AI sites\n- Stock photos in AI sites\n- Business profile\n- AI credits\n- AI jobs and activity'
1357
+ },
1358
+ {
1359
+ path: '/ai/stock-photos',
1360
+ title: 'Stock photos in AI sites',
1361
+ heading: '',
1362
+ anchor: '',
1363
+ text: 'Stock photos in AI sites\nWhen Aglyn AI writes the pages of a site started with AI, each picture it needs, such as a hero, a service card or a blog cover, is found as a free stock photo that matches what that part of the page is about.'
1364
+ },
1365
+ {
1366
+ path: '/ai/stock-photos',
1367
+ title: 'Stock photos in AI sites',
1368
+ heading: 'Where the photos come from',
1369
+ anchor: '#where-the-photos-come-from',
1370
+ text: 'Photos come from Pixabay, a library of free photos. The job searches it with words from your page, such as dog grooming salon, and picks a photo that fits the space.\nWhen no photo matches, or stock photos are not available on the deployment your workspace runs on, the space gets one of the starter photos that come with every site.'
1371
+ },
1372
+ {
1373
+ path: '/ai/stock-photos',
1374
+ title: 'Stock photos in AI sites',
1375
+ heading: 'In your media library',
1376
+ anchor: '#in-your-media-library',
1377
+ text: 'Every photo used is copied into the site\'s own media library, and the page uses that copy, not an address on Pixabay. That means:\n- the photo keeps working whatever happens on Pixabay;\n- it is listed in Media like any file you upload, with alt text you can edit;\n- the same photo used twice is stored once;\n- you replace it like any image: select it on the page and choose another from your library, or upload your own.'
1378
+ },
1379
+ {
1380
+ path: '/ai/stock-photos',
1381
+ title: 'Stock photos in AI sites',
1382
+ heading: 'Credits',
1383
+ anchor: '#credits',
1384
+ text: 'Stock photos cost no AI credits. Finding and copying them calls no AI model, so they add nothing to the start\'s estimate.\nTo make a picture rather than find one, use Create images with AI, which does use credits.'
1385
+ },
1386
+ {
1387
+ path: '/ai/stock-photos',
1388
+ title: 'Stock photos in AI sites',
1389
+ heading: 'The photographer\'s credit',
1390
+ anchor: '#the-photographers-credit',
1391
+ text: 'Pixabay\'s license does not require a credit on your page, and none is added to your site. Each photo\'s details in the media library still say who took it, as Photo by the photographer\'s name on Pixabay, with the license it was used under, so you can credit them if you wish.'
1392
+ },
1393
+ {
1394
+ path: '/ai/stock-photos',
1395
+ title: 'Stock photos in AI sites',
1396
+ heading: 'What is sent',
1397
+ anchor: '#what-is-sent',
1398
+ text: 'Only the search words are sent to Pixabay: never your brief, your business details or anything that identifies you or your visitors. See Privacy and Aglyn AI.'
1399
+ },
1400
+ {
1401
+ path: '/ai/stock-photos',
1402
+ title: 'Stock photos in AI sites',
1403
+ heading: 'Related',
1404
+ anchor: '#related',
1405
+ text: '- Start a new site with AI\n- Media Library & CDN\n- Create images with AI'
1406
+ },
868
1407
  {
869
1408
  path: '/ai/theme-assist',
870
1409
  title: 'Change your site\'s theme with AI',
@@ -876,7 +1415,7 @@ export const DOCS_SECTION_INDEX = [
876
1415
  path: '/ai/theme-assist',
877
1416
  title: 'Change your site\'s theme with AI',
878
1417
  heading: 'Change what you describe, or design a new theme',
879
- anchor: '#change-what-you-describe-or-design-a-new-theme',
1418
+ anchor: '#describe-a-change',
880
1419
  text: '- Change what I describe makes a targeted change. "Make it feel warmer" proposes new colors and leaves your font, corners and spacing alone; "bigger headings on mobile" changes heading sizes on phones and nothing else. Anything the proposal does not name keeps its current value.\n- Design a new theme proposes a complete look — accents, backgrounds, text and their dark values — from a brief like "warm and editorial, deep green primary, serif headings".'
881
1420
  },
882
1421
  {
@@ -1759,7 +2298,7 @@ export const DOCS_SECTION_INDEX = [
1759
2298
  title: 'Reusable components',
1760
2299
  heading: 'Manage',
1761
2300
  anchor: '#manage',
1762
- text: 'From the site\'s Components page you can rename, edit the description, open the besigner, or delete a reusable component. The component\'s ID is persisted inside every page that places it and never changes.\nYou can also give a component its own icon, from the same picker the besigner uses for icon elements — either in the Edit component dialog on the Components page, or on the component\'s detail page. Every instance is then marked with it: in the hierarchy, on the canvas badge, and in the element drawer under Your components. A page assembled from promoted sections becomes readable at a glance. Components without an icon keep the generic package glyph.\nFilters in the Components table\'s toolbar narrows the list by name (a word of it, or the whole name), Used in (page or email), ID, or the date it was last updated, and Search finds a component by the start of any word of its name. Every filter and the search word are part of the list\'s query, so they look through every component on the site, not only the page on screen. The table lists components by ID and its column headers do not re-sort it; an Updated filter lists the matches most recently updated first. Each filter in force shows as a chip above the table. A combination that cannot be asked at once — a name "contains" filter beside a search, or an ID "starts with" beside an Updated filter (one range at a time) — is left out, and the table says which one and why. See Filter and search a list.'
2301
+ text: 'From the site\'s Components page you can rename, edit the description, open the besigner, or delete a reusable component. The component\'s ID is persisted inside every page that places it and never changes.\nYou can also give a component its own icon, from the same picker the besigner uses for icon elements — either in the Edit component dialog on the Components page, or on the component\'s detail page. Every instance is then marked with it: in the hierarchy, on the canvas badge, and in the element drawer under Your components. A page assembled from promoted sections becomes readable at a glance. Components without an icon keep the generic package glyph.\nFilters in the Components table\'s toolbar narrows the list by name (a word of it, or the whole name), Used in (page or email), ID, or the date it was last updated, and Search finds a component by the start of any word of its name. Every filter and the search word are part of the list\'s query, so they look through every component on the site, not only the page on screen. The table lists components by ID and its column headers do not re-sort it; an Updated filter lists the matches most recently updated first. Each filter in force shows as a chip above the table. A combination that cannot be asked at once — a name "contains" filter beside a search, or an ID "starts with" beside an Updated filter (one range at a time) — is left out, and the table says which one and why. See Filter and search a list.\nA component\'s Details card {#component-details-card}\nThe Details card on a component\'s page is where you name and describe it: edit the Display name, the Description shown in the components list and the element drawer, and the icon that marks every instance in the Besigner, then press Save. The component\'s ID is shown underneath; it'
1763
2302
  },
1764
2303
  {
1765
2304
  path: '/building-sites/besigner/reusable-components',
@@ -2011,7 +2550,7 @@ export const DOCS_SECTION_INDEX = [
2011
2550
  title: 'Bindings, Variables & Functions',
2012
2551
  heading: 'No-code functions',
2013
2552
  anchor: '#no-code-functions',
2014
- 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'
2553
+ 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.\nThe Functions card {#functions-card}\nThe Functions card on a site\'s Logic page lists every function the site has, each with its parameters and the value it returns — press Add function to build one, or Edit to change it. Usage finds where a function is used before you change it, and Delete removes it. Your plan sets ho'
2015
2554
  },
2016
2555
  {
2017
2556
  path: '/building-sites/bindings/overview',
@@ -2181,6 +2720,41 @@ export const DOCS_SECTION_INDEX = [
2181
2720
  anchor: '#related',
2182
2721
  text: '- Connect a domain'
2183
2722
  },
2723
+ {
2724
+ path: '/building-sites/live-chat',
2725
+ title: 'Live chat',
2726
+ heading: '',
2727
+ anchor: '',
2728
+ text: 'Live chat\nPut your own Tidio or LiveChat chat on your site. Visitors press the chat button in the corner of the page, and you answer them from your Tidio or LiveChat inbox, as you would on any other site. Your conversations, agents, greetings and chatbots stay in your Tidio or LiveChat account; Aglyn only puts the chat on your pages.\nLive chat is included on every plan. You need your own Tidio or LiveChat account.'
2729
+ },
2730
+ {
2731
+ path: '/building-sites/live-chat',
2732
+ title: 'Live chat',
2733
+ heading: 'Set up live chat',
2734
+ anchor: '#set-up-live-chat',
2735
+ text: 'Connect your own Tidio or LiveChat account by its public key or license number, then choose which pages show the chat.\n1. Turn on Live chat for the site under Admin → Plugins → Live chat. It is off for every site until you turn it on.\n2. Open the site\'s Setup page and find the Live chat card.\n3. Choose your Chat service: Tidio or LiveChat.\n4. Paste the identifier from your chat service\'s install code. You can paste the whole install code and Aglyn takes the identifier out of it.\n- Tidio: the Public key, under Settings → Developer in Tidio.\n- LiveChat: the License number, in the install code under Settings → Channels → Website in LiveChat.\n5. Turn on Show the chat on this site and press Save.\nSaving refreshes your live pages, so the chat button appears within a minute. Only a site admin can change the card; everyone else on the site can see how it is set.\nTo pause the chat without losing your settings, turn off Show the chat on this site and save. Switching Live chat off under Admin → Plugins removes it from the site\'s pages too, and keeps the settings for later.'
2736
+ },
2737
+ {
2738
+ path: '/building-sites/live-chat',
2739
+ title: 'Live chat',
2740
+ heading: 'Which pages show the chat',
2741
+ anchor: '#which-pages-show-the-chat',
2742
+ text: 'Under Pages, choose:\n- Every page (the default).\n- Only these pages, then list them.\n- Every page except these, then list them.\nList one page address per line, such as /contact. End an address with / to cover a whole section: /shop/ covers /shop and every page under it. You can list up to 50.\nThe chat never appears in the Besigner or anywhere else in the console, only on your published pages.\nChat button sets the corner the button sits in. Choose the same side you chose in Tidio or LiveChat, so the button and the chat open in the same place.'
2743
+ },
2744
+ {
2745
+ path: '/building-sites/live-chat',
2746
+ title: 'Live chat',
2747
+ heading: 'How the chat loads',
2748
+ anchor: '#how-the-chat-loads',
2749
+ text: 'The chat is built to keep your pages fast. Until a visitor asks for it, the page carries only a small chat button, drawn after the page has finished loading. Tidio or LiveChat loads when:\n- A visitor presses the chat button. The chat loads and opens.\n- The same visitor opens another page in the same browser tab. Their chat comes with them, so a conversation is not cut off.\n- You turned on Load the chat with the page, once the page has finished loading, for visitors who allowed analytics. With it on, your chat service\'s own greetings, proactive messages and visitor list work before anyone presses the button. A visitor who has not allowed analytics still gets the chat when they press the button.\nLoad the chat with the page is off by default. It needs your site\'s cookie consent to be running, which it is whenever the site has a Google Analytics or Google Tag Manager ID. On a site with neither, or one that turned the consent tool off, the chat loads only when a visitor presses the button.'
2750
+ },
2751
+ {
2752
+ path: '/building-sites/live-chat',
2753
+ title: 'Live chat',
2754
+ heading: 'Privacy and cookies',
2755
+ anchor: '#privacy-and-cookies',
2756
+ text: 'Tidio and LiveChat keep the visitor\'s conversation and recognize them when they come back, in the visitor\'s browser: Tidio mostly in local storage (tidiostate…, tidiotoken), LiveChat in the lccid and lccst cookies. Neither uses them for advertising.\n- When a visitor presses the chat button, they are asking for the chat, so it loads whatever they answered on your consent banner.\n- When the chat loads with the page, it waits for the visitor\'s analytics consent, and your consent banner names your chat service beside Google Analytics. A visitor who later withdraws consent has the chat taken off the page and its storage deleted, unless they had pressed the chat button themselves.\nYour chat service receives what visitors type into the chat, the page they are on and their browser\'s details. It is your account with that service, under your agreement with it; list it in your site\'s privacy policy.\nYour site\'s security policy admits the addresses Tidio or LiveChat need only while the chat is on, so you do not need to add them under Security yourself.'
2757
+ },
2184
2758
  {
2185
2759
  path: '/building-sites/menus-and-navigation/overview',
2186
2760
  title: 'Menus & navigation',
@@ -2307,6 +2881,13 @@ export const DOCS_SECTION_INDEX = [
2307
2881
  anchor: '',
2308
2882
  text: 'Multilingual\nReach a wider audience by publishing your site in more than one language.\nPlan availability Business and above. Multilingual is on Business, Scale, Advanced, Agency and Enterprise. Every plan can set the one language its site is written in: enter a single code (for example es) in Languages and save. A second language needs Business.'
2309
2883
  },
2884
+ {
2885
+ path: '/building-sites/multilingual/overview',
2886
+ title: 'Multilingual',
2887
+ heading: 'The Languages card',
2888
+ anchor: '#languages-card',
2889
+ text: 'The Languages card in Setup lists the languages your site publishes in: type their codes, comma-separated (en, es, fr), pick the Default, and press Save languages. Then link each page to its translations from the Pages list (the globe button), and add a language switcher so visitors can change language.\nThe default is the language your site declares on every page — see What language your site says it is in.'
2890
+ },
2310
2891
  {
2311
2892
  path: '/building-sites/multilingual/overview',
2312
2893
  title: 'Multilingual',
@@ -2326,7 +2907,7 @@ export const DOCS_SECTION_INDEX = [
2326
2907
  title: 'Multilingual',
2327
2908
  heading: 'Language switcher',
2328
2909
  anchor: '#language-switcher',
2329
- text: 'Add a language switcher so visitors can move between locales themselves.\nHow-tos\n- Add a locale\n- Add a language switcher\nThis is multilingual v1.'
2910
+ text: 'Add a language switcher so visitors can move between locales themselves.\nHow-tos\n- Add a locale\n- Add a language switcher\n- Translate with Weglot — your own Weglot account translates pages in the visitor\'s browser (for visitors, not for search ranking)\nThis is multilingual v1.'
2330
2911
  },
2331
2912
  {
2332
2913
  path: '/building-sites/multilingual/overview',
@@ -2335,6 +2916,83 @@ export const DOCS_SECTION_INDEX = [
2335
2916
  anchor: '#related',
2336
2917
  text: '- SEO toolkit\n- Pages & layouts'
2337
2918
  },
2919
+ {
2920
+ path: '/building-sites/multilingual/weglot',
2921
+ title: 'Translate with Weglot',
2922
+ heading: '',
2923
+ anchor: '',
2924
+ text: 'Translate with Weglot\nIf you already use Weglot, Aglyn can load it on your published pages with your own Weglot account. Weglot translates each page in the visitor\'s browser, and a language switcher lets visitors pick their language.\nPlan availability Business and above, the same plans as Multilingual. On other plans, nothing is added to your pages.\nYou need your own Weglot account. Weglot\'s plan decides how many words and languages you can translate, and Weglot bills you for it. Aglyn charges nothing extra.'
2925
+ },
2926
+ {
2927
+ path: '/building-sites/multilingual/weglot',
2928
+ title: 'Translate with Weglot',
2929
+ heading: 'Translated pages are for visitors, not search engines',
2930
+ anchor: '#seo',
2931
+ text: 'Weglot\'s JavaScript translation runs after the page loads, at the same address as the original. Search engines index your site in the language it is written in, so the translations may not rank in other languages.\nAglyn adds no hreflang tags for Weglot\'s languages, and it does not support Weglot\'s subdomain or subdirectory setups. Those setups give each language its own address, which needs DNS and server routing your Aglyn site does not provide.\nIf a language needs to rank in search, use Aglyn\'s own locale variants. Each variant is a real page at its own address with hreflang tags. You can use both on one site: Weglot for languages you want to offer visitors, and locale variants for languages that need to rank. Don\'t set up the same language both ways.'
2932
+ },
2933
+ {
2934
+ path: '/building-sites/multilingual/weglot',
2935
+ title: 'Translate with Weglot',
2936
+ heading: 'Before you start',
2937
+ anchor: '#before-you-start',
2938
+ text: '1. In Weglot, create a project for your site. Set its original language and the languages you want to translate into.\n2. Copy the project\'s API key from Weglot\'s project settings. It starts with wg. Weglot designed this key to be public, and it appears in your pages\' source.'
2939
+ },
2940
+ {
2941
+ path: '/building-sites/multilingual/weglot',
2942
+ title: 'Translate with Weglot',
2943
+ heading: 'Turn it on',
2944
+ anchor: '#turn-it-on',
2945
+ text: '1. Go to Sites → your site → Admin → Plugins. On the Site plugins card, switch on Weglot translation and press Save site plugins. It starts off on every site.\n2. On that card, select Weglot translation to open the plugin\'s page for this site.\n3. On the Weglot translation settings card, enter:\n- Translate this site with Weglot: on.\n- Weglot API key: the wg key you copied.\n- Language your site is written in: a code such as en. It must match the original language of your Weglot project.\n- Languages to translate into: codes separated by commas, such as fr, es, de. Use the same languages as in your Weglot project.\n- Language switcher: Matches your site\'s theme (Aglyn\'s switcher, drawn with your theme) or Weglot\'s own switcher.\n- Switcher position: bottom right or bottom left.\n4. Press Save site settings. Your published pages update right away.'
2946
+ },
2947
+ {
2948
+ path: '/building-sites/multilingual/weglot',
2949
+ title: 'Translate with Weglot',
2950
+ heading: 'Weglot translation settings',
2951
+ anchor: '#settings',
2952
+ text: 'The settings card holds your Weglot API key, your site\'s language, the languages to translate into, and which switcher visitors see and where.\nTo give every site in a workspace the same settings, set them on the plugin\'s workspace page under Plugins. Each site follows those settings unless you change a field on that site\'s page. Each site still has to switch the plugin on. A workspace save reaches published pages when their cache next refreshes (within an hour). A save on a site\'s own page updates that site right away.\nThe settings card won\'t save while translation is on and a field can\'t be used, such as a key that doesn\'t start with wg, or a target language that is the same as your site\'s language.'
2953
+ },
2954
+ {
2955
+ path: '/building-sites/multilingual/weglot',
2956
+ title: 'Translate with Weglot',
2957
+ heading: 'What visitors see',
2958
+ anchor: '#what-visitors-see',
2959
+ text: '- The switcher appears in the corner you picked. Aglyn\'s switcher lists each language by its own name (Français, Español). Once Weglot has loaded, it lists only languages your Weglot project actually serves.\n- Choosing a language translates the page. Weglot remembers the choice, so the visitor\'s next pages and later visits open in that language.\n- Weglot\'s own options, such as redirecting visitors by their browser language, come from your Weglot dashboard.\nWeglot doesn\'t run in the Besigner or in the console\'s page preview. To check it, open your published site.'
2960
+ },
2961
+ {
2962
+ path: '/building-sites/multilingual/weglot',
2963
+ title: 'Translate with Weglot',
2964
+ heading: 'How it affects page speed',
2965
+ anchor: '#page-speed',
2966
+ text: 'Weglot\'s script is about 73 KB compressed and comes from Weglot\'s servers. Aglyn never lets it hold up the first view of your page:\n- Visitors who chose a translated language before get the script as soon as the page starts loading, without blocking it. Until the translation arrives, Weglot hides the text instead of showing the original language first.\n- Everyone else gets the script after the page has loaded and the browser is idle. Most of these visitors read your site in its own language. If they pick a language before then, Weglot loads right away.\nVisitors redirected by Weglot\'s browser-language option may see the original text briefly on their first visit, because Weglot loads after the page. Later visits load it early.'
2967
+ },
2968
+ {
2969
+ path: '/building-sites/multilingual/weglot',
2970
+ title: 'Translate with Weglot',
2971
+ heading: 'Cookies and privacy',
2972
+ anchor: '#cookies-and-privacy',
2973
+ text: 'Weglot stores these in the visitor\'s browser:\n- wglang: the language they chose.\n- wg-translations and wg-slugs: a cache of the translations already fetched.\n- WGCHOOSEORIGINAL: a cookie that lasts one month. Weglot sets it only when your project redirects by browser language and the visitor picks the original language.\nNone of these measure visitors or show them ads. They remember a choice the visitor made and serve the translation they asked for. That\'s why Weglot is in the always on (strictly necessary) group and is not held back by the cookie banner.\nTo translate a page, the visitor\'s browser sends Weglot the page\'s text, its address, the chosen language and the browser\'s language. If your Weglot project counts page views, the browser also reports each page view to Weglot. You chose Weglot as your vendor, so Aglyn\'s servers never contact it.'
2974
+ },
2975
+ {
2976
+ path: '/building-sites/multilingual/weglot',
2977
+ title: 'Translate with Weglot',
2978
+ heading: 'Security',
2979
+ anchor: '#security',
2980
+ text: 'Your site\'s security policy allows Weglot\'s addresses (cdn.weglot.com, cdn-api-weglot.com and api.weglot.com) only while Weglot is switched on and enabled for that site. Every other site\'s policy blocks them.'
2981
+ },
2982
+ {
2983
+ path: '/building-sites/multilingual/weglot',
2984
+ title: 'Translate with Weglot',
2985
+ heading: 'Turn it off',
2986
+ anchor: '#turn-it-off',
2987
+ text: 'You can turn off Translate this site with Weglot in the settings, or switch the plugin off on the Site plugins card. Either way, the script and the switcher stop loading on your pages. Your settings stay saved, and your Weglot account keeps its translations.'
2988
+ },
2989
+ {
2990
+ path: '/building-sites/multilingual/weglot',
2991
+ title: 'Translate with Weglot',
2992
+ heading: 'Related',
2993
+ anchor: '#related',
2994
+ text: '- Multilingual: locale variants and hreflang.\n- Cookie consent\n- Plugins & Marketplace: how site settings follow the workspace.'
2995
+ },
2338
2996
  {
2339
2997
  path: '/building-sites/redirects/create-a-redirect',
2340
2998
  title: 'Create a redirect',
@@ -2620,7 +3278,21 @@ export const DOCS_SECTION_INDEX = [
2620
3278
  title: 'Pages',
2621
3279
  heading: 'Pages & routing',
2622
3280
  anchor: '#screens--routing',
2623
- text: '- Each page has a title and a URL slug. Aglyn normalizes slugs and keeps a site routing map.\n- Pages form a hierarchy: pick a parent and the child inherits a nested path (/services/pricing). Changing a slug or parent cascades safe rewrites across the map, with cycle guards so you can\'t create a loop. See What a move does to a URL.\n- Reorder the hierarchy with drag-and-drop in the pages list. To organize pages without changing their addresses, put them in a group.\n- The pages list shows each page\'s Published date, and the page\'s detail view shows Date published. Both stay empty until the page goes live, and clear again if you unpublish it (including a scheduled unpublish) — so the column tells you what\'s live, not what exists. A page you\'ve just created is a draft: it holds its slug but nothing resolves there until you publish it.\n- Unpublish takes a live page off your site. It\'s in the row\'s ⋮ menu on the pages list (on published pages), on the page\'s detail view under Publishing, and on the Besigner toolbar. The page, its versions and its slug are all kept, so publishing again puts it back at the same address.\n- Unpublishing or deleting a page takes that page alone off your site. Pages nested under it stay live at their own addresses, and the confirmation lists them, so you can unpublish them one by one if that\'s what you meant. A scheduled unpublish works the same way.'
3281
+ text: '- Each page has a title and a URL slug. Aglyn normalizes slugs and keeps a site routing map.\n- Pages form a hierarchy: pick a parent and the child inherits a nested path (/services/pricing). Changing a slug or parent cascades safe rewrites across the map, with cycle guards so you can\'t create a loop. See What a move does to a URL.\n- Reorder the hierarchy with drag-and-drop in the pages list. To organize pages without changing their addresses, put them in a group.\n- The pages list shows each page\'s Published date, and the page\'s detail view shows Date published. Both stay empty until the page goes live, and clear again if you unpublish it (including a scheduled unpublish) — so the column tells you what\'s live, not what exists. A page you\'ve just created is a draft: it holds its slug but nothing resolves there until you publish it.\n- Unpublish takes a live page off your site. It\'s in the row\'s ⋮ menu on the pages list (on published pages), on the page\'s detail view under Publishing, and on the Besigner toolbar. The page, its versions and its slug are all kept, so publishing again puts it back at the same address.\n- Unpublishing or deleting a page takes that page alone off your site. Pages nested under it stay live at their own addresses, and the confirmation lists them, so you can unpublish them one by one if that\'s what you meant. A scheduled unpublish works the same way.\nSlug {#slug}\nA page\'s Slug is the path it is served at — / for the home page, about for /about — up to 60 characters. Publishing registers it in the routing map, and a nested page puts its parent\'s path in front of its own. Leave it empty to keep the page unpublished.'
3282
+ },
3283
+ {
3284
+ path: '/building-sites/screens-and-layouts/screens',
3285
+ title: 'Pages',
3286
+ heading: 'The Pages list',
3287
+ anchor: '#the-pages-list',
3288
+ text: 'A site\'s Pages list shows every page in its hierarchy, with when each was published, and is where you add, arrange and open them. Drag a page to reorder or nest it, and use a row\'s ⋮ menu to View details, Edit in besigner, Open live page, add Translations…, Save as template, Unpublish or Delete it. The plan readout opposite the heading shows how many pages your plan allows — see what counts.'
3289
+ },
3290
+ {
3291
+ path: '/building-sites/screens-and-layouts/screens',
3292
+ title: 'Pages',
3293
+ heading: 'A page\'s detail view',
3294
+ anchor: '#page-detail',
3295
+ text: 'View details opens one page\'s settings without opening its design: its basic details, publishing, who can see it, what links to it, its SEO, versions, traffic and recent activity. Open Besigner at the top of the page is where you change how it looks.\nBasic Details {#basic-details-card}\nThe Basic Details card is the page\'s record: its Page ID, Display name and Description, and when it was created, published and last updated. The published date stays empty until the page goes live. To change the display name or description, use Edit at the top of the detail view.\nUsed by {#used-by}\nThe Used by card finds everything that links to this page before you move, unpublish or delete it: press Find where this is used to scan the published version of every page and layout, every component, the pages nested under this one, and the collections that render their pages through it. Links typed as a plain address rather than picked as a page are not found, because nothing records which page they meant.\nRaw JSON {#raw-json}\nThe Raw JSON card shows the page document exactly as it is stored — a read-only view for developers checking what a page holds. It is closed by default; press the chevron to open it.'
2624
3296
  },
2625
3297
  {
2626
3298
  path: '/building-sites/screens-and-layouts/screens',
@@ -2683,7 +3355,7 @@ export const DOCS_SECTION_INDEX = [
2683
3355
  title: 'Versions & scheduled publishing',
2684
3356
  heading: 'Publish & roll back',
2685
3357
  anchor: '#publish--roll-back',
2686
- text: 'Publish on any row makes that version the live one — which is also how you roll back: publishing an older version moves the live pointer, destroys nothing, and is symmetrical, so rolling forward again is the same click.\nA save is not a publish. Saving updates the version you have open; publishing is what changes the live site. Publishing a layout version reaches every page bound to that layout, so check its Used by card first — see Layouts. A reusable component version reaches every page that places it the same way.'
3358
+ text: 'Publish on any row makes that version the live one — which is also how you roll back: publishing an older version moves the live pointer, destroys nothing, and is symmetrical, so rolling forward again is the same click.\nA save is not a publish. Saving updates the version you have open; publishing is what changes the live site. Publishing a layout version reaches every page bound to that layout, so check its Used by card first — see Layouts. A reusable component version reaches every page that places it the same way.\nA layout\'s versions {#layout-versions}\nA layout\'s page lists its versions in the Versions card, newest first, with when each was created and last updated; the live one carries a Current chip. Open takes a version into the Besigner, where you edit, publish or schedule it. A layout has no versions until you first open it in the Besigner.\nPublishing a layout version changes every page bound to it at once, so check its Used by card before you do. Saving never does — a save is not a publish.'
2687
3359
  },
2688
3360
  {
2689
3361
  path: '/building-sites/screens-and-layouts/versions-and-publishing',
@@ -2767,7 +3439,7 @@ export const DOCS_SECTION_INDEX = [
2767
3439
  title: 'SEO Toolkit',
2768
3440
  heading: 'AI agents',
2769
3441
  anchor: '#ai-agents',
2770
- text: 'Agents read a site differently from a browser. Aglyn publishes four things for them, on every site, with nothing to switch on.\nMarkdown for any page\nEvery page serves a Markdown version of itself with the navigation, styling and scripts removed. Two ways to ask:\nBoth return the same document: the page title, its summary, the content region, and a Source: line carrying the canonical URL. Site chrome is left out — that is the point. The HTML page links to its own Markdown with , so an agent reading the HTML can find it.\nA request that accepts neither HTML nor Markdown — Accept: application/pdf, say — is answered 406 Not Acceptable with a plain-text list of what IS available. Ordinary browser requests are never affected.\nThe search page is the one exception: its results are computed in the browser, so there is no Markdown version to serve and it stays HTML.\n/llms.txt\nA short guide at https://your-site/llms.txt telling an agent what the site is for and which addresses answer what — your collections that have published entries and their entry counts, search, the sitemap, the API description, and a contact route when you publish one.\nIt also lists your pages in the order your site is built: the home page, then the top-level pages as your screens list arranges them, then the pages under each of those. A page you have hidden from search — unlisted, password-protected, members-only — is never listed, so the guide agrees with your robots meta about which pages exist. A very large site lists its first two hundred in that order and leaves the rest to the sitemap.\nYou can lead it with your own words. Setup → SEO → AI agents has two boxes:\n- When to use this site — the questions you are the best source for. Be specific; an agent discounts a claim it cannot check, and generic marketin'
3442
+ text: 'Agents read a site differently from a browser. Aglyn publishes four things for them, on every site, with nothing to switch on.\nMarkdown for any page\nEvery page serves a Markdown version of itself with the navigation, styling and scripts removed. Two ways to ask:\nBoth return the same document: the page title, its summary, the content region, and a Source: line carrying the canonical URL. Site chrome is left out — that is the point. The HTML page links to its own Markdown with , so an agent reading the HTML can find it.\nA request that accepts neither HTML nor Markdown — Accept: application/pdf, say — is answered 406 Not Acceptable with a plain-text list of what IS available. Ordinary browser requests are never affected.\nThe search page is the one exception: its results are computed in the browser, so there is no Markdown version to serve and it stays HTML.\n/llms.txt\nA short guide at https://your-site/llms.txt telling an agent what the site is for and which addresses answer what — your collections that have published entries and their entry counts, search, the sitemap, the API description, and a contact route when you publish one.\nIt also lists your pages in the order your site is built: the home page, then the top-level pages as your screens list arranges them, then the pages under each of those. A page you have hidden from search — unlisted, password-protected, members-only — is never listed, so the guide agrees with your robots meta about which pages exist. A very large site lists its first two hundred in that order and leaves the rest to the sitemap.\nThe AI agents card {#ai-agents-card}\nThe AI agents card in Setup → SEO lets you open /llms.txt with your own words: which questions your site is the best source for, and what an agent should know before it fetches. It has '
2771
3443
  },
2772
3444
  {
2773
3445
  path: '/building-sites/seo/overview',
@@ -2839,6 +3511,13 @@ export const DOCS_SECTION_INDEX = [
2839
3511
  anchor: '',
2840
3512
  text: 'Site backup and packages\nDownload everything designable on a site as one file, a site package, or only the items you pick, and import it into the same site or another of your sites. An import compares each item in the file with what the site already holds, shows you what changes and asks how to handle each item before it writes anything, and you can undo it afterwards.\nPlan availability Pro and above. Site admins only.\nOpen Admin → Backup & template on the site.'
2841
3513
  },
3514
+ {
3515
+ path: '/building-sites/site-backup-and-packages',
3516
+ title: 'Site backup and packages',
3517
+ heading: 'The Backup & restore card',
3518
+ anchor: '#backup-and-restore-card',
3519
+ text: 'The Backup & restore card is where you take a copy of a site and bring one back: Download backup saves the whole site as one package, Export items saves only the items you pick, Import package loads a package into this site, and Undo import reverses the last import. Download a backup before any large change.'
3520
+ },
2842
3521
  {
2843
3522
  path: '/building-sites/site-backup-and-packages',
2844
3523
  title: 'Site backup and packages',
@@ -3180,7 +3859,7 @@ export const DOCS_SECTION_INDEX = [
3180
3859
  title: 'Templates, Blocks & Content',
3181
3860
  heading: 'Content collections & blog',
3182
3861
  anchor: '#content-collections--blog',
3183
- text: '- Create collections managed in the console.\n- Publish a blog with rich entries (images, preview, scheduling) and an RSS feed.\n- Use entry-template pages with {{entry.}} bindings to render each collection item.\nHow-tos\n- Build a blog\n- Save & share a template'
3862
+ text: 'A site\'s Content page holds its collections — a blog, a news feed, a portfolio — each with its own entries, authors and categories, published as pages of your site.\n- Create collections managed in the console.\n- Publish a blog with rich entries (images, preview, scheduling) and an RSS feed.\n- Use entry-template pages with {{entry.}} bindings to render each collection item.\nHow-tos\n- Build a blog\n- Save & share a template'
3184
3863
  },
3185
3864
  {
3186
3865
  path: '/building-sites/site-templates/overview',
@@ -3238,6 +3917,13 @@ export const DOCS_SECTION_INDEX = [
3238
3917
  anchor: '#the-three-kinds',
3239
3918
  text: '| Kind | What it holds | What you get from it |\n| Page | A page\'s content | A new page, unpublished |\n| Component | An element tree | A reusable component, or a drop onto a page |\n| Layout | Page chrome — header, footer, navigation | A new shared layout |'
3240
3919
  },
3920
+ {
3921
+ path: '/building-sites/site-templates/templates-library',
3922
+ title: 'Your templates library',
3923
+ heading: 'Your Templates list',
3924
+ anchor: '#templates-list',
3925
+ text: 'A site\'s Templates page lists every template it has — pages, components and layouts you saved, ones installed from the marketplace, and Aglyn\'s starters — with how many your plan allows opposite the heading. Create Template starts a blank one; open a row to see where it came from and to use it.'
3926
+ },
3241
3927
  {
3242
3928
  path: '/building-sites/site-templates/templates-library',
3243
3929
  title: 'Your templates library',
@@ -3334,7 +4020,14 @@ export const DOCS_SECTION_INDEX = [
3334
4020
  title: 'Edit your theme',
3335
4021
  heading: 'Set colors and fonts',
3336
4022
  anchor: '#set-colors-and-fonts',
3337
- text: '- Choose your palette and typography.\n- Pick any Google font with the font browser. Your published site serves it from its own address: the font rules are part of the page and the files come from your site with a long cache, so text never waits on a stylesheet from Google, and visitors\' browsers never contact Google for your fonts.\n- Your site loads each font at the weights your text styles use, including the bold headings, so a heading never shows a stand-in weight. Each font comes either as one file per weight or as one file holding every weight, whichever is smaller.\n- The fonts for the body text and the main heading start loading with the page. Until a font arrives, text shows in a fallback that is sized to match it, so nothing moves when the font swaps in.\n- A site that picks no font uses the visitor\'s system font and loads no font files.\n- Configure both light and dark schemes. Published sites follow the visitor\'s system scheme (or their choice in the theme mode switcher); anything you leave unset under Dark comes from the platform\'s default dark palette, so a site goes dark without a dark design of its own.\n- Dark scheme — set it to Off when your content only reads well in light: every visitor stays on light and the theme mode switcher is hidden on published pages.'
4023
+ text: '- Choose your palette and typography.\n- Pick any Google font with the font browser. Your published site serves it from its own address: the font rules are part of the page and the files come from your site with a long cache, so text never waits on a stylesheet from Google, and visitors\' browsers never contact Google for your fonts.\n- Your site loads each font at the weights your text styles use, including the bold headings, so a heading never shows a stand-in weight. Each font comes either as one file per weight or as one file holding every weight, whichever is smaller.\n- The fonts for the body text and the main heading start loading with the page. Until a font arrives, text shows in a fallback that is sized to match it, so nothing moves when the font swaps in.\n- A site that picks no font uses the visitor\'s system font and loads no font files.\n- Configure both light and dark schemes. Published sites follow the visitor\'s system scheme (or their choice in the theme mode switcher); anything you leave unset under Dark comes from the platform\'s default dark palette, so a site goes dark without a dark design of its own.\n- Dark scheme — set it to Off when your content only reads well in light: every visitor stays on light and the theme mode switcher is hidden on published pages.\nColor scheme {#color-scheme}\nThe Color scheme card sets your site\'s colors, once for Light and once for Dark — switch between the two tabs and pick each color; the preview updates as you go.\n- Dark scheme at the top decides whether visitors can get a dark site at all: Follows the visitor, or Off — always light.\n- Palette — your brand colors: Primary, Secondary and Tertiary, plus the status colors Error, Warning, Info and Success.\n- Background & text — the page Background, the Paper cards sit on, and th'
4024
+ },
4025
+ {
4026
+ path: '/building-sites/theme-builder/edit-your-theme',
4027
+ title: 'Edit your theme',
4028
+ heading: 'Shape & spacing',
4029
+ anchor: '#shape-and-spacing',
4030
+ text: 'The Shape & spacing card sets the proportions every component follows, so buttons, cards and inputs stay consistent without restyling each one.\n- Border radius — how rounded corners are, from 0 (square) to 24px.\n- Spacing unit (px) — the step every gap and padding is a multiple of, from 2 to 16px. Raise it for a roomier site, lower it for a denser one.\n- Nav height, mobile (px) and Nav height, desktop (px) — the height of the top navigation bar on small screens, and from 600px wide up.'
3338
4031
  },
3339
4032
  {
3340
4033
  path: '/building-sites/theme-builder/edit-your-theme',
@@ -3418,7 +4111,7 @@ export const DOCS_SECTION_INDEX = [
3418
4111
  title: 'Bookings & Scheduling',
3419
4112
  heading: 'Set up bookings',
3420
4113
  anchor: '#set-up-bookings',
3421
- 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'
4114
+ text: 'The Services card on the site\'s Bookings page defines what visitors can book: each service\'s length, price and the weekly hours it is offered in.\n1. Select Add service and enter its Name, Duration (minutes) and Price (0 is free). A paid service needs Stripe connected first (see above); Show the price as offers a label such as a free estimate instead — see Price labels.\n2. Choose the service\'s Timezone and, under Weekly availability, the days and hours slots are offered.\n3. Under Booking form, choose whether to ask for a phone number or an address — see Asking for a phone number and an address.\n4. Select Save service. A service you add here is active at once.\n5. Add the booking widget to a page as a canvas element, so visitors can pick a service and a time.\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 t'
3422
4115
  },
3423
4116
  {
3424
4117
  path: '/commerce-and-bookings/bookings/overview',
@@ -3432,14 +4125,14 @@ export const DOCS_SECTION_INDEX = [
3432
4125
  title: 'Bookings & Scheduling',
3433
4126
  heading: 'Payments and fees',
3434
4127
  anchor: '#payments-and-fees',
3435
- text: 'Money for a paid booking goes to you, not to Aglyn. The charge is created on your connected Stripe account, and Aglyn takes its platform fee out of it as the Stripe Connect application fee — the same way a storefront sale works.\n- A booking is priced as a service, which bills at your plan\'s digital transaction rate: 5% on Starter, 3% on Pro, 2% on Business, 1% on Scale, and 0% from Advanced up. It is the same rate and the same ladder as digital products — bookings are not charged separately or additionally.\n- The fee is taken on the service price only. Stripe\'s own processing fee is separate and comes out of your account as usual.\n- Your current rate is shown on the Payments card of the Products hub, and the full ladder is on the plans page.\nService tax\nPaid bookings charge no tax by default, and that stays true for every site that does not change it.\nA service is not goods: the sales-tax rate configured for your store is a goods rate, and whether a service is taxable is a different question with frequently the opposite answer. So Aglyn does not apply your store\'s sales rate to an appointment. Instead, Commerce → Settings → Taxes → Service tax is where you set your own rate for it.\nWhen you set one, Aglyn adds it to the booking charge as its own receipt line using the label you choose, and records the amount and the regime on the booking. It is always your own rate — Stripe Tax is never asked to compute it, because it has no service tax code for this and would apply a goods rate to an appointment.\nThe platform fee is charged on the service price, never on the tax.\nAglyn does not provide tax advice Aglyn applies the rate you enter and records what was charged. It does not determine whether service tax applies to you, at what rate, or where it should be paid. Confirm your'
4128
+ text: 'Money for a paid booking goes to you, not to Aglyn. The charge is created on your connected Stripe account, and Aglyn takes its platform fee out of it as the Stripe Connect application fee — the same way a storefront sale works.\n- A booking is priced as a service, which bills at your plan\'s digital transaction rate: 5% on Starter, 3% on Pro, 2% on Business, 1% on Scale, and 0% from Advanced up. It is the same rate and the same ladder as digital products — bookings are not charged separately or additionally.\n- The fee is taken on the service price only. Stripe\'s own processing fee is separate and comes out of your account as usual.\n- Your current rate is shown on the Payments card of the Products hub, and the full ladder is on the plans page.\nService tax\nPaid bookings charge no tax by default, and that stays true for every site that does not change it.\nA service is not goods: the sales-tax rate configured for your store is a goods rate, and whether a service is taxable is a different question with frequently the opposite answer. So Aglyn does not apply your store\'s sales rate to an appointment. Instead, Service tax, on the Taxes card in the store\'s settings, is where you set your own rate for it.\nWhen you set one, Aglyn adds it to the booking charge as its own receipt line using the label you choose, and records the amount and the regime on the booking. It is always your own rate — Stripe Tax is never asked to compute it, because it has no service tax code for this and would apply a goods rate to an appointment.\nThe platform fee is charged on the service price, never on the tax.\nAglyn does not provide tax advice Aglyn applies the rate you enter and records what was charged. It does not determine whether service tax applies to you, at what rate, or where it should be paid'
3436
4129
  },
3437
4130
  {
3438
4131
  path: '/commerce-and-bookings/bookings/overview',
3439
4132
  title: 'Bookings & Scheduling',
3440
4133
  heading: 'Manage',
3441
4134
  anchor: '#manage',
3442
- text: 'Use the console bookings page to see and manage upcoming appointments.\nEach upcoming booking carries View in CRM, which opens the booker\'s contact — the CRM\'s Contacts list asked for their address, moving straight on to the record when exactly one person matches. A booking taken without an address has no link. A contact\'s timeline links back to this page from the booking that captured them.\nBooking from the CRM {#booking-from-the-crm}\nA contact, a lead or a deal in the CRM carries Book a meeting whenever this site runs Bookings and your plan includes it. It lists the site\'s services, each with the public link a visitor books it at — the page the booking widget sits on, with that service preselected — and a copy button. From Send email on a record, Insert booking link drops the chosen link into the message where the caret is.\nEvery link dropped from a record carries that record with it, so the booking lands on the right timeline even when the person books with a different address. A booking taken without a record reference is matched to a contact by the booker\'s address instead. Links are per service, not per person: a service has one calendar, so there is nothing narrower to link to.\nEach service has two switches in its dialog:\n- Log a meeting on the CRM record when this service is booked (on by default) — a confirmed booking is filed as a meeting on the record\'s timeline, titled with the service and the slot.\n- Create a follow-up task on the CRM record when this service is booked (off by default) — a Follow up after <service> task is filed on the record, due one business day after the slot, on whoever holds the relationship.\nNeither files anything on a site where the CRM plugin is switched off, and a booking is filed once however many times its payment confirmati'
4135
+ text: 'The Upcoming bookings card on the site\'s Bookings page lists every booking still to come, with the customer and the time each one holds.\nExport in its header downloads your bookings as a file — see Export bookings.\nEach upcoming booking carries View in CRM, which opens the booker\'s contact — the CRM\'s Contacts list asked for their address, moving straight on to the record when exactly one person matches. A booking taken without an address has no link. A contact\'s timeline links back to this page from the booking that captured them.\nBooking from the CRM {#booking-from-the-crm}\nA contact, a lead or a deal in the CRM carries Book a meeting whenever this site runs Bookings and your plan includes it. It lists the site\'s services, each with the public link a visitor books it at — the page the booking widget sits on, with that service preselected — and a copy button. From Send email on a record, Insert booking link drops the chosen link into the message where the caret is.\nEvery link dropped from a record carries that record with it, so the booking lands on the right timeline even when the person books with a different address. A booking taken without a record reference is matched to a contact by the booker\'s address instead. Links are per service, not per person: a service has one calendar, so there is nothing narrower to link to.\nEach service has two switches in its dialog:\n- Log a meeting on the CRM record when this service is booked (on by default) — a confirmed booking is filed as a meeting on the record\'s timeline, titled with the service and the slot.\n- Create a follow-up task on the CRM record when this service is booked (off by default) — a Follow up after <service> task is filed on the record, due one business day after the slot, on whoever holds the relationsh'
3443
4136
  },
3444
4137
  {
3445
4138
  path: '/commerce-and-bookings/bookings/overview',
@@ -3481,7 +4174,7 @@ export const DOCS_SECTION_INDEX = [
3481
4174
  title: 'Product catalog',
3482
4175
  heading: 'Categories and tags',
3483
4176
  anchor: '#categories-and-tags',
3484
- text: 'Categories are hierarchical (each may have a parent) and slugged for URLs. Tags are free-form labels. Both drive storefront filtering and smart collections.'
4177
+ text: 'The Categories & collections card, in the products hub\'s catalog, organizes your products into categories and collections that storefront pages and filters use.\nCategories are hierarchical (each may have a parent) and slugged for URLs. Tags are free-form labels. Both drive storefront filtering and smart collections.'
3485
4178
  },
3486
4179
  {
3487
4180
  path: '/commerce-and-bookings/commerce/catalog',
@@ -3490,6 +4183,13 @@ export const DOCS_SECTION_INDEX = [
3490
4183
  anchor: '#collections',
3491
4184
  text: 'Collections group products for landing pages and storefront blocks:\n- Manual collections are an ordered, hand-picked list.\n- Smart collections define rules — match by tag, category, price, name, or product type, with all or any semantics — and membership updates automatically as products change. Draft and archived products never appear. A smart collection lists every product that matches, however large the catalog. Saving or deleting one updates which products it holds right away. On a big catalog that can take a few seconds after Collection saved appears.\nOn a Product grid scoped to a smart collection, the grid\'s search box and its category and tag chips can\'t be combined with the collection when a rule says a product\'s tag or category is something, or when the rules are ones a single query cannot ask: any across two or more rules, a tag or category that is not, a name, a price above or is, or more than one tag or category. Using one of those controls shows a notice above the grid instead of narrowing it. The type, In stock and price controls still work, and a collection built only from type is or is not rules and a price below keeps every control. A price below rule is a price range, so that collection\'s grid is in price order — high to low if that is the sort chosen, low to high otherwise.'
3492
4185
  },
4186
+ {
4187
+ path: '/commerce-and-bookings/commerce/catalog',
4188
+ title: 'Product catalog',
4189
+ heading: 'Product reviews',
4190
+ anchor: '#product-reviews',
4191
+ text: 'The Review moderation card, in the products hub\'s Promotions section, holds the reviews shoppers leave on your products until you approve or reject them. Pro plan and above.\n1. Add a Product reviews block to your product page template, so shoppers can rate a product from 1 to 5 and write a review with their email address.\n2. Each new review waits on the card under Show: Pending. A Verified label means that email has a paid order for the product.\n3. Select Approve to publish a review, or Reject to keep it off your site. Reply adds your answer under it.\nOnly approved reviews show on your site, with the product\'s average rating. Switch Show to Approved, Rejected or All to look back.'
4192
+ },
3493
4193
  {
3494
4194
  path: '/commerce-and-bookings/commerce/catalog',
3495
4195
  title: 'Product catalog',
@@ -3502,7 +4202,7 @@ export const DOCS_SECTION_INDEX = [
3502
4202
  title: 'Product catalog',
3503
4203
  heading: 'Google Merchant Center feed',
3504
4204
  anchor: '#merchant-center-feed',
3505
- text: 'Your catalog is published as a product feed for Google Merchant Center, and for Meta, TikTok, Pinterest, Snapchat and Microsoft Shopping too. Each channel has its own feed address and setup steps under Products → Settings → Sales channels; see Sales channels.'
4205
+ text: 'Your catalog is published as a product feed for Google Merchant Center, and for Meta, TikTok, Pinterest, Snapchat and Microsoft Shopping too. Each channel has its own feed address and setup steps in the store\'s settings, under Sales channels; see Sales channels.'
3506
4206
  },
3507
4207
  {
3508
4208
  path: '/commerce-and-bookings/commerce/catalog',
@@ -3565,7 +4265,7 @@ export const DOCS_SECTION_INDEX = [
3565
4265
  title: 'Fulfillment, returns and webhooks',
3566
4266
  heading: 'Ship an order in parts',
3567
4267
  anchor: '#fulfillment',
3568
- text: 'Fulfill… in the order\'s dialog opens the Fulfill items panel. Each line starts at the units still to ship; lower a quantity to send part of a line now and the rest later. Digital and service lines have nothing to ship and never hold an order open.\n- Carrier and Tracking number make the tracking link for USPS, UPS, FedEx, DHL, Canada Post, Royal Mail and Australia Post. For any other carrier, choose Other, type its name, and paste the Tracking link yourself.\n- Notify customer emails the buyer the shipment with its tracking link. Leave it off to record a shipment quietly.\n- The order reads Partially fulfilled until every unit that ships is out, then Fulfilled.\nEach shipment is listed in the dialog. Edit tracking corrects a carrier or a number; Cancel shipment puts its units back to be shipped again. Ticking orders in the list and choosing Mark as fulfilled ships every remaining unit of each.'
4268
+ text: 'Fulfill… in the order\'s dialog opens the Fulfill items panel. Each line starts at the units still to ship; lower a quantity to send part of a line now and the rest later. Digital and service lines have nothing to ship and never hold an order open.\n- Carrier and Tracking number make the tracking link for USPS, UPS, FedEx, DHL, Canada Post, Royal Mail and Australia Post. For any other carrier, choose Other, type its name, and paste the Tracking link yourself.\n- Shipping cost is optional: what sending this shipment cost you, in your store\'s currency. Enter 0 for free shipping; leave it empty when you don\'t know. Each shipment keeps its own cost, so a partial shipment and the rest can differ. It is asked only for a shipment you enter by hand; a label you buy in Aglyn keeps what the label cost. A Faire order sends it to Faire as the shipping you paid (Marketplaces).\n- Notify customer emails the buyer the shipment with its tracking link. Leave it off to record a shipment quietly.\n- The order reads Partially fulfilled until every unit that ships is out, then Fulfilled.\nEach shipment is listed in the dialog. Edit tracking corrects a carrier or a number; Cancel shipment puts its units back to be shipped again. Ticking orders in the list and choosing Mark as fulfilled ships every remaining unit of each.'
3569
4269
  },
3570
4270
  {
3571
4271
  path: '/commerce-and-bookings/commerce/orders-and-returns',
@@ -3614,7 +4314,7 @@ export const DOCS_SECTION_INDEX = [
3614
4314
  title: 'Commerce',
3615
4315
  heading: 'Inventory',
3616
4316
  anchor: '#inventory',
3617
- text: '- Per-variant stock; blank = untracked, 0 = sold out.\n- Oversell policy per product: stop selling or allow backorders.\n- Low-stock alerts notify managers once per threshold crossing.\n- Adjustment history with reason codes (sale, restock, correction…).\n- Locations split stock across warehouses/storefronts (plan-capped); adjustments and POS sales bucket per location.\n- Reserved in checkout holds units for a shopper who has reached the payment page, so the last one cannot be sold twice.\nReserved stock {#reserved-stock}\nWhen a shopper reaches the payment page, the units in their basket are reserved — the next shopper is offered what is left, not the same unit. It is what stops two people paying for the last one.\nYour stock count does not move when a unit is reserved. A reservation is a promise, not a sale, and the count means what is on the shelf. The products list names the difference instead: 3 (1 reserved) is three units on the shelf with one of them spoken for, so two are available to buy right now.\nA reservation is released when the shopper pays (the count moves then), when they abandon the checkout, or after 31 minutes, whichever comes first. A checkout page left open expires on its own, so nothing stays reserved by someone who walked away.\nTwo cases reserve nothing, deliberately: a variant with no stock tracking has no number to reserve against, and a product set to allow backorders is one you have told us to keep selling past zero.\nSales at the register are not affected — the till never refuses a sale, because the shelf in front of the cashier is the truth.\nStock movements {#stock-movements}\nInventory → Stock movements is the history behind every tracked count — the answer to "the shelf says four and the console says six, what happened?"\nFour things write to it and '
4317
+ text: '- Per-variant stock; blank = untracked, 0 = sold out.\n- Oversell policy per product: stop selling or allow backorders.\n- Low-stock alerts notify managers once per threshold crossing.\n- Adjustment history with reason codes (sale, restock, correction…).\n- Locations split stock across warehouses/storefronts (plan-capped); adjustments and POS sales bucket per location.\n- Reserved in checkout holds units for a shopper who has reached the payment page, so the last one cannot be sold twice.\nInventory locations {#inventory-locations}\nThe Inventory locations card, in the store\'s settings, splits your stock across warehouses or storefronts: add a location for each place you keep stock, then set each variant\'s count per location.\nWithout locations, every variant has a single stock count. How many locations you can add depends on your plan; the card says when you reach the limit.\n1. Type a name under New location and select Add. The first location you add becomes the Default; Make default on another row moves it.\n2. Select Add address on a row to give the location its postal address. Shipping labels use it as the address parcels ship from (see Where parcels ship from), and buyers who pick up are sent there.\n3. Optionally select Pickup on a row to let buyers collect orders there, with pickup hours and arrival instructions — see Set up pickup.\n4. In the products hub, enter each variant\'s stock for each location.\nPOS registers sell from the location you give them, so a sale at the till takes stock from that location. Remove deletes a location after you confirm.\nReserved stock {#reserved-stock}\nWhen a shopper reaches the payment page, the units in their basket are reserved — the next shopper is offered what is left, not the same unit. It is what stops two people paying for the last one'
3618
4318
  },
3619
4319
  {
3620
4320
  path: '/commerce-and-bookings/commerce/overview',
@@ -3628,7 +4328,7 @@ export const DOCS_SECTION_INDEX = [
3628
4328
  title: 'Commerce',
3629
4329
  heading: 'Recovery & alerts',
3630
4330
  anchor: '#recovery-and-alerts',
3631
- text: 'Two queues the storefront fills and Aglyn drains for you, both visible so you can see they are moving.\nAbandoned checkouts — a shopper who reached checkout, entered their email and left. Aglyn emails them once, with a link back to the cart they had built, about fifteen minutes after that checkout has been idle for an hour. A checkout that gets completed stops reminding itself, and one that is never completed is given up on after seven days. The card shows how many are due a reminder, how many are still inside the first hour, and how many have already been reminded, with the five most recent open checkouts named. Pro plan and above.\nBack-in-stock alerts — anyone who used "Notify me when it\'s back" on a sold-out product is emailed once its stock goes above zero. The count of shoppers waiting is a demand signal worth restocking against. Available on every plan that includes commerce.\nEvery figure is counted across the whole queue, however long it is, and counted again when a checkout changes. Until a count arrives its chip shows a dash rather than a zero.\nBoth are read-only here on purpose. Sending is the scheduled job\'s to do, and a "send now" button would race it for a reminder you cannot un-send.'
4331
+ text: 'The Recovery & alerts card, in the Orders section of the products hub, shows the abandoned-checkout reminders and back-in-stock alerts Aglyn sends for you. There is nothing to set up.\nThey are two queues the storefront fills and Aglyn drains for you, both visible so you can see they are moving.\nAbandoned checkouts — a shopper who reached checkout, entered their email and left. Aglyn emails them once, with a link back to the cart they had built, about fifteen minutes after that checkout has been idle for an hour. A checkout that gets completed stops reminding itself, and one that is never completed is given up on after seven days. The card shows how many are due a reminder, how many are still inside the first hour, and how many have already been reminded, with the five most recent open checkouts named. Pro plan and above.\nBack-in-stock alerts — anyone who used "Notify me when it\'s back" on a sold-out product is emailed once its stock goes above zero. The count of shoppers waiting is a demand signal worth restocking against. Available on every plan that includes commerce.\nEvery figure is counted across the whole queue, however long it is, and counted again when a checkout changes. Until a count arrives its chip shows a dash rather than a zero.\nBoth are read-only here on purpose. Sending is the scheduled job\'s to do, and a "send now" button would race it for a reminder you cannot un-send.'
3632
4332
  },
3633
4333
  {
3634
4334
  path: '/commerce-and-bookings/commerce/overview',
@@ -3642,14 +4342,14 @@ export const DOCS_SECTION_INDEX = [
3642
4342
  title: 'Commerce',
3643
4343
  heading: 'Payment methods',
3644
4344
  anchor: '#payment-methods',
3645
- text: 'Settings → Payment methods chooses what shoppers may pay with besides a card. Cards are always on. Every other method is on unless you turn it off, except stablecoins, which you turn on. Stripe shows a method only on orders it suits: the right currency, an amount inside its limits, and a shopper in a country it serves.\n| Method | What the shopper needs | Limits |\n| Apple Pay | Safari on a Mac, iPhone or iPad with a card in Apple Wallet | Same as cards |\n| Google Pay | Chrome or an Android device with a card in Google Pay | Same as cards |\n| Link | A card or bank saved with Link | Same as cards |\n| Klarna | A US shopper paying in USD | From $10 |\n| Afterpay | A US shopper paying in USD | $1 to $4,000, one-time purchases only |\n| Affirm | A US shopper paying in USD | $50 to $30,000, one-time purchases only |\n| Cash App Pay | A US shopper with Cash App | USD only |\n| Amazon Pay | An Amazon account with a saved card | USD only |\n| Stablecoins | A crypto wallet holding USDC or another supported stablecoin | USD only, up to $10,000 |\nThe card only lists the methods the platform offers. A method missing from your card is not available for storefronts yet. Anyone who manages the store can read the card; only a site admin can change it.\nWhat each chip means. Buy-now-pay-later, Cash App Pay, Amazon Pay and stablecoins also need Stripe to enable them on your payout account. Saving the card asks Stripe for that. Stripe is reviewing means it is still checking, and Stripe needs more details means Stripe wants more information. The organization owner presses Finish in Stripe on that method to give it. A method Stripe has not enabled on your account may not be offered to shoppers.\nApple Pay needs your domain registered with Stripe. Aglyn registers your custom domain when you connect it'
4345
+ text: 'The Payment methods card, in the store\'s settings, chooses what shoppers may pay with besides a card, once your Stripe account is connected on the Payments card. Cards are always on. Every other method is on unless you turn it off, except stablecoins, which you turn on. Stripe shows a method only on orders it suits: the right currency, an amount inside its limits, and a shopper in a country it serves.\n| Method | What the shopper needs | Limits |\n| Apple Pay | Safari on a Mac, iPhone or iPad with a card in Apple Wallet | Same as cards |\n| Google Pay | Chrome or an Android device with a card in Google Pay | Same as cards |\n| Link | A card or bank saved with Link | Same as cards |\n| Klarna | A US shopper paying in USD | From $10 |\n| Afterpay | A US shopper paying in USD | $1 to $4,000, one-time purchases only |\n| Affirm | A US shopper paying in USD | $50 to $30,000, one-time purchases only |\n| Cash App Pay | A US shopper with Cash App | USD only |\n| Amazon Pay | An Amazon account with a saved card | USD only |\n| Stablecoins | A crypto wallet holding USDC or another supported stablecoin | USD only, up to $10,000 |\nThe card only lists the methods the platform offers. A method missing from your card is not available for storefronts yet. Anyone who manages the store can read the card; only a site admin can change it.\nWhat each chip means. Buy-now-pay-later, Cash App Pay, Amazon Pay and stablecoins also need Stripe to enable them on your payout account. Saving the card asks Stripe for that. Stripe is reviewing means it is still checking, and Stripe needs more details means Stripe wants more information. The organization owner presses Finish in Stripe on that method to give it. A method Stripe has not enabled on your account may not be offered to shoppers.\nApple Pay needs your d'
3646
4346
  },
3647
4347
  {
3648
4348
  path: '/commerce-and-bookings/commerce/overview',
3649
4349
  title: 'Commerce',
3650
4350
  heading: 'Shipping & taxes',
3651
4351
  anchor: '#shipping--taxes',
3652
- text: '- Shipping zones own countries (\'\' = rest of world); rates are flat, free-over-subtotal, or subtotal/weight tiers; optional local pickup. See Shipping.\n- Taxes: manual per-region rates (state beats country, VAT-style inclusive pricing supported) or Stripe Tax automatic calculation; products can be tax-exempt.\nLodging tax on reservations\nA stay is not goods. The sales-tax settings above configure a goods rate resolved against an address; occupancy (lodging/hotel) tax is a separate regime with its own rates, its own registration and its own return, so reservations do not use them.\nCommerce → Settings → Taxes → Lodging tax is where you set your own rate for it. It is off by default — leave it blank and reservations charge no lodging tax, exactly as before.\nWhen you set a rate, Aglyn adds it to the reservation charge as its own receipt line using the label you choose, and records the amount and the rate on the reservation. It is always your own rate: Stripe Tax cannot compute occupancy tax from a reservation session, so a store using Stripe Tax for goods still sets this one by hand.\nAglyn does not provide tax advice Aglyn applies the rate you enter and records what was charged. It does not determine whether lodging tax applies to you, at what rate, or where it should be paid. Confirm your obligations with a qualified tax professional.\nDeposits. A reservation usually charges a deposit rather than the whole stay, and the rate is applied to the amount actually charged — the deposit. Aglyn does not decide whether your jurisdiction wants occupancy tax on the full stay at booking, on the deposit, or at check-out. If tax is due on more than the deposit, collect the difference the way you collect the rest of the balance.\nStorefront sales tax\nAnalytics → Storefront sales tax shows w'
4352
+ text: '- Shipping zones own countries (\'\' = rest of world); rates are flat, free-over-subtotal, or subtotal/weight tiers; optional local pickup. See Shipping.\n- Taxes: manual per-region rates (state beats country, VAT-style inclusive pricing supported) or Stripe Tax automatic calculation; products can be tax-exempt.\nTax settings {#tax-settings}\nThe Taxes card, in the store\'s settings, decides how your store charges sales tax: rates you enter, Stripe Tax, or none at all. Checkout stays off until you choose an option and save, so no order is taken that cannot be taxed correctly.\n1. Choose the Calculation:\n- Manual rates — you enter the rates.\n- Stripe Tax (automatic) — Stripe works out the tax for each buyer\'s location at checkout. Activate Stripe Tax in your Stripe dashboard first.\n- Don\'t collect sales tax — no tax is added to any order, and orders still go through. Choose it when you have no obligation to collect.\n2. For manual rates, enter the Origin country and Origin state: where the store ships or sells from. It is not the address Aglyn bills your workspace at, and not where your payouts go.\n3. Select Add rate for each region you collect in: a Country, an optional State, the rate in % and the Label buyers see. A state rate beats a country rate.\n4. Turn on Prices include tax if your prices already include it, VAT-style.\n5. Optionally set a Lodging tax rate for reservations (see below) and a Service tax rate for paid bookings (see Bookings).\n6. Select Save tax settings.\nWhat the store has collected is reported on the Storefront sales tax card. A store that uses Avalara or TaxJar sets that up separately: see Tax services.\nLodging tax on reservations\nA stay is not goods. The sales-tax settings above configure a goods rate resolved against an address; occupancy (lodging/hotel)'
3653
4353
  },
3654
4354
  {
3655
4355
  path: '/commerce-and-bookings/commerce/overview',
@@ -3663,7 +4363,35 @@ export const DOCS_SECTION_INDEX = [
3663
4363
  title: 'Commerce',
3664
4364
  heading: 'Dropshipping',
3665
4365
  anchor: '#dropshipping',
3666
- text: 'Assign a supplier to a product and paid orders route automatically — by email and/or HMAC-signed webhook — with a token link the supplier uses to post tracking back, which fulfills the order. Pro plan and above.'
4366
+ text: 'Assign a supplier to a product and paid orders route automatically — by email and/or HMAC-signed webhook — with a token link the supplier uses to post tracking back, which fulfills the order. Pro plan and above.\nThe supplier needs no Aglyn account. To set it up:\n1. In the store\'s settings, find the Dropship suppliers card and select Add supplier.\n2. Enter the supplier\'s Name, and how it hears about orders: a Notification email, which gets the order details and a tracking link for each sale, a Webhook URL with its Webhook secret, or both.\n3. Open each product the supplier fulfills, and choose it under Supplier in the product editor. None (self-fulfilled) keeps the product with you.\nFrom then on, each paid order for that product is sent to the supplier. When the supplier posts tracking through its link, the order is fulfilled.'
4367
+ },
4368
+ {
4369
+ path: '/commerce-and-bookings/commerce/overview',
4370
+ title: 'Commerce',
4371
+ heading: 'Store settings',
4372
+ anchor: '#store-settings',
4373
+ text: 'The Store settings card, in the store\'s settings, sets the pages product and collection links open, the currency prices show in, guest checkout, your terms link and the receipt footer.\n1. Choose the Product page template: a page you designed with the Product detail block, rendered at /products/{slug} for every product. With None, product links lead nowhere. See The product page template.\n2. Choose the Collection page template, a page with a Product grid, rendered at /collections/{slug}.\n3. Leave Currency at USD; charges settle in USD.\n4. Turn on Allow guest checkout to let buyers pay without an account.\n5. Optionally enter a Terms URL, linked from checkout, and a Receipt footer.\n6. Select Save store settings.\nTaxes and shipping have their own cards. Store password and maintenance mode live under Site Protection.'
4374
+ },
4375
+ {
4376
+ path: '/commerce-and-bookings/commerce/overview',
4377
+ title: 'Commerce',
4378
+ heading: 'Discounts and coupons',
4379
+ anchor: '#discounts-and-coupons',
4380
+ text: 'Your store has two kinds of money-off code, both in the Promotions section of the products hub. They are your codes for your buyers — not the coupons Aglyn applies to your own subscription.\nDiscounts {#discounts}\nThe Discounts card makes codes buyers type at checkout, or automatic promotions that apply on their own, for a percent off, an amount off or free shipping.\n1. Select Add discount.\n2. Enter a Code, such as SAVE10, or leave it blank for an automatic promotion and give it a Promotion name instead.\n3. Choose the Type — Percent off, Fixed amount off or Free shipping — and its value.\n4. Optionally set a Min subtotal, a Max uses, and the dates it Starts and Ends.\n5. Select Save.\nDiscounts apply at your storefront checkout and at the register. Each row shows how many times it has been used; Edit changes it and Delete removes it. Import and Export in the card header move discounts in and out with a file.\nCoupons {#coupons}\nThe Coupons card makes simple percent-off codes buyers enter at checkout, with an optional limit on uses and an expiry date. For anything more, use a discount.\n1. Select Add coupon.\n2. Enter the Code: letters and numbers, saved in capitals, such as LAUNCH20.\n3. Enter the Percent off, and optionally Max redemptions (blank is unlimited) and the day it expires. The code still works on the day it expires.\n4. Select Create. The coupon is live at once.\nEach row shows the code, the percent off, its uses and its expiry. Disable stops a coupon without deleting it, and Enable brings it back.'
4381
+ },
4382
+ {
4383
+ path: '/commerce-and-bookings/commerce/overview',
4384
+ title: 'Commerce',
4385
+ heading: 'Commerce at a glance',
4386
+ anchor: '#commerce-glance',
4387
+ text: 'The Commerce card on your site\'s overview and Analytics pages shows the last 30 days of sales at a glance: revenue, orders, average order value, and how many products are low on stock.\nIt appears once the site has a product or an order, and the figures need the Pro plan or above; on a lower plan the card says so, and every order is still recorded. Revenue counts paid orders less what was refunded, and leaves out test-mode orders. The card lists the five latest orders, and Open store takes you to the products hub.'
4388
+ },
4389
+ {
4390
+ path: '/commerce-and-bookings/commerce/overview',
4391
+ title: 'Commerce',
4392
+ heading: 'Commerce analytics',
4393
+ anchor: '#commerce-analytics',
4394
+ text: 'The Commerce analytics card, in the Analytics section of the products hub, shows the last 30 days of revenue, orders and average order value, a 14-day revenue trend and your top products. Pro plan and above.\nNothing needs setting up: the figures come from your orders. Refunds are taken off, and pending, canceled and test-mode orders are left out. Storefront events such as viewitem and addtocart also go to your site\'s Google Analytics when it is connected. The Storefront sales tax card sits beside it.'
3667
4395
  },
3668
4396
  {
3669
4397
  path: '/commerce-and-bookings/commerce/overview',
@@ -3684,14 +4412,14 @@ export const DOCS_SECTION_INDEX = [
3684
4412
  title: 'Pickup & local delivery',
3685
4413
  heading: 'Set up pickup',
3686
4414
  anchor: '#set-up-pickup',
3687
- text: 'Pickup is set per location under Products → Settings → Inventory locations. On a location\'s row, choose Pickup, then:\n1. Turn on Buyers can pick up orders here.\n2. Enter the Pickup hours, one line per set of days, like Mo-Fr 09:00-17:00 and Sa 10:00-14:00. A line that doesn\'t read as days and times is flagged before you save.\n3. Add Arrival instructions if buyers need them, such as which door to use.\n4. Choose how long an order is Usually ready in, or leave it unsaid.\nGive the location an address too (Add address on its row), so buyers know where to go. Every location with pickup on is offered at the cart, with your default location first.\nWhen a buyer picks up at a location, that location\'s stock is reserved while they check out and sold from that location when they pay. If the location doesn\'t have enough, the cart says so and the buyer can choose another location or have it shipped. Canceling the order puts the stock back at the same location.\nThe Offer free local pickup switch on the Shipping card is the older, unnamed pickup choice. Once any location offers pickup, the cart uses your locations instead.'
4415
+ text: 'Pickup is turned on per location, on the Inventory locations card in the store\'s settings, so buyers can collect orders there at the hours you set. On a location\'s row, choose Pickup, then:\n1. Turn on Buyers can pick up orders here.\n2. Enter the Pickup hours, one line per set of days, like Mo-Fr 09:00-17:00 and Sa 10:00-14:00. A line that doesn\'t read as days and times is flagged before you save.\n3. Add Arrival instructions if buyers need them, such as which door to use.\n4. Choose how long an order is Usually ready in, or leave it unsaid.\nGive the location an address too (Add address on its row), so buyers know where to go. Every location with pickup on is offered at the cart, with your default location first.\nWhen a buyer picks up at a location, that location\'s stock is reserved while they check out and sold from that location when they pay. If the location doesn\'t have enough, the cart says so and the buyer can choose another location or have it shipped. Canceling the order puts the stock back at the same location.\nThe Offer free local pickup switch on the Shipping card is the older, unnamed pickup choice. Once any location offers pickup, the cart uses your locations instead.'
3688
4416
  },
3689
4417
  {
3690
4418
  path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
3691
4419
  title: 'Pickup & local delivery',
3692
4420
  heading: 'Set up local delivery',
3693
4421
  anchor: '#set-up-local-delivery',
3694
- text: 'Local delivery is set up on the Local delivery card under Products → Settings:\n1. Turn on Deliver orders yourself and enter the two-letter Country you deliver in.\n2. Optionally choose the location orders Leave from. Its stock is reserved and sold for delivery orders.\n3. Add one or more Zones. A zone lists the postal codes it covers: exact codes such as 10001, a prefix ending in such as 100, or a range such as 10010-10020. Each zone has its own Fee, an optional Minimum order and an optional Free over amount. When a postal code is in more than one zone, the zone listed first is used.\n4. Enter your Delivery windows, one per line, like Mo-Fr 09:00-12:00. Each line is offered on each of its days.\n5. Choose how long before a window an order must be placed (Order at least) and how many days ahead buyers can book.\n6. Optionally add What buyers should know, such as "We text when we\'re 10 minutes away." It shows at the cart and on the receipt.\nThe card lists anything that stops checkout from offering delivery, such as a zone with no postal codes or no delivery windows.\nAt the cart, the buyer enters their postal code and sees the fee, or why delivery isn\'t available, such as an order below the zone\'s minimum. Checkout charges the fee as the order\'s shipping and asks for an address in your country only. If the address the buyer then enters is outside all of your zones, the order is flagged and you\'re notified, so you can contact the buyer or refund the delivery.'
4422
+ text: 'The Local delivery card, in the store\'s settings, lets your own driver deliver orders: buyers enter their postal code at the cart, pay your fee and book a delivery time. To set it up:\n1. Turn on Deliver orders yourself and enter the two-letter Country you deliver in.\n2. Optionally choose the location orders Leave from. Its stock is reserved and sold for delivery orders.\n3. Add one or more Zones. A zone lists the postal codes it covers: exact codes such as 10001, a prefix ending in such as 100, or a range such as 10010-10020. Each zone has its own Fee, an optional Minimum order and an optional Free over amount. When a postal code is in more than one zone, the zone listed first is used.\n4. Enter your Delivery windows, one per line, like Mo-Fr 09:00-12:00. Each line is offered on each of its days.\n5. Choose how long before a window an order must be placed (Order at least) and how many days ahead buyers can book.\n6. Optionally add What buyers should know, such as "We text when we\'re 10 minutes away." It shows at the cart and on the receipt.\nThe card lists anything that stops checkout from offering delivery, such as a zone with no postal codes or no delivery windows.\nAt the cart, the buyer enters their postal code and sees the fee, or why delivery isn\'t available, such as an order below the zone\'s minimum. Checkout charges the fee as the order\'s shipping and asks for an address in your country only. If the address the buyer then enters is outside all of your zones, the order is flagged and you\'re notified, so you can contact the buyer or refund the delivery.'
3695
4423
  },
3696
4424
  {
3697
4425
  path: '/commerce-and-bookings/commerce/pickup-and-local-delivery',
@@ -3803,14 +4531,14 @@ export const DOCS_SECTION_INDEX = [
3803
4531
  title: 'POS hardware',
3804
4532
  heading: 'Card readers',
3805
4533
  anchor: '#card-readers',
3806
- text: 'The register takes card-present payments on Stripe\'s smart readers:\n| Reader | Notes |\n| Stripe Reader S700 / S710 | Android-based smart reader for the countertop or the hand. |\n| BBPOS WisePOS E | Countertop smart reader. |\nBoth are sold by Stripe. They are smart readers: each one talks to Stripe over its own internet connection, so it does not need to be plugged into or paired by Bluetooth with the device the register runs on. Card readers are shown in the console only when they are available for your store.\nGetting a reader\nReaders take payments through Aglyn\'s Stripe account, which pays your store out, so a reader is registered to your store in Aglyn rather than in a Stripe Dashboard of your own. Any supported reader can be added with the pairing code it shows, including one that was registered somewhere else before: generating a new pairing code on the reader and adding it here moves it to your store.\nStripe sells its readers through the Terminal hardware shop in the Stripe Dashboard. If you buy one there with a Stripe account of your own, add it here with a fresh pairing code from the reader, as above. Use the pairing code rather than the reader\'s serial number or order number: those two only register a reader to the Stripe account that ordered it.\nSetting one up\n1. Charge the reader and switch it on. Stripe recommends leaving it plugged in and on, even when not in use, so it receives software updates.\n2. Connect it to the internet: Wi-Fi from the reader\'s Settings, or Ethernet through Stripe\'s optional dock or hub. Stripe\'s setup guides for the S700/S710 and the WisePOS E show where each setting is, including the admin passcode the reader\'s Settings asks for.\n3. On the reader, open Settings and generate a pairing code.\n4. In the console, add the reader under Comm'
4534
+ text: 'The register takes card-present payments on Stripe\'s smart readers:\n| Reader | Notes |\n| Stripe Reader S700 / S710 | Android-based smart reader for the countertop or the hand. |\n| BBPOS WisePOS E | Countertop smart reader. |\nBoth are sold by Stripe. They are smart readers: each one talks to Stripe over its own internet connection, so it does not need to be plugged into or paired by Bluetooth with the device the register runs on. Card readers are shown in the console only when they are available for your store.\nGetting a reader\nReaders take payments through Aglyn\'s Stripe account, which pays your store out, so a reader is registered to your store in Aglyn rather than in a Stripe Dashboard of your own. Any supported reader can be added with the pairing code it shows, including one that was registered somewhere else before: generating a new pairing code on the reader and adding it here moves it to your store.\nStripe sells its readers through the Terminal hardware shop in the Stripe Dashboard. If you buy one there with a Stripe account of your own, add it here with a fresh pairing code from the reader, as above. Use the pairing code rather than the reader\'s serial number or order number: those two only register a reader to the Stripe account that ordered it.\nSetting one up\n1. Charge the reader and switch it on. Stripe recommends leaving it plugged in and on, even when not in use, so it receives software updates.\n2. Connect it to the internet: Wi-Fi from the reader\'s Settings, or Ethernet through Stripe\'s optional dock or hub. Stripe\'s setup guides for the S700/S710 and the WisePOS E show where each setting is, including the admin passcode the reader\'s Settings asks for.\n3. On the reader, open Settings and generate a pairing code.\n4. In the console, add the reader on the POS'
3807
4535
  },
3808
4536
  {
3809
4537
  path: '/commerce-and-bookings/commerce/pos-hardware',
3810
4538
  title: 'POS hardware',
3811
4539
  heading: 'Receipt printers',
3812
4540
  anchor: '#receipt-printers',
3813
- text: 'A cloud receipt printer collects its work from Aglyn over the internet, so a receipt prints from the register on any device, even one with no printer driver, and even when the printer is on a different network. Each printer belongs to one register.\nStar printers use CloudPRNT and Epson printers use Server Direct Print. Both come built into the models above.\nAdd a printer\n1. Go to Commerce → Settings. Each register has a Hardware card.\n2. Select Add printer on the register\'s card and choose the brand.\n3. Enter the model, a name such as Counter printer, and the printer\'s identity:\n- Star: the printer\'s MAC address. Hold the FEED button while you switch the printer on to print a self-test; the MAC address is on it. Use the Ethernet MAC even when the printer is on Wi-Fi.\n- Epson: any ID you choose, such as counter-1. You enter the same ID in the printer in step 5.\n4. Choose the paper width, whether the printer prints a receipt for every sale, whether it prints kitchen tickets, and whether a cash drawer is plugged into it. Select Add printer. The card shows the printer\'s URL. Copy it.\n5. Enter the URL in the printer\'s own settings page (open the printer\'s IP address, from the self-test, in a browser on the same network):\n- Star: sign in (user root; the password is public or the one on the printer\'s label), go to Settings → CloudPRNT, turn CloudPRNT on, paste the URL as the Server URL, set the polling interval to 5 seconds, then Submit and Save → Restart device.\n- Epson: in EPSON TMNet WebConfig, open Server Direct Print (under Web Service Settings on most models). Select Enable, enter the ID from step 3, paste the URL as the Server 1 URL, set the interval to 5 seconds, select Submit, and reset the printer.\n6. Within a minute the printer shows Online on the card. Select Test '
4541
+ text: 'A cloud receipt printer collects its work from Aglyn over the internet, so a receipt prints from the register on any device, even one with no printer driver, and even when the printer is on a different network. Each printer belongs to one register.\nStar printers use CloudPRNT and Epson printers use Server Direct Print. Both come built into the models above.\nAdd a printer\n1. Open the store\'s settings. Each register has a Hardware card.\n2. Select Add printer on the register\'s card and choose the brand.\n3. Enter the model, a name such as Counter printer, and the printer\'s identity:\n- Star: the printer\'s MAC address. Hold the FEED button while you switch the printer on to print a self-test; the MAC address is on it. Use the Ethernet MAC even when the printer is on Wi-Fi.\n- Epson: any ID you choose, such as counter-1. You enter the same ID in the printer in step 5.\n4. Choose the paper width, whether the printer prints a receipt for every sale, whether it prints kitchen tickets, and whether a cash drawer is plugged into it. Select Add printer. The card shows the printer\'s URL. Copy it.\n5. Enter the URL in the printer\'s own settings page (open the printer\'s IP address, from the self-test, in a browser on the same network):\n- Star: sign in (user root; the password is public or the one on the printer\'s label), go to Settings → CloudPRNT, turn CloudPRNT on, paste the URL as the Server URL, set the polling interval to 5 seconds, then Submit and Save → Restart device.\n- Epson: in EPSON TMNet WebConfig, open Server Direct Print (under Web Service Settings on most models). Select Enable, enter the ID from step 3, paste the URL as the Server 1 URL, set the interval to 5 seconds, select Submit, and reset the printer.\n6. Within a minute the printer shows Online on the card. Select Test '
3814
4542
  },
3815
4543
  {
3816
4544
  path: '/commerce-and-bookings/commerce/pos-hardware',
@@ -3838,7 +4566,7 @@ export const DOCS_SECTION_INDEX = [
3838
4566
  title: 'POS hardware',
3839
4567
  heading: 'Customer display tablet',
3840
4568
  anchor: '#customer-display-tablet',
3841
- text: 'Any tablet with a modern browser can be the customer display. It needs an internet connection, but not a sign-in: you pair it with a code from the register, as described in Customer display.\nFor a counter that runs all day:\n- Put the tablet on a stand facing the customer; landscape gives the basket and the tip buttons the most room.\n- Keep it plugged in, and set the tablet not to sleep or lock while the display page is open.\n- Use the tablet\'s own single-app or guided-access mode, if it has one, so customers cannot leave the display page.\n- Add the display page to the home screen or bookmark it, so it can be reopened quickly after a restart. A paired display stays paired until you sign it out under Commerce → Settings → POS devices, remove its register, or clear the tablet browser\'s data for the console.'
4569
+ text: 'Any tablet with a modern browser can be the customer display. It needs an internet connection, but not a sign-in: you pair it with a code from the register, as described in Customer display.\nFor a counter that runs all day:\n- Put the tablet on a stand facing the customer; landscape gives the basket and the tip buttons the most room.\n- Keep it plugged in, and set the tablet not to sleep or lock while the display page is open.\n- Use the tablet\'s own single-app or guided-access mode, if it has one, so customers cannot leave the display page.\n- Add the display page to the home screen or bookmark it, so it can be reopened quickly after a restart. A paired display stays paired until you sign it out on the POS devices card in the store\'s settings, remove its register, or clear the tablet browser\'s data for the console.'
3842
4570
  },
3843
4571
  {
3844
4572
  path: '/commerce-and-bookings/commerce/pos-hardware',
@@ -3852,7 +4580,7 @@ export const DOCS_SECTION_INDEX = [
3852
4580
  title: 'Running the register',
3853
4581
  heading: '',
3854
4582
  anchor: '',
3855
- text: 'Running the register\nEverything a till needs between the first sale of the day and the last: a counted cash drawer, a quick way to change who is ringing, the customer in front of you, returns, and a proper printed receipt. All of it runs from the register at /{site}/pos. Staff PINs are set under Commerce → Settings, and the register\'s rules under the site\'s Admin → Plugins → Commerce.\nPlan availability These are part of the point of sale, so they need Pro or above, like the register itself. Only members who can use the register — a site admin or editor whose Manage POS permission is on — can open shifts, switch in, look customers up or take returns.'
4583
+ text: 'Running the register\nEverything a till needs between the first sale of the day and the last: a counted cash drawer, a quick way to change who is ringing, the customer in front of you, returns, and a proper printed receipt. All of it runs from the register at /{site}/pos. Staff PINs are set in the store\'s settings, and the register\'s rules under the site\'s Admin → Plugins → Commerce.\nPlan availability These are part of the point of sale, so they need Pro or above, like the register itself. Only members who can use the register — a site admin or editor whose Manage POS permission is on — can open shifts, switch in, look customers up or take returns.'
3856
4584
  },
3857
4585
  {
3858
4586
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -3866,7 +4594,7 @@ export const DOCS_SECTION_INDEX = [
3866
4594
  title: 'Running the register',
3867
4595
  heading: 'Staff PINs',
3868
4596
  anchor: '#staff-pins',
3869
- text: 'A shared tablet stays signed in; each person switches in with their own PIN instead of signing out.\n- Set your 4–6 digit PIN under Commerce → Settings → Staff PINs. A PIN that is one digit repeated or a straight run like 1234 is refused.\n- At the register, tap Switch cashier, pick your name and enter your PIN. Every sale, shift and return you ring is recorded under you until someone else switches in.\n- A PIN never grants more than your role: the register checks your role and your Manage POS permission each time it is used, so removing someone\'s access takes effect on their next tap.\n- Five wrong PINs in a row lock that person out for 15 minutes. A workspace admin can reset or remove anyone\'s PIN, which also lifts a lockout.\n- Lock the register after (minutes idle) in Admin → Plugins → Commerce locks the register after that long without a tap, so the next person has to enter their PIN. Tap Lock to lock it yourself.\nPINs are stored only as salted hashes and nobody can read them back, not even a workspace admin.'
4597
+ text: 'A shared tablet stays signed in; each person switches in with their own PIN instead of signing out.\n- Set your 4–6 digit PIN on the Staff PINs card in the store\'s settings. A PIN that is one digit repeated or a straight run like 1234 is refused.\n- At the register, tap Switch cashier, pick your name and enter your PIN. Every sale, shift and return you ring is recorded under you until someone else switches in.\n- A PIN never grants more than your role: the register checks your role and your Manage POS permission each time it is used, so removing someone\'s access takes effect on their next tap.\n- Five wrong PINs in a row lock that person out for 15 minutes. A workspace admin can reset or remove anyone\'s PIN, which also lifts a lockout.\n- Lock the register after (minutes idle) in Admin → Plugins → Commerce locks the register after that long without a tap, so the next person has to enter their PIN. Tap Lock to lock it yourself.\nPINs are stored only as salted hashes and nobody can read them back, not even a workspace admin.'
3870
4598
  },
3871
4599
  {
3872
4600
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -3887,7 +4615,7 @@ export const DOCS_SECTION_INDEX = [
3887
4615
  title: 'Running the register',
3888
4616
  heading: 'Printed receipts',
3889
4617
  anchor: '#printed-receipts',
3890
- text: 'Receipts print on any 80 mm receipt printer through your browser\'s print dialog. Each receipt has your logo and store name, the order number and its barcode, the date, cashier and register, the customer\'s name, every item, discounts, tax, the total, how it was paid (card with its last four digits), the tip and change, and your receipt footer from Commerce → Settings. Two more lines are set in Admin → Plugins → Commerce: Address on printed receipts, printed under your store name, and Return policy on printed receipts, printed at the foot.\n- After each sale, the register shows Print receipt and Gift receipt for that sale until the next one completes.\n- Gift receipt prints the items and the barcode without any prices.\n- Reprint any register sale from its order on the Orders page: open the order and use Print receipt or Gift receipt.\nMost network receipt printers open the cash drawer cabled to them whenever they print, so printing a cash sale\'s receipt also opens the drawer. That is a setting on the printer.'
4618
+ text: 'Receipts print on any 80 mm receipt printer through your browser\'s print dialog. Each receipt has your logo and store name, the order number and its barcode, the date, cashier and register, the customer\'s name, every item, discounts, tax, the total, how it was paid (card with its last four digits), the tip and change, and your receipt footer from the store\'s settings. Two more lines are set in Admin → Plugins → Commerce: Address on printed receipts, printed under your store name, and Return policy on printed receipts, printed at the foot.\n- After each sale, the register shows Print receipt and Gift receipt for that sale until the next one completes.\n- Gift receipt prints the items and the barcode without any prices.\n- Reprint any register sale from its order on the Orders page: open the order and use Print receipt or Gift receipt.\nMost network receipt printers open the cash drawer cabled to them whenever they print, so printing a cash sale\'s receipt also opens the drawer. That is a setting on the printer.'
3891
4619
  },
3892
4620
  {
3893
4621
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -3903,6 +4631,55 @@ export const DOCS_SECTION_INDEX = [
3903
4631
  anchor: '#related',
3904
4632
  text: '- POS & reservations\n- Commerce overview'
3905
4633
  },
4634
+ {
4635
+ path: '/commerce-and-bookings/commerce/review-platforms',
4636
+ title: 'Review platforms (Trustpilot and Yotpo)',
4637
+ heading: '',
4638
+ anchor: '',
4639
+ text: 'Review platforms: Trustpilot and Yotpo\nYour store has its own product reviews built in, and they stay the reviews your product pages show. If you also collect reviews on Trustpilot or Yotpo Reviews, connect that account and Aglyn asks it to invite each customer once their order is on its way or has arrived.\nEach service uses your own account; Aglyn does not sell one. They come with every plan that includes selling, at no extra cost.'
4640
+ },
4641
+ {
4642
+ path: '/commerce-and-bookings/commerce/review-platforms',
4643
+ title: 'Review platforms (Trustpilot and Yotpo)',
4644
+ heading: 'Who is invited',
4645
+ anchor: '#who-is-invited',
4646
+ text: 'A review invitation is marketing email: you are asking, the customer\'s order does not require it. So an order\'s customer is invited only when:\n- they agreed to marketing email from your store (for example, by ticking the marketing box at checkout) and have not unsubscribed. An email that bounced or was reported as spam counts as unsubscribed, as it does for your campaigns;\n- the order was paid with real money: test-mode orders are never sent;\n- the order was not canceled or fully refunded by the time the invitation is due;\n- the order has an email address.\nEach order is invited once per service, however many packages it ships in and however many emails it sends.'
4647
+ },
4648
+ {
4649
+ path: '/commerce-and-bookings/commerce/review-platforms',
4650
+ title: 'Review platforms (Trustpilot and Yotpo)',
4651
+ heading: 'Trustpilot',
4652
+ anchor: '#trustpilot',
4653
+ text: 'Invite customers to review your store on Trustpilot after their order ships or arrives, by copying one order email to your Trustpilot invitation address.\nGo to Commerce → Settings and find the Trustpilot card. Under How Trustpilot hears about orders, choose one way, and under When to invite, choose:\n- When the order ships, goes out for delivery or is picked up, or\n- When the order is delivered or picked up.\nTrustpilot\'s own delay setting still applies after that.\nBy your invitation address {#trustpilot-invitation-address}\nTrustpilot gives every business an Automatic Feedback Service address that ends in @invite.trustpilot.com. No key is needed:\n1. Copy that address from your Trustpilot Business account.\n2. On the Trustpilot card, choose Copy an order email to my Trustpilot invitation address and paste it in Trustpilot invitation address. Only an address on invite.trustpilot.com is accepted.\n3. Select Save in the card\'s header.\nThe customer\'s Order shipped, Order out for delivery, Order picked up or Order delivered email (whichever comes first at the moment you chose) is then blind-copied to Trustpilot, with the customer\'s name, email and order number in a part of the email only Trustpilot reads. The customer does not see the copy. If you turn that email off under Order notifications, no copy is sent.\nBy your Trustpilot API key {#trustpilot-api}\nRolling out The API option is not yet available on aglyn.com-hosted workspaces. Until it is, the card offers the invitation address only.\nIf your Trustpilot plan includes API access, you can send invitations through it instead:\n1. In Trustpilot Business, under Integrations → Developers → APIs, create or copy an API key and secret.\n2. On the Trustpilot card, choose Trustpilot API, with my API key, and paste the API key, API secret'
4654
+ },
4655
+ {
4656
+ path: '/commerce-and-bookings/commerce/review-platforms',
4657
+ title: 'Review platforms (Trustpilot and Yotpo)',
4658
+ heading: 'Yotpo Reviews',
4659
+ anchor: '#yotpo-reviews',
4660
+ text: 'Send each shipped order to your Yotpo Reviews account, so Yotpo asks the customer for a review.\nRolling out Yotpo Reviews is not yet available on aglyn.com-hosted workspaces. Until it is, no Yotpo Reviews card appears.\n1. In your Yotpo Reviews settings, copy the app key and secret key. These are not the keys of Yotpo Loyalty & Referrals, which connects under Rewards.\n2. On the Yotpo Reviews card under Commerce → Settings, paste both, turn on Send shipped orders to Yotpo for review requests, and select Save.\nWhen an order first ships or is picked up, Aglyn sends it to Yotpo with its items, marked fulfilled, and Yotpo sends the customer its review request after the delay set in your Yotpo account.'
4661
+ },
4662
+ {
4663
+ path: '/commerce-and-bookings/commerce/review-platforms',
4664
+ title: 'Review platforms (Trustpilot and Yotpo)',
4665
+ heading: 'On the order',
4666
+ anchor: '#on-the-order',
4667
+ text: 'An order\'s details show a Review invitations section once a service was asked about it: Invited, with how and when, or Not invited, with the reason, such as a customer who has not agreed to marketing email.'
4668
+ },
4669
+ {
4670
+ path: '/commerce-and-bookings/commerce/review-platforms',
4671
+ title: 'Review platforms (Trustpilot and Yotpo)',
4672
+ heading: 'Switching it off for a site',
4673
+ anchor: '#switching-it-off-for-a-site',
4674
+ text: 'Choose Off on the Trustpilot card or turn off the Yotpo switch, or turn off Review platforms for the site in its plugin settings. New orders are not sent; reviews already collected stay in your Trustpilot and Yotpo accounts.'
4675
+ },
4676
+ {
4677
+ path: '/commerce-and-bookings/commerce/review-platforms',
4678
+ title: 'Review platforms (Trustpilot and Yotpo)',
4679
+ heading: 'Related',
4680
+ anchor: '#related',
4681
+ text: '- Order notifications\n- Tracking and protection'
4682
+ },
3906
4683
  {
3907
4684
  path: '/commerce-and-bookings/commerce/rewards-and-referrals',
3908
4685
  title: 'Rewards, referrals and store credit',
@@ -3985,21 +4762,28 @@ export const DOCS_SECTION_INDEX = [
3985
4762
  title: 'Sales channels',
3986
4763
  heading: '',
3987
4764
  anchor: '',
3988
- text: 'Sales channels\nSales channels put your catalog in front of shoppers on Google (Shopping, free listings, Search, Images and YouTube), Meta (Facebook and Instagram), TikTok, Pinterest, Snapchat and Microsoft Shopping (Bing and Copilot). Each channel reads its own product feed from your store on a schedule you set on the channel\'s side, so a price, photo or stock change reaches it without another upload.\nSales channels come with every plan that sells online. They are set up under Products → Settings → Sales channels, with one card per channel.'
4765
+ text: 'Sales channels\nSales channels put your catalog in front of shoppers on Google (Shopping, free listings, Search, Images and YouTube), Meta (Facebook and Instagram), TikTok, Pinterest, Snapchat and Microsoft Shopping (Bing and Copilot). Each channel reads its own product feed from your store on a schedule you set on the channel\'s side, so a price, photo or stock change reaches it without another upload.\nSales channels come with every plan that sells online. They are set up in the store\'s settings, under Sales channels, with one card per channel.'
4766
+ },
4767
+ {
4768
+ path: '/commerce-and-bookings/commerce/sales-channels',
4769
+ title: 'Sales channels',
4770
+ heading: 'Set up sales channels',
4771
+ anchor: '#set-up-sales-channels',
4772
+ text: 'The Sales channels card, in the store\'s settings, lists your products on shopping channels: set the feed defaults, check your products, then turn on each channel and paste its feed address there.\nYou need the store selling, a web address for the site, and an account with each channel you want — Google Merchant Center, Meta Commerce Manager and so on.\n1. Fill in Defaults for every feed — the brand and other values sent for a product that leaves them blank — and select Save. See Brand, barcode and category.\n2. Select Check products. Each channel\'s card counts what it would list, leave out and list with suggestions. See Check your products.\n3. On each channel you want, switch the feed On and paste its address into the channel. See Turn on a channel.\nAfter that, the channel reads your feed on its own schedule, and each card shows when it last did.'
3989
4773
  },
3990
4774
  {
3991
4775
  path: '/commerce-and-bookings/commerce/sales-channels',
3992
4776
  title: 'Sales channels',
3993
4777
  heading: 'Turn on a channel',
3994
4778
  anchor: '#turn-on-a-channel',
3995
- text: '1. On the channel\'s card, switch the feed On. The card shows the feed\'s address.\n2. Select Copy address.\n3. Follow the steps on the card: each one opens the channel\'s own setup and says where the address goes. In short:\n| Channel | Where the address goes | Format |\n| -- | -- | -- |\n| Google | Merchant Center → Products → add products from a file → enter a link to your file | XML |\n| Meta | Commerce Manager → Catalog → Data sources → data feed → scheduled feed | XML |\n| TikTok | Ads Manager → Assets → Catalogs → add products with a data feed → scheduled feed | CSV |\n| Pinterest | Ads → Catalogs → create a data source | TSV |\n| Snapchat | Ads Manager → Catalogs → add products from a feed URL | CSV |\n| Microsoft | Microsoft Advertising → Merchant Center → Catalog → Feeds → scheduled download | Text |\nSet the channel to fetch at least daily. Products appear on YouTube through Google: link your YouTube channel to Merchant Center in Merchant Center\'s settings.\nThe address appears once the site has a web address — a subdomain or a custom domain — and it is always on your store\'s own domain.\nKeep the address private {#keep-the-address-private}\nEach feed\'s address carries a long random code, different for every channel, and the feed answers only that address. Anyone holding it can read what your storefront already shows publicly, nothing more. If an address is shared by mistake, select Replace address (site admins): the old address stops at once and the card shows the new one to paste into the channel.\nSwitching a feed Off stops it answering; switching it back on keeps the same address, so the channel picks up where it left off.'
4779
+ text: 'Each channel has its own card: switch its feed on, copy the feed\'s address and paste it into the channel\'s own setup, which then fetches your products on a schedule.\n1. On the channel\'s card, switch the feed On. The card shows the feed\'s address.\n2. Select Copy address.\n3. Follow the steps on the card: each one opens the channel\'s own setup and says where the address goes. In short:\n| Channel | Where the address goes | Format |\n| -- | -- | -- |\n| Google | Merchant Center → Products → add products from a file → enter a link to your file | XML |\n| Meta | Commerce Manager → Catalog → Data sources → data feed → scheduled feed | XML |\n| TikTok | Ads Manager → Assets → Catalogs → add products with a data feed → scheduled feed | CSV |\n| Pinterest | Ads → Catalogs → create a data source | TSV |\n| Snapchat | Ads Manager → Catalogs → add products from a feed URL | CSV |\n| Microsoft | Microsoft Advertising → Merchant Center → Catalog → Feeds → scheduled download | Text |\nSet the channel to fetch at least daily. Products appear on YouTube through Google: link your YouTube channel to Merchant Center in Merchant Center\'s settings.\nThe address appears once the site has a web address — a subdomain or a custom domain — and it is always on your store\'s own domain.\nKeep the address private {#keep-the-address-private}\nEach feed\'s address carries a long random code, different for every channel, and the feed answers only that address. Anyone holding it can read what your storefront already shows publicly, nothing more. If an address is shared by mistake, select Replace address (site admins): the old address stops at once and the card shows the new one to paste into the channel.\nSwitching a feed Off stops it answering; switching it back on keeps the same address, so the channel picks up where'
3996
4780
  },
3997
4781
  {
3998
4782
  path: '/commerce-and-bookings/commerce/sales-channels',
3999
4783
  title: 'Sales channels',
4000
4784
  heading: 'What each product sends',
4001
4785
  anchor: '#what-each-product-sends',
4002
- text: 'Every active product is listed; drafts, archived and deleted products never are. A product with options (sizes, colors) is listed once per variant, grouped so the channel shows them as one product with choices.\nEach listing carries:\n- the name (with the variant\'s choices), description, product page link and photos — the variant\'s own photo first, then up to 10 more (20 for Meta);\n- the price in your store\'s currency, and the sale price when a compare-at price is set above it;\n- availability from your stock: in stock, out of stock, or backorder when the product keeps selling after it runs out;\n- the brand, barcode (GTIN), part number (MPN), condition and Google product category — see below;\n- your store\'s category path, and the variant\'s color and size;\n- the weight and, for Google, the packed size;\n- shipping: the cheapest rate to each country your shipping zones name, from the same rates checkout charges.\nThere is no limit on catalog size.\nBrand, barcode and category {#brand-barcode-and-category}\nChannels match listings to products they know by their identifiers. In the product editor, the Shopping channels section holds a product\'s:\n- Brand — what shoppers know it by.\n- Barcode (GTIN) — the UPC, EAN, ISBN or JAN on the packaging. A product with variants keeps a barcode per variant, in each variant\'s barcode field. A barcode whose last (check) digit does not match is not sent, because channels refuse it.\n- Part number (MPN) — the manufacturer\'s number, for products with no barcode.\n- Condition — new, refurbished or used.\n- Google product category — an id such as 2271 or a path such as Apparel & Accessories > Clothing > Dresses.\nA product you make yourself usually has no barcode: leave it blank, and the feed tells Google and Microsoft the product has no manufacturer ide'
4786
+ text: 'Every active product is listed; drafts, archived and deleted products never are. A product with options (sizes, colors) is listed once per variant, grouped so the channel shows them as one product with choices.\nEach listing carries:\n- the name (with the variant\'s choices), description, product page link and photos — the variant\'s own photo first, then up to 10 more (20 for Meta);\n- the price in your store\'s currency, and the sale price when a compare-at price is set above it;\n- availability from your stock: in stock, out of stock, or backorder when the product keeps selling after it runs out;\n- the brand, barcode (GTIN), part number (MPN), condition and Google product category — see below;\n- your store\'s category path, and the variant\'s color and size;\n- the weight and, for Google, the packed size;\n- shipping: the cheapest rate to each country your shipping zones name, from the same rates checkout charges.\nThere is no limit on catalog size.\nBrand, barcode and category {#brand-barcode-and-category}\nChannels match your listings to products they know by brand, barcode and category: set them for each product in the product editor, and store-wide on Defaults for every feed.\nChannels match listings to products they know by their identifiers. In the product editor, the Shopping channels section holds a product\'s:\n- Brand — what shoppers know it by.\n- Barcode (GTIN) — the UPC, EAN, ISBN or JAN on the packaging. A product with variants keeps a barcode per variant, in each variant\'s barcode field. A barcode whose last (check) digit does not match is not sent, because channels refuse it.\n- Part number (MPN) — the manufacturer\'s number, for products with no barcode.\n- Condition — new, refurbished or used.\n- Google product category — an id such as 2271 or a path such as Apparel & Ac'
4003
4787
  },
4004
4788
  {
4005
4789
  path: '/commerce-and-bookings/commerce/sales-channels',
@@ -4041,21 +4825,21 @@ export const DOCS_SECTION_INDEX = [
4041
4825
  title: 'Shipping',
4042
4826
  heading: '',
4043
4827
  anchor: '',
4044
- text: 'Shipping\nShipping is set up under Products → Settings → Shipping. Every order that ships is priced from the zones and rates you save there, at the storefront\'s cart, on a product\'s Buy button, and on a draft order\'s payment link.'
4828
+ text: 'Shipping\nShipping is set up in the store\'s settings, on the Shipping card. Every order that ships is priced from the zones and rates you save there, at the storefront\'s cart, on a product\'s Buy button, and on a draft order\'s payment link.'
4045
4829
  },
4046
4830
  {
4047
4831
  path: '/commerce-and-bookings/commerce/shipping',
4048
4832
  title: 'Shipping',
4049
4833
  heading: 'Zones and rates',
4050
4834
  anchor: '#zones-and-rates',
4051
- text: 'A zone owns countries; is the rest of the world. A rate belongs to one zone and prices a parcel in one of four ways:\n| Rate type | What the shopper pays |\n| -- | -- |\n| Flat | One price. |\n| Free over subtotal | One price, or nothing once the cart reaches the subtotal you set. |\n| Subtotal tiers | The price of the first tier the cart\'s subtotal fits under. |\n| Weight tiers | The price of the first tier the cart\'s weight fits under. Weight is each variant\'s weight times its quantity. |\nLocal pickup adds a free collection choice beside your rates. It does not widen where you ship: a destination no rate reaches is still refused. To let buyers choose which location to collect from, with pickup hours and a ready-for-pickup email, turn on pickup for the location instead: see Pickup & local delivery.\nCheckout charges only the rates of the zone the destination falls in, and narrows the address it collects to that destination, so a shopper cannot pick another zone\'s cheaper rate. The destination coverage rules explain what your zones make checkout ask and refuse.'
4835
+ text: 'The Shipping card, in the store\'s settings, prices every parcel: group the countries you ship to into zones, then give each zone one or more rates.\n1. Under Zones, select Add zone, enter a Zone name and its Countries as two-letter codes, such as US, CA, or for everywhere else.\n2. Under Rates, select Add rate, choose its Zone, give it a Name buyers see (a rate without one is dropped at checkout), and choose its Type and price.\n3. Optionally turn on Offer free local pickup.\n4. Check the Coverage line, which names any destination no rate reaches, then select Save shipping settings.\nA zone owns countries; is the rest of the world. A rate belongs to one zone and prices a parcel in one of four ways:\n| Rate type | What the shopper pays |\n| -- | -- |\n| Flat | One price. |\n| Free over subtotal | One price, or nothing once the cart reaches the subtotal you set. |\n| Subtotal tiers | The price of the first tier the cart\'s subtotal fits under. |\n| Weight tiers | The price of the first tier the cart\'s weight fits under. Weight is each variant\'s weight times its quantity. |\nLocal pickup adds a free collection choice beside your rates. It does not widen where you ship: a destination no rate reaches is still refused. To let buyers choose which location to collect from, with pickup hours and a ready-for-pickup email, turn on pickup for the location instead: see Pickup & local delivery.\nCheckout charges only the rates of the zone the destination falls in, and narrows the address it collects to that destination, so a shopper cannot pick another zone\'s cheaper rate. The destination coverage rules explain what your zones make checkout ask and refuse.'
4052
4836
  },
4053
4837
  {
4054
4838
  path: '/commerce-and-bookings/commerce/shipping',
4055
4839
  title: 'Shipping',
4056
4840
  heading: 'Where parcels ship from',
4057
4841
  anchor: '#where-parcels-ship-from',
4058
- text: 'Each inventory location (Products → Settings → Inventory locations) can carry a postal address: choose Add address on its row, or Edit address once it has one. The address is the street, an optional apartment or suite, city, state or region, postal code, the two-letter country code and a phone number, saved beside the location\'s name.'
4842
+ text: 'Each inventory location (the Inventory locations card in the store\'s settings) can carry a postal address: choose Add address on its row, or Edit address once it has one. The address is the street, an optional apartment or suite, city, state or region, postal code, the two-letter country code and a phone number, saved beside the location\'s name.'
4059
4843
  },
4060
4844
  {
4061
4845
  path: '/commerce-and-bookings/commerce/shipping',
@@ -4097,21 +4881,28 @@ export const DOCS_SECTION_INDEX = [
4097
4881
  title: 'Tax services (Avalara AvaTax and TaxJar)',
4098
4882
  heading: '',
4099
4883
  anchor: '',
4100
- text: 'Tax services: Avalara AvaTax and TaxJar\nIf you already calculate sales tax in an Avalara AvaTax or TaxJar account, connect it and Aglyn asks it for the tax on every sale — at your storefront\'s checkout and at the register — instead of using a flat rate. Your paid orders and refunds are recorded in that account, so its reports and filings start from what you actually sold.\nYou remain responsible for your sales tax Aglyn asks your tax service for a figure and records your sales there. It does not register you anywhere, file your returns or pay the tax you collect. Where you are registered, what you file and when are decisions for you, your tax service and your own advisor. This is different from Stripe Tax mode, where the platform collects and remits the tax for you.\nTax services come with every plan that includes selling, at no extra cost. You need your own AvaTax or TaxJar account; Aglyn does not sell one.'
4884
+ text: 'Tax services: Avalara AvaTax and TaxJar\nIf you already calculate sales tax in an Avalara AvaTax or TaxJar account, connect it and Aglyn asks it for the tax on every sale — at your storefront\'s checkout and at the register — instead of using a flat rate, while your store\'s Taxes are set to Manual rates. Under Stripe Tax it is not used. Your paid orders and refunds are recorded in that account, so its reports and filings start from what you actually sold.\nYou remain responsible for your sales tax Aglyn asks your tax service for a figure and records your sales there. It does not register you anywhere, file your returns or pay the tax you collect. Where you are registered, what you file and when are decisions for you, your tax service and your own advisor. This is different from Stripe Tax mode, where the platform collects and remits the tax for you.\nTax services come with every plan that includes selling, at no extra cost. You need your own AvaTax or TaxJar account; Aglyn does not sell one.'
4101
4885
  },
4102
4886
  {
4103
4887
  path: '/commerce-and-bookings/commerce/tax-services',
4104
4888
  title: 'Tax services (Avalara AvaTax and TaxJar)',
4105
4889
  heading: 'Before you start',
4106
4890
  anchor: '#before-you-start',
4107
- text: '- Set your store\'s Taxes to collect at your own rates (Commerce → Settings → Taxes), with a rate for where you sell. A tax service is used only in that mode. Your own rates stay as the fallback: when the service does not answer, the sale is taxed at them instead.\n- Avalara AvaTax: your account id (a number) and a license key, from AvaTax → Settings → License and API keys. If your AvaTax account has more than one company, the company code to file under.\n- TaxJar: an API token, from TaxJar → Account → TaxJar API. List the states where you collect tax (your nexus) in TaxJar: it charges no tax anywhere else.\nBoth vendors offer a free sandbox account for testing. Connect it as a sandbox first, place a test order, then connect your production account.'
4891
+ text: '- Set your store\'s Taxes to Manual rates (the Taxes card in the store\'s settings), with a rate for where you sell, and leave Prices include tax off. A tax service is used only then — see When the service is not used. Your own rates stay as the fallback: when the service does not answer, the sale is taxed at them instead.\n- Avalara AvaTax: your account id (a number) and a license key, from AvaTax → Settings → License and API keys. If your AvaTax account has more than one company, the company code to file under.\n- TaxJar: an API token, from TaxJar → Account → TaxJar API. List the states where you collect tax (your nexus) in TaxJar: it charges no tax anywhere else.\nBoth vendors offer a free sandbox account for testing. Connect it as a sandbox first, place a test order, then connect your production account.'
4108
4892
  },
4109
4893
  {
4110
4894
  path: '/commerce-and-bookings/commerce/tax-services',
4111
4895
  title: 'Tax services (Avalara AvaTax and TaxJar)',
4112
4896
  heading: 'Connect',
4113
4897
  anchor: '#connect',
4114
- text: '1. Go to Commerce → Settings and find the Tax service card.\n2. Choose Avalara AvaTax or TaxJar, and Sandbox or Production.\n3. Enter your credentials and select Connect. Aglyn tests them with the vendor first and stores nothing they refuse. The credentials are encrypted on the server and are never shown again, not even to you.\n4. Enter the ship-from address: the street, city, state and postal code you ship or sell from. Aglyn checks it with the service. It is the origin of every sale and the place an in-person sale is taxed.\nOnly an admin of the site can connect, test or disconnect a service and change its address. Test connection checks the stored credentials again whenever you like; the card shows the answer.'
4898
+ text: '1. Open the store\'s settings and find the Tax service card.\n2. Choose Avalara AvaTax or TaxJar, and Sandbox or Production.\n3. Enter your credentials and select Connect. Aglyn tests them with the vendor first and stores nothing they refuse. The credentials are encrypted on the server and are never shown again, not even to you.\n4. Enter the ship-from address: the street, city, state and postal code you ship or sell from. Aglyn checks it with the service. It is the origin of every sale and the place an in-person sale is taxed.\nOnly an admin of the site can connect, test or disconnect a service and change its address. Test connection checks the stored credentials again whenever you like; the card shows the answer.'
4899
+ },
4900
+ {
4901
+ path: '/commerce-and-bookings/commerce/tax-services',
4902
+ title: 'Tax services (Avalara AvaTax and TaxJar)',
4903
+ heading: 'When the service is not used',
4904
+ anchor: '#when-the-service-is-not-used',
4905
+ text: 'A connected service applies only when Taxes is set to Manual rates with Prices include tax off. With any other setting it is not asked for the tax on any sale, and new orders are not recorded in it:\n- Stripe Tax (automatic): Stripe Tax calculates the tax instead.\n- Prices include tax: your prices already include the tax.\n- Don\'t collect sales tax: no tax is added.\n- Not chosen yet: checkout is off until you choose.\nThe Tax service card says so while it is the case, with Go to Taxes to change the setting. Your connection, product tax codes and exempt customers are kept, and the service is used again as soon as Taxes is back on Manual rates.'
4115
4906
  },
4116
4907
  {
4117
4908
  path: '/commerce-and-bookings/commerce/tax-services',
@@ -4209,7 +5000,7 @@ export const DOCS_SECTION_INDEX = [
4209
5000
  title: 'Use ShippingEasy with Aglyn',
4210
5001
  heading: 'Connect ShippingEasy',
4211
5002
  anchor: '#connect',
4212
- text: '1. In Aglyn, open your site\'s Products hub, choose the Settings tab and find the ShippingEasy card.\n2. Select Connect ShippingEasy and paste the API key, API secret and store API key. Aglyn checks them with ShippingEasy before it saves them, and keeps the secret encrypted. Nobody can see the secret in Aglyn again, including you.\n3. The card shows a Callback URL. Copy it and paste it into your API store\'s settings in ShippingEasy, so each label you buy there comes back to Aglyn.\n4. Select Send open orders to send the orders that were paid before you connected.'
5003
+ text: 'The ShippingEasy card, in the store\'s settings, sends each paid order to your ShippingEasy account and takes each label back, using the API keys from Before you start. You need to be a site admin.\n1. In Aglyn, open the store\'s settings and find the ShippingEasy card.\n2. Select Connect ShippingEasy and paste the API key, API secret and store API key. Aglyn checks them with ShippingEasy before it saves them, and keeps the secret encrypted. Nobody can see the secret in Aglyn again, including you.\n3. The card shows a Callback URL. Copy it and paste it into your API store\'s settings in ShippingEasy, so each label you buy there comes back to Aglyn.\n4. Select Send open orders to send the orders that were paid before you connected.'
4213
5004
  },
4214
5005
  {
4215
5006
  path: '/commerce-and-bookings/commerce/use-shippingeasy',
@@ -4258,7 +5049,7 @@ export const DOCS_SECTION_INDEX = [
4258
5049
  title: 'Use ShipStation with Aglyn',
4259
5050
  heading: 'Connect ShipStation',
4260
5051
  anchor: '#connect',
4261
- text: '1. In Aglyn, open your site\'s Products hub, choose the Settings tab and find the ShipStation card.\n2. Select Connect ShipStation. The card shows the URL to custom XML page, a username and a password. Aglyn keeps the password encrypted, and a site admin can select Show on the card to see it again later.\n3. In ShipStation, go to Settings → Selling Channels → Store Setup, select Connect a Store or Marketplace and choose Custom Store.\n4. Paste the URL, username and password from Aglyn.\n5. Type the status names exactly as the Aglyn card shows them. ShipStation matches them letter for letter:\n| ShipStation field | Type |\n| Unpaid Status | unpaid |\n| Paid Status | paid |\n| Shipped Status | shipped |\n| Canceled Status | canceled |\n| On-Hold Status | onhold |\n6. Select Test Connection, then Connect.'
5052
+ text: 'The ShipStation card, in the store\'s settings, connects your store to ShipStation as a Custom Store, so ShipStation imports your paid orders and sends each shipment back. You need to be a site admin.\n1. In Aglyn, open the store\'s settings and find the ShipStation card.\n2. Select Connect ShipStation. The card shows the URL to custom XML page, a username and a password. Aglyn keeps the password encrypted, and a site admin can select Show on the card to see it again later.\n3. In ShipStation, go to Settings → Selling Channels → Store Setup, select Connect a Store or Marketplace and choose Custom Store.\n4. Paste the URL, username and password from Aglyn.\n5. Type the status names exactly as the Aglyn card shows them. ShipStation matches them letter for letter:\n| ShipStation field | Type |\n| Unpaid Status | unpaid |\n| Paid Status | paid |\n| Shipped Status | shipped |\n| Canceled Status | canceled |\n| On-Hold Status | onhold |\n6. Select Test Connection, then Connect.'
4262
5053
  },
4263
5054
  {
4264
5055
  path: '/commerce-and-bookings/commerce/use-shipstation',
@@ -4734,7 +5525,7 @@ export const DOCS_SECTION_INDEX = [
4734
5525
  title: 'The contact record',
4735
5526
  heading: 'The record page',
4736
5527
  anchor: '#the-record-page',
4737
- text: 'Clicking a row in the list opens the person\'s own page at …/crm/contacts/{id} — an address you can paste and that every other CRM record links to. The page opens with the person\'s name, their lifecycle stage, their owner, when they last engaged with one of your campaigns, and — for a buyer — how many orders they have placed and what they have spent; the order count is a link to the site\'s orders list narrowed to the person\'s address. When a sender has given a verdict on the address — a bounce, a gateway block, an unsubscribe, a spam complaint, a do-not-contact mark — or the address\'s domain has no mail server (Would bounce), it leads the chip row, with the date and the server\'s words on hover, and Send email is disabled with the reason; the Contacts list carries the same verdict in its Email column and filter. Beside it, a chip names the mail gateway in front of the address, when its domain names one. It is the lead\'s email state, on the contact the lead became or was always. Beside Send email it carries Call, which dials the person\'s number, and Log a call — see click to call. Under it, one card per aspect of the record:\n- Sharing — the site that holds the person and every other site the record is shared with, and why, with Share with sites… in the card\'s header — see Share records across sites.\n- Properties — the editable profile, grouped the way Salesforce groups a contact\'s details — see The standard fields — then an About box for your team\'s notes, then under More fields one control per custom field your organization has defined. One Save, in the card\'s header, writes everything at once, and Discard changes beside it puts back what you had not saved. The email is shown but cannot be edited here, because it is the shared identity. The Company field is the same picke'
5528
+ text: 'Clicking a row in the list opens the person\'s own page at …/crm/contacts/{id} — an address you can paste and that every other CRM record links to. The page opens with the person\'s name, their lifecycle stage, their owner, when they last engaged with one of your campaigns, and — for a buyer — how many orders they have placed and what they have spent; the order count is a link to the site\'s orders list narrowed to the person\'s address. When a sender has given a verdict on the address — a bounce, a gateway block, an unsubscribe, a spam complaint, a do-not-contact mark — or the address\'s domain has no mail server (Would bounce), it leads the chip row, with the date and the server\'s words on hover, and Send email is disabled with the reason; the Contacts list carries the same verdict in its Email column and filter. Beside it, a chip names the mail gateway in front of the address, when its domain names one. It is the lead\'s email state, on the contact the lead became or was always. Beside Send email it carries Call, which dials the person\'s number, and Log a call — see click to call. Under it, one card per aspect of the record:\n- Sharing — the site that holds the person and every other site the record is shared with, and why, with Share with sites… in the card\'s header — see Share records across sites.\n- Properties — the editable profile; see The Properties card.\n- Relationship — the sources that created the record (a form, a checkout, a booking, an import, or by hand), the campaign attribution recorded from the link the person followed, the marketing email basis this site holds (opted in, opted out, or no record — the last is not a refusal), and the campaigns your team has filed the person under, saved with Save filing in the card\'s header. Filing is your own bookkeeping; it'
4738
5529
  },
4739
5530
  {
4740
5531
  path: '/content-and-data/crm/contact-record',
@@ -4937,7 +5728,7 @@ export const DOCS_SECTION_INDEX = [
4937
5728
  title: 'Deals pipeline',
4938
5729
  heading: 'A deal\'s page',
4939
5730
  anchor: '#a-deals-page',
4940
- text: 'Opening a deal shows:\n- The header — the deal\'s title in the page heading and the trail, the pipeline and stage under its kind, its status, amount and owner as chips, Back to deals, Edit, and a menu (⋮) carrying Delete deal.\n- Stage — a stepper across the open stages, with Won and Lost buttons and, on a closed deal, the way to reopen it. The line under it says how long the deal has sat in its stage, its probability and its forecast category.\n- Properties — the amount and its weighted value, the probability (the deal\'s own beside its stage\'s, 40% · from stage: 75%), the forecast category, the expected close, the type, lead source and next step, the owner, links to the contact and the company, the campaign, the notes, and one row per custom field defined on the Deals tab of the Fields section; Edit carries a control for each.\n- Contact roles — every person on the deal, the part each plays, and the Primary; see Contact roles.\n- Products — the line items behind the amount, with the door to add one from the catalog or by hand.\n- Tasks and Activity — what is owed on this deal and what has happened on it.\nA deal also appears on the pages of the contact and the company it names — on a contact\'s page, for every role the person holds on it — each with a New deal shortcut that starts a deal already linked to them.'
5731
+ text: 'A deal\'s page is where you work one deal: its stage, what it is worth, the people on it and what is owed on it, each on a card of its own. Opening a deal shows:\n- The header — the deal\'s title in the page heading and the trail, the pipeline and stage under its kind, its status, amount and owner as chips, Back to deals, Edit, and a menu (⋮) carrying Delete deal.\n- Stage — a stepper across the open stages, with Won and Lost buttons and, on a closed deal, the way to reopen it. The line under it says how long the deal has sat in its stage, its probability and its forecast category.\n- Properties — what the deal is worth and where it stands; see Deal properties.\n- Contact roles — every person on the deal, the part each plays, and the Primary; see Contact roles.\n- Products — the line items behind the amount, with the door to add one from the catalog or by hand.\n- Tasks and Activity — what is owed on this deal and what has happened on it.\nDeal properties {#deal-properties}\nThe Properties card lists what the deal is worth and where it stands; to change any of it, choose Edit in the page\'s header, which carries a control for each.\nIt shows the amount and its weighted value, the probability (the deal\'s own beside its stage\'s, 40% · from stage: 75%), the forecast category, the expected close, the type, lead source and next step, the owner, links to the contact and the company, the campaign, the notes, and one row per custom field defined on the Deals tab of the Fields section.\nDeals on a contact or a company {#deals-on-a-record}\nThe Deals card on a contact\'s or a company\'s page lists every deal that names that record, newest first, and New deal in its header starts one already linked to them.\nOn a contact\'s page the card also lists the deals the person is on in any other contact ro'
4941
5732
  },
4942
5733
  {
4943
5734
  path: '/content-and-data/crm/deals',
@@ -5154,7 +5945,7 @@ export const DOCS_SECTION_INDEX = [
5154
5945
  title: 'Leads',
5155
5946
  heading: 'A lead\'s page',
5156
5947
  anchor: '#a-leads-page',
5157
- text: 'Click a row to open the lead.\nLead holds what the team decides: the status and the owner. It also shows the identity the capture recorded — email and name — and the person\'s marketing consent: whether they opted in (and when), declined, or never recorded a choice. A lead with no recorded consent cannot be sent marketing email, which is worth knowing before you promise them a newsletter. The card\'s header carries Convert, Call and Log a call beside Send email — see click to call — and, once the lead converts, Open contact, Open company and Open deal in place of Convert. Beside the status, the header names every campaign the lead is filed under.\nDetails is the lead\'s profile, laid out as Salesforce lays out a lead: the salutation and the name\'s parts, then Lead information — company, job title, industry, rating, lead source, tags, employees and annual revenue — then Contact information — phone, mobile phone, fax, website and Do not call — then the address, with any custom lead fields under More fields, and free-text notes, all saved together by the one Save in the card\'s header. Once the lead converts, the profile is read-only here, because the contact is the record then; the notes can still be written.\nCampaigns is the filing: Filed under campaigns offers the site\'s campaigns by name, and Save filing in the card\'s header writes the pick. It is your own grouping — it never adds anyone to a send, because a campaign mails its lists — and it is the same picker the contact\'s Relationship card carries, so a lead and the contact it becomes are filed the same way.\nCaptured history is read-only: when the person was first and last seen, how many times your site captured them, every source that did, and — under Where this lead came from — the campaign the capture is credited to, wh'
5948
+ text: 'A lead\'s page is where you work one lead: set its status and owner, call or email the person, and Convert it once it is real. Click a row in the Leads list to open it.\nLead holds what the team decides: the status and the owner. It also shows the identity the capture recorded — email and name — and the person\'s marketing consent: whether they opted in (and when), declined, or never recorded a choice. A lead with no recorded consent cannot be sent marketing email, which is worth knowing before you promise them a newsletter. The card\'s header carries Convert, Call and Log a call beside Send email — see click to call — and, once the lead converts, Open contact, Open company and Open deal in place of Convert. Beside the status, the header names every campaign the lead is filed under.\nDetails {#lead-details}\nDetails is the lead\'s profile, laid out as Salesforce lays out a lead: the salutation and the name\'s parts, then Lead information — company, job title, industry, rating, lead source, tags, employees and annual revenue — then Contact information — phone, mobile phone, fax, website and Do not call — then the address, with any custom lead fields under More fields, and free-text notes, all saved together by the one Save in the card\'s header. Once the lead converts, the profile is read-only here, because the contact is the record then; the notes can still be written.\nCampaigns {#lead-campaigns}\nCampaigns is your own filing of the lead under the site\'s campaigns: Filed under campaigns offers the site\'s campaigns by name, and Save filing in the card\'s header writes the pick. It is your own grouping — it never adds anyone to a send, because a campaign mails its lists — and it is the same picker the contact\'s Relationship card carries, so a lead and the contact it becomes are file'
5158
5949
  },
5159
5950
  {
5160
5951
  path: '/content-and-data/crm/leads',
@@ -5469,7 +6260,7 @@ export const DOCS_SECTION_INDEX = [
5469
6260
  title: 'Sequences',
5470
6261
  heading: 'See one person\'s history',
5471
6262
  anchor: '#person-history',
5472
- text: 'Select a person\'s row — or focus it and press Enter — to open their page. Its address is theirs alone, so you can paste it into a comment or a message to point a teammate at one person. The page has three parts:\n- The header — their name and address, a Lead or Contact chip that opens their CRM record, their status, the step they\'re on and when the next one sends, with the same actions as the row\'s menu. A person held because their mail gateway refused you shows why, and Resume and send sends the email anyway. Under it, five numbers: emails sent, clicks, links followed, scanner clicks (which aren\'t counted) and replies — and, on a sequence that counts opens, their opens, with the machine opens that weren\'t counted beside them.\n- Activity — everything that happened to them, newest first: when they were enrolled and by whom, each email with its subject as sent (and whether it was their curated copy), each link they followed with the full address and the email it came from, scanner visits with why they were read as a scanner, each open and each machine open with why it wasn\'t counted, replies, bounces with what the receiving server said, holds, pauses, resumes and stops with who did it and why. Open thread in Gmail opens the conversation in the sending mailbox.\n- Details — closed until you open it: the personal line, the attestations, the mailbox, the campaigns, what your mail has met at their domain, each curated email in full, the Gmail threads and the enrollment\'s id.\nClicks are listed one at a time from the release that added this page. Clicks before it were kept only as a count, the times of the first and last, and the last link followed, so the page shows them as one line saying exactly that rather than guessing at the rest. Someone enrolled but not yet emailed shows '
6263
+ text: 'Select a person\'s row on a sequence\'s Enrollments tab — or focus it and press Enter — to open their page, which shows where they are in the sequence and everything it has done to them. Its address is theirs alone, so you can paste it into a comment or a message to point a teammate at one person. The page has three parts:\n- The header — their name and address, a Lead or Contact chip that opens their CRM record, their status, the step they\'re on and when the next one sends, with the same actions as the row\'s menu. A person held because their mail gateway refused you shows why, and Resume and send sends the email anyway. Under it, five numbers: emails sent, clicks, links followed, scanner clicks (which aren\'t counted) and replies — and, on a sequence that counts opens, their opens, with the machine opens that weren\'t counted beside them.\n- Activity — everything that happened to them; see Their activity.\n- Details — the record behind the enrollment; see Their enrollment\'s details.\nTheir activity {#person-activity}\nThe Activity card lists everything the sequence did to one person, newest first, and Open thread in Gmail opens the conversation in the sending mailbox.\nIt holds when they were enrolled and by whom, each email with its subject as sent (and whether it was their curated copy), each link they followed with the full address and the email it came from, scanner visits with why they were read as a scanner, each open and each machine open with why it wasn\'t counted, replies, bounces with what the receiving server said, holds, pauses, resumes and stops with who did it and why.\nClicks are listed one at a time from the release that added this page. Clicks before it were kept only as a count, the times of the first and last, and the last link followed, so the page shows them '
5473
6264
  },
5474
6265
  {
5475
6266
  path: '/content-and-data/crm/sequences',
@@ -5553,7 +6344,7 @@ export const DOCS_SECTION_INDEX = [
5553
6344
  title: 'CRM settings',
5554
6345
  heading: 'Email capture',
5555
6346
  anchor: '#email-capture',
5556
- text: 'The Email capture card holds the workspace\'s one capture address — crm+…@in.aglyn.com — with Copy and Rotate address. A message forwarded to it, or sent with it in BCC, is filed on the timeline of the contact or lead it was with, so a reply that reached your own mailbox lands on the record too. How a message is matched, what is kept and what is dropped is described under Captured email.\nThe address is the workspace\'s, not a site\'s: the card reads the same under every site and at the organization level, and the record\'s own site decides which timeline the message lands on. It is minted the first time somebody opens the card or the Send email dialog, and everybody who can open the CRM can copy it.\nRotate address replaces it, behind a confirmation, and only a workspace owner or admin may. The moment the new address is written the old one goes quiet: mail sent to it afterwards is dropped without a trace, so a mailbox rule or a saved shortcut that carried the old address has to be updated. Rotate when the address has leaked outside the team — anybody who holds it can file mail on your records, though only mail from or to somebody already in the CRM is ever filed.'
6347
+ text: 'The Email capture card holds the workspace\'s one capture address, with Copy and Rotate address. The address looks like crm+…@in.aglyn.com. A message forwarded to it, or sent with it in BCC, is filed on the timeline of the contact or lead it was with, so a reply that reached your own mailbox lands on the record too. How a message is matched, what is kept and what is dropped is described under Captured email.\nThe address is the workspace\'s, not a site\'s: the card reads the same under every site and at the organization level, and the record\'s own site decides which timeline the message lands on. It is minted the first time somebody opens the card or the Send email dialog, and everybody who can open the CRM can copy it.\nRotate address replaces it, behind a confirmation, and only a workspace owner or admin may. The moment the new address is written the old one goes quiet: mail sent to it afterwards is dropped without a trace, so a mailbox rule or a saved shortcut that carried the old address has to be updated. Rotate when the address has leaked outside the team — anybody who holds it can file mail on your records, though only mail from or to somebody already in the CRM is ever filed.'
5557
6348
  },
5558
6349
  {
5559
6350
  path: '/content-and-data/crm/settings',
@@ -5588,7 +6379,7 @@ export const DOCS_SECTION_INDEX = [
5588
6379
  title: 'Share records across sites',
5589
6380
  heading: 'What a shared record looks like',
5590
6381
  anchor: '#what-a-shared-record-looks-like',
5591
- text: 'On the site you shared it with, the record appears on the site\'s own CRM lists with a Shared by chip. The chip names the person who shared it, or the rule that did. The record\'s page has a Sharing card that lists where the record is visible and why:\n- Held by: the sites that captured the record. Their visibility comes from the record itself, and sharing never removes it.\n- Shared by hand: the site, who shared it and when. An owner or admin can stop sharing it in one click.\n- Shared by a rule: the rule\'s name. To stop it, edit or delete the rule in Settings.\nUnsharing removes only the visibility that the share added. If the site also holds the record (it captured the person itself), it keeps seeing it.'
6382
+ text: 'On the site you shared it with, the record appears on the site\'s own CRM lists with a Shared by chip. The chip names the person who shared it, or the rule that did.\nThe Sharing card {#sharing-card}\nThe Sharing card on a lead\'s, contact\'s, company\'s or deal\'s page lists every site that can see the record and why; an owner or admin shares it with more sites from Share with sites… in the card\'s header. The card shows once the record is shared, and to an owner or admin before then:\n- Held by: the sites that captured the record. Their visibility comes from the record itself, and sharing never removes it.\n- Shared by hand: the site, who shared it and when. An owner or admin can stop sharing it in one click.\n- Shared by a rule: the rule\'s name. To stop it, edit or delete the rule in Settings.\nUnsharing removes only the visibility that the share added. If the site also holds the record (it captured the person itself), it keeps seeing it.'
5592
6383
  },
5593
6384
  {
5594
6385
  path: '/content-and-data/crm/sharing',
@@ -5856,6 +6647,13 @@ export const DOCS_SECTION_INDEX = [
5856
6647
  anchor: '',
5857
6648
  text: 'Datasets & Dynamic Content\nDatasets are your structured content: a typed model plus the records that fill it. Pages read from datasets to render dynamic, repeatable content, and forms write new records back in.\nDatasets belong to your organization, not to a single site — every site in the organization shares the same collections. Manage them from the organization Data page (next to Media in the organization tabs), or from any site\'s Data page; both edit the same data. Dataset limits, storage, and add-ons are billed at the organization level.\nPlan availability Starter and above. Free plans have no data store; higher tiers raise the dataset and record caps, and extra-dataset add-ons are available.'
5858
6649
  },
6650
+ {
6651
+ path: '/content-and-data/datasets/overview',
6652
+ title: 'Datasets & Dynamic Content',
6653
+ heading: 'Where you manage datasets',
6654
+ anchor: '#organization-data-page',
6655
+ text: 'The organization Data page manages every dataset in the workspace in one place — create a dataset, edit its schema, add and import records — and sets where new datasets start shared. A site\'s own Data page edits the same datasets, limited to the ones shared with that site.'
6656
+ },
5859
6657
  {
5860
6658
  path: '/content-and-data/datasets/overview',
5861
6659
  title: 'Datasets & Dynamic Content',
@@ -5910,7 +6708,7 @@ export const DOCS_SECTION_INDEX = [
5910
6708
  title: 'Datasets & Dynamic Content',
5911
6709
  heading: 'Who a dataset is shared with',
5912
6710
  anchor: '#who-a-dataset-is-shared-with',
5913
- text: 'Datasets belong to the workspace, not to a single site, so one dataset can drive pages on every site you run. When that isn\'t what you want, the Sharing control on each dataset decides which sites can see it:\n- All sites — everyone in the workspace, on every site.\n- Selected sites… — pick the sites that share it, up to 30.\nWhere a new dataset starts depends on where you create it and on your workspace\'s Default sharing for new datasets, the setting at the top of the organization Data page (new media files have a default of their own, on the workspace Media page):\n- Created on a site\'s Data page — it follows that setting. Set to All sites, the dataset starts on All sites. Set to Only the site they were created in, it starts shared with that site alone, and its control reads Selected sites… with just that site picked.\n- Created on the organization Data page — it starts on All sites whatever the setting says, because there is no site to limit it to.\n- Installed from the Marketplace, or created through the REST API — it starts on All sites too. Both act for the whole organization, not for one site.\nThe setting only decides where a new dataset starts. It changes nothing that already exists, and you can widen or narrow any dataset afterwards.\nA dataset with no sharing stored is visible to no site; its control reads Not shared with any site until you choose one of the two.\nThis matters most for agencies. If you run three internal sites alongside twelve client sites, your rate card can be shared with the internal three and stay invisible to the clients — including to the client collaborators you have invited, who will not see it in the Data page, the pickers, or anywhere else.\nSharing is enforced on the server, not just in the console. A site cannot render a dataset it hasn\'t b'
6711
+ text: 'Datasets belong to the workspace, not to a single site, so one dataset can drive pages on every site you run. When that isn\'t what you want, the Sharing control on each dataset decides which sites can see it:\n- All sites — everyone in the workspace, on every site.\n- Selected sites… — pick the sites that share it, up to 30.\nWhere a new dataset starts depends on where you create it and on your workspace\'s Default sharing for new datasets, the setting at the top of the organization Data page (new media files have a default of their own, on the workspace Media page):\n- Created on a site\'s Data page — it follows that setting. Set to All sites, the dataset starts on All sites. Set to Only the site they were created in, it starts shared with that site alone, and its control reads Selected sites… with just that site picked.\n- Created on the organization Data page — it starts on All sites whatever the setting says, because there is no site to limit it to.\n- Installed from the Marketplace, or created through the REST API — it starts on All sites too. Both act for the whole organization, not for one site.\nDefault sharing for new datasets {#default-dataset-sharing}\nDefault sharing for new datasets, at the top of the organization Data page, decides what a dataset created on a site\'s Data page starts shared with: All sites, or only that site. Only workspace owners and admins can change it.\nThe setting only decides where a new dataset starts. It changes nothing that already exists, and you can widen or narrow any dataset afterwards.\nA dataset with no sharing stored is visible to no site; its control reads Not shared with any site until you choose one of the two.\nThis matters most for agencies. If you run three internal sites alongside twelve client sites, your rate card can be shared '
5914
6712
  },
5915
6713
  {
5916
6714
  path: '/content-and-data/datasets/overview',
@@ -6101,6 +6899,13 @@ export const DOCS_SECTION_INDEX = [
6101
6899
  anchor: '',
6102
6900
  text: 'Media Library & CDN\nThe media library stores your images, video, and files, keeps them organized, and serves them quickly. Media plugs into components like Image and Video and into the theme\'s favicon.\nA site\'s Media page has two tabs: This site, the site\'s own library, and Organization (shared), the workspace assets this site may use. The organization library loads only when you open its tab.\nPlan availability Free with storage quotas. CDN delivery with WebP variants is on every plan, free included; document uploads and higher storage are gated by plan. Video uploads are paused on every plan for now — see Upload.'
6103
6901
  },
6902
+ {
6903
+ path: '/content-and-data/media/overview',
6904
+ title: 'Media Library & CDN',
6905
+ heading: 'Two libraries',
6906
+ anchor: '#two-libraries',
6907
+ text: 'Every site has a media library of its own, and the workspace has one more that its sites share. A site\'s Media page shows both, as two tabs, so you upload where the file belongs and pick from either one.\nThis site\'s library {#site-library}\nThe This site tab is the site\'s own library: files only this site uses, organized in folders and served over the CDN. Upload here for anything specific to the site — its photos, its downloads — and it stays out of every other site\'s picker.\nThe organization library {#organization-library}\nThe organization\'s Media page holds the workspace\'s shared library — folders, uploads, editing and a storage meter — for assets more than one site uses, such as a logo or brand photography. A site sees it on its Organization (shared) tab, limited to the assets shared with that site.'
6908
+ },
6104
6909
  {
6105
6910
  path: '/content-and-data/media/overview',
6106
6911
  title: 'Media Library & CDN',
@@ -6141,7 +6946,7 @@ export const DOCS_SECTION_INDEX = [
6141
6946
  title: 'Media Library & CDN',
6142
6947
  heading: 'Approved image hosts',
6143
6948
  anchor: '#approved-image-hosts',
6144
- text: 'Most images on your site are ones you uploaded here, and those always work. But you can also point a block at an image that lives somewhere else by pasting its URL — a photo on your own CDN, say, or an image your supplier hosts.\nThose are worth being deliberate about, for a reason that is easy to miss: when a visitor opens a page with an external image on it, their browser fetches that image directly from the other site. So that site sees your visitor\'s IP address and which page they were on, whether or not you have any relationship with them. It is a real disclosure, and it is one you are making on your visitors\' behalf.\nSo your site keeps a list of the external hosts it is allowed to load images from, under Admin → Security → Approved image hosts. Add a host and images from it load normally. Leave it off the list and browsers refuse it.\nYou do not have to think about this for anything you upload — your own media is always allowed, and so is your site\'s own address.\nAdding a host {#adding-an-approved-image-host}\nEnter the host on its own, with no https:// and no path:\n- cdn.example.com allows exactly that host.\n- .example.com allows every subdomain of it, which is what most image CDNs need because they give each account its own.\nIf you paste a URL into an image block for a host you have not approved, the editor tells you so while you are editing, rather than letting you publish a page whose image is blank for everyone but you. The warning names the host, so approving it is a copy and paste.\nWhen an image does not appear {#approved-image-host-troubleshooting}\nIf an image shows in the editor but not on the published page, an unapproved host is the first thing to check. Open the page, right-click the missing image, and the browser console will name the host it refused.'
6949
+ text: 'Most images on your site are ones you uploaded here, and those always work. But you can also point a block at an image that lives somewhere else by pasting its URL — a photo on your own CDN, say, or an image your supplier hosts.\nThose are worth being deliberate about, for a reason that is easy to miss: when a visitor opens a page with an external image on it, their browser fetches that image directly from the other site. So that site sees your visitor\'s IP address and which page they were on, whether or not you have any relationship with them. It is a real disclosure, and it is one you are making on your visitors\' behalf.\nSo your site keeps a list of the external hosts it is allowed to load images from, under Admin → Security → Approved image hosts. Add a host and images from it load normally. Leave it off the list and browsers refuse it.\nYou do not have to think about this for anything you upload — your own media is always allowed, and so is your site\'s own address.\nAdding a host {#adding-an-approved-image-host}\nEnter the host on its own, with no https:// and no path:\n- cdn.example.com allows exactly that host.\n- .example.com allows every subdomain of it, which is what most image CDNs need because they give each account its own.\nIf you paste a URL into an image block for a host you have not approved, the editor tells you so while you are editing, rather than letting you publish a page whose image is blank for everyone but you. The warning names the host, so approving it is a copy and paste.\nWhen an image does not appear {#approved-image-host-troubleshooting}\nIf an image shows in the editor but not on the published page, an unapproved host is the first thing to check. Open the page, right-click the missing image, and the browser console will name the host it refused.\nTh'
6145
6950
  },
6146
6951
  {
6147
6952
  path: '/content-and-data/media/overview',
@@ -6729,7 +7534,7 @@ export const DOCS_SECTION_INDEX = [
6729
7534
  title: 'Publish a plugin',
6730
7535
  heading: 'Your publisher profile',
6731
7536
  anchor: '#your-publisher-profile',
6732
- text: 'Your publisher profile is a storefront: its own page in the marketplace listing everything you\'ve published, reachable from the Publisher card on any of your listings and from the by @handle link on every browse card. Buyers who like one of your plugins use it to find the rest, so the handle, display name, and bio you set are worth the same care as a listing.'
7537
+ text: 'Your publisher profile is a storefront: its own page in the marketplace listing everything you\'ve published, reachable from the Publisher card on any of your listings and from the by @handle link on every browse card. Buyers who like one of your plugins use it to find the rest, so the handle, display name, and bio you set are worth the same care as a listing.\nThe profile card {#profile-card}\nThe card at the top of a publisher\'s page shows their logo, display name, handle and bio — what a buyer reads before deciding to trust a listing. You set all of it, and your support and social links, under Public profile on Marketplace → Profile.\nThe Publisher card on a listing {#listing-publisher-card}\nThe Publisher card on every listing names who published it, with their logo, and links to their publisher page, so a buyer can see what else they ship. It is drawn from your public profile, so keep that profile filled in.'
6733
7538
  },
6734
7539
  {
6735
7540
  path: '/developers/plugins/publish-a-plugin',
@@ -6757,7 +7562,7 @@ export const DOCS_SECTION_INDEX = [
6757
7562
  title: 'Publisher handbook',
6758
7563
  heading: 'Before your first publish',
6759
7564
  anchor: '#before-your-first-publish',
6760
- text: '1. Publisher profile (Marketplace → Profile) — your handle and display name appear on every listing. Publishing is organization-owned: the listing belongs to your organization, not your personal account.\n2. Publisher agreement — accept it once, on behalf of the organization. It is offered wherever you start a publish, and it is always on Marketplace → Profile. See The publisher agreement.\n3. Plan: publishing requires a Pro plan.\n4. Payouts (paid listings only): complete Stripe Connect onboarding from Marketplace → Payouts. The platform fee is 20% (30% on free plans).'
7565
+ text: '1. Publisher profile (Marketplace → Profile) — your handle and display name appear on every listing. Publishing is organization-owned: the listing belongs to your organization, not your personal account.\n2. Publisher agreement — accept it once, on behalf of the organization. It is offered wherever you start a publish, and it is always on Marketplace → Profile. See The publisher agreement.\n3. Plan: publishing requires a Pro plan.\n4. Payouts (paid listings only): complete Stripe Connect onboarding from Marketplace → Payouts. The platform fee is 20% (30% on free plans).\nSet up your public profile {#public-profile}\nThe Public profile card on Marketplace → Profile is your publisher identity: set a handle, display name, bio and logo, then Save profile before you publish. They are shown on everything your organization publishes to the marketplace, and on your publisher page. The same card takes optional support contacts — a support email and URL — and links to your website, GitHub, X and LinkedIn, so buyers know where to ask for help.'
6761
7566
  },
6762
7567
  {
6763
7568
  path: '/developers/plugins/publishing/publisher-handbook',
@@ -6799,7 +7604,7 @@ export const DOCS_SECTION_INDEX = [
6799
7604
  title: 'Publisher handbook',
6800
7605
  heading: 'Authoring your listing',
6801
7606
  anchor: '#authoring-your-listing',
6802
- text: 'Your listing IS your storefront — it renders on the detail page every buyer sees. Editable at publish time or any time after, no republish needed: open Edit listing on your own listing\'s detail page (the whole page becomes the editor), or use the Edit action on Marketplace → Listings.\n| Field | Guidance |\n| Name | The display name on every browse card and at the top of the detail page; ≤80 chars. A typo here is fixable without republishing — leaving it blank keeps the current name rather than clearing it. |\n| Description | The one-line summary under the name on browse cards; ≤500 chars. |\n| Body (About) | The main docs: what it does, setup, what it adds, data & permissions. Rich-text editor with headings, bold/italic, links, and inline images; ≤20k chars. |\n| Preview image | The hero shown on browse cards and at the top of the detail page — pick it from your media library. |\n| Logo | Square; pick from the media library or paste an https URL. |\n| Screenshots | Up to 6, from the media library or https URLs; the detail page shows a gallery with click-to-zoom. |\n| Categories | Up to 3 from the fixed taxonomy. |\n| License | Short label (e.g. MIT) — listings without one get flagged in review. |\n| Homepage / repository | Public links build trust; reviewers check them. The repository is asked for at publish and required — editing it here changes the listing, not what past versions declared. |\nBe explicit about data & permissions in the README: what your plugin reads/writes and every host in your manifest\'s network allowlist — unverified sandbox listings show buyers a risk disclaimer, and good docs are what overcomes it.'
7607
+ text: 'Your listing IS your storefront — it renders on the detail page every buyer sees. Editable at publish time or any time after, no republish needed: open Edit listing on your own listing\'s detail page (the whole page becomes the editor), or use the Edit action on Marketplace → Listings.\n| Field | Guidance |\n| Name | The display name on every browse card and at the top of the detail page; ≤80 chars. A typo here is fixable without republishing — leaving it blank keeps the current name rather than clearing it. |\n| Description | The one-line summary under the name on browse cards; ≤500 chars. |\n| Body (About) | The main docs: what it does, setup, what it adds, data & permissions. Rich-text editor with headings, bold/italic, links, and inline images; ≤20k chars. |\n| Preview image | The hero shown on browse cards and at the top of the detail page — pick it from your media library. |\n| Logo | Square; pick from the media library or paste an https URL. |\n| Screenshots | Up to 6, from the media library or https URLs; the detail page shows a gallery with click-to-zoom. |\n| Categories | Up to 3 from the fixed taxonomy. |\n| License | Short label (e.g. MIT) — listings without one get flagged in review. |\n| Homepage / repository | Public links build trust; reviewers check them. The repository is asked for at publish and required — editing it here changes the listing, not what past versions declared. |\nEdit a listing {#edit-listing}\nSelect Edit listing on your own listing\'s detail page and the page becomes the editor for what buyers see: name, summary, rich-text body and media. Save, and the listing changes at once — no new version, and no new review, because review is about the bundle\'s bytes rather than the words around them.\nYour listings {#your-listings}\nMarketplace → Listings lists '
6803
7608
  },
6804
7609
  {
6805
7610
  path: '/developers/plugins/publishing/publisher-handbook',
@@ -6813,21 +7618,21 @@ export const DOCS_SECTION_INDEX = [
6813
7618
  title: 'Publisher handbook',
6814
7619
  heading: 'Versioning & updates',
6815
7620
  anchor: '#versioning--updates',
6816
- text: 'Shipping a new version\nPublish new version on your listing — the button on the listing\'s own detail page, or the action in the row menu on Marketplace → Listings. It opens the same publish page bound to that listing, so you upload the new bundle and manifest and write a changelog rather than describing a listing you already own; name, description, README, license, repository and price arrive filled in from the listing and are yours to edit.\nWhat the page tells you, because it is the part worth knowing: the version that installs today keeps installing until a reviewer approves the new one. Nobody is upgraded onto unreviewed code, and nothing you publish can change a version somebody already has.\nTwo things it will stop you on:\n- A mismatched manifest id. An update is recognized by your publisher organization plus the manifest id — so a bundle carrying a different id would create a separate listing, not a new version. The page says so and refuses rather than letting you find out from a duplicate listing you cannot un-publish the bytes of.\n- The changelog confirmation. On an update the pre-publish checklist asks for it up front, because here we know it applies.\nWho can install it is fixed when the listing is created and a new version never changes it — change that from the listing itself.\n- Artifacts are immutable and installs pin {version, sha256} — you can never change the code a consumer runs; ship a new version instead.\n- Users update explicitly (an Update to vX action appears when your latestVersion passes their pin). Write a changelog every publish — it renders in the detail page\'s Version history card, where every published version is listed with its changelog, a Latest marker, and a Realm-trusted chip on versions that carry it. That card is what a cautious buyer re'
7621
+ text: 'The Changelog card {#listing-changelog}\nThe Changelog card on a listing shows what each approved version changed, newest first, in the words its publisher wrote when publishing it. Write the changelog on the publish page every time you ship; a listing whose publisher has never written one shows no Changelog card at all, rather than an empty one.\nVersion history {#version-history}\nVersion history on a listing\'s detail page lists every published version with its changelog, a Latest marker on the newest, and a Realm-trusted chip on versions that carry it. Buyers read it to decide whether to update; you add to it with Publish new version.\nShipping a new version\nPublish new version on your listing — the button on the listing\'s own detail page, or the action in the row menu on Marketplace → Listings. It opens the same publish page bound to that listing, so you upload the new bundle and manifest and write a changelog rather than describing a listing you already own; name, description, README, license, repository and price arrive filled in from the listing and are yours to edit.\nWhat the page tells you, because it is the part worth knowing: the version that installs today keeps installing until a reviewer approves the new one. Nobody is upgraded onto unreviewed code, and nothing you publish can change a version somebody already has.\nTwo things it will stop you on:\n- A mismatched manifest id. An update is recognized by your publisher organization plus the manifest id — so a bundle carrying a different id would create a separate listing, not a new version. The page says so and refuses rather than letting you find out from a duplicate listing you cannot un-publish the bytes of.\n- The changelog confirmation. On an update the pre-publish checklist asks for it up front, because here '
6817
7622
  },
6818
7623
  {
6819
7624
  path: '/developers/plugins/publishing/publisher-handbook',
6820
7625
  title: 'Publisher handbook',
6821
7626
  heading: 'How installs work (the buyer side)',
6822
7627
  anchor: '#how-installs-work-the-buyer-side',
6823
- text: 'Browse is a catalog — cards link to the detail page, which is the only place an install happens. The buyer picks targets (all sites, selected sites, or org-wide for plugins), confirms a dialog that names exactly where the install lands, and the pin is written: your exact {version, sha256} pinned to the site or org, the plugin enabled for the workspace, loaded on their next visit. Buyers can uninstall from the listing\'s own detail page (Uninstall, or Uninstall org-wide for an org-scope pin) as well as from Marketplace → Installed — removing the pin and disabling it. Data your plugin created stays, so reinstalls resume cleanly. Paid listings require purchase before install; you see sales in your publisher ledger.\nThe detail page shows two install figures side by side: installs is the cumulative all-time total and only ever grows, while active counts the organizations and sites that currently hold a pin — it goes down when someone uninstalls. A big gap between the two is churn worth investigating.\nA purchase licenses the buyer\'s organization, and Marketplace → Licenses lists what the workspace holds and what the buyer bought across every workspace, one table each. Each table filters through its own toolbar: Search finds a license by the start of a word of its listing\'s name, and Filters offers Bought by (You) on the workspace\'s table, and Licensed to — which workspace a purchase landed in, or Every workspace you belong to for a purchase that names none — on the buyer\'s own. Both answer over every license, not the page on screen, and each filter in force shows as a chip above it; the tables keep their own order and their column headers do not re-sort them. A word that more than 30 listing names share is refused with a note asking for more of it. See Filter and search a list'
7628
+ text: 'Browse is a catalog — cards link to the detail page, which is the only place an install happens. The buyer picks targets (all sites, selected sites, or org-wide for plugins), confirms a dialog that names exactly where the install lands, and the pin is written: your exact {version, sha256} pinned to the site or org, the plugin enabled for the workspace, loaded on their next visit. Buyers can uninstall from the listing\'s own detail page (Uninstall, or Uninstall org-wide for an org-scope pin) as well as from Marketplace → Installed — removing the pin and disabling it. Data your plugin created stays, so reinstalls resume cleanly. Paid listings require purchase before install; you see sales in your publisher ledger.\nThe detail page shows two install figures side by side: installs is the cumulative all-time total and only ever grows, while active counts the organizations and sites that currently hold a pin — it goes down when someone uninstalls. A big gap between the two is churn worth investigating.\nThe Install card {#install-card}\nThe Install card on a listing\'s detail page is where an install happens: choose where it lands — all sites, selected sites, or the whole organization for a plugin — then confirm. A paid listing asks for the purchase first, and the same card offers Uninstall (or Uninstall org-wide) once it is installed.\nInstalled from the marketplace {#installed-from-the-marketplace}\nInstalled from the marketplace, on the workspace\'s Plugins page, lists every marketplace item this workspace has installed — org-wide, or the sites it is on — with the version it is pinned to and whether an update is out. Open one to manage that installation; browse the marketplace to add one.\nLicenses {#licenses}\nA purchase licenses the buyer\'s organization, and Marketplace → Licenses'
6824
7629
  },
6825
7630
  {
6826
7631
  path: '/developers/plugins/publishing/publisher-handbook',
6827
7632
  title: 'Publisher handbook',
6828
7633
  heading: 'Getting paid',
6829
7634
  anchor: '#getting-paid',
6830
- text: 'One-time prices in whole USD: $0 (free), or $3 to $1000. Purchases flow through the platform\'s Stripe; your share (80%, or 70% on free plans) pays out via your Connect account. The Marketplace → Sales tab tracks every sale.\nYour share is calculated on the pre-tax price. Buyers also pay sales tax on top of it, which Aglyn collects and remits under its marketplace-provider registration — that money is never yours and is not part of your payout. The Sales tab reports net paid out, the amount that reached your Stripe account, with what buyers paid, the tax and the platform fee shown beside it.\nRefunds and lost chargebacks are excluded from that total: your share is pulled back from your Connect account, and the amount returned is listed separately.\nThe $3 minimum on paid listings {#low-prices-and-processing}\nA paid listing must be $3 or more. Type less than that into any publish form and the price field turns red, the hint says why, the publish button holds, and the publish route refuses it — the same figure in all four places.\nThe reason is the payment processor\'s per-transaction cost: a percentage of what the buyer pays (the price plus sales tax) plus a fixed amount per transaction. That fixed amount is what makes small prices uneconomic — it does not shrink with the price, while the platform\'s 20% cut does. At $1 processing the payment costs about $0.36, more than the $0.20 platform fee, so the sale loses money for the platform that has to settle it.\nThe minimum is not a round number picked for effect: it is the cheapest whole dollar at which the platform\'s cut covers the cost of collecting it, computed at the 20% take rate — the band that breaks even latest, so the number holds whichever plan you are on — and against the most expensive payment method a buyer may choose.'
7635
+ text: 'One-time prices in whole USD: $0 (free), or $3 to $1000. Purchases flow through the platform\'s Stripe; your share (80%, or 70% on free plans) pays out via your Connect account. The Marketplace → Sales tab tracks every sale.\nYour share is calculated on the pre-tax price. Buyers also pay sales tax on top of it, which Aglyn collects and remits under its marketplace-provider registration — that money is never yours and is not part of your payout. The Sales tab reports net paid out, the amount that reached your Stripe account, with what buyers paid, the tax and the platform fee shown beside it.\nRefunds and lost chargebacks are excluded from that total: your share is pulled back from your Connect account, and the amount returned is listed separately.\nSet up payouts {#set-up-payouts}\nThe Payouts card on Marketplace → Payouts connects your organization\'s Stripe account so paid listings can pay you: select Set up payouts and finish Stripe\'s onboarding. The card then says where you stand — payouts enabled, setup still to finish in Stripe, or an account to reconnect — and links to your payouts in Stripe. The platform fee is 20% per sale, 30% on the Free plan.\nPurchases and the platform fee {#purchases-and-fees}\nEvery paid purchase records what the buyer paid and the platform fee taken from it, and Aglyn staff see recent purchases on their marketplace overview with the fee from each sale. Your share is what is left once that fee is taken, before sales tax.\nWhen a refund cannot be pulled back {#refund-reversals}\nWhen a sale is refunded, your share is pulled back from your Connect account; if Stripe refuses that reversal, you keep the share and the platform absorbs the refund until it is recovered. Aglyn staff track each one, with the amount owed, until it is.\nThe $3 minimum on paid '
6831
7636
  },
6832
7637
  {
6833
7638
  path: '/developers/plugins/reference/extension-points',
@@ -6904,7 +7709,7 @@ export const DOCS_SECTION_INDEX = [
6904
7709
  title: 'Manifests, trust lifecycle & environment',
6905
7710
  heading: 'Review & trust lifecycle',
6906
7711
  anchor: '#review--trust-lifecycle',
6907
- text: '- listed/verified (or legacy/absent) plugin listings appear in browse; everything else is owner-and-staff-only. Verified adds the ✅ badge.\n- Realm trust is separate and orthogonal: a super-staff signature over a version\'s sha256 (POST /api/marketplace/admin/trust) sets trust: \'realm\', letting that version load into the app realm. The revocations/{listingId} kill switch beats everything.'
7712
+ text: '- listed/verified (or legacy/absent) plugin listings appear in browse; everything else is owner-and-staff-only. Verified adds the ✅ badge.\n- Realm trust is separate and orthogonal: a super-staff signature over a version\'s sha256 (POST /api/marketplace/admin/trust) sets trust: \'realm\', letting that version load into the app realm. The revocations/{listingId} kill switch beats everything.\nThe rest of this section is the reviewer\'s side of that lifecycle — the staff review queue and a submission\'s review page — so a publisher can see what their submission is checked against.\nThe review queue {#review-queue}\nAwaiting review lists the plugin submissions waiting on a staff verdict; open one to read its listing, manifest and verifier findings, then act on it. Search finds a plugin by the start of a word of its name, and the status menu narrows the queue.\nVerification requests {#verification-requests}\nVerification requested lists publishers who asked to be verified — a claim about who they are, separate from reviewing any one version. Their plugins stay listed and installable while the request waits.\nListed plugins {#listed-plugins}\nListed plugins lists the plugin listings that are already installable, the step that makes a version reachable from Browse. It is also where staff grant or revoke realm trust for a listed version.\nA submission\'s status {#submission-status}\nStatus says where the version under review stands — submitted, listed, verified or rejected — and, when the listing was taken down or unpublished by its publisher, says so with the reason on file.\nThe listing under review {#review-overview}\nOverview shows the listing as a customer will see it — name, description, media and links, all supplied by the publisher — and flags what is missing, such as no license or no R'
6908
7713
  },
6909
7714
  {
6910
7715
  path: '/developers/plugins/reference/manifest-and-envs',
@@ -7515,6 +8320,13 @@ export const DOCS_SECTION_INDEX = [
7515
8320
  anchor: '#what-this-means-when-you-build',
7516
8321
  text: '- Declare network honestly and minimally. It\'s both your allowlist and a disclosure buyers read — an over-broad list costs you trust in review.\n- Test in the sandbox, not just locally. A plugin that works against a dev server with no CSP will hit the policy the moment it\'s published.\n- Document data & permissions in your README. Unverified sandbox listings show buyers a risk disclaimer; clear docs are what overcomes it.\n- Don\'t reach for realm trust to dodge the CSP. Realm trust is granted by Aglyn staff for a specific reviewed version, not on request.'
7517
8322
  },
8323
+ {
8324
+ path: '/developers/plugins/reference/sandbox-security',
8325
+ title: 'Sandbox security model',
8326
+ heading: 'What a reviewer checks',
8327
+ anchor: '#what-a-reviewer-checks',
8328
+ text: 'A reviewer\'s Security panel sets what a bundle asked for — its declared network origins and capabilities — against what the sandbox enforces regardless of what it asked for, beside the static verifier\'s findings for that version. Declare only the origins you call, and the verifier\'s findings stay clean.'
8329
+ },
7518
8330
  {
7519
8331
  path: '/developers/plugins/reference/sandbox-security',
7520
8332
  title: 'Sandbox security model',
@@ -7940,7 +8752,7 @@ export const DOCS_SECTION_INDEX = [
7940
8752
  title: 'Aglyn Assist',
7941
8753
  heading: 'When it builds instead of answering',
7942
8754
  anchor: '#aglyn-ai',
7943
- text: 'Everything above is the assistant explaining. With AI generation on your plan — the Aglyn AI add-on, or the AI credits a Free workspace gets — the same assistant also builds: whole pages, layouts, page templates, reusable components, forms, designed emails, campaigns, product copy, your search titles and descriptions, a change to your theme, and a small site from one brief. AI jobs in the panel is where you watch one work and open what it made. It opens on its own while a job is running or waiting for you, the AI chip in the top bar says what your jobs are doing, and the Assist button carries a badge while one runs. See Finding your AI jobs.\nEverything it builds arrives as a draft. It never publishes, never changes a live page in place and never sends anything, so a generated page has no address on your live site until you publish it yourself.\nWhat each door does, what it costs in credits and who can use it is in Aglyn AI.'
8755
+ text: 'Everything above is the assistant explaining. With AI generation on your plan — the Aglyn AI add-on, or the AI credits a Free workspace gets — the same assistant also builds: whole pages, layouts, page templates, reusable components, forms, designed emails, campaigns, product copy, your search titles and descriptions, a change to your theme, and a small site from one brief. AI jobs in the panel is where you watch one work and open what it made. It opens on its own while a job is running or waiting for you, the AI chip in the top bar says what your jobs are doing, and the Assist button carries a badge while one runs. See Finding your AI jobs.\nEverything it builds arrives as a draft. It never publishes, never changes a live page in place and never sends anything, so a generated page has no address on your live site until you publish it yourself.\nWhat each door does, what it costs in credits and who can use it is in Aglyn AI. To build several things from one chat message, see Build from Assist chat.'
7944
8756
  },
7945
8757
  {
7946
8758
  path: '/getting-started/aglyn-assist',
@@ -7982,7 +8794,7 @@ export const DOCS_SECTION_INDEX = [
7982
8794
  title: 'Aglyn Assist',
7983
8795
  heading: 'Message limits',
7984
8796
  anchor: '#message-limits',
7985
- text: '- Free workspaces get a limited number of assistant messages each day, with answers and docs links, and 300 AI credits a month for the assistant and AI generation together. The credits belong to the person who owns the workspace, so several Free workspaces owned by one account share them; when they are used, AI pauses until next month or an upgrade, and nothing is ever billed. A new account waits a short while after signing up before it can generate, and free requests are capped per day.\n- Paid plans include their own monthly AI credits for the assistant and AI generation together, rising with the plan, and sell credits past the band rather than stopping at it — so the assistant keeps working and the month\'s overage is billed, unless you switch that off or set a ceiling in Billing.\n- Every paid plan, Starter included, also gets page-aware guidance and the offers to open a page described above.\nWhen a free workspace reaches its daily limit, the assistant says so and the counter resets the next day (UTC).\nAnswers quoted straight from the documentation are free and are not counted, so a workspace at its daily limit can still ask how-to questions.'
8797
+ text: '- Free workspaces get a limited number of assistant messages each day, with answers and docs links, and 300 AI credits a month for the assistant and AI generation together. The credits belong to the person who owns the workspace, so several Free workspaces owned by one account share them; when they are used, AI pauses until next month or an upgrade, and nothing is ever billed. Free requests are capped per day. See AI credits.\n- Paid plans include their own monthly AI credits for the assistant and AI generation together, rising with the plan, and sell credits past the band rather than stopping at it — so the assistant keeps working and the month\'s overage is billed, unless you switch that off or set a ceiling in Billing.\n- Every paid plan, Starter included, also gets page-aware guidance and the offers to open a page described above.\nWhen a free workspace reaches its daily limit, the assistant says so and the counter resets the next day (UTC).\nAnswers quoted straight from the documentation are free and are not counted, so a workspace at its daily limit can still ask how-to questions.'
7986
8798
  },
7987
8799
  {
7988
8800
  path: '/getting-started/aglyn-assist',
@@ -8087,14 +8899,14 @@ export const DOCS_SECTION_INDEX = [
8087
8899
  title: 'The console tour',
8088
8900
  heading: 'The Sites list',
8089
8901
  anchor: '#the-sites-list',
8090
- text: 'All Sites is the front door of a workspace: one card per site, for the workspace currently selected in the switcher, in name order. A site you can reach in another organization isn\'t missing — it\'s behind the workspace switcher.\nEach card carries:\n- The site\'s display name as the title, with its hostname underneath as the subheader — the custom domain when the site has one, otherwise its name.aglyn.app address. Both are also listed inside the card, as Aglyn Domain and Custom Domain.\n- A status pill (below).\n- Visit, which opens the live site in a new tab, and Manage, which opens that site\'s dashboard in the console.\nAbove the cards are a Search box and a Filters button — the same controls a table\'s toolbar has, over the cards. Search finds a site by the start of any word of its name, its slug (the name in name.aglyn.app) or its custom domain: harbor, bakery and shop.harbor all find Harbor Bakery at shop.harbor-bakery.com. Filters narrows the cards by Custom domain (Connected or None) and by the day a site was Created — is, after, on or after, before or on or before a day. Each filter in force shows as a chip above the cards; remove a chip to drop it. A filter on the created date lists the cards newest first instead of by name.\nThe search and the filters are answered by the query that reads the cards, across every site you have in the workspace, not only the cards on screen. The cards come twelve at a time; Load more adds the next twelve that match. The site count opposite the heading always counts every site. Status, plan, owner and the last-updated date are not filters: a site\'s status can change with no save at all (a timed suspension ends on its own), and a site doesn\'t store its plan, owner or template. See Filter and search a list.\nThe status pill {#the-status-pill'
8902
+ text: 'All Sites is the front door of a workspace: one card per site, for the workspace currently selected in the switcher, in name order. A site you can reach in another organization isn\'t missing — it\'s behind the workspace switcher.\nEach card carries:\n- The site\'s display name as the title, with its hostname underneath as the subheader — the custom domain when the site has one, otherwise its name.aglyn.app address. Both are also listed inside the card, as Aglyn Domain and Custom Domain.\n- A status pill (below).\n- Visit, which opens the live site in a new tab, and Manage, which opens that site\'s dashboard in the console.\nAbove the cards are a Search box and a Filters button — the same controls a table\'s toolbar has, over the cards. Search finds a site by the start of any word of its name, its slug (the name in name.aglyn.app) or its custom domain: harbor, bakery and shop.harbor all find Harbor Bakery at shop.harbor-bakery.com. Filters narrows the cards by Custom domain (Connected or None) and by the day a site was Created — is, after, on or after, before or on or before a day. Each filter in force shows as a chip above the cards; remove a chip to drop it. A filter on the created date lists the cards newest first instead of by name.\nThe search and the filters are answered by the query that reads the cards, across every site you have in the workspace, not only the cards on screen. The cards come twelve at a time; Load more adds the next twelve that match. The site count opposite the heading always counts every site. Status, plan, owner and the last-updated date are not filters: a site\'s status can change with no save at all (a timed suspension ends on its own), and a site doesn\'t store its plan, owner or template. See Filter and search a list.\nA site card {#a-site-card}\nEach c'
8091
8903
  },
8092
8904
  {
8093
8905
  path: '/getting-started/console-tour',
8094
8906
  title: 'The console tour',
8095
8907
  heading: 'A site\'s dashboard',
8096
8908
  anchor: '#a-sites-dashboard',
8097
- text: 'Opening a site lands you on its dashboard. It\'s a place to glance at the site, not to edit it — every card is a summary with a link to the section that owns the detail:\n- Traffic — pageviews over a window you choose (14 days by default). View details opens Analytics.\n- Newest site users — the five most recent people who signed up on your site. View all opens Users.\n- Recent Activity — the ten most recent changes, each naming the thing that changed ("Saved the screen — Home") and linking straight to it. A change an integration made through the REST API is attributed to its key by name — API key Zapier — rather than to a person. The full, paginated log lives under Admin → Activity.\nPlugins contribute the rest, so this list is a floor rather than an exact match for your own dashboard: Last campaign appears once you\'ve sent an email campaign, Commerce where the commerce plugin is enabled and the site has products or orders, Tasks due and CRM at a glance where the CRM is on, and Inbox with the site\'s unread form submissions. A brand-new site shows the same cards with empty states — "No pageviews recorded yet", "No activity yet" — which is what a first visit should look like.\nTwo things people expect here and won\'t find: role management lives under Users, and the announcement bar and promotional popup live under Marketing.\nVisit site, in the dashboard header, opens the published site in a new tab with the admin bar armed — the route from a site\'s own dashboard to the site itself, without going back out to the Sites list and in through a card action.'
8909
+ text: 'Opening a site lands you on its dashboard. It\'s a place to glance at the site, not to edit it — every card is a summary with a link to the section that owns the detail:\n- Traffic — pageviews over a window you choose (14 days by default). View details opens Analytics.\n- Newest site users — the five most recent people who signed up on your site. View all opens Users.\n- Recent Activity — the ten most recent changes, each naming the thing that changed ("Saved the screen — Home") and linking straight to it. A change an integration made through the REST API is attributed to its key by name — API key Zapier — rather than to a person. The full, paginated log lives under Admin → Activity.\nPlugins contribute the rest, so this list is a floor rather than an exact match for your own dashboard: Last campaign appears once you\'ve sent an email campaign, Commerce where the commerce plugin is enabled and the site has products or orders, Tasks due and CRM at a glance where the CRM is on, and Inbox with the site\'s unread form submissions. A brand-new site shows the same cards with empty states — "No pageviews recorded yet", "No activity yet" — which is what a first visit should look like.\nTwo things people expect here and won\'t find: role management lives under Users, and the announcement bar and promotional popup live under Marketing.\nRecent activity {#recent-activity}\nThe Recent Activity card on a site\'s dashboard lists the latest changes made to the site, newest first — who made each one and what it touched, linked straight to it. View all activity opens the full log under Admin → Activity; a brand-new site shows No activity yet until its first change in the console.\nVisit site, in the dashboard header, opens the published site in a new tab with the admin bar armed — the route from a s'
8098
8910
  },
8099
8911
  {
8100
8912
  path: '/getting-started/console-tour',
@@ -8108,7 +8920,7 @@ export const DOCS_SECTION_INDEX = [
8108
8920
  title: 'The console tour',
8109
8921
  heading: 'Workspace settings & notifications',
8110
8922
  anchor: '#workspace-settings--notifications',
8111
- text: 'Organization-wide settings (name, workspace URL) live under Organization → Settings, which also holds Profile, API keys, Branding, Single sign-on, Privacy, Ownership and Delete. Turning plugins on and off for the workspace is its own section, Organization → Plugins — Marketplace is for finding and installing new ones, not for administering what you already run:\nThe notifications feed\nYour in-app notification feed — billing, publishing, workflow failures — lives under Notifications, which has two sections in the rail on the left: All notifications and Settings. The first shows what arrived, newest first, with Mark all read above it. The feed\'s Filters narrows it by Type (is one type, or is any of up to thirty — a larger pick is refused, with a note above the feed) and by Status (is New or Read), and both can stand together. Each filter in force shows as a chip above the feed; remove the chip to drop it. The filters apply to the whole feed, not just the page on screen, and the pager then turns through the matches; see Filter and search a list. There is no search box, because a notification\'s words are not indexed:\nHow urgent each notification is {#notification-levels}\nEvery notification carries a level, shown by the icon at the start of its row and the color of its type, both in the feed and in the bell:\n| Level | Looks like | For example |\n| Critical | Red icon, solid red type, red bar and a red wash over the row | A fraud signal, a failed payment, a form that stopped accepting submissions |\n| Warning | Amber icon, amber type, amber bar and a light amber wash | A limit reached, low stock, a held email |\n| Good news | Green icon, green type, green bar | An order or a booking, a new subscription |\n| Info | Blue icon, blue type | An invitation, a support reply, a usage step'
8923
+ text: 'Organization-wide settings (name, workspace URL) live under Organization → Settings, which also holds Profile, API keys, Branding, Single sign-on, Privacy, Ownership and Delete. Turning plugins on and off for the workspace is its own section, Organization → Plugins — Marketplace is for finding and installing new ones, not for administering what you already run:\nOrganization settings {#organization-settings}\nOrganization → Settings is where you run the workspace itself: its name and workspace URL under General, then — for owners and admins — Profile, Plugins, API keys, Branding, Single sign-on, Privacy, Holds & reviews and Import & export, each a section in the rail on the left. Ownership and Delete appear to the workspace owner only.\nGeneral {#organization-general}\nThe General card renames the organization, changes its workspace URL and sets the time zone its sites inherit — "workspace" is the console\'s word for your organization\'s home.\nChanging the workspace URL changes the address teammates use to reach the workspace, so share the new one after you save.\nThe notifications feed\nYour in-app notification feed — billing, publishing, workflow failures — lives under Notifications, which has two sections in the rail on the left: All notifications and Settings. The first shows what arrived, newest first, with Mark all read above it. The feed\'s Filters narrows it by Type (is one type, or is any of up to thirty — a larger pick is refused, with a note above the feed) and by Status (is New or Read), and both can stand together. Each filter in force shows as a chip above the feed; remove the chip to drop it. The filters apply to the whole feed, not just the page on screen, and the pager then turns through the matches; see Filter and search a list. There is no search box, because '
8112
8924
  },
8113
8925
  {
8114
8926
  path: '/getting-started/create-a-site',
@@ -8131,6 +8943,20 @@ export const DOCS_SECTION_INDEX = [
8131
8943
  anchor: '#what-a-site-contains',
8132
8944
  text: '- Pages & layouts — the pages and the shared frames they render in.\n- Data — the datasets this site can see. Variables and functions are under Logic, and workflows and actions under Automation.\n- Media — images, video, and files, organized in folders.\n- Setup — theme, SEO, tracking, and emails under tabbed settings. The Site logo card (Details tab) sets your brand mark: it\'s shown on the live site\'s page-navigation loading overlay — a themed, blurred scrim with a progress bar. Without a logo, the loader shows your site name instead. Add a Dark mode logo too if yours is hard to see on a dark background: visitors browsing in dark mode see it on the loader and error pages, and without one they see the light mode logo.\n- Billing — the plan and usage meters that gate features and quotas.'
8133
8945
  },
8946
+ {
8947
+ path: '/getting-started/create-a-site',
8948
+ title: 'Create a site',
8949
+ heading: 'Your site\'s details',
8950
+ anchor: '#site-details',
8951
+ text: 'A site\'s Setup page opens on its details: what the site is called, where it is served from, and how it presents itself. The cards below are the ones to fill in first.\nBasic details {#basic-details}\nThe Basic details card names your site, sets its Aglyn address and picks the time zone its dates are read in — fill in a display name and a subdomain, then press Update.\n- Display name — what the site is called in the console. See below.\n- Subdomain — the site\'s address on Aglyn. See below.\n- Time zone — the day a published post is dated on this site. Leave it unset and the site follows your workspace\'s time zone; clear it with the ✕ to go back to that.\nDisplay name {#display-name}\nThe Display name is what the site is called inside the console — the site switcher, breadcrumbs, the Sites list and notifications — up to 30 characters. Visitors never see it: the title in their browser tab is your site\'s SEO Title, set under Setup → SEO.\nSubdomain {#subdomain}\nThe Subdomain is your site\'s free address, up to 15 characters, and it works from the moment the site exists. On aglyn.com it is the name in name.aglyn.app. It keeps working after you connect your own domain. Changing it changes that address, so links to the old one stop working.\nSite logo {#site-logo}\nThe Site logo card sets your brand mark: pick a Light mode logo from your media library — an SVG, or a PNG at least 400px wide — and add a Dark mode one if yours is hard to see on a dark background. Your live site shows it on the loading overlay between pages, and on error pages; without a logo it shows the site name instead, and dark-mode visitors see the light logo when no dark one is set.\nEmails this site sends {#site-emails}\nSetup → Emails lists the emails your site sends its own customers, grouped by the feature that send'
8952
+ },
8953
+ {
8954
+ path: '/getting-started/create-a-site',
8955
+ title: 'Create a site',
8956
+ heading: 'Site Admin',
8957
+ anchor: '#site-admin',
8958
+ text: 'Site Admin holds the controls only a site\'s owners and admins should touch, kept apart from Setup so a collaborator never trips over them. Open it from the site navigation; its sections are:\n- General — the site\'s basic details.\n- Plugins — which of the workspace\'s plugins run on this site. See Plugins on one site.\n- Custom Domain — connect your own domain.\n- Security — who can reach the site.\n- Error pages — the pages shown when something goes wrong.\n- Activity — the full log of changes made to the site.\n- Backup & template — download a backup or import a package.\n- Danger zone — deleting the site.\nWho can open Site Admin {#who-can-open-site-admin}\nOnly a site\'s admins can open Site Admin; anyone else who follows a link to it is told so instead of seeing the sections. To get in, ask a site admin or a workspace owner to raise your role on this site — see Teams & roles.'
8959
+ },
8134
8960
  {
8135
8961
  path: '/getting-started/create-a-site',
8136
8962
  title: 'Create a site',
@@ -8318,7 +9144,7 @@ export const DOCS_SECTION_INDEX = [
8318
9144
  title: 'Commerce end to end',
8319
9145
  heading: '1. Connect payments',
8320
9146
  anchor: '#1-connect-payments',
8321
- text: 'Aglyn sells from your own Stripe account via Stripe Connect. On the Products hub, the payments card walks you through Express onboarding; checkout stays disabled ("This site has not enabled payments yet") until Stripe reports charges enabled. Aglyn adds its per-sale platform fee automatically per your plan.'
9147
+ text: 'The Payments card, in the store\'s settings, connects your own Stripe account so buyers pay you directly; checkout stays off until Stripe reports charges enabled.\nYou need a paid plan, and only the workspace owner can connect the account.\n1. On the Payments card, select Set up payments.\n2. Finish Stripe\'s Express onboarding: your business details, identity and the bank account your payouts go to.\n3. Back in Aglyn, the card\'s Stripe account line reads Charges enabled. Refresh status checks again if it does not yet.\nUntil then checkout says "This site has not enabled payments yet". Aglyn adds its per-sale platform fee automatically per your plan, and the card shows the fee your plan carries.'
8322
9148
  },
8323
9149
  {
8324
9150
  path: '/guides/commerce-end-to-end',
@@ -8353,7 +9179,7 @@ export const DOCS_SECTION_INDEX = [
8353
9179
  title: 'Commerce end to end',
8354
9180
  heading: '6. Subscriptions & the Stripe portal',
8355
9181
  anchor: '#6-subscriptions--the-stripe-portal',
8356
- text: 'Active subscriptions are recorded per site and surface in two places:\n- Buyers manage their own — the Customer account block\'s Subscriptions section has a Manage button that opens the Stripe Billing Portal (update card, cancel, see invoices).\n- You see each member\'s subscriptions in the member drawer on the site\'s Users page — what they subscribed to, the amount and interval, and the renewal date — and managers get a New subscriber notification carrying the amount on each signup, then a Subscription renewed notification carrying the amount on every cycle after it.\nWhat a subscription puts in Orders depends on the product\'s Type:\n- A physical subscription creates one order per paid cycle — the first charge included — on the Subscription channel, so every box has something to fulfill, pack and label against, and recurring revenue shows up in the Orders tab, the analytics card and the orders CSV alongside one-time sales. Each cycle\'s order also decrements the variant\'s stock (if tracked) and can trigger the low-stock alert.\n- A digital or service subscription is not an order, by design: it does not appear in Orders, in the analytics card or in the orders CSV, and it does not decrement stock — there is nothing to ship.\nEither way, what the subscriber pays is recorded on the subscription itself — each paid invoice, its period and its amount included, so a renewal is a record you hold rather than one only Stripe holds. The amount shown follows the latest cycle, so a price change, a tax change or a trial converting to a paid cycle is reflected rather than frozen at what the first charge was. Stripe keeps its own copy of every invoice, reachable from the Billing Portal.\nAn active subscription is also what members-only content can check for paid gating.'
9182
+ text: 'Active subscriptions are recorded per site and surface in two places:\n- Buyers manage their own — the Customer account block\'s Subscriptions section has a Manage button that opens the Stripe Billing Portal (update card, cancel, see invoices).\n- You see each member\'s subscriptions in the member drawer on the site\'s Users page — what they subscribed to, the amount and interval, and the renewal date — and managers get a New subscriber notification carrying the amount on each signup, then a Subscription renewed notification carrying the amount on every cycle after it.\nWhat a subscription puts in Orders depends on the product\'s Type:\n- A physical subscription creates one order per paid cycle — the first charge included — on the Subscription channel, so every box has something to fulfill, pack and label against, and recurring revenue shows up in the Orders tab, the analytics card and the orders CSV alongside one-time sales. Each cycle\'s order also decrements the variant\'s stock (if tracked) and can trigger the low-stock alert.\n- A digital or service subscription is not an order, by design: it does not appear in Orders, in the analytics card or in the orders CSV, and it does not decrement stock — there is nothing to ship.\nEither way, what the subscriber pays is recorded on the subscription itself — each paid invoice, its period and its amount included, so a renewal is a record you hold rather than one only Stripe holds. The amount shown follows the latest cycle, so a price change, a tax change or a trial converting to a paid cycle is reflected rather than frozen at what the first charge was. Stripe keeps its own copy of every invoice, reachable from the Billing Portal.\nAn active subscription is also what members-only content can check for paid gating.\nMember updates {#member-u'
8357
9183
  },
8358
9184
  {
8359
9185
  path: '/guides/commerce-end-to-end',
@@ -8495,6 +9321,13 @@ export const DOCS_SECTION_INDEX = [
8495
9321
  anchor: '#step-7-off',
8496
9322
  text: 'Three different actions, often confused:\n| You want to | Where | What happens |\n| Stop it running, keep it | Plugins → its switch | Off everywhere in the workspace. Flip it back any time. |\n| Remove it from your sites | Marketplace → Installed → Uninstall, or Uninstall org-wide on an org-wide install. The listing\'s own detail page carries the same button. | The pin and the switchboard entry go. |\n| Update it | Marketplace → Installed, or the detail page\'s Update to v2.2 button | You move to the new version, deliberately. |\nUninstalling never deletes the data a plugin created. Reinstall it and it picks up where it left off. That is deliberate — an accidental uninstall shouldn\'t cost you a year of bookings — but it also means uninstalling is not how you erase data. For that, delete the data itself.\nDesign copied onto a site behaves differently, and the difference matters: a component or template you installed and then edited is now your copy. Uninstalling the listing doesn\'t reach into your pages and remove it, and updating shows you field by field what the publisher\'s new version would overwrite before it touches your edits.'
8497
9323
  },
9324
+ {
9325
+ path: '/guides/install-your-first-plugin',
9326
+ title: 'Install your first marketplace item',
9327
+ heading: 'Manage your plugins',
9328
+ anchor: '#manage-plugins',
9329
+ text: 'Plugins, in the organization navigation, is where you switch plugins on and off for the whole workspace — the ones you installed from the Marketplace, listed first, and Aglyn\'s own built-in plugins below them. Open any plugin to see where it runs and change its settings.\nFind the Plugins section {#find-plugins}\nPlugins is its own section in the organization navigation, next to Marketplace. Organization → Settings → Plugins used to hold the switches; it now only points you to the section, where enabling, configuring and managing marketplace installs all live.\nBuilt-in plugins {#built-in-plugins}\nThe Built in card lists the plugins that ship with Aglyn, each with its own switch. Switching one off removes it from every site in the workspace — its navigation, the editor, published pages and the API — and switching it back on restores it.\n- Only workspace owners and admins can flip a switch.\n- A few cannot be switched off at all, because sites are built out of them.\n- AI and Forms have no workspace switch: they stay on for the workspace, and a site switches them off for itself — see A plugin on one site.\n- Switching off a plugin that another one depends on asks first, and names what else will go with it.\nA plugin\'s page {#a-plugins-page}\nOpen a plugin from the Plugins section to manage it for the workspace. Its page shows Where it runs, the plugin\'s own settings — saved once for the workspace and followed by every site — its Dependencies, and, for a marketplace plugin, the version you are pinned to and what it is allowed to reach. View listing opens a marketplace plugin\'s listing.\nWhere a plugin runs {#where-a-plugin-runs}\nThe Where it runs card on a plugin\'s page answers which of your sites have it. A built-in plugin has a single switch: on, it runs on every site in the wor'
9330
+ },
8498
9331
  {
8499
9332
  path: '/guides/install-your-first-plugin',
8500
9333
  title: 'Install your first marketplace item',
@@ -8619,7 +9452,7 @@ export const DOCS_SECTION_INDEX = [
8619
9452
  title: 'Member accounts',
8620
9453
  heading: '5. Manage members from the console',
8621
9454
  anchor: '#5-manage-members-from-the-console',
8622
- text: 'The site\'s Users page has two cards: Site users (your members — this guide) and Users (console collaborators). The Site users card is paged, newest first, with Email, Name, Joined, and Status columns. Its search box finds a member by the start of any word of their name or their email address — rae, donovan or example.com all find Rae Donovan at rae@example.com, and a member who never gave a name is found by their address. Filters in the table\'s toolbar narrows it by Email (equals the whole address), Name (contains a word of it, or equals the whole name), Joined (is, is after, is on or after, is before or is on or before a day) and Status (is Active or Suspended). The filters and the search add up, and every one is answered by the query that reads the list, across every member rather than the page on screen. Name contains and the search each look for one word, and one query can look for only one: while a search is typed, a Name-contains filter is not applied, and a notice above the table says so. Each filter in force shows as a chip above the table; see Filter and search a list. For members who may open the CRM, each row\'s ⋮ menu holds Open in CRM — the member\'s contact, found by the address they signed up with.\nClick a member to open the member drawer:\n- Profile — email, display name, and join date, with a Suspended chip when applicable.\n- Lifetime purchases — charged order totals minus refunds (pending and canceled orders excluded).\n- Orders — the member\'s payment history, newest first: order number, status, total, date, any refunded amount, and the Stripe payment reference. Needs the editor or admin role on the site.\n- Subscriptions — each with its renewal date and status chip.\n- Addresses — the member\'s saved addresses.\nSuspend & reactivate\nThe drawer\'s action button'
9455
+ text: 'The site\'s Users page has two cards: Site users (your members — this guide) and Users (console collaborators). The Site users card is paged, newest first, with Email, Name, Joined, and Status columns. Its search box finds a member by the start of any word of their name or their email address — rae, donovan or example.com all find Rae Donovan at rae@example.com, and a member who never gave a name is found by their address. Filters in the table\'s toolbar narrows it by Email (equals the whole address), Name (contains a word of it, or equals the whole name), Joined (is, is after, is on or after, is before or is on or before a day) and Status (is Active or Suspended). The filters and the search add up, and every one is answered by the query that reads the list, across every member rather than the page on screen. Name contains and the search each look for one word, and one query can look for only one: while a search is typed, a Name-contains filter is not applied, and a notice above the table says so. Each filter in force shows as a chip above the table; see Filter and search a list. For members who may open the CRM, each row\'s ⋮ menu holds Open in CRM — the member\'s contact, found by the address they signed up with.\nThe Users page {#the-users-page}\nA site\'s Users page is where you see everyone who has an account with that site: Site users, the visitors who signed up on it, and Users, the teammates who can work on it in the console. Open a site user to see their purchases and to suspend them; add teammates from the Users card with a role.\nClick a member to open the member drawer:\n- Profile — email, display name, and join date, with a Suspended chip when applicable.\n- Lifetime purchases — charged order totals minus refunds (pending and canceled orders excluded).\n- Orders — the'
8623
9456
  },
8624
9457
  {
8625
9458
  path: '/guides/member-accounts',
@@ -8838,6 +9671,34 @@ export const DOCS_SECTION_INDEX = [
8838
9671
  anchor: '#related',
8839
9672
  text: '- Datasets & schema deep-dive — field ids, the typed model, quotas.\n- Billing & plans — which plans include the API.'
8840
9673
  },
9674
+ {
9675
+ path: '/marketing-and-automation/analytics/ad-tracking',
9676
+ title: 'Ad tracking',
9677
+ heading: '',
9678
+ anchor: '',
9679
+ text: 'Ad tracking\nMeasure your ads in your own ad accounts. Your site can run the browser tags of Meta, TikTok, Pinterest, Google Ads and LinkedIn.\nEverything here uses your own accounts: the IDs are yours, and what the tags send goes to your ad accounts, not to Aglyn\'s.'
9680
+ },
9681
+ {
9682
+ path: '/marketing-and-automation/analytics/ad-tracking',
9683
+ title: 'Ad tracking',
9684
+ heading: 'Browser tags',
9685
+ anchor: '#browser-tags',
9686
+ text: 'Site → Setup → Tracking.\n| Field | Where to find it |\n| Meta pixel ID | Meta Events Manager — 8–20 digits |\n| TikTok pixel ID | TikTok Ads Manager → Events — 16–24 capital letters and digits |\n| Pinterest tag ID | Pinterest Ads → Conversions — 10–16 digits |\n| Google Ads conversion ID | Google Ads — AW- and digits |\n| LinkedIn partner ID | LinkedIn Campaign Manager — 4–10 digits |\nEach is optional. A value that does not match its format cannot be saved.\nOnce a tag loads, your site reports these to Meta, TikTok and Pinterest under each one\'s standard event names:\n| What happened | Meta | TikTok | Pinterest |\n| A product page was viewed | ViewContent | ViewContent | — |\n| An item was added to the cart | AddToCart | AddToCart | addtocart |\n| Checkout started | InitiateCheckout | InitiateCheckout | — |\n| An order was paid | Purchase | CompletePayment | checkout |\n| A form was submitted | Lead | SubmitForm | lead |\nGoogle Ads and LinkedIn report page views; their conversions are set up in those products.\nA purchase\'s value excludes tax, as it does in Google Analytics.\nNothing is sent from a preview or a development server Tags only load on your published site, never in Preview or the editor.\nTikTok pixel {#tiktok-pixel}\nPaste the pixel code from TikTok Ads Manager → Events (16–24 capital letters and digits, like C4ABCDEFGH1234567890) to run your TikTok pixel on your site, under the same advertising consent as your other tags. With an access token on the Ad conversions card, the same events are also sent from the server.\nPinterest tag {#pinterest-tag}\nPaste the numeric tag ID from Pinterest Ads → Conversions (10–16 digits) to run your Pinterest tag on your site, under the same advertising consent as your other tags. With an access token on the Ad conversions card, the same ev'
9687
+ },
9688
+ {
9689
+ path: '/marketing-and-automation/analytics/ad-tracking',
9690
+ title: 'Ad tracking',
9691
+ heading: 'Consent',
9692
+ anchor: '#consent',
9693
+ text: 'No advertising tag loads unless the visitor allowed advertising. Advertising is its own question in your cookie consent banner, separate from analytics, and it has to be on: turn on Also ask visitors about advertising storage in the Cookie consent card. Until it is, your advertising tags never load.\nWhich visitors that covers follows your consent mode:\n- In the UK, the EU and the EEA, and anywhere the region cannot be determined, nothing loads until the visitor allows advertising.\n- Elsewhere, under the default mode, advertising runs from the first visit and the visitor can turn it off at any time from Your Privacy Choices. Under Opt-in everywhere, every visitor is asked first.\n- Global Privacy Control turns advertising off for that visitor.\n- If you switch the consent tool off to run your own, Aglyn has no answer on file for anyone, so your advertising tags do not load.\nWhen a visitor withdraws, the tags are told to stop, removed from the page and their cookies deleted:\n| Tag | Cookies |\n| Meta pixel | fbp, fbc |\n| TikTok pixel | ttp, ttenablecookie, ttcsid |\n| Pinterest tag | pinunauth, pinterestctua, pinterestctrt, epik, derivedepik |\n| Google Ads | gclau |\n| LinkedIn Insight Tag | lisugr, UserMatchHistory, AnalyticsSyncHistory, ligc (bcookie and lidc are on LinkedIn\'s own domain, which only LinkedIn can clear) |\nA tag you paste into Custom HTML yourself is not one of these: it is not consent-gated by Aglyn and is never removed by a withdrawal.'
9694
+ },
9695
+ {
9696
+ path: '/marketing-and-automation/analytics/ad-tracking',
9697
+ title: 'Ad tracking',
9698
+ heading: 'Related',
9699
+ anchor: '#related',
9700
+ text: '- Cookie consent — the advertising question and the consent modes\n- Google Analytics events — the same moments, in your GA4 property'
9701
+ },
8841
9702
  {
8842
9703
  path: '/marketing-and-automation/analytics/cookie-consent',
8843
9704
  title: 'Cookie consent',
@@ -8850,7 +9711,7 @@ export const DOCS_SECTION_INDEX = [
8850
9711
  title: 'Cookie consent',
8851
9712
  heading: 'How it works',
8852
9713
  anchor: '#how-it-works',
8853
- text: 'Consent UI appears only on sites that use a consent-gated feature — today, a configured Google Analytics measurement ID or a Google Tag Manager container ID. Either one is enough. A site with neither has nothing to consent to, so its visitors never see anything.\nYour site\'s consent mode (Site setup → SEO → Cookie consent) decides how visitors are handled:\n- Geo-conditional (recommended, and the behavior when you have never touched the setting): visitors in prior-consent regions — the EU/EEA, the UK, and any visitor whose region cannot be determined — see a consent banner first, and analytics loads only after they allow it. Visitors everywhere else (for example the US) are tracked from their first visit with no banner; their state is recorded as implied consent, and the persistent Your Privacy Choices control lets them opt out at any time.\n- Opt-in everywhere: every visitor, everywhere, sees the prior-consent banner.\nThe banner offers Allow, Decline, and Preferences side by side — no dark patterns, and declining is one click, same as allowing.\nAdvertising is a second, separate question — and it is off until you turn it on. By default Aglyn asks your visitors about analytics and nothing else, and tells Google that advertising storage is denied for every visitor, in both directions. If you have Google Ads linked to your GA4 property and you need a basis for advertising storage, turn on Also ask visitors about advertising storage in Site setup → SEO → Cookie consent. The switch needs a Google tag of some kind — a measurement ID or a container ID — to do anything; there is no advertising storage to ask about without one.\nTurning it on grants nothing by itself. It adds a second question, with its own checkbox, to the banner and to the preferences panel, so that a visitor has '
9714
+ text: 'Consent UI appears only on sites that use a consent-gated feature — today, a configured Google Analytics measurement ID or a Google Tag Manager container ID. Either one is enough. A site with neither has nothing to consent to, so its visitors never see anything.\nYour site\'s consent mode (Site setup → SEO → Cookie consent) decides how visitors are handled:\n- Geo-conditional (recommended, and the behavior when you have never touched the setting): visitors in prior-consent regions — the EU/EEA, the UK, and any visitor whose region cannot be determined — see a consent banner first, and analytics loads only after they allow it. Visitors everywhere else (for example the US) are tracked from their first visit with no banner; their state is recorded as implied consent, and the persistent Your Privacy Choices control lets them opt out at any time.\n- Opt-in everywhere: every visitor, everywhere, sees the prior-consent banner.\nThe banner offers Allow, Decline, and Preferences side by side — no dark patterns, and declining is one click, same as allowing.\nAdvertising is a second, separate question — and it is off until you turn it on. By default Aglyn asks your visitors about analytics and nothing else, and tells Google that advertising storage is denied for every visitor, in both directions. If you have Google Ads linked to your GA4 property and you need a basis for advertising storage, turn on Also ask visitors about advertising storage in Site setup → SEO → Cookie consent. The switch needs a tag to ask about — a Google measurement ID or container ID, or one of your own advertising tags (a Meta, TikTok or Pinterest tag, Google Ads or LinkedIn) set on the Tracking tab. Your advertising tags load only for visitors who say yes to this question, so a site running one needs it on; see '
8854
9715
  },
8855
9716
  {
8856
9717
  path: '/marketing-and-automation/analytics/cookie-consent',
@@ -8885,7 +9746,7 @@ export const DOCS_SECTION_INDEX = [
8885
9746
  title: 'Cookie consent',
8886
9747
  heading: 'Where the choice is kept',
8887
9748
  anchor: '#where-the-choice-is-kept',
8888
- text: 'A visitor\'s choice is stored in their browser\'s local storage, under a key that includes your site\'s id. Three consequences worth knowing before you answer a visitor\'s question about it:\n- It is per site. A yes on one site is not a yes on another, even when the two share a preview address.\n- It does not expire. Nothing re-asks a visitor on a schedule. Clearing site data resets them to undecided, and they are then handled by your consent mode as if for the first time.\n- What was granted is re-derived from the recorded decision on every read, never trusted as a stored flag. That is why turning the advertising question off makes existing advertising grants stop counting immediately.\nWithdrawing consent removes the cookies too. When a visitor opts out or declines, Aglyn deletes the Google analytics and advertising cookies it can reach (ga, gid, gcl and their variants) across your domain and its parent, and tells any tag still resident on the page to stop measuring. A visitor who checks their cookie list after opting out sees them gone, which is the behavior to describe if one asks.'
9749
+ text: 'A visitor\'s choice is stored in their browser\'s local storage, under a key that includes your site\'s id. Three consequences worth knowing before you answer a visitor\'s question about it:\n- It is per site. A yes on one site is not a yes on another, even when the two share a preview address.\n- It does not expire. Nothing re-asks a visitor on a schedule. Clearing site data resets them to undecided, and they are then handled by your consent mode as if for the first time.\n- What was granted is re-derived from the recorded decision on every read, never trusted as a stored flag. That is why turning the advertising question off makes existing advertising grants stop counting immediately.\nWithdrawing consent removes the cookies too. When a visitor opts out or declines, Aglyn deletes the Google analytics and advertising cookies it can reach (ga, gid, gcl and their variants) across your domain and its parent — and, for the advertising tags you set on the Tracking tab, removes the tag and deletes its cookies too (fbp, fbc, ttp, pinunauth, epik and the others listed in Ad tracking) — and tells any tag still resident on the page to stop measuring. A visitor who checks their cookie list after opting out sees them gone, which is the behavior to describe if one asks.'
8889
9750
  },
8890
9751
  {
8891
9752
  path: '/marketing-and-automation/analytics/cookie-consent',
@@ -9025,14 +9886,14 @@ export const DOCS_SECTION_INDEX = [
9025
9886
  title: 'Google Analytics events',
9026
9887
  heading: 'What your property never receives',
9027
9888
  anchor: '#never-sent',
9028
- text: 'Some measurement exists on Aglyn\'s side and is deliberately kept off your property:\n- Aglyn\'s own product events — workspace and site creation, publishing, billing and assistant usage. These go to Aglyn\'s console analytics, never to a site\'s property.\n- traffictype and contentgroup — internal-traffic marking and content grouping are applied only to Aglyn\'s own marketing site.\n- Advertising tags — Meta, Google Ads and LinkedIn tags are installed only on Aglyn\'s own marketing site. On your site the advertising machinery renders nothing and installs nothing.\n- Server-side events, including refunds and subscription cancellations. They are sent from the server with credentials that are not per-site, so there is no way to route them to your property.\n- The built-in pageview beacon. Aglyn\'s own Traffic card is fed by a first-party, cookieless request that is not GA4 and does not appear in your property.'
9889
+ text: 'Some measurement exists on Aglyn\'s side and is deliberately kept off your property:\n- Aglyn\'s own product events — workspace and site creation, publishing, billing and assistant usage. These go to Aglyn\'s console analytics, never to a site\'s property.\n- traffictype and contentgroup — internal-traffic marking and content grouping are applied only to Aglyn\'s own marketing site.\n- Aglyn\'s own advertising tags. Aglyn\'s Meta, Google Ads and LinkedIn tags run only on Aglyn\'s own sites. Your site runs only the advertising tags you set yourself — see Ad tracking.\n- Server-side events, including refunds and subscription cancellations. They are sent from the server with credentials that are not per-site, so there is no way to route them to your property.\n- The built-in pageview beacon. Aglyn\'s own Traffic card is fed by a first-party, cookieless request that is not GA4 and does not appear in your property.'
9029
9890
  },
9030
9891
  {
9031
9892
  path: '/marketing-and-automation/analytics/google-analytics',
9032
9893
  title: 'Google Analytics events',
9033
9894
  heading: 'Related',
9034
9895
  anchor: '#related',
9035
- text: '- Analytics — the built-in Traffic card and per-page figures\n- Cookie consent — what has to be true before any of this runs\n- Interactions — sending an event of your own'
9896
+ text: '- Analytics — the built-in Traffic card and per-page figures\n- Cookie consent — what has to be true before any of this runs\n- Ad tracking — your own Meta, TikTok and Pinterest tags\n- Interactions — sending an event of your own'
9036
9897
  },
9037
9898
  {
9038
9899
  path: '/marketing-and-automation/analytics/insights',
@@ -9132,6 +9993,13 @@ export const DOCS_SECTION_INDEX = [
9132
9993
  anchor: '#google-analytics',
9133
9994
  text: 'Prefer your own tooling? Add a Google Analytics measurement ID under Site → Setup → Tracking and Aglyn injects it alongside the built-in tracking. There is a Google Tag Manager container field beside it, and both are gated on the visitor\'s analytics consent — the tag never loads for a visitor whose recorded state does not grant it.\nYour site then sends a defined set of events to your own property: form submissions, CTA and outbound clicks, the full ecommerce funnel, overlay and A/B events, and Core Web Vitals. Google Analytics events lists every one of them with the exact parameters it carries — read it before you build a report, because GA4 will not surface a custom dimension you have not registered.'
9134
9995
  },
9996
+ {
9997
+ path: '/marketing-and-automation/analytics/overview',
9998
+ title: 'Analytics',
9999
+ heading: 'The Tracking card',
10000
+ anchor: '#tracking-card',
10001
+ text: 'The Tracking card in a site\'s Setup connects your own analytics and advertising tags — Google Analytics, Tag Manager, a Meta pixel, Google Ads and LinkedIn — each loading only where the visitor\'s consent allows it.\nEvery field is optional; fill in the ones for the tools you use, then Save. In the UK, EU and EEA, and anywhere the visitor\'s region cannot be determined, nothing loads until the visitor accepts; elsewhere the tags load from the first visit and the visitor can turn them off at any time. The Cookie consent card below it sets that posture.\nGoogle Analytics measurement ID {#ga-measurement-id}\nPaste your GA4 measurement ID (it looks like G-XXXXXXXXXX, under Admin → Data streams in Google Analytics) to track the site in your own property alongside the built-in pageview analytics.\nThe field refuses anything that is not shaped like a measurement ID, so a saved one is one that will load. The events your property then receives are listed in Google Analytics events.\nGoogle Tag Manager container ID {#gtm-container}\nPaste your container ID (it looks like GTM-XXXXXXX) to load a Tag Manager container on the site, with Consent Mode signals set before it loads.\nA container is a loader: whatever tags it carries load with it, on the same consent terms as the other fields, and advertising tags in it stay denied until the visitor allows advertising. Do not put a Google Analytics or Google Ads tag in the container if you filled in those fields here — the same measurement would load twice and count every visit and conversion twice.\nMeta pixel ID {#meta-pixel}\nPaste the numeric pixel ID from Meta Events Manager to run a Meta pixel for ads and remarketing; it waits for advertising consent, a separate choice from analytics.\nThe ID is 8–20 digits. When a visitor withdraws consent, the'
10002
+ },
9135
10003
  {
9136
10004
  path: '/marketing-and-automation/analytics/overview',
9137
10005
  title: 'Analytics',
@@ -9237,6 +10105,13 @@ export const DOCS_SECTION_INDEX = [
9237
10105
  anchor: '#duplicate-a-template',
9238
10106
  text: 'Every template on the list has Duplicate… in its row menu. The copy takes the latest saved design whole, under the name you give it, and is sent by nothing until a campaign picks it — so a copy is the safe way to try a variation without touching the design a campaign is already using.'
9239
10107
  },
10108
+ {
10109
+ path: '/marketing-and-automation/email-campaigns/designed-emails',
10110
+ title: 'Designed emails',
10111
+ heading: 'A template\'s page',
10112
+ anchor: '#template-page',
10113
+ text: 'Open a template from the list to see it on its own page: rename it under Name (the name the campaign composer\'s design picker shows), and open it in the besigner with Edit in besigner to change the design. A template installed from a listing says so at the top of the card, because its content is versioned by whoever published it.\nUnder it come what the emails sent from it did, who received them, and a preview.\nSent from this template {#template-report}\nThe Sent from this template card lists every email sent from the template and adds up what they did, each rate over the population it was measured against. A design used by several emails has its figures in one place, and each row opens that email\'s own report.\nWho those emails reached is the card under it — the same Recipients table an email\'s own page carries.\nPreview {#template-preview}\nThe Preview card draws the template as an inbox receives it, with the same renderer the send uses; merge tokens are left standing, because a real send fills them from each recipient. A template with nothing in it yet says so, with the way into the besigner.'
10114
+ },
9240
10115
  {
9241
10116
  path: '/marketing-and-automation/email-campaigns/designed-emails',
9242
10117
  title: 'Designed emails',
@@ -9424,7 +10299,7 @@ export const DOCS_SECTION_INDEX = [
9424
10299
  title: 'Email Campaigns',
9425
10300
  heading: 'Opens & clicks',
9426
10301
  anchor: '#opens--clicks',
9427
- text: 'With the Resend webhook configured, campaign history shows opens and clicks per campaign, and clicks on A/B sends count as that variant\'s conversions — so the experiment results table fills in by itself.\nThe campaign report\nReport, beside any campaign that has been sent, opens the full picture for that one send.\nIt leads with what the campaign did — what it caused, what it earned, and where it sent people — and the mail\'s own figures come under that: delivery, engagement, rates and the audience it was taken from. A campaign holding several emails is laid out the same way, with the list of its emails last, so the two read alike.\nEvery rate names the population it is taken over, right next to the number, because the same label means different things in different tools:\n| Rate | Taken over |\n| Delivery rate | Sent — what the provider accepted |\n| Open rate | Delivered, and counting readers, not opens |\n| Click rate | Delivered |\n| Click-to-open rate | The readers who opened — a different question from the click rate, and usually three or four times larger |\n| Bounce rate | Sent |\n| Complaint rate | Delivered |\n| Unsubscribe rate | Delivered |\nTwo things the report will refuse to show you, and says so on screen:\n- A rate with no denominator. Delivery events are recorded by the webhook, so a campaign sent before it was connected has no delivered count. The report leaves those rates blank rather than dividing by sent, which would read higher than the same campaign measured anywhere else.\n- A click rate for a send whose links were not trackable. Click tracking rewrites links in the HTML part of a message, so a send that carried none reports zero clicks whatever recipients did. The click count is still shown; no rate is computed from it.\nOpens and readers who opened are both sh'
10302
+ text: 'With the Resend webhook configured, campaign history shows opens and clicks per campaign, and clicks on A/B sends count as that variant\'s conversions — so the experiment results table fills in by itself.\nThe Last campaign card {#last-campaign-card}\nThe Last campaign card on a site\'s dashboard shows how many emails your most recent sent campaign sent, and how many opens and clicks it has had; Campaigns in its header opens the full history.\nThe Messages list {#messages-list}\nEmails → Messages lists every email this site has sent, scheduled or is still writing, newest first, a page at a time, and each row opens that email\'s own page. On your organization\'s Emails page it lists every site\'s, with a Site column, and writing a new one there first asks which site it is sent as.\nOne email\'s page {#email-page}\nOpen any email from Messages to see what it did on its own: where it went and its state, its delivery and engagement figures with every rate over the population it is measured against, the links followed, and who it was allowed to reach.\nThe header carries what can still be done with it — Send now, Stop sending or Send to more recipients while those apply, Write this email while it is unsent, and Open template for a designed one — beside All messages. The Recipients table and the Preview come under it.\nPreview {#email-preview}\nThe Preview card at the foot of an email\'s page draws the email as an inbox receives it, with the same renderer the send uses; merge tokens are left standing, because a real send fills them from each recipient.\nThe HTML that was mailed is not stored — it is rendered for each recipient at send time — so the preview draws the template as it is now, and says so when the email went out before the template was last edited.\nWho an email reached {#email-rec'
9428
10303
  },
9429
10304
  {
9430
10305
  path: '/marketing-and-automation/email-campaigns/overview',
@@ -9494,7 +10369,7 @@ export const DOCS_SECTION_INDEX = [
9494
10369
  title: 'Marketing Overlays',
9495
10370
  heading: 'Across your organization\'s sites',
9496
10371
  anchor: '#across-your-sites',
9497
- text: 'Your organization has its own Marketing page beside CRM, with the same sections as a site\'s — Overview, Campaigns, Conversions, Overlays and A/B testing — each answering for every site at once. It opens on Overview.\n- Overview leads with the email figures for every site\'s sends, then lists your sites one per row with their overlay views and clicks and their running and decided A/B tests, totaled underneath. A site\'s name opens its own Overview, which also counts the overlays live right now. The table covers your first 25 sites; a site past that has its figures on its own page.\n- Overlays lists every site\'s bars and popups, grouped by site in the order each site shows them, with whether that site\'s default bar and popup are on. Switch an overlay on or off right from the list. Creating and editing happen on the site — New overlay asks which site, and Edit opens that site\'s Overlays section — because an overlay is written against one site\'s pages, variables and order. Ten sites show at a time, with up to ten overlays each; a site with more says so and links to its own list.\nThese figures and lists are read when you open the section rather than kept live, so open it again to see a change made somewhere else. Without the marketingOverlays entitlement the organization\'s Overlays section is locked, and the Overview leaves the overlay columns out.'
10372
+ text: 'Your organization has its own Marketing page beside CRM, with the same sections as a site\'s — Overview, Campaigns, Conversions, Overlays and A/B testing — each answering for every site at once. It opens on Overview.\nThese figures and lists are read when you open the section rather than kept live, so open it again to see a change made somewhere else. Without the marketingOverlays entitlement the organization\'s Overlays section is locked, and the Overview leaves the overlay columns out.\nEvery site at a glance {#org-marketing-overview}\nThe organization\'s Overview leads with the email figures for every site\'s sends, then lists your sites one per row with their overlay views and clicks and their running and decided A/B tests, totaled underneath.\nA site\'s name opens its own Overview, which also counts the overlays live right now. The table covers your first 25 sites; a site past that has its figures on its own page.\nEvery site\'s overlays {#org-overlays}\nThe organization\'s Overlays section lists every site\'s bars and popups, grouped by site, and switches any of them on or off right from the list. Each site\'s overlays are in the order that site shows them, with whether its default bar and popup are on.\nCreating and editing happen on the site — New overlay asks which site, and Edit opens that site\'s Overlays section — because an overlay is written against one site\'s pages, variables and order. Ten sites show at a time, with up to ten overlays each; a site with more says so and links to its own list.'
9498
10373
  },
9499
10374
  {
9500
10375
  path: '/marketing-and-automation/marketing-overlays/overview',
@@ -9767,7 +10642,7 @@ export const DOCS_SECTION_INDEX = [
9767
10642
  title: 'Add-ons',
9768
10643
  heading: 'What you can add',
9769
10644
  anchor: '#what-you-can-add',
9770
- text: 'Prices live on one page Per-unit add-on prices are on aglyn.com/pricing, and what YOUR workspace would pay is shown in Billing before you confirm. This page covers what each add-on does and how it is billed; restating the numbers here would just be a second copy to keep in step.\n| Add-on | What it does | How it is priced |\n| Manager seats | Workspace manager seats beyond the included count | Per seat, per month — cheaper on higher plans |\n| Collaborator seats | Per-site collaborator (teammate) seats beyond the included count | Per seat, per month — cheaper on higher plans |\n| Extra datasets | Additional shared datasets across the workspace | Per dataset, per month — cheaper on higher plans |\n| Extra sites | Publish more sites than your plan includes | Per site, per month — cheaper on higher plans |\n| POS registers | One extra point-of-sale register, assigned to one site | Flat per register, per month — the same on every plan |\n| Event Calendar | The event manager + calendar elements, workspace-wide | Flat per month — the same on every plan |\n| Aglyn AI | Generative building — pages, emails, campaigns, products and more — plus a monthly band of AI credits added to your plan\'s, workspace-wide | Flat per month, priced by plan — higher on higher plans, and so is the band it adds |\n- Prices are per unit per month. On annual billing, add-ons bill yearly alongside your plan (12× the monthly price) — a subscription has one billing interval.\n- POS registers also require a plan with POS (Pro and above), and each one is assigned to a specific site — see Assigning register seats.\n- Collaborator seats work the same way as POS registers: bought once for the workspace, then assigned to a site — see Assigning collaborator seats.\n- Event Calendar is a single workspace-wide toggle, not a'
10645
+ text: 'Buy extra capacity for the whole workspace on the Plan add-ons card under Billing → Plan: manager seats, datasets and extra sites apply straight away, while collaborator seats and POS registers become pools you then assign to a site.\nPrices live on one page Per-unit add-on prices are on aglyn.com/pricing, and what YOUR workspace would pay is shown in Billing before you confirm. This page covers what each add-on does and how it is billed; restating the numbers here would just be a second copy to keep in step.\n| Add-on | What it does | How it is priced |\n| Manager seats | Workspace manager seats beyond the included count | Per seat, per month — cheaper on higher plans |\n| Collaborator seats | Per-site collaborator (teammate) seats beyond the included count | Per seat, per month — cheaper on higher plans |\n| Extra datasets | Additional shared datasets across the workspace | Per dataset, per month — cheaper on higher plans |\n| Extra sites | Publish more sites than your plan includes | Per site, per month — cheaper on higher plans |\n| POS registers | One extra point-of-sale register, assigned to one site | Flat per register, per month — the same on every plan |\n| Event Calendar | The event manager + calendar elements, workspace-wide | Flat per month — the same on every plan |\n| Aglyn AI | Generative building — pages, emails, campaigns, products and more — plus a monthly band of AI credits added to your plan\'s, workspace-wide | Flat per month, priced by plan — higher on higher plans, and so is the band it adds |\n- Prices are per unit per month. On annual billing, add-ons bill yearly alongside your plan (12× the monthly price) — a subscription has one billing interval.\n- POS registers also require a plan with POS (Pro and above), and each one is assigned to a specific site — s'
9771
10646
  },
9772
10647
  {
9773
10648
  path: '/workspace-and-billing/billing-and-plans/add-ons',
@@ -9893,7 +10768,7 @@ export const DOCS_SECTION_INDEX = [
9893
10768
  title: 'Downgrading, canceling & your data',
9894
10769
  heading: 'Canceling your subscription',
9895
10770
  anchor: '#canceling-your-subscription',
9896
- text: '- Cancel any time. Your subscription runs to the end of the paid period — a chip on the Billing page shows the end date, and you can resume before it hits.\n- When the period ends, your organization resolves to the Free plan. This is the same as a downgrade: nothing is deleted, over-limit resources persist, and paid features turn off.\n- A failed payment doesn\'t cancel you immediately — your access continues while Stripe retries the charge (a past-due banner shows), and entitlements only drop to Free if the subscription actually lapses.\nWhat the Cancel button actually opens {#the-cancel-dialog}\nCancel subscription doesn\'t cancel on the first click. It opens a short dialog with up to four steps. We\'d rather tell you what\'s in it here than have it surprise you:\n1. "Why are you leaving?" — one choice from a fixed list (too expensive, missing features, not using it enough, switching to something else, technical problems, just pausing, something else) plus an optional comment box. This is the only required step, and the comment is genuinely optional.\n2. A downsell, if a smaller paid plan would still fit you. It names the plan and its price. No thanks, continue moves on.\n3. A winback discount, if you haven\'t used one before. It states the exact percentage and the exact number of months it lasts, because a discount whose end date you can\'t see isn\'t an offer. No thanks, continue moves on.\n4. The confirmation. This step also lists anything you\'ll be over the Free plan\'s limits on once the cancel lands — extra sites, datasets, seats — so the consequence is visible at the moment you decide, not afterwards.\nThings worth knowing about the offers:\n- Every step has a visible way past it. There is no step you can only leave by staying. Keep my plan on the last step closes the dialog and'
10771
+ text: 'Canceling keeps your plan until the end of the period you have already paid for, then moves the organization to the Free plan — nothing is deleted, and you can resume any time before the period ends.\n- Cancel any time. Your subscription runs to the end of the paid period — a chip on the Billing page shows the end date, and you can resume before it hits.\n- When the period ends, your organization resolves to the Free plan. This is the same as a downgrade: nothing is deleted, over-limit resources persist, and paid features turn off.\n- A failed payment doesn\'t cancel you immediately — your access continues while Stripe retries the charge (a past-due banner shows), and entitlements only drop to Free if the subscription actually lapses.\nWhat the Cancel button actually opens {#the-cancel-dialog}\nCancel subscription doesn\'t cancel on the first click. It opens a short dialog with up to four steps. We\'d rather tell you what\'s in it here than have it surprise you:\n1. "Why are you leaving?" — one choice from a fixed list (too expensive, missing features, not using it enough, switching to something else, technical problems, just pausing, something else) plus an optional comment box. This is the only required step, and the comment is genuinely optional.\n2. A downsell, if a smaller paid plan would still fit you. It names the plan and its price. No thanks, continue moves on.\n3. A winback discount, if you haven\'t used one before. It states the exact percentage and the exact number of months it lasts, because a discount whose end date you can\'t see isn\'t an offer. No thanks, continue moves on.\n4. The confirmation. This step also lists anything you\'ll be over the Free plan\'s limits on once the cancel lands — extra sites, datasets, seats — so the consequence is visible at the moment you de'
9897
10772
  },
9898
10773
  {
9899
10774
  path: '/workspace-and-billing/billing-and-plans/downgrading-and-canceling',
@@ -9907,7 +10782,7 @@ export const DOCS_SECTION_INDEX = [
9907
10782
  title: 'Downgrading, canceling & your data',
9908
10783
  heading: 'Deleting your organization',
9909
10784
  anchor: '#deleting-your-organization',
9910
- text: 'Deletion is separate from canceling and is the only thing that removes your data. It\'s intentional and reversible for a short window:\n1. Request deletion — an owner starts it from the organization settings; you confirm by typing the organization name. Export anything you want to keep before you start (Setup → Backup & restore) — the hold is the window for it, and nothing is kept for you afterwards.\n2. A hold period follows the request. During the hold nothing is deleted and you can cancel the request to fully restore.\n3. After the hold, the organization — its sites, files, datasets, and account records — is permanently erased. This step is irreversible, and we keep no copy of the erased data. What we retain is an internal record that the erasure happened: which organization, when it was requested, and how many sites, members and credentials were removed.\nDeletion covers your organization\'s sites and their stored files and data. If you own an organization that still has other members, transfer or remove them first — a shared organization isn\'t deleted out from under its members.\nGDPR / right to erasure You can request erasure of your personal data at any time. Deletion permanently removes your records and leaves us with no copy of them — only a record that the erasure was carried out, which is itself kept for a limited period. Export anything you need during the hold. Contact support if you need an erasure completed outside the self-serve flow.'
10785
+ text: 'Deletion is separate from canceling and is the only thing that removes your data. It\'s intentional and reversible for a short window:\n1. Request deletion — an owner starts it from the organization settings; you confirm by typing the organization name. Export anything you want to keep before you start (Setup → Backup & restore) — the hold is the window for it, and nothing is kept for you afterwards.\n2. A hold period follows the request. During the hold nothing is deleted and you can cancel the request to fully restore.\n3. After the hold, the organization — its sites, files, datasets, and account records — is permanently erased. This step is irreversible, and we keep no copy of the erased data. What we retain is an internal record that the erasure happened: which organization, when it was requested, and how many sites, members and credentials were removed.\nDeletion covers your organization\'s sites and their stored files and data. If you own an organization that still has other members, transfer or remove them first — a shared organization isn\'t deleted out from under its members.\nGDPR / right to erasure You can request erasure of your personal data at any time. Deletion permanently removes your records and leaves us with no copy of them — only a record that the erasure was carried out, which is itself kept for a limited period. Export anything you need during the hold. Contact support if you need an erasure completed outside the self-serve flow.\nConfirming the deletion {#confirm-deletion}\nThe last step of Delete organization starts the deletion of the organization and everything in it; nothing is erased yet, and you can cancel the request at any time during the hold period that follows. It is the same short dialog canceling opens, so it asks why you are leaving first, and'
9911
10786
  },
9912
10787
  {
9913
10788
  path: '/workspace-and-billing/billing-and-plans/downgrading-and-canceling',
@@ -9923,6 +10798,13 @@ export const DOCS_SECTION_INDEX = [
9923
10798
  anchor: '',
9924
10799
  text: 'Billing & Plans\nYour plan determines which features you can use and how much of each. Aglyn checks entitlements (can you use a feature) and quotas (how much) throughout the product, and shows usage meters so you always know where you stand.\nPlan availability Every site has a plan. Free, Starter, Pro, Business, Scale, Advanced, and Agency unlock progressively more, and Enterprise sits above them all.'
9925
10800
  },
10801
+ {
10802
+ path: '/workspace-and-billing/billing-and-plans/overview',
10803
+ title: 'Billing & Plans',
10804
+ heading: 'The Billing page',
10805
+ anchor: '#billing-page',
10806
+ text: 'Organization → Billing is where your workspace\'s plan, usage, invoices and billing details live, in four tabs: Plan, Usage, Invoices and Settings. Members whose role carries View billing can read every tab; changing anything — the plan, add-ons, caps, cards, the billing address — needs Manage billing. Owners and admins have both.\nCurrent plan {#current-plan}\nThe Current plan card at the top of the Plan tab names your plan, the state of its subscription and its price, with the plan\'s headline limits — sites, team seats and campaign emails a month — beside it. Your full usage against every limit is on the Usage tab.\nWith Manage billing the card also carries the plan\'s controls:\n- Update payment method, in the card\'s header, replaces the card your subscription is charged to in one step, through Stripe\'s own form. It turns solid while a payment is failing, when it is the one thing on the page that matters.\n- Manage payment methods opens the Settings tab, where every card on file is listed — see Payment methods.\n- Cancel subscription opens a short dialog before anything changes — see What the Cancel button actually opens. Once a cancel is scheduled the same button reads Resume subscription.\n- When a move to a lower plan is scheduled, a chip says which plan and on what date, and Keep my current plan undoes it — see Changing your mind.\nA sentence under the limits says when the current period renews or ends, and any add-ons you hold are listed at the bottom.\nBilling links in emails {#billing-link}\nA billing link in an email from Aglyn — a failed-payment notice, say — opens the Billing page of your workspace, asking you to sign in first if you need to. Because the link cannot know which workspace it is about, an account that belongs to one workspace goes straight to its Billing '
10807
+ },
9926
10808
  {
9927
10809
  path: '/workspace-and-billing/billing-and-plans/overview',
9928
10810
  title: 'Billing & Plans',
@@ -9942,7 +10824,7 @@ export const DOCS_SECTION_INDEX = [
9942
10824
  title: 'Billing & Plans',
9943
10825
  heading: 'Storage overage',
9944
10826
  anchor: '#storage-overage',
9945
- text: 'Your plan includes an amount of storage for each of its sites, and the workspace shares it as one allowance: every site\'s media library and the organization library draw on the same total. On a paid plan, going past it is not a wall:\n- Uploads keep working. You are never stopped from adding files because you reached your included storage.\n- The extra storage is billed on your monthly invoice at our infrastructure cost plus 30%, kept after card fees — the exact per-GB rate is on the pricing page and in Billing → Storage cap.\n- We tell you before it happens. You get an alert as you approach your included storage and another when you cross it, so the invoice is never the first you hear of it. See usage meters.\nIf you would rather uploads stopped\nSet a monthly storage cap in Billing → Storage cap. This is optional and off unless you choose it. Once a month\'s storage overage would pass the amount you set, new uploads are refused and you are never billed above that number.\nYou can change or remove the cap at any time, including while you are over your included allowance. Nothing is ever deleted — a cap only affects new uploads, and removing one takes effect immediately.\nFree plans are never billed for storage On the Free plan there is no storage overage at all. Your included storage is a fixed cap, shared the same way: uploads stop when the workspace reaches it, wherever they are going, nothing is metered, and no amount of usage produces a charge — so there is nothing to cap and nothing to configure. Enterprise storage is a fixed default that an agreement raises, with no overage either: uploads stop there.\nNo surprise bills Two things prevent one, and they work in different ways. The alerts at 75%, 80%, 90% and 100% of your allowance mean nobody first learns about overage fro'
10827
+ text: 'Your plan includes an amount of storage for each of its sites, and the workspace shares it as one allowance: every site\'s media library and the organization library draw on the same total. On a paid plan, going past it is not a wall:\n- Uploads keep working. You are never stopped from adding files because you reached your included storage.\n- The extra storage is billed on your monthly invoice at our infrastructure cost plus 30%, kept after card fees — the exact per-GB rate is on the pricing page and in Billing → Storage cap.\n- We tell you before it happens. You get an alert as you approach your included storage and another when you cross it, so the invoice is never the first you hear of it. See usage meters.\nIf you would rather uploads stopped\nSet a monthly storage cap on the Storage cap card under Billing → Usage when you would rather new uploads stopped than pay for extra storage past a figure you choose. This is optional and off unless you choose it. Once a month\'s storage overage would pass the amount you set, new uploads are refused and you are never billed above that number.\nYou can change or remove the cap at any time, including while you are over your included allowance. Nothing is ever deleted — a cap only affects new uploads, and removing one takes effect immediately.\nFree plans are never billed for storage On the Free plan there is no storage overage at all. Your included storage is a fixed cap, shared the same way: uploads stop when the workspace reaches it, wherever they are going, nothing is metered, and no amount of usage produces a charge — so there is nothing to cap and nothing to configure. Enterprise storage is a fixed default that an agreement raises, with no overage either: uploads stop there.\nNo surprise bills Two things prevent one, and they work i'
9946
10828
  },
9947
10829
  {
9948
10830
  path: '/workspace-and-billing/billing-and-plans/overview',
@@ -9991,7 +10873,7 @@ export const DOCS_SECTION_INDEX = [
9991
10873
  title: 'Billing & Plans',
9992
10874
  heading: 'Payments',
9993
10875
  anchor: '#payments',
9994
- text: 'Billing runs through Stripe. Paid features (commerce, bookings, campaigns) share the same Stripe integration.\nYour billing details live on the Billing page in the console, one card per thing you might want to change. Each card saves on its own, so editing your address never touches your tax ID and vice versa.\nPaying an outstanding invoice {#outstanding}\nIf a payment fails, the invoice stays open and the Billing page shows it with a Pay now button.\n- It works even if the subscription has already been canceled. Dunning cancels subscriptions after enough failed retries; the invoice is still owed and still payable, and paying it does not require a plan.\n- Your bank may ask you to confirm the payment. That step is your bank\'s, not ours, and it appears for the same reason it does anywhere else.\n- We do not mark it paid because the button worked. The invoice updates when Stripe confirms the money arrived, so what you see is the settled state rather than an optimistic one.\n- The amount is the amount the invoice was issued for. Tax on an invoice is fixed when it is issued and is never recalculated later.\nWhat a plan will cost {#plan-total}\nBefore you subscribe, the Billing page quotes the plan you are looking at with tax included, taken from Stripe\'s own invoice preview rather than worked out here.\n- A total is only shown as final once tax has been calculated, which needs your billing address. Until then the page says so rather than showing a total that quietly leaves tax out.\n- A zero tax is explained, because a zero has several meanings: reverse charge applies and you account for the tax under your own registration; your account is registered as tax-exempt; or nothing is charged in your location.\n- Promotion codes are applied here. An invalid or expired code is refused immedia'
10876
+ text: 'Billing runs through Stripe. Paid features (commerce, bookings, campaigns) share the same Stripe integration.\nYour billing details live on the Billing page in the console, one card per thing you might want to change. Each card saves on its own, so editing your address never touches your tax ID and vice versa.\nPaying an outstanding invoice {#outstanding}\nIf a payment fails, the invoice stays open and the Outstanding card — on both the Plan and Invoices tabs of the Billing page — shows it with a Pay now button.\n- It works even if the subscription has already been canceled. Dunning cancels subscriptions after enough failed retries; the invoice is still owed and still payable, and paying it does not require a plan.\n- Your bank may ask you to confirm the payment. That step is your bank\'s, not ours, and it appears for the same reason it does anywhere else.\n- We do not mark it paid because the button worked. The invoice updates when Stripe confirms the money arrived, so what you see is the settled state rather than an optimistic one.\n- The amount is the amount the invoice was issued for. Tax on an invoice is fixed when it is issued and is never recalculated later.\nWhat a plan will cost {#plan-total}\nBefore you subscribe, the Billing page quotes the plan you are looking at with tax included, taken from Stripe\'s own invoice preview rather than worked out here.\n- A total is only shown as final once tax has been calculated, which needs your billing address. Until then the page says so rather than showing a total that quietly leaves tax out.\n- A zero tax is explained, because a zero has several meanings: reverse charge applies and you account for the tax under your own registration; your account is registered as tax-exempt; or nothing is charged in your location.\n- Promotion codes '
9995
10877
  },
9996
10878
  {
9997
10879
  path: '/workspace-and-billing/billing-and-plans/overview',
@@ -10068,7 +10950,14 @@ export const DOCS_SECTION_INDEX = [
10068
10950
  title: 'Manage Account',
10069
10951
  heading: '',
10070
10952
  anchor: '',
10071
- text: 'Manage Account\nManage Account is your personal account page, separate from your workspace and its team roster. Open it from the account menu (your avatar, top right) — click your name in the menu header, or the gear icon beside it.\nEverything here is yours alone: changing it follows you into every workspace you belong to. Workspace-level things — the team roster, roles, billing — live under Organization → Team and Billing instead.\nThe page is five tabs.'
10953
+ text: 'Manage Account\nManage Account is your personal account page, separate from your workspace and its team roster. Open it from the account menu (your avatar, top right) — click your name in the menu header, or the gear icon beside it.\nEverything here is yours alone: changing it follows you into every workspace you belong to. Workspace-level things — the team roster, roles, billing — live under Organization → Team and Billing instead.'
10954
+ },
10955
+ {
10956
+ path: '/workspace-and-billing/manage-account',
10957
+ title: 'Manage Account',
10958
+ heading: 'The tabs',
10959
+ anchor: '#account-tabs',
10960
+ text: 'Manage Account has a tab for each part of your account — Account, Email addresses, Profile image, Basic info, Security and Close account — and each one saves on its own. Security is left out for an account that signs in only through a company identity provider, which owns that account\'s credentials.'
10072
10961
  },
10073
10962
  {
10074
10963
  path: '/workspace-and-billing/manage-account',
@@ -10103,7 +10992,7 @@ export const DOCS_SECTION_INDEX = [
10103
10992
  title: 'Manage Account',
10104
10993
  heading: 'Security',
10105
10994
  anchor: '#security',
10106
- text: 'Change your password.\nThis tab appears only if your account has a password. A Google-only account has no password to change — connect Email & password from the Account tab first, and the Security tab appears.'
10995
+ text: 'The Security tab is where you change your password, manage your passkeys and check recent sign-ins. To change your password, type your current one, then the new one twice, and save.\nThe password card appears only if your account has a password. A Google-only account has no password to change — connect Email & password from the Account tab first, and the card appears.'
10107
10996
  },
10108
10997
  {
10109
10998
  path: '/workspace-and-billing/manage-account',
@@ -10117,7 +11006,14 @@ export const DOCS_SECTION_INDEX = [
10117
11006
  title: 'Report an issue',
10118
11007
  heading: '',
10119
11008
  anchor: '',
10120
- text: 'Report an issue\nFound something broken? Open the account menu in the top right and choose Report an issue. The dialog is available from every console page, and on every plan — including Free.\nIt also has a direct link — app.aglyn.com/manage/report-issue — which is the one to share with someone, or to bookmark. Opening it from the account menu is still the better route while you are looking at the problem: the report carries the page you were on, and that page is the most useful thing in it.'
11009
+ text: 'Report an issue\nFound something broken? Open the account menu in the top right and choose Report an issue. The dialog is available from every console page, and on every plan — including Free.'
11010
+ },
11011
+ {
11012
+ path: '/workspace-and-billing/report-an-issue',
11013
+ title: 'Report an issue',
11014
+ heading: 'The Report an issue page',
11015
+ anchor: '#direct-link',
11016
+ text: 'The Report an issue page opens the report dialog on a page of its own — the link to share with someone, or to bookmark. On aglyn.com it is app.aglyn.com/manage/report-issue. Closing the dialog leaves a Report an issue button on the page to open it again. Opening it from the account menu is still the better route while you are looking at the problem: the report carries the page you were on, and that page is the most useful thing in it.'
10121
11017
  },
10122
11018
  {
10123
11019
  path: '/workspace-and-billing/report-an-issue',
@@ -10278,14 +11174,21 @@ export const DOCS_SECTION_INDEX = [
10278
11174
  title: 'Support & community',
10279
11175
  heading: 'Support tickets',
10280
11176
  anchor: '#support-tickets',
10281
- text: 'At Organization → Support → Support tickets.\nA ticket is a private conversation between your organization and Aglyn staff. Anyone in the organization can open one and follow the thread.\nOn Free and Starter this page explains where ticket support starts and points you at the forum instead — it never offers a New ticket button the server would refuse.\n1. Choose New ticket.\n2. Give it a Subject (up to 150 characters) and describe what\'s going on in the message body (up to 5,000 characters).\n3. Submit. The ticket appears in your list marked open, and Aglyn staff are notified immediately.\nOpen a ticket from the list to read the thread and reply. Each message shows who sent it, so a staff reply is always distinguishable from your own.\nTicket status\n- open — with you or with Aglyn; new replies from either side keep it open.\n- closed — resolved. Either side can close a ticket, and replying to a closed ticket reopens it automatically — you never need to file a duplicate to follow up on something you thought was finished.\nTickets belong to the organization, not to the person who opened them, so a teammate can pick up a thread while you\'re away. They stay in the list after closing as a record of what was asked and answered.\nWhat to include\nSupport answers faster with the specifics: the site and page involved, what you expected versus what happened, and the exact error text if there is one. If it\'s about billing, say which plan and which invoice.'
11177
+ text: 'At Organization → Support → Support tickets.\nA ticket is a private conversation between your organization and Aglyn staff. Anyone in the organization can open one and follow the thread.\nOn Free and Starter this page explains where ticket support starts and points you at the forum instead — it never offers a New ticket button the server would refuse.\n1. Choose New ticket.\n2. Give it a Subject (up to 150 characters) and describe what\'s going on in the message body (up to 5,000 characters).\n3. Submit. The ticket appears in your list marked open, and Aglyn staff are notified immediately.\nOpen a ticket from the list to read the thread and reply. Each message shows who sent it, so a staff reply is always distinguishable from your own.\nYour tickets {#your-tickets}\nThe Your tickets card lists every ticket your organization has opened, each marked open or closed, under the first-response target your plan carries. Choose New ticket to start one, or Open on a ticket to read the thread and reply. On Enterprise the card also names your success manager, who is copied on every ticket, once one is appointed. On Free and Starter it says where ticket support starts instead.\nTicket status\n- open — with you or with Aglyn; new replies from either side keep it open.\n- closed — resolved. Either side can close a ticket, and replying to a closed ticket reopens it automatically — you never need to file a duplicate to follow up on something you thought was finished.\nTickets belong to the organization, not to the person who opened them, so a teammate can pick up a thread while you\'re away. They stay in the list after closing as a record of what was asked and answered.\nWhat to include\nSupport answers faster with the specifics: the site and page involved, what you expected versus what happened, and '
10282
11178
  },
10283
11179
  {
10284
11180
  path: '/workspace-and-billing/support-and-community',
10285
11181
  title: 'Support & community',
10286
11182
  heading: 'Community forum',
10287
11183
  anchor: '#community-forum',
10288
- text: 'At Organization → Support → Community forum, and the page Free and Starter workspaces land on.\nThe forum is for questions other builders can answer, and for sharing what you\'ve made. Threads are visible to everyone with forum access across all organizations — so don\'t post anything private (account details, customer data, keys). That\'s what a support ticket is for.\nThreads are organized into four categories:\n| Category | For |\n| General | Anything that doesn\'t fit the others. |\n| Building | How-to questions about designing and shipping sites. |\n| Showcase | Show the site you built. |\n| Feedback | Product feedback and feature requests. |\nFilter the list by category, open a thread to read and reply, or start your own with a title and body (5,000 characters). Your display name and avatar are shown as the author.'
11184
+ text: 'At Organization → Support → Community forum, and the page Free and Starter workspaces land on.\nThe forum is for questions other builders can answer, and for sharing what you\'ve made. Threads are visible to everyone with forum access across all organizations — so don\'t post anything private (account details, customer data, keys). That\'s what a support ticket is for.\nThreads are organized into four categories:\n| Category | For |\n| General | Anything that doesn\'t fit the others. |\n| Building | How-to questions about designing and shipping sites. |\n| Showcase | Show the site you built. |\n| Feedback | Product feedback and feature requests. |\nThreads {#forum-threads}\nThe Threads card lists the forum\'s threads, each with its category, author and number of replies. Pick a category chip to show only that category, choose Read to open a thread and reply, or Start a thread to post your own with a title, a category and a body (5,000 characters). Your display name and avatar are shown as the author.'
11185
+ },
11186
+ {
11187
+ path: '/workspace-and-billing/support-and-community',
11188
+ title: 'Support & community',
11189
+ heading: 'Support links in emails',
11190
+ anchor: '#support-link',
11191
+ text: 'A support link in an email from Aglyn, on a receipt or in a payment page opens Support for your workspace, asking you to sign in first if you need to. An account that belongs to one workspace goes straight there; an account in several is asked to Choose a workspace first, and then lands on the channel that workspace\'s plan makes primary.\nIf the account you signed in with belongs to no workspace, the page says so — you may have signed in with a different address than the one you were invited with.'
10289
11192
  },
10290
11193
  {
10291
11194
  path: '/workspace-and-billing/support-and-community',
@@ -10385,12 +11288,19 @@ export const DOCS_SECTION_INDEX = [
10385
11288
  anchor: '#you-are-a-site-collaborators-support-channel',
10386
11289
  text: 'Someone you invite to a single site gets a console scoped to that site, which leaves out the organization pages — including Support. That is deliberate: a support ticket is a conversation between the whole organization and Aglyn, readable by your team, not a per-site channel.\nThe practical consequence is that a site collaborator who hits a problem comes to you. Open a ticket on their behalf if it needs Aglyn — include the site and the exact error, as Support & community describes, since you will be relaying rather than reproducing. Someone invited to the whole organization keeps Support unchanged.'
10387
11290
  },
11291
+ {
11292
+ path: '/workspace-and-billing/teams-and-roles/invite-teammates',
11293
+ title: 'Invite teammates',
11294
+ heading: 'A member\'s page',
11295
+ anchor: '#member-page',
11296
+ text: 'Open anyone from the Team page to see their own page: their role and site access, a Password card for helping them back in, what has been changed about them, everything they have done in the organization, and their AI usage and allotment.\nRole and site access {#member-access}\nThe Member card sets this person\'s organization role and job title and, for an editor or viewer, which sites they can reach. Roles are Admin, Editor and Viewer. Admins reach every site; for an editor or viewer, turn off Access to all sites and choose Editor, Viewer or No access on each site, so they see only those. Save applies the change; Remove from organization takes them off the team and frees their seat.\nEditing a member needs the admin role. The owner\'s role is not edited here — ownership moves under Settings → Transfer ownership.\nOne member\'s activity {#member-activity}\nActivity by this member lists everything this person has done in the organization — on its sites as well as at organization level — newest first. Above it, Changes to this member lists what others changed about them, such as role and access edits. Both need the Activity & audit log permission, the same as the organization\'s activity log.'
11297
+ },
10388
11298
  {
10389
11299
  path: '/workspace-and-billing/teams-and-roles/invite-teammates',
10390
11300
  title: 'Invite teammates',
10391
11301
  heading: 'Help a teammate who is locked out',
10392
11302
  anchor: '#help-a-teammate-who-is-locked-out',
10393
- text: 'Open the member from the Team page and use the Password card. It has two options, and the first is almost always the right one.\nSend password reset email emails the member a link to choose their own password. Their current password keeps working until they use the link, and nobody else ever sees the new one. This works for every member. A few sends per hour to the same person is the cap — it\'s their inbox, and a reset link is good for an hour anyway.\nSet a password directly replaces the member\'s password with one you choose. Use it only when the member cannot receive email at all — you then have to pass the new password to them over a channel you trust. When you do:\n- they are signed out on every device, and\n- they are emailed to say an administrator changed their password.\nWhy you can\'t always set a password\nAn Aglyn login is personal, not per-organization. One person has one account no matter how many organizations they work with, so setting someone\'s password can hand you the keys to workspaces that have nothing to do with yours.\nThe Set a password directly option is therefore unavailable — with the reason shown in its place — when the member:\n- also belongs to another organization,\n- is the organization owner (use Settings → Transfer ownership instead),\n- is an Aglyn staff account, or\n- is you (change your own password in your account settings).\nIn every one of those cases, Send password reset email still works. The link goes to the member\'s own inbox, so it is safe regardless of what else their account can reach.\nBoth actions are recorded in the organization\'s activity log, along with who performed them. The password itself is never written to the log.'
11303
+ text: 'When a teammate cannot sign in, open them from the Team page and use the Password card to email them a reset link — or, when their account belongs to your organization alone, to set a password for them. The first is almost always the right one.\nSend password reset email emails the member a link to choose their own password. Their current password keeps working until they use the link, and nobody else ever sees the new one. This works for every member. A few sends per hour to the same person is the cap — it\'s their inbox, and a reset link is good for an hour anyway.\nSet a password directly replaces the member\'s password with one you choose. Use it only when the member cannot receive email at all — you then have to pass the new password to them over a channel you trust. When you do:\n- they are signed out on every device, and\n- they are emailed to say an administrator changed their password.\nWhy you can\'t always set a password\nAn Aglyn login is personal, not per-organization. One person has one account no matter how many organizations they work with, so setting someone\'s password can hand you the keys to workspaces that have nothing to do with yours.\nThe Set a password directly option is therefore unavailable — with the reason shown in its place — when the member:\n- also belongs to another organization,\n- is the organization owner (use Settings → Transfer ownership instead),\n- is an Aglyn staff account, or\n- is you (change your own password in your account settings).\nIn every one of those cases, Send password reset email still works. The link goes to the member\'s own inbox, so it is safe regardless of what else their account can reach.\nBoth actions are recorded in the organization\'s activity log, along with who performed them. The password itself is never written to the lo'
10394
11304
  },
10395
11305
  {
10396
11306
  path: '/workspace-and-billing/teams-and-roles/invite-teammates',
@@ -10476,6 +11386,13 @@ export const DOCS_SECTION_INDEX = [
10476
11386
  anchor: '',
10477
11387
  text: 'Teams, Roles & Membership\nAglyn has two kinds of people: your team (who build and manage the site) and site members (visitors who sign up to your site). Both are permission-aware.\nPlan availability Paid. Seats are metered per tier; see Billing & plans.\nThe Team page\'s roster filters through its table\'s toolbar: Filters narrows it by Role (is one role, or is any of several) or Access (is Team manager or Site collaborator), and Search finds a member by the start of any word of their name, email address or job title — ada, lovelace or example.com all find Ada Lovelace at ada@example.com. The filters and the search add up, and they are answered by the query that reads the roster, so the table lists every member who matches, not a narrowing of the rows already on screen. Each filter in force shows as a chip above the table; see Filter and search a list. The role pickers and Permissions in each row work as before.'
10478
11388
  },
11389
+ {
11390
+ path: '/workspace-and-billing/teams-and-roles/overview',
11391
+ title: 'Teams, Roles & Membership',
11392
+ heading: 'The Team page',
11393
+ anchor: '#team-page',
11394
+ text: 'Organization → Team is where you manage the people who build and run your sites, in three tabs: Members lists everyone and invites more, Custom roles defines what a role may do, and Recent activity shows what changed across the organization. Recent activity appears only to members whose role carries Activity & audit log.\nOpen anyone on Members for their own page — see A member\'s page.'
11395
+ },
10479
11396
  {
10480
11397
  path: '/workspace-and-billing/teams-and-roles/overview',
10481
11398
  title: 'Teams, Roles & Membership',