@aglyn/aglyn 1.0.0-beta.287 → 1.0.0-beta.289

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 (46) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/business-profile-values.d.ts +15 -3
  3. package/src/lib/app-utils/business-profile-values.js +19 -3
  4. package/src/lib/app-utils/business-profile-values.js.map +1 -1
  5. package/src/lib/app-utils/business-profile.d.ts +5 -3
  6. package/src/lib/app-utils/business-profile.js +2 -1
  7. package/src/lib/app-utils/business-profile.js.map +1 -1
  8. package/src/lib/app-utils/docs-help-sections.generated.js +5 -0
  9. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
  10. package/src/lib/app-utils/docs-help.generated.d.ts +7 -1
  11. package/src/lib/app-utils/docs-help.generated.js +24 -0
  12. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  13. package/src/lib/app-utils/docs-index.generated.js +111 -27
  14. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  15. package/src/lib/app-utils/element-motion.js +1 -0
  16. package/src/lib/app-utils/element-motion.js.map +1 -1
  17. package/src/lib/app-utils/host-permissions.d.ts +31 -1
  18. package/src/lib/app-utils/host-permissions.js +45 -5
  19. package/src/lib/app-utils/host-permissions.js.map +1 -1
  20. package/src/lib/app-utils/host-status.d.ts +2 -1
  21. package/src/lib/app-utils/host-status.js +10 -0
  22. package/src/lib/app-utils/host-status.js.map +1 -1
  23. package/src/lib/app-utils/org-permissions.d.ts +8 -0
  24. package/src/lib/app-utils/org-permissions.js +2 -0
  25. package/src/lib/app-utils/org-permissions.js.map +1 -1
  26. package/src/lib/app-utils/org-role-grants.js +3 -3
  27. package/src/lib/app-utils/org-role-grants.js.map +1 -1
  28. package/src/lib/app-utils/screen-slug.d.ts +5 -5
  29. package/src/lib/app-utils/screen-slug.js +5 -5
  30. package/src/lib/app-utils/screen-slug.js.map +1 -1
  31. package/src/lib/app-utils/search-indexing.d.ts +18 -0
  32. package/src/lib/app-utils/search-indexing.js +16 -2
  33. package/src/lib/app-utils/search-indexing.js.map +1 -1
  34. package/src/lib/app-utils/server.d.ts +1 -0
  35. package/src/lib/app-utils/server.js +2 -0
  36. package/src/lib/app-utils/server.js.map +1 -1
  37. package/src/lib/app-utils/site-preview.d.ts +153 -0
  38. package/src/lib/app-utils/site-preview.js +167 -0
  39. package/src/lib/app-utils/site-preview.js.map +1 -0
  40. package/src/lib/foundation/definitions/platform.types.d.ts +27 -0
  41. package/src/lib/foundation/definitions/platform.types.js.map +1 -1
  42. package/src/lib/plugin-manager/feature-plugins.d.ts +17 -1
  43. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  44. package/src/lib/plugin-manager/plugin-entitlements.d.ts +12 -0
  45. package/src/lib/plugin-manager/plugin-entitlements.js +4 -2
  46. package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -1
@@ -541,28 +541,28 @@ export const DOCS_SECTION_INDEX = [
541
541
  title: 'Bring my site',
542
542
  heading: 'Read my site',
543
543
  anchor: '#read-my-site',
544
- text: 'Choose Read my site. Aglyn then:\n- creates your new site, with nothing on it and nothing published;\n- reads your current site as AglynBot, starting with its robots.txt file and its sitemap, and only on your own domain. Your current site is not changed.\nReading uses no AI credits. When it is done, Your site is read shows:\n- what was found, grouped as your Main pages and each collection, such as a blog\'s posts;\n- how many pages your plan includes, how many will be brought in, and in how many waves;\n- each page\'s old address and its address on your new site;\n- under Not brought in, every page that was left out and the reason.'
544
+ text: 'Choose Read my site. Aglyn then:\n- creates your new site, with nothing on it and nothing published;\n- reads your current site as AglynBot, starting with its robots.txt file and its sitemap, then your home page, then every other page, and only on your own domain. Your current site is not changed.\nReading uses no AI credits.\nYour home page comes first. If AglynBot cannot read your home page, nothing is planned and no AI credits are used. The import waits and says why:\n- AglynBot was turned away means your site\'s bot protection or firewall refused it. See When your site turns AglynBot away.\n- Your home page could not be read means your home page answered with an error or did not answer. Check that your site is up, then choose Check again.\nCheck again reads your site again, and uses no AI credits either.\nWhen it is done, Your site is read shows:\n- what was found, grouped as your Main pages and each collection, such as a blog\'s posts, and how many more pages could not be read;\n- how many pages your plan includes, how many will be brought in, and in how many waves;\n- if the read ran out of time before it reached every page, a line that says so;\n- each page\'s old address and its address on your new site, and Old page, which opens the page on your current site in a new tab;\n- under Not brought in, every page that was left out and the reason.\nNot brought in {#not-brought-in}\nEach page left out is listed under one of these reasons:\n- Past your plan\'s page count. See plans opens Billing.\n- Turned away by your site\'s bot protection or firewall. See When your site turns AglynBot away.\n- Not reached. The read stopped before it got to the page.\n- No text could be read. The page shows its words only once a browser runs it, so it cannot be brought in yet.\n- Could not be read just now, a'
545
545
  },
546
546
  {
547
547
  path: '/ai/bring-my-site',
548
548
  title: 'Bring my site',
549
549
  heading: 'Waves',
550
550
  anchor: '#waves',
551
- text: '- The first wave brings in your main pages: home, then the pages in your menu, then your other top-level pages. It also builds your new site\'s header and footer, with the menu linking those pages.\n- Each later wave brings in up to 10 pages of one collection, for example Blog, 1 of 3.\n- Never past your plan. Your main pages are kept first. If your site has more pages than your plan allows, the last pages of your collections are the ones left out, each listed with Past your plan\'s page count. See plans opens Billing.\nTo start a wave, choose its Start button, for example Start Main pages. Each wave shows its cost before you start it. A page costs about 27 AI credits, the same as any page Aglyn AI writes, and the header and footer cost about 29. Credits are used as each page is written. A page that fails on our side gives its credits back.\nWhile a wave runs, its page lists each page as it comes in. You can leave the page. You are told when the wave is in.'
551
+ text: '- The first wave brings in your main pages: home, then the pages in your menu, then your other top-level pages. Before any page, it gives your new site your current site\'s look: your colors, read from your home page, on one of Aglyn\'s built-in themes, with type in the same style as yours. If you already chose a theme for the new site, it is kept. The first wave also builds your header and footer: your logo, your name, or both, as your current site\'s header shows them, your menu linking your pages, and the address, phone, email and profiles your current header and footer show. Your home page\'s title and description become your new site\'s search listing, unless you already changed it.\n- Each later wave brings in up to 10 pages of one collection, for example Blog, 1 of 3.\n- Never past your plan. Your main pages are kept first. If your site has more pages than your plan allows, the last pages of your collections are the ones left out, each listed with Past your plan\'s page count. See plans opens Billing.\nYour words are never rewritten. Each page is built one of two ways, and the wave\'s row for the page says which:\n- Copied as it is: a page of a collection, such as a blog post or a policy, and any long page. Every heading, paragraph, list and link comes in, in order, laid out in your new site\'s theme.\n- Arranged by Aglyn AI: your main pages. Aglyn AI chooses how each section is laid out, such as its columns and background, and every line keeps the words your page has.\nTo start a wave, choose its Start button, for example Start Main pages. Each wave shows its cost before you start it, and how many of its pages are arranged and how many are copied. A page copied as it is costs far less than a page Aglyn AI arranges. Credits are used as each page is brought in. A page that fail'
552
552
  },
553
553
  {
554
554
  path: '/ai/bring-my-site',
555
555
  title: 'Bring my site',
556
556
  heading: 'Review a wave',
557
557
  anchor: '#review-a-wave',
558
- text: 'When a wave is in, its page says so, for example Main pages is in, and shows:\n- every page of the wave, with Open draft, its old and new address and how many photos were added;\n- a page that could not be brought in, with the reason;\n- how many AI credits the wave used.\nEvery page is a draft: nothing is published until you publish it. Open your draft pages opens the site\'s Pages list. When you are ready for more, choose the next wave\'s Start button. Nothing starts the next wave except you.\nCancel stops the import. The pages already brought in stay as drafts.'
558
+ text: 'When a wave is in, its page says so, for example Main pages is in your site\'s preview, and shows:\n- every page of the wave, with Open draft, its old and new address, and Old page to compare it with the page on your current site;\n- how many of the page\'s photos came in, for example 3 of 5 photos, with how many were already in your media library and how many could not be brought in;\n- a page that could not be brought in, with the reason;\n- how many AI credits the wave used.\nIf your site started in preview, each wave\'s pages are published into the preview as the wave comes in. You, your team and Aglyn support can open the site and see them at their addresses, home at your site\'s address. Visitors still see Coming soon. To make the site public, switch Preview off in Admin → Error pages, or choose Make it public on the banner that says your site is in preview.\nIf your site is not in preview, every page is a draft: nothing is published until you publish it.\nOpen your draft pages opens the site\'s Pages list. When you are ready for more, choose the next wave\'s Start button. Nothing starts the next wave except you, unless you chose Start every remaining wave.\nCancel stops the import. The pages already brought in stay where they are: in the preview, or as drafts.'
559
559
  },
560
560
  {
561
561
  path: '/ai/bring-my-site',
562
562
  title: 'Bring my site',
563
563
  heading: 'Photos',
564
564
  anchor: '#photos',
565
- text: 'A page\'s photos are copied into your new site\'s media library and placed on that page first. The same photo is stored only once, however many pages show it.'
565
+ text: 'A page\'s photos are copied into your new site\'s media library and placed on that page: on a page copied as it is, each one where your page shows it. The same photo is stored only once, however many pages show it.\nYour logo is copied once, for your header. If it is a drawing (an SVG file), it is saved as a picture. Your home page\'s share image, the one shown when your site is linked, becomes your new site\'s share image unless you already chose one.'
566
566
  },
567
567
  {
568
568
  path: '/ai/bring-my-site',
@@ -576,21 +576,21 @@ export const DOCS_SECTION_INDEX = [
576
576
  title: 'Bring my site',
577
577
  heading: 'When an import waits for you',
578
578
  anchor: '#when-an-import-waits',
579
- text: '- Verify your site again. A wave starts only while your proof is less than 30 days old. Choose Verify again, prove the site is yours once more, then start the wave again.\n- The day\'s limit. A workspace can start 12 waves a day, counting each time a site is read. Start the wave again the next day.\n- The site could not be read. If robots.txt could not be read, or no page answered, nothing is read. Choose Read the site again once your site is up. If your site\'s bot protection turned AglynBot away, see When your site turns AglynBot away.\n- Out of AI credits. The import pauses. Choose Get more AI credits, then Resume.\nEvery import is also logged for the Trust & Safety team\'s review.'
579
+ text: '- Verify your site again. A wave starts only while your proof is less than 30 days old. Choose Verify again, prove the site is yours once more, then start the wave again.\n- The day\'s limit. A workspace can start 12 waves a day, counting each time a site is read. Start the wave again the next day.\n- The site could not be read. If robots.txt could not be read, or no page answered, nothing is read. Choose Read the site again once your site is up. If your site\'s bot protection turned AglynBot away, see When your site turns AglynBot away.\n- AglynBot was turned away, or Your home page could not be read. Nothing was planned and no AI credits were used. Fix what the page names, then choose Check again.\n- Out of AI credits. The import pauses. Choose Get more AI credits, then Resume.\nEvery import is also logged for the Trust & Safety team\'s review.'
580
580
  },
581
581
  {
582
582
  path: '/ai/bring-my-site',
583
583
  title: 'Bring my site',
584
584
  heading: 'When your site turns AglynBot away',
585
585
  anchor: '#turned-away',
586
- text: 'Many hosts protect a site with bot protection or a firewall that turns away visitors it takes for robots. If yours turns AglynBot away, the page is listed under Not brought in as turned away by your site\'s bot protection or firewall. If it turns away every page, nothing is read, and the import says so.\nTo bring those pages in:\n1. Open your site\'s bot protection or firewall settings, wherever your host or your domain\'s security service keeps them.\n2. Allow AglynBot. It reads only your own domain, and only pages robots.txt lets it read.\n3. Bring the site in again. If nothing was read, choose Read the site again.'
586
+ text: 'Many hosts protect a site with bot protection or a firewall that turns away visitors it takes for robots. If yours turns AglynBot away, the page is listed under Not brought in as turned away by your site\'s bot protection or firewall.\nIf it turns away your home page, nothing is planned and no AI credits are used. The import waits under AglynBot was turned away, and says how many other pages were turned away too. A site seen without its home page is not your site, so nothing is built from it.\nTo let AglynBot in:\n1. Open your site\'s bot protection or firewall settings, wherever your host or your domain\'s security service keeps them. When the import can tell who answered, it names them:\n- Vercel: in your project\'s Firewall, under Rules, add a bypass rule for the user agent AglynBot.\n- Cloudflare: under Security, WAF, add a custom rule that skips the checks when the user agent contains AglynBot.\n2. Allow AglynBot. It reads only your own domain, and only pages robots.txt lets it read.\n3. Choose Check again. If the import had already planned its waves, bring the site in again instead.'
587
587
  },
588
588
  {
589
589
  path: '/ai/business-profile',
590
590
  title: 'Business profile',
591
591
  heading: '',
592
592
  anchor: '',
593
- text: 'Business profile\nEvery AI job for a site starts from what the site already knows about the business: its name, what it does, its services, the area it serves, who it is for, its tone of voice, and the contact details you entered. Aglyn AI writes for this business instead of guessing, and it never makes up a way to reach you.'
593
+ text: 'Business profile\nEvery AI job for a site starts from what the site already knows about the business: its name, what it does, its services, the area it serves, who it is for, its tone of voice, the year it was founded, and the contact details you entered. Aglyn AI writes for this business instead of guessing, and it never makes up a way to reach you.'
594
594
  },
595
595
  {
596
596
  path: '/ai/business-profile',
@@ -604,21 +604,21 @@ export const DOCS_SECTION_INDEX = [
604
604
  title: 'Business profile',
605
605
  heading: 'The Business profile card',
606
606
  anchor: '#the-business-profile-card',
607
- 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.'
607
+ 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;\n- Year founded, as four digits, such as 2015. An About page or a "Since" line uses it instead of leaving a gap where the year would go.\nAglyn AI reads it on every job for the site and never replaces what you write here.'
608
608
  },
609
609
  {
610
610
  path: '/ai/business-profile',
611
611
  title: 'Business profile',
612
612
  heading: 'Where the values come from',
613
613
  anchor: '#where-the-values-come-from',
614
- 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.'
614
+ text: 'When a site is started with Aglyn AI, the profile is filled from your answers to the guided start, including the Year founded from More details, 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. The year founded is set on each site\'s own card.'
615
615
  },
616
616
  {
617
617
  path: '/ai/business-profile',
618
618
  title: 'Business profile',
619
619
  heading: 'Contact details are never invented',
620
620
  anchor: '#contact-details-are-never-invented',
621
- text: 'The name, business type, email, phone, address, opening hours and social profiles come only from Setup → Basic details and Setup → SEO, exactly as entered. A detail you have not entered reads Not entered, and Aglyn AI writes around it, or leaves a bracketed placeholder such as [phone number] for you to fill, instead of making one up. The same goes for prices, reviews and testimonials.'
621
+ text: 'The name, business type, email, phone, address, opening hours and social profiles come only from Setup → Basic details and Setup → SEO, exactly as entered. A detail you have not entered reads Not entered, and Aglyn AI writes the sentence without it instead of making one up or leaving a gap for you to fill. The same goes for prices, reviews and testimonials.'
622
622
  },
623
623
  {
624
624
  path: '/ai/business-profile',
@@ -884,7 +884,7 @@ export const DOCS_SECTION_INDEX = [
884
884
  title: 'Generate a form from a description',
885
885
  heading: 'What a form cannot collect',
886
886
  anchor: '#what-a-form-cannot-collect',
887
- text: 'A form collects text, choices and ratings. When your brief asks for something else, such as a file or photo upload, a signature or a payment, the form leaves it out and the job says so beside Open draft. For a roofing quote request that asks for photos of the damage, for example, the form asks for a written description of the damage instead. The job also lists any fact the brief did not give that the form marks in square brackets, such as a label naming your studio, for you to fill in before the form goes on a page.'
887
+ text: 'A form collects text, choices and ratings. When your brief asks for something else, such as a file or photo upload, a signature or a payment, the form leaves it out and the job says so beside Open draft. For a roofing quote request that asks for photos of the damage, for example, the form asks for a written description of the damage instead. A fact the brief did not give is left out of the form. If the form still shows one in square brackets, such as a label naming your studio, the job lists it for you to fill in before the form goes on a page.'
888
888
  },
889
889
  {
890
890
  path: '/ai/generate-a-form',
@@ -3019,7 +3019,7 @@ export const DOCS_SECTION_INDEX = [
3019
3019
  title: 'Manage your domains',
3020
3020
  heading: '',
3021
3021
  anchor: '',
3022
- text: 'Manage your domains\nYour workspace\'s Domains page lists every domain it holds through Aglyn: the ones connected to a site, the ones that aren\'t connected yet, and the ones on their way. Open it from your workspace\'s menu. Workspace owners and admins can open it.\nPlan availability Starter and above for buying, transferring in and connecting domains. On a plan without domains, the page still lists the domains you hold, and you can still turn auto-renew on or off, edit their contacts and DNS records, or move them to another registrar.'
3022
+ text: 'Manage your domains\nYour workspace\'s Domains page lists every domain it holds through Aglyn: the ones connected to a site, the ones that aren\'t connected yet, and the ones on their way. Open it from your workspace\'s menu. Opening it takes the Manage the workspace\'s domains permission, which workspace owners and admins have.\nPlan availability Starter and above for buying, transferring in and connecting domains. On a plan without domains, the page still lists the domains you hold, and you can still turn auto-renew on or off, edit their contacts and DNS records, or move them to another registrar.'
3023
3023
  },
3024
3024
  {
3025
3025
  path: '/building-sites/custom-domains/manage-domains',
@@ -3572,7 +3572,7 @@ export const DOCS_SECTION_INDEX = [
3572
3572
  title: 'Generate a page from a prompt',
3573
3573
  heading: 'How the page is built',
3574
3574
  anchor: '#how-the-page-is-built',
3575
- text: 'The job first builds anything the plan creates, one at a time: a layout, a form or a reusable component, each as a draft, the same way a layout, form or component job builds one. Then it builds the page one section at a time, top to bottom, in the background, so you can leave the Pages list while it works. Each section is checked against the building rules as part of the whole page: one top-level heading and headings in order, your theme\'s colors, spacing and type, and your components placed as instances instead of copied.\n- Pictures are image slots with a description of what belongs there, for you to fill from the media library.\n- Facts the brief does not give, such as a price, a phone number or an address, appear in square brackets for you to fill in, instead of being invented. AI jobs lists them beside the draft, including the ones a component on the page shows until you set your own, named once for that component however often the page places it.'
3575
+ text: 'The job first builds anything the plan creates, one at a time: a layout, a form or a reusable component, each as a draft, the same way a layout, form or component job builds one. Then it builds the page one section at a time, top to bottom, in the background, so you can leave the Pages list while it works. Each section is checked against the building rules as part of the whole page: one top-level heading and headings in order, your theme\'s colors, spacing and type, and your components placed as instances instead of copied.\n- Pictures are image slots with a description of what belongs there, for you to fill from the media library.\n- Facts the brief does not give, such as a price, a phone number or an address, are left out, never invented. If the draft still shows one in square brackets, AI jobs lists it beside the draft, including the ones a component on the page shows until you set your own, named once for that component however often the page places it.'
3576
3576
  },
3577
3577
  {
3578
3578
  path: '/building-sites/screens-and-layouts/generate-a-page',
@@ -3656,7 +3656,7 @@ export const DOCS_SECTION_INDEX = [
3656
3656
  title: 'Layouts',
3657
3657
  heading: 'Generate a layout with Aglyn AI',
3658
3658
  anchor: '#generate-a-layout-with-aglyn-ai',
3659
- text: 'An AI build job can make a layout from a brief: the header, navigation and footer you have in mind. The job proposes a plan first, and builds once you confirm it: a header that links your pages, the slot each page renders in, and a footer. When your site already has a navigation or menu component, the layout places it rather than building another. The layout follows the building rules, so it carries no page title of its own and takes its colors and type from your theme.\nOpen Layouts for the site and choose Create with AI, beside Templates and Create New Layout. Write what the header, navigation and footer should hold, then choose Plan the layout. The window shows the plan when it is ready, with Confirm plan; Open AI jobs follows the job in the Assist panel instead.\nA link in the layout goes only to a page that does what its words say, and one on a colored band, such as a footer in your primary color, uses the band\'s text color. Where the brief leaves out a fact, such as your address or opening hours, the footer marks it in square brackets, and AI jobs lists those gaps beside the draft.\nThe layout arrives as a new draft in Layouts, and Open draft on the job opens it in the Besigner. No page uses it until you assign it, so nothing on the live site changes. It counts against your shared-layout allowance like a layout you create yourself, and when the site has none to spare the job says so before it starts, not after it has spent anything.'
3659
+ text: 'An AI build job can make a layout from a brief: the header, navigation and footer you have in mind. The job proposes a plan first, and builds once you confirm it: a header that links your pages, the slot each page renders in, and a footer. When your site already has a navigation or menu component, the layout places it rather than building another. The layout follows the building rules, so it carries no page title of its own and takes its colors and type from your theme.\nOpen Layouts for the site and choose Create with AI, beside Templates and Create New Layout. Write what the header, navigation and footer should hold, then choose Plan the layout. The window shows the plan when it is ready, with Confirm plan; Open AI jobs follows the job in the Assist panel instead.\nA link in the layout goes only to a page that does what its words say, and one on a colored band, such as a footer in your primary color, uses the band\'s text color. Where the brief leaves out a fact, such as your address or opening hours, the footer leaves it out. If the draft still shows one in square brackets, AI jobs lists it beside the draft.\nThe layout arrives as a new draft in Layouts, and Open draft on the job opens it in the Besigner. No page uses it until you assign it, so nothing on the live site changes. It counts against your shared-layout allowance like a layout you create yourself, and when the site has none to spare the job says so before it starts, not after it has spent anything.'
3660
3660
  },
3661
3661
  {
3662
3662
  path: '/building-sites/screens-and-layouts/layouts',
@@ -4006,7 +4006,7 @@ export const DOCS_SECTION_INDEX = [
4006
4006
  title: 'Design custom error pages',
4007
4007
  heading: 'The error pages',
4008
4008
  anchor: '#the-error-screens',
4009
- text: '| Status | Picker label | When it shows |\n| 404 | 404 · Not found | The URL doesn\'t match any page. |\n| 401 | 401 · Members only | A members-only page, requested by a signed-out visitor. |\n| 403 | 403 · Forbidden | Reserved for future access rules — nothing serves it yet. |\n| 503 | 503 · Maintenance | Shown on every page while maintenance mode is on. |'
4009
+ text: '| Status | Picker label | When it shows |\n| 404 | 404 · Not found | The URL doesn\'t match any page. |\n| 401 | 401 · Members only | A members-only page, requested by a signed-out visitor. |\n| 403 | 403 · Forbidden | Reserved for future access rules — nothing serves it yet. |\n| 503 | 503 · Maintenance | Shown on every page while maintenance mode is on, and to visitors while the site is in preview. |'
4010
4010
  },
4011
4011
  {
4012
4012
  path: '/building-sites/site-protection/error-screens',
@@ -4048,7 +4048,7 @@ export const DOCS_SECTION_INDEX = [
4048
4048
  title: 'Maintenance mode',
4049
4049
  heading: '',
4050
4050
  anchor: '',
4051
- text: 'Maintenance mode\nNeed to pause your live site while you make changes? Maintenance mode serves your designed 503 page to visitors until you switch it back.'
4051
+ text: 'Maintenance mode\nNeed to pause your live site while you make changes? Maintenance mode serves your designed 503 page to visitors until you switch it back.\nTo keep building while only your team can see the site, use Preview instead: visitors see the same 503 page, and your team sees the whole site.'
4052
4052
  },
4053
4053
  {
4054
4054
  path: '/building-sites/site-protection/maintenance-mode',
@@ -4076,7 +4076,14 @@ export const DOCS_SECTION_INDEX = [
4076
4076
  title: 'Make your site private',
4077
4077
  heading: '',
4078
4078
  anchor: '',
4079
- text: 'Make your site private\nWant to keep your site to yourself while you build it, share it with a client before launch, or keep it to a few people for good? Aglyn doesn\'t have a single "private" switch that puts every page behind one password. Instead, pick the setting that matches who should still get in:\n| Who should see the site | Use | Where | Plan |\n| No one yet. Not visitors, not search engines, not someone with the link | Maintenance mode | Admin → Error pages | Every plan |\n| Anyone with the link, but keep it off Google | Discourage search engines | Setup → SEO → Search engines | Every plan |\n| Only people you give a password to | Password protected, page by page | The page\'s Page Access card | Every plan |\n| Only people signed in to your site | Members only, page by page | The page\'s Page Access card | Business and above |\nHiding a page from search doesn\'t stop people opening it. Only maintenance mode, a page password, and members-only actually keep visitors out.'
4079
+ text: 'Make your site private\nWant to keep your site to yourself while you build it, share it with a client before launch, or keep it to a few people for good? Aglyn doesn\'t have a single "private" switch that puts every page behind one password. Instead, pick the setting that matches who should still get in:\n| Who should see the site | Use | Where | Plan |\n| Only you and your team, while you finish it | Preview | Admin → Error pages (also offered when you create a site) | Every plan |\n| No one yet. Not visitors, not search engines, not someone with the link | Maintenance mode | Admin → Error pages | Every plan |\n| Anyone with the link, but keep it off Google | Discourage search engines | Setup → SEO → Search engines | Every plan |\n| Only people you give a password to | Password protected, page by page | The page\'s Page Access card | Every plan |\n| Only people signed in to your site | Members only, page by page | The page\'s Page Access card | Business and above |\nHiding a page from search doesn\'t stop people opening it. Only preview, maintenance mode, a page password, and members-only actually keep visitors out.'
4080
+ },
4081
+ {
4082
+ path: '/building-sites/site-protection/make-your-site-private',
4083
+ title: 'Make your site private',
4084
+ heading: 'Keep it to your team with Preview',
4085
+ anchor: '#keep-it-to-your-team-with-preview',
4086
+ text: 'Preview keeps the whole site to the people building it. Visitors see your 503 page, or a plain Coming soon notice if you haven\'t designed one, at every address. You and your team see the whole site: every page, your header and footer, collections and working forms, with a bar across the top that says only your team can see it. When you\'re ready, you flip one switch and the site is public to everyone.\n1. Open Admin → Error pages for the site. Only site admins can open the Admin area.\n2. Switch on Preview — only you and your team can see the site. It confirms with "Your site is in preview — only you and your team can see it".\n3. Keep building. A banner, "This site is in preview", follows you around the site\'s console pages so it isn\'t forgotten at launch, and the site\'s card in Sites reads In preview.\n4. On launch day, switch Preview off. Make it public on the banner takes you straight to the switch. Your pages are public within about a minute.\nWho sees what\n- Visitors see your 503 · Maintenance page if you\'ve assigned one (see custom error pages), or a Coming soon notice with your site\'s name. Design the 503 page first if you want visitors to see your brand.\n- Your team sees the whole site. That is anyone who can open the site in the console: workspace owners and admins, members who look after every site, and anyone with a role on this site. Someone who is only on other sites of your workspace doesn\'t see it.\n- Aglyn support can see it too, so they can help you with it before it\'s public.\n- People who signed up on your site (its member accounts) are visitors, not your team, so they see the 503 page.\nOpen your site while it\'s in preview\nChoose Visit site on the site\'s dashboard, or Visit on its card in Sites. While the site is in preview these buttons sign you in to the s'
4080
4087
  },
4081
4088
  {
4082
4089
  path: '/building-sites/site-protection/make-your-site-private',
@@ -4118,14 +4125,14 @@ export const DOCS_SECTION_INDEX = [
4118
4125
  title: 'Make your site private',
4119
4126
  heading: 'Check what\'s still public',
4120
4127
  anchor: '#check-whats-still-public',
4121
- text: 'Before you share a link or announce a launch:\n- Open the site in a private (incognito) browser window, where you aren\'t signed in, and click through it as a visitor would.\n- In Pages, open any page you added recently and check its Page Access visibility. New pages start as Public.\n- Run the SEO check. It reports whether search engines are being asked to stay away from the site.'
4128
+ text: 'Before you share a link or announce a launch:\n- If the site was in Preview, check the banner is gone and the site\'s card in Sites no longer reads In preview.\n- Open the site in a private (incognito) browser window, where you aren\'t signed in, and click through it as a visitor would.\n- In Pages, open any page you added recently and check its Page Access visibility. New pages start as Public.\n- Run the SEO check. It reports whether search engines are being asked to stay away from the site.'
4122
4129
  },
4123
4130
  {
4124
4131
  path: '/building-sites/site-protection/make-your-site-private',
4125
4132
  title: 'Make your site private',
4126
4133
  heading: 'Related',
4127
4134
  anchor: '#related',
4128
- text: '- Site Protection & Error Pages\n- Maintenance mode\n- Password-protect a page\n- Members-only areas\n- Search engine visibility'
4135
+ text: '- Site Protection & Error Pages\n- Keep it to your team with Preview\n- Maintenance mode\n- Password-protect a page\n- Members-only areas\n- Search engine visibility'
4129
4136
  },
4130
4137
  {
4131
4138
  path: '/building-sites/site-protection/overview',
@@ -5168,7 +5175,7 @@ export const DOCS_SECTION_INDEX = [
5168
5175
  title: 'Fulfillment, returns and webhooks',
5169
5176
  heading: 'Order webhooks',
5170
5177
  anchor: '#order-webhooks',
5171
- text: 'An order webhook posts each order event to an address you choose, as it happens: a warehouse system, an ERP, a spreadsheet script. Add them under Notifications → Order webhooks in the Products hub. Managing webhooks needs the admin role and organization-wide membership, the same as refunds.\nAdd endpoint asks for:\n- Endpoint URL — an https:// address on a public server. Redirects are not followed, so give the final address.\n- Events — any of the events below.\nWhen you add an endpoint, its signing secret is shown once. Copy it into your endpoint\'s settings; Roll secret makes a new one if it is lost. A store can keep 10 endpoints. Pause stops deliveries to one without deleting it, and Send test event posts a webhook.test event now.\n| Event | When |\n| order.paid | An order was paid: online, buy-now, a payment link, a POS sale or a subscription renewal. |\n| order.fulfilled | A shipment was recorded, once per shipment. |\n| order.delivered | The order was marked delivered. |\n| order.refunded | Money went back to the buyer, once per refund, including a refund made in the Stripe Dashboard. |\n| order.cancelled | The order was canceled. |\n| return.requested | A buyer asked for a return, or you opened one. |\n| return.approved | You approved a return, or opened one yourself. |\n| return.declined | You declined a return request. |\n| return.received | The returned items arrived. |\n| return.refunded | A return was refunded. |\nWhen an endpoint is down\nAn endpoint has 8 seconds to answer each event. One that doesn\'t is sent the event again, on a schedule that lasts about a day, and the site\'s admins and editors are notified in the console if the last try fails.\nWhoever builds your endpoint needs Order webhooks for developers: what each event carries and how to check that it came from your'
5178
+ text: 'An order webhook posts each order event to an address you choose, as it happens: a warehouse system, an ERP, a spreadsheet script. Add them under Notifications → Order webhooks in the Products hub. Managing webhooks needs the Manage order webhooks permission. By default, as with refunds, that\'s an admin of the whole workspace who is also the site\'s admin.\nAdd endpoint asks for:\n- Endpoint URL — an https:// address on a public server. Redirects are not followed, so give the final address.\n- Events — any of the events below.\nWhen you add an endpoint, its signing secret is shown once. Copy it into your endpoint\'s settings; Roll secret makes a new one if it is lost. A store can keep 10 endpoints. Pause stops deliveries to one without deleting it, and Send test event posts a webhook.test event now.\n| Event | When |\n| order.paid | An order was paid: online, buy-now, a payment link, a POS sale or a subscription renewal. |\n| order.fulfilled | A shipment was recorded, once per shipment. |\n| order.delivered | The order was marked delivered. |\n| order.refunded | Money went back to the buyer, once per refund, including a refund made in the Stripe Dashboard. |\n| order.cancelled | The order was canceled. |\n| return.requested | A buyer asked for a return, or you opened one. |\n| return.approved | You approved a return, or opened one yourself. |\n| return.declined | You declined a return request. |\n| return.received | The returned items arrived. |\n| return.refunded | A return was refunded. |\nWhen an endpoint is down\nAn endpoint has 8 seconds to answer each event. One that doesn\'t is sent the event again, on a schedule that lasts about a day, and the site\'s admins and editors are notified in the console if the last try fails.\nWhoever builds your endpoint needs Order webhooks for developer'
5172
5179
  },
5173
5180
  {
5174
5181
  path: '/commerce-and-bookings/commerce/orders-and-returns',
@@ -5217,7 +5224,7 @@ export const DOCS_SECTION_INDEX = [
5217
5224
  title: 'Commerce',
5218
5225
  heading: 'Orders',
5219
5226
  anchor: '#orders',
5220
- text: 'Every paid checkout becomes an order with a sequential number, line-item snapshots, totals, and a timeline:\n- Statuses: pending → paid → fulfilled (or partially) → delivered, with cancel/refund exits guarded by a status machine. The seven of them, and the labels the console shows, are in Statuses and channels.\n- Fulfill with tracking, in one shipment or several, print packing slips and invoices, and add internal notes — see Fulfillment, returns and webhooks.\n- Ship with the tools you already use: ShipStation imports your orders and sends each shipment back, ShippingEasy receives each order as it is paid and sends each label back, and Pirate Ship, Shippo or EasyPost work through a spreadsheet out and a file of tracking numbers back.\n- Returns: buyers ask from their account or the order-status page, and you approve, receive with restock and refund — see Returns. Order webhooks send each order event to your own systems — see Order webhooks.\n- Refunds (full or partial) go through Stripe and reverse the platform fee. Refunding needs the admin role and organization-wide membership — a workspace owner or admin, or a member given access to every site. A collaborator invited to this one site is an admin of the site, which is enough to run the till and fulfill orders but not to send money back out of the business.\n- Chargebacks are shown apart from refunds. When a shopper disputes a charge with their bank, the order gets a Chargeback open badge and the list warns you with the date Stripe needs your evidence by — answer it in the Stripe dashboard, because an unanswered dispute is decided for the shopper. If the dispute is lost the money is reversed, the order reads Charged back rather than Refunded, and the buyer loses the downloads, membership and verified-purchase review a refun'
5227
+ text: 'Every paid checkout becomes an order with a sequential number, line-item snapshots, totals, and a timeline:\n- Statuses: pending → paid → fulfilled (or partially) → delivered, with cancel/refund exits guarded by a status machine. The seven of them, and the labels the console shows, are in Statuses and channels.\n- Fulfill with tracking, in one shipment or several, print packing slips and invoices, and add internal notes — see Fulfillment, returns and webhooks.\n- Ship with the tools you already use: ShipStation imports your orders and sends each shipment back, ShippingEasy receives each order as it is paid and sends each label back, and Pirate Ship, Shippo or EasyPost work through a spreadsheet out and a file of tracking numbers back.\n- Returns: buyers ask from their account or the order-status page, and you approve, receive with restock and refund — see Returns. Order webhooks send each order event to your own systems — see Order webhooks.\n- Refunds (full or partial) go through Stripe and reverse the platform fee. Refunding needs the Refund orders permission. By default, that\'s an admin of the site who is also a member of the whole workspace: a workspace owner or admin, or a member given access to every site. A collaborator invited to this one site as its admin can run the till and fulfill orders, but can\'t send money back out of the business unless the site grants them Refund orders.\n- Chargebacks are shown apart from refunds. When a shopper disputes a charge with their bank, the order gets a Chargeback open badge and the list warns you with the date Stripe needs your evidence by — answer it in the Stripe dashboard, because an unanswered dispute is decided for the shopper. If the dispute is lost the money is reversed, the order reads Charged back rather than Refunded, an'
5221
5228
  },
5222
5229
  {
5223
5230
  path: '/commerce-and-bookings/commerce/overview',
@@ -5511,7 +5518,7 @@ export const DOCS_SECTION_INDEX = [
5511
5518
  title: 'Running the register',
5512
5519
  heading: 'Staff PINs',
5513
5520
  anchor: '#staff-pins',
5514
- text: 'A shared tablet stays signed in; each person switches in with their own PIN instead of signing out.\n- Set your 4–6 digit PIN on the Staff PINs card on Products → Point of sale. A PIN that is one digit repeated or a straight run like 1234 is refused.\n- At the register, tap Switch cashier, pick your name and enter your PIN. Every sale, shift and return you ring is recorded under you until someone else switches in.\n- A PIN never grants more than your role: the register checks your role and your Manage POS permission each time it is used, so removing someone\'s access takes effect on their next tap.\n- Five wrong PINs in a row lock that person out for 15 minutes. A workspace admin can reset or remove anyone\'s PIN, which also lifts a lockout.\n- Lock the register after (minutes idle) in Admin → Plugins → Commerce locks the register after that long without a tap, so the next person has to enter their PIN. Tap Lock to lock it yourself.\nPINs are stored only as salted hashes and nobody can read them back, not even a workspace admin.'
5521
+ text: 'A shared tablet stays signed in; each person switches in with their own PIN instead of signing out.\n- Set your 4–6 digit PIN on the Staff PINs card on Products → Point of sale. A PIN that is one digit repeated or a straight run like 1234 is refused.\n- At the register, tap Switch cashier, pick your name and enter your PIN. Every sale, shift and return you ring is recorded under you until someone else switches in.\n- A PIN never grants more than your role: the register checks your role and your Manage POS permission each time it is used, so removing someone\'s access takes effect on their next tap.\n- Five wrong PINs in a row lock that person out for 15 minutes. Anyone with Approve refunds over the register\'s limit 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.'
5515
5522
  },
5516
5523
  {
5517
5524
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -5525,7 +5532,7 @@ export const DOCS_SECTION_INDEX = [
5525
5532
  title: 'Running the register',
5526
5533
  heading: 'Returns and exchanges',
5527
5534
  anchor: '#returns-and-exchanges',
5528
- text: 'Tap Return on the register, then type the order number, scan the barcode at the foot of the receipt, or enter the customer\'s email.\n1. Pick the items coming back, how many of each, and the reason.\n2. Leave Put the items back in stock on to restock them at the register\'s location.\n3. Refund. The money goes back to how the customer paid:\n- Card — refunded through Stripe to the same card.\n- Cash — paid out of the drawer; the register tells you how much to hand over, and the open shift counts it.\n- Gift card — added back to the same gift card. A voided or frozen gift card cannot take a refund.\n- Room charge — taken back off the stay\'s folio.\nA sale paid more than one way is refunded to cards first, then gift cards and room charges, and to cash last. Turn on Split by hand to choose the amounts yourself; a payment can never take back more than it paid.\nEach unit\'s refund is its price less its share of any discount, plus its share of the tax, so returning items one at a time refunds exactly what returning them together would.\nEvery register return is also listed under Returns, beside the returns customers ask for online, already marked refunded. Items a customer has already asked to return online are held for that return: the register shows them as In an online return and will not refund them a second time.\nExchanges: after the return, tap Ring up the exchange to start a new sale for the same customer.\nRefund limits and manager approval\nCashier refund limit ($) in Admin → Plugins → Commerce is the largest return a cashier may refund without a manager. It is $0 by default, so every register refund needs a manager until you raise it. Above the limit the register asks a workspace admin to enter their PIN to approve that one refund. Workspace admins have no limit.'
5535
+ text: 'Tap Return on the register, then type the order number, scan the barcode at the foot of the receipt, or enter the customer\'s email.\n1. Pick the items coming back, how many of each, and the reason.\n2. Leave Put the items back in stock on to restock them at the register\'s location.\n3. Refund. The money goes back to how the customer paid:\n- Card — refunded through Stripe to the same card.\n- Cash — paid out of the drawer; the register tells you how much to hand over, and the open shift counts it.\n- Gift card — added back to the same gift card. A voided or frozen gift card cannot take a refund.\n- Room charge — taken back off the stay\'s folio.\nA sale paid more than one way is refunded to cards first, then gift cards and room charges, and to cash last. Turn on Split by hand to choose the amounts yourself; a payment can never take back more than it paid.\nEach unit\'s refund is its price less its share of any discount, plus its share of the tax, so returning items one at a time refunds exactly what returning them together would.\nEvery register return is also listed under Returns, beside the returns customers ask for online, already marked refunded. Items a customer has already asked to return online are held for that return: the register shows them as In an online return and will not refund them a second time.\nExchanges: after the return, tap Ring up the exchange to start a new sale for the same customer.\nRefund limits and manager approval\nCashier refund limit ($) in Admin → Plugins → Commerce is the largest return a cashier may refund without a manager. It is $0 by default, so every register refund needs a manager until you raise it. Above the limit the register asks someone with Approve refunds over the register\'s limit to enter their PIN to approve that one refund, and anyone '
5529
5536
  },
5530
5537
  {
5531
5538
  path: '/commerce-and-bookings/commerce/pos-operations',
@@ -5611,6 +5618,83 @@ export const DOCS_SECTION_INDEX = [
5611
5618
  anchor: '#what-is-sent-to-the-service',
5612
5619
  text: 'For each paid order with imported products: your buyer\'s name, shipping address, phone number and email address, the order number, and each line\'s variant, quantity and the price your buyer paid. Your token authenticates each call. No card or payment details are sent. Reading your products sends nothing about your customers.\nThe service is one you chose and connected with your own account; the data is sent to it on your instruction so it can make and ship your orders.'
5613
5620
  },
5621
+ {
5622
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5623
+ title: 'Quotes',
5624
+ heading: '',
5625
+ anchor: '',
5626
+ text: 'Quotes\nA quote prices an order for one customer before they buy: the canopy with their logo, the sign at the size they asked for, the job with its materials and labor. You build it in the console from your products and from items you type for the job, and Aglyn works out the totals, tax included, as you go.\nQuotes are on your site\'s Products hub, on the Orders tab, in the Quotes card under the orders list.'
5627
+ },
5628
+ {
5629
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5630
+ title: 'Quotes',
5631
+ heading: 'What a quote holds',
5632
+ anchor: '#what-a-quote-holds',
5633
+ text: '- The customer. When your workspace keeps contacts, find someone by name, email or phone; or type their name, company, email and phone. A contact keeps the quote tied to their record.\n- Items. Any mix of:\n- Products from your catalog, with the option you pick and any add-ons the product offers. They are priced from the product, add-ons included, exactly as the point of sale prices them.\n- Custom items, typed for this job: a name, an optional description and SKU, a unit price and a quantity. Turn off Ships for work that doesn\'t ship, such as design or installation. A custom item never changes your stock.\n- Included items. Turn on Included at no charge for anything that comes with the order, a product or a custom item, and it is listed at no charge.\n- Discount: an amount off, or a percent off the items.\n- Shipping: the amount you charge to ship it. Leave it empty when nothing ships.\n- Ship to and Bill to addresses.\n- Notes for the customer and Terms.\nEach quote also keeps whether Customers approve the proof before they can pay. When it is on and the quote has a proof the customer hasn\'t approved, the customer\'s page asks them to approve it instead of offering Pay, and a payment can\'t be started for it. A quote with no proof is never held.'
5634
+ },
5635
+ {
5636
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5637
+ title: 'Quotes',
5638
+ heading: 'New-quote defaults',
5639
+ anchor: '#quote-defaults',
5640
+ text: 'The Quotes card on the Checkout settings page sets what every new quote starts with: whether customers approve the proof before they can pay. Turn the switch on or off and choose Save. Each quote starts with this setting, and you can change it on the quote.'
5641
+ },
5642
+ {
5643
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5644
+ title: 'Quotes',
5645
+ heading: 'Make a quote',
5646
+ anchor: '#make-a-quote',
5647
+ text: '1. On the Orders tab, choose New quote in the Quotes card.\n2. Find the customer in your contacts, or type their details.\n3. Choose Add product or Add custom item for each line, and set its quantity.\n4. Add a discount, shipping, the addresses, notes and terms as you need them.\n5. Choose Create quote.\nThe quote gets the next number from your store\'s order numbers and is listed as Quote #1042, for example. Choose a quote in the list to open it again; change anything and choose Save. A draft quote you no longer need can be deleted.\nThe list shows each quote\'s customer, total, status and when it last changed, and sorts by any column.'
5648
+ },
5649
+ {
5650
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5651
+ title: 'Quotes',
5652
+ heading: 'Totals and tax',
5653
+ anchor: '#totals-and-tax',
5654
+ text: 'The totals add up the items (included items count nothing), take off the discount, then add shipping and tax. Tax follows your store\'s tax settings:\n- Manual rates: the rate for the quote\'s ship-to state and country, or for your store\'s address when the quote has no ship-to country. The discount comes off before tax, and shipping is not taxed. A product marked tax-exempt is left out.\n- A connected tax service (Tax services) prices the quote when you save it, and the quote shows its figure.\n- Stripe Tax: the quote says Tax is added at payment, because Stripe works out the tax when the customer pays.\n- No sales tax: no tax is added.\nIf your store hasn\'t chosen how it handles sales tax, the quote shows no tax and says so, with a link to Taxes.'
5655
+ },
5656
+ {
5657
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5658
+ title: 'Quotes',
5659
+ heading: 'Send the pay link',
5660
+ anchor: '#pay-link',
5661
+ text: 'Every quote has a pay link: an address on your own site, at /pay-quote, that opens the quote for your customer with a Pay button. Open the quote and, under Pay link, choose Copy pay link. The link is copied and shown, ready to paste into an email or a text. It opens the quote as it was last saved, so save your changes before you copy it.\nThe link doesn\'t expire. It keeps working until the customer pays or you replace it.\nReplace link makes a new link and retires the old one. Use it when a link went to the wrong person, or when you want only your latest message to work. The old link then opens a page saying the quote was updated and that you sent a newer link, and shows nothing of the quote. Send your customer the new one. A paid quote\'s link can\'t be replaced.'
5662
+ },
5663
+ {
5664
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5665
+ title: 'Quotes',
5666
+ heading: 'What your customer sees',
5667
+ anchor: '#customer-page',
5668
+ text: 'The pay link opens the quote inside your site\'s own header and footer:\n- your business name, the quote number and its date;\n- who it is for, and the bill-to and ship-to addresses;\n- each item with its option and add-ons, description, SKU, quantity and price, and Included beside anything included at no charge;\n- the discount, shipping, tax and total, or Tax is added at payment when Stripe Tax works the tax out;\n- your notes and terms.\nThe page is private: search engines don\'t list it, and it never shows the customer\'s email or phone number, your notes to yourself or who on your team wrote the quote.'
5669
+ },
5670
+ {
5671
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5672
+ title: 'Quotes',
5673
+ heading: 'How your customer pays',
5674
+ anchor: '#paying',
5675
+ text: 'Pay charges the quote as you saved it, priced from its items, discount, shipping and tax. Your customer pays on the page itself, or on a Stripe payment page that brings them back to the quote afterward. Their email is filled in from the quote. When the quote charges shipping, they\'re asked where it ships, starting from the quote\'s ship-to. Under Stripe Tax, the tax is worked out from that address when they pay.\nIf you edit the quote while your customer has it open, Pay asks them to reload the page first, so nobody pays for a version they haven\'t seen. Editing a quote, deleting it or replacing its link also closes any payment your customer had started for it.\nPaying needs a connected Stripe account and a decision about sales tax. Until your store has both, Pay tells the customer to contact you.'
5676
+ },
5677
+ {
5678
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5679
+ title: 'Quotes',
5680
+ heading: 'When a quote is paid',
5681
+ anchor: '#paid',
5682
+ text: 'A paid quote becomes an order, with the same number:\n- it joins the Orders list on the day it was paid, and the Channel filter finds it as Quote;\n- your customer gets a receipt, and their quote page shows Paid with a link to their order;\n- the customer becomes a contact, and you\'re notified;\n- stock goes down for your catalog products on the quote, included ones too. Custom items never change your stock.\nThe quote then can no longer be changed. If a second payment arrives for a quote that was already paid, or a payment comes through a link you had replaced, it isn\'t counted as a sale: the quote\'s timeline records it and you\'re notified, so you can refund it in Stripe.'
5683
+ },
5684
+ {
5685
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5686
+ title: 'Quotes',
5687
+ heading: 'Quotes are not orders until they\'re paid',
5688
+ anchor: '#quotes-are-not-orders',
5689
+ text: 'A quote shares your order numbers, but until it is paid it is not an order. It stays out of the orders list, the money tiles, the analytics, exports, the shipping tools and the customer\'s account page.'
5690
+ },
5691
+ {
5692
+ path: '/commerce-and-bookings/commerce/quotes-and-proofs',
5693
+ title: 'Quotes',
5694
+ heading: 'Who can make and send quotes',
5695
+ anchor: '#permissions',
5696
+ text: 'Making, editing and deleting quotes takes the Create and edit quotes permission. Copying and replacing a quote\'s pay link takes Send quotes and invoices to customers. Everyone who can manage orders on the site has both to start with; a custom role or a per-member override can grant or deny each one. See Order permissions.'
5697
+ },
5614
5698
  {
5615
5699
  path: '/commerce-and-bookings/commerce/review-platforms',
5616
5700
  title: 'Review platforms (Trustpilot and Yotpo)',
@@ -11244,14 +11328,14 @@ export const DOCS_SECTION_INDEX = [
11244
11328
  title: 'Funnels',
11245
11329
  heading: 'Create a funnel',
11246
11330
  anchor: '#create',
11247
- text: '1. Open your site\'s Analytics page and find Funnels.\n2. Select New funnel, name it, and add steps with the pickers.\n3. Save. Saving needs a site admin or editor.\nCreate with AI {#create-with-ai}\nWhen Aglyn AI is available to your workspace, Create with AI turns a description — "people who read a blog post, then booked a consultation" — into a draft funnel. The draft uses only the pages, forms, services, products and bars or popups your site has; a step the model suggests that your site does not have is left out and listed. Nothing is saved until you review the draft and select Save. It uses AI credits like other generation.\nDraft funnels {#drafts}\nWhen Aglyn AI builds part of your site from one request, it can set a funnel up too. That funnel arrives as a draft, marked Draft on the Funnels card, and changes nothing on your live site: it does not turn recording on, it has no results, Insights does not read it, and it cannot be followed up on. Its steps use only pages your site already publishes, and forms, services, products or bars and popups your site has — including ones the same request made.\nSelect the draft to review its steps, edit it if you like (it stays a draft), then select Activate. Activating checks every step against your site again, makes the funnel live and turns recording on if it was off, so it counts visits from then on. Activating needs a site admin or editor. A draft counts towards the 20 funnels a site keeps.'
11331
+ text: '1. Open your site\'s Analytics page and find Funnels.\n2. Select New funnel, name it, and add steps with the pickers.\n3. Save. Saving needs the Manage funnels permission, which a site\'s admins and editors have.\nCreate with AI {#create-with-ai}\nWhen Aglyn AI is available to your workspace, Create with AI turns a description — "people who read a blog post, then booked a consultation" — into a draft funnel. The draft uses only the pages, forms, services, products and bars or popups your site has; a step the model suggests that your site does not have is left out and listed. Nothing is saved until you review the draft and select Save. It uses AI credits like other generation.\nDraft funnels {#drafts}\nWhen Aglyn AI builds part of your site from one request, it can set a funnel up too. That funnel arrives as a draft, marked Draft on the Funnels card, and changes nothing on your live site: it does not turn recording on, it has no results, Insights does not read it, and it cannot be followed up on. Its steps use only pages your site already publishes, and forms, services, products or bars and popups your site has — including ones the same request made.\nSelect the draft to review its steps, edit it if you like (it stays a draft), then select Activate. Activating checks every step against your site again, makes the funnel live and turns recording on if it was off, so it counts visits from then on. Activating needs Manage funnels. A draft counts towards the 20 funnels a site keeps.'
11248
11332
  },
11249
11333
  {
11250
11334
  path: '/marketing-and-automation/analytics/funnels',
11251
11335
  title: 'Funnels',
11252
11336
  heading: 'Act on a drop-off',
11253
11337
  anchor: '#act-on-drop-off',
11254
- text: 'Below each step after the first, Act on this drop-off drafts an automation for the people who reached the step before it and did not go on. Pick:\n- After — how long to wait for them to go on: 1 hour, 1 day, 3 days or 7 days.\n- Then — send them a follow-up email, or create a CRM task for your team.\nThe automation is saved switched off on your site\'s Automation page. Edit its words there, then switch it on. It starts on the trigger Left a funnel, with conditions for this funnel, this step and this wait, and it can use the funnel\'s name, the step\'s name, the next step\'s name and the person\'s email.\nWho it reaches:\n- Only people who submitted a form on your site. Anonymous visitors are never followed up.\n- Only once per person, for each funnel, step and wait, and only if they had not reached the next step in any of their recorded visits.\n- A follow-up email is a mailing, not a reply: it carries its unsubscribe link and is never sent to someone who unsubscribed or whose address is suppressed.\n- People who dropped off in the last wait period before you created the automation are included; earlier ones are not.\nAglyn checks for drop-offs every 15 minutes, so a follow-up can arrive up to a quarter of an hour after its wait. Drafting needs a site admin or editor and a plan that includes automations. Add an Email from the site step after the step you follow up on to see in the funnel how many people the follow-up brought back.'
11338
+ text: 'Below each step after the first, Act on this drop-off drafts an automation for the people who reached the step before it and did not go on. Pick:\n- After — how long to wait for them to go on: 1 hour, 1 day, 3 days or 7 days.\n- Then — send them a follow-up email, or create a CRM task for your team.\nThe automation is saved switched off on your site\'s Automation page. Edit its words there, then switch it on. It starts on the trigger Left a funnel, with conditions for this funnel, this step and this wait, and it can use the funnel\'s name, the step\'s name, the next step\'s name and the person\'s email.\nWho it reaches:\n- Only people who submitted a form on your site. Anonymous visitors are never followed up.\n- Only once per person, for each funnel, step and wait, and only if they had not reached the next step in any of their recorded visits.\n- A follow-up email is a mailing, not a reply: it carries its unsubscribe link and is never sent to someone who unsubscribed or whose address is suppressed.\n- People who dropped off in the last wait period before you created the automation are included; earlier ones are not.\nAglyn checks for drop-offs every 15 minutes, so a follow-up can arrive up to a quarter of an hour after its wait. Drafting needs Manage funnels and a plan that includes automations. Add an Email from the site step after the step you follow up on to see in the funnel how many people the follow-up brought back.'
11255
11339
  },
11256
11340
  {
11257
11341
  path: '/marketing-and-automation/analytics/funnels',
@@ -12014,14 +12098,14 @@ export const DOCS_SECTION_INDEX = [
12014
12098
  title: 'Org automations',
12015
12099
  heading: 'Create one',
12016
12100
  anchor: '#create-one',
12017
- text: '1. At the organization level, open Automation → Org automations and choose Add org automation.\n2. Name it and pick the trigger event. Optionally add a filter or conditions — the same ones the actions builder offers.\n3. Choose where it runs on: Every site — including sites you add later — or Chosen sites, up to 30 of them.\n4. Add the steps, then save.\nTo start from a description instead, choose Create with AI in the card\'s header: Aglyn AI drafts one and opens it in the editor, switched off, for you to place on sites and save. See Automations with AI.\nOnly an organization owner, admin or editor creates and edits org automations. An organization holds up to 100 of them; deleting one frees its place.\nTriggers\nOrg automations start on what the server records about a person: Form submitted, New lead, Contact created, Contact changed stage, New booking, Member signed up, Member signed in, Deal moved, Deal won, Deal lost and CRM task completed. What each event carries for filters and conditions is listed under the filter field as you pick it.\nPage views and on-page events (clicks, scroll depth, exit intent) are not offered: they belong to one site\'s pages. Build those as actions on the site.\nSteps\nSend an email, Notify site admins, Enroll in a list, Assign to a campaign, Write to a dataset, Update a dataset record, the five CRM steps, Fire a custom event, Wait, Wait for something to happen and End the flow here.\nWhat is left out belongs to one site, so an org automation cannot run it:\n- Run a workflow — a workflow calls its own site\'s functions and variables;\n- Send a webhook — a webhook holds its own site\'s address and secret;\n- every in-page step — popups, drawers, menus, show and hide, CSS classes, custom HTML and JavaScript, analytics events, redirects and site alerts.\nTo '
12101
+ text: '1. At the organization level, open Automation → Org automations and choose Add org automation.\n2. Name it and pick the trigger event. Optionally add a filter or conditions — the same ones the actions builder offers.\n3. Choose where it runs on: Every site — including sites you add later — or Chosen sites, up to 30 of them.\n4. Add the steps, then save.\nTo start from a description instead, choose Create with AI in the card\'s header: Aglyn AI drafts one and opens it in the editor, switched off, for you to place on sites and save. See Automations with AI.\nCreating and editing org automations takes the Manage org automations permission, which a workspace\'s owners, admins and editors have. An organization holds up to 100 of them; deleting one frees its place.\nTriggers\nOrg automations start on what the server records about a person: Form submitted, New lead, Contact created, Contact changed stage, New booking, Member signed up, Member signed in, Deal moved, Deal won, Deal lost and CRM task completed. What each event carries for filters and conditions is listed under the filter field as you pick it.\nPage views and on-page events (clicks, scroll depth, exit intent) are not offered: they belong to one site\'s pages. Build those as actions on the site.\nSteps\nSend an email, Notify site admins, Enroll in a list, Assign to a campaign, Write to a dataset, Update a dataset record, the five CRM steps, Fire a custom event, Wait, Wait for something to happen and End the flow here.\nWhat is left out belongs to one site, so an org automation cannot run it:\n- Run a workflow — a workflow calls its own site\'s functions and variables;\n- Send a webhook — a webhook holds its own site\'s address and secret;\n- every in-page step — popups, drawers, menus, show and hide, CSS classes, custom HTML and Java'
12018
12102
  },
12019
12103
  {
12020
12104
  path: '/marketing-and-automation/workflows-and-actions/org-automations',
12021
12105
  title: 'Org automations',
12022
12106
  heading: 'Pause it on one site',
12023
12107
  anchor: '#pause-it-on-one-site',
12024
- text: 'Each site\'s Automation → Actions section shows Org automations on this site: the ones placed on it, whether each runs here, and Pause here / Resume here. A site\'s admins and editors can pause an org automation on their own site — only their own; the organization\'s editors can pause it on any of its sites from the organization hub, with Pause on… and the Paused on chips.\nPausing stops it on that site, including for anyone waiting inside it there, and leaves every other site running it.'
12108
+ text: 'Each site\'s Automation → Actions section shows Org automations on this site: the ones placed on it, whether each runs here, and Pause here / Resume here. Anyone with Pause org automations on a site (a site\'s admins and editors, by default) can pause an org automation on that site — only there; anyone with Manage org automations can pause it on any of the organization\'s sites from the organization hub, with Pause on… and the Paused on chips.\nPausing stops it on that site, including for anyone waiting inside it there, and leaves every other site running it.'
12025
12109
  },
12026
12110
  {
12027
12111
  path: '/marketing-and-automation/workflows-and-actions/org-automations',