@aglyn/aglyn 1.0.0-beta.230 → 1.0.0-beta.232
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.
- package/package.json +11 -11
- package/src/lib/app-utils/account-acquisition.d.ts +15 -2
- package/src/lib/app-utils/account-acquisition.js +20 -1
- package/src/lib/app-utils/account-acquisition.js.map +1 -1
- package/src/lib/app-utils/artifact-list-queries.d.ts +35 -0
- package/src/lib/app-utils/artifact-list-queries.js +203 -0
- package/src/lib/app-utils/artifact-list-queries.js.map +1 -0
- package/src/lib/app-utils/business-profile.d.ts +171 -0
- package/src/lib/app-utils/business-profile.js +277 -0
- package/src/lib/app-utils/business-profile.js.map +1 -0
- package/src/lib/app-utils/child-contract.d.ts +4 -1
- package/src/lib/app-utils/child-contract.js +5 -2
- package/src/lib/app-utils/child-contract.js.map +1 -1
- package/src/lib/app-utils/console-routes.d.ts +5 -0
- package/src/lib/app-utils/console-routes.js +1 -0
- package/src/lib/app-utils/console-routes.js.map +1 -1
- package/src/lib/app-utils/content-schema-type.d.ts +9 -0
- package/src/lib/app-utils/content-schema-type.js +4 -0
- package/src/lib/app-utils/content-schema-type.js.map +1 -1
- package/src/lib/app-utils/crm.d.ts +14 -1
- package/src/lib/app-utils/crm.js +19 -2
- package/src/lib/app-utils/crm.js.map +1 -1
- package/src/lib/app-utils/docs-help.generated.d.ts +119 -5
- package/src/lib/app-utils/docs-help.generated.js +290 -2
- package/src/lib/app-utils/docs-help.generated.js.map +1 -1
- package/src/lib/app-utils/docs-index.generated.js +697 -32
- package/src/lib/app-utils/docs-index.generated.js.map +1 -1
- package/src/lib/app-utils/entry-list-declaration.d.ts +33 -0
- package/src/lib/app-utils/entry-list-declaration.js +172 -0
- package/src/lib/app-utils/entry-list-declaration.js.map +1 -0
- package/src/lib/app-utils/first-version-seed.d.ts +19 -0
- package/src/lib/app-utils/first-version-seed.js +53 -0
- package/src/lib/app-utils/first-version-seed.js.map +1 -0
- package/src/lib/app-utils/host-status.d.ts +85 -0
- package/src/lib/app-utils/host-status.js +115 -0
- package/src/lib/app-utils/host-status.js.map +1 -0
- package/src/lib/app-utils/local-business.d.ts +8 -0
- package/src/lib/app-utils/local-business.js +4 -0
- package/src/lib/app-utils/local-business.js.map +1 -1
- package/src/lib/app-utils/lockdown.js +1 -1
- package/src/lib/app-utils/lockdown.js.map +1 -1
- package/src/lib/app-utils/media-filter.d.ts +136 -0
- package/src/lib/app-utils/media-filter.js +400 -0
- package/src/lib/app-utils/media-filter.js.map +1 -0
- package/src/lib/app-utils/mobile-push.d.ts +98 -0
- package/src/lib/app-utils/mobile-push.js +97 -0
- package/src/lib/app-utils/mobile-push.js.map +1 -0
- package/src/lib/app-utils/notification-push.d.ts +38 -0
- package/src/lib/app-utils/notification-push.js +54 -0
- package/src/lib/app-utils/notification-push.js.map +1 -0
- package/src/lib/app-utils/notifications.d.ts +7 -0
- package/src/lib/app-utils/notifications.js.map +1 -1
- package/src/lib/app-utils/organizations.js +5 -2
- package/src/lib/app-utils/organizations.js.map +1 -1
- package/src/lib/app-utils/page-markdown.js +3 -0
- package/src/lib/app-utils/page-markdown.js.map +1 -1
- package/src/lib/app-utils/plugin-host-events.generated.d.ts +1 -1
- package/src/lib/app-utils/plugin-host-events.generated.js +149 -0
- package/src/lib/app-utils/plugin-host-events.generated.js.map +1 -1
- package/src/lib/app-utils/plugin-release-flags.generated.d.ts +1 -1
- package/src/lib/app-utils/plugin-release-flags.generated.js +7 -0
- package/src/lib/app-utils/plugin-release-flags.generated.js.map +1 -1
- package/src/lib/app-utils/realm-host-surface.generated.js +3 -0
- package/src/lib/app-utils/realm-host-surface.generated.js.map +1 -1
- package/src/lib/app-utils/release-flags.js +6 -2
- package/src/lib/app-utils/release-flags.js.map +1 -1
- package/src/lib/app-utils/scope-tokens.d.ts +16 -1
- package/src/lib/app-utils/scope-tokens.js +15 -1
- package/src/lib/app-utils/scope-tokens.js.map +1 -1
- package/src/lib/app-utils/site-list-query.d.ts +47 -0
- package/src/lib/app-utils/site-list-query.js +142 -0
- package/src/lib/app-utils/site-list-query.js.map +1 -0
- package/src/lib/app-utils/site-wide-outbox.d.ts +95 -0
- package/src/lib/app-utils/site-wide-outbox.js +117 -0
- package/src/lib/app-utils/site-wide-outbox.js.map +1 -0
- package/src/lib/app-utils/transfer-launcher-context.d.ts +6 -0
- package/src/lib/app-utils/transfer-launcher-context.js.map +1 -1
- package/src/lib/app-utils/upload-inspection.js +7 -0
- package/src/lib/app-utils/upload-inspection.js.map +1 -1
- package/src/lib/app-utils/webhook-delivery.js +4 -1
- package/src/lib/app-utils/webhook-delivery.js.map +1 -1
- package/src/lib/foundation/definitions/org-billing.types.d.ts +8 -0
- package/src/lib/foundation/definitions/org-billing.types.js.map +1 -1
- package/src/lib/foundation/definitions/organization.types.d.ts +18 -7
- package/src/lib/foundation/definitions/organization.types.js.map +1 -1
- package/src/lib/foundation/definitions/write-deny-coverage.util.d.ts +4 -1
- package/src/lib/foundation/definitions/write-deny-coverage.util.js +12 -2
- package/src/lib/foundation/definitions/write-deny-coverage.util.js.map +1 -1
- package/src/lib/plugin-manager/enabled-plugins.js +4 -2
- package/src/lib/plugin-manager/enabled-plugins.js.map +1 -1
- package/src/lib/plugin-manager/feature-plugins.d.ts +107 -0
- package/src/lib/plugin-manager/feature-plugins.js +52 -0
- package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
- package/src/lib/plugin-manager/first-party-plugins.generated.js +326 -2
- package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
- package/src/lib/plugin-manager/plugin-channel-orders.d.ts +262 -0
- package/src/lib/plugin-manager/plugin-channel-orders.js +32 -0
- package/src/lib/plugin-manager/plugin-channel-orders.js.map +1 -0
- package/src/lib/plugin-manager/plugin-checkout-extras.d.ts +168 -0
- package/src/lib/plugin-manager/plugin-checkout-extras.js +172 -0
- package/src/lib/plugin-manager/plugin-checkout-extras.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contributions.d.ts +7 -0
- package/src/lib/plugin-manager/plugin-contributions.js +1 -1
- package/src/lib/plugin-manager/plugin-contributions.js.map +1 -1
- package/src/lib/plugin-manager/plugin-domain-events.d.ts +138 -0
- package/src/lib/plugin-manager/plugin-domain-events.js +148 -0
- package/src/lib/plugin-manager/plugin-domain-events.js.map +1 -0
- package/src/lib/plugin-manager/plugin-events.d.ts +30 -0
- package/src/lib/plugin-manager/plugin-events.js +4 -0
- package/src/lib/plugin-manager/plugin-events.js.map +1 -1
- package/src/lib/plugin-manager/plugin-fulfillment-providers.d.ts +101 -0
- package/src/lib/plugin-manager/plugin-fulfillment-providers.js +83 -0
- package/src/lib/plugin-manager/plugin-fulfillment-providers.js.map +1 -0
- package/src/lib/plugin-manager/plugin-permissions.js +21 -5
- package/src/lib/plugin-manager/plugin-permissions.js.map +1 -1
- package/src/lib/plugin-manager/plugin-person-records.d.ts +90 -0
- package/src/lib/plugin-manager/plugin-person-records.js +26 -0
- package/src/lib/plugin-manager/plugin-person-records.js.map +1 -1
- package/src/lib/plugin-manager/plugin-product-catalog.d.ts +209 -0
- package/src/lib/plugin-manager/plugin-product-catalog.js +43 -0
- package/src/lib/plugin-manager/plugin-product-catalog.js.map +1 -0
- package/src/lib/plugin-manager/plugin-product-writer.d.ts +166 -0
- package/src/lib/plugin-manager/plugin-product-writer.js +31 -0
- package/src/lib/plugin-manager/plugin-product-writer.js.map +1 -0
- package/src/lib/plugin-manager/plugin-shipment-records.d.ts +210 -0
- package/src/lib/plugin-manager/plugin-shipment-records.js +63 -0
- package/src/lib/plugin-manager/plugin-shipment-records.js.map +1 -0
- package/src/lib/plugin-manager/plugin-shipping-rates.d.ts +151 -0
- package/src/lib/plugin-manager/plugin-shipping-rates.js +62 -0
- package/src/lib/plugin-manager/plugin-shipping-rates.js.map +1 -0
- package/src/lib/plugin-manager/plugin-sms-messaging.d.ts +103 -0
- package/src/lib/plugin-manager/plugin-sms-messaging.js +39 -0
- package/src/lib/plugin-manager/plugin-sms-messaging.js.map +1 -0
- package/src/lib/plugin-manager/plugin-stock-levels.d.ts +81 -0
- package/src/lib/plugin-manager/plugin-stock-levels.js +32 -0
- package/src/lib/plugin-manager/plugin-stock-levels.js.map +1 -0
- package/src/lib/plugin-manager/plugin-tax-profile.d.ts +154 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js +56 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js.map +1 -1
- package/src/lib/plugin-manager/plugin-theme-font-catalog.d.ts +59 -0
- package/src/lib/plugin-manager/plugin-theme-font-catalog.js +40 -0
- package/src/lib/plugin-manager/plugin-theme-font-catalog.js.map +1 -0
- package/src/lib/plugin-manager/plugin-theme-presets.d.ts +40 -0
- package/src/lib/plugin-manager/plugin-theme-presets.js +44 -0
- package/src/lib/plugin-manager/plugin-theme-presets.js.map +1 -0
- package/src/lib/plugin-manager/plugin-tracking-pages.d.ts +55 -0
- package/src/lib/plugin-manager/plugin-tracking-pages.js +76 -0
- package/src/lib/plugin-manager/plugin-tracking-pages.js.map +1 -0
- package/src/lib/plugin-manager/realm-host-aglyn.generated.js +3 -0
- package/src/lib/plugin-manager/realm-host-aglyn.generated.js.map +1 -1
|
@@ -235,6 +235,55 @@ export const DOCS_SECTION_INDEX = [
|
|
|
235
235
|
anchor: '#related',
|
|
236
236
|
text: '- Actions builder\n- Aglyn AI\n- How Aglyn AI builds'
|
|
237
237
|
},
|
|
238
|
+
{
|
|
239
|
+
path: '/ai/business-profile',
|
|
240
|
+
title: 'Business profile',
|
|
241
|
+
heading: '',
|
|
242
|
+
anchor: '',
|
|
243
|
+
text: 'Business profile\nEvery AI job for a site starts from what the site already knows about the business: its name, what it does, its services, the area it serves, who it is for, its tone of voice, and the contact details you entered. Aglyn AI writes for this business instead of guessing, and it never makes up a way to reach you.'
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
path: '/ai/business-profile',
|
|
247
|
+
title: 'Business profile',
|
|
248
|
+
heading: 'Where to edit it',
|
|
249
|
+
anchor: '#where-to-edit-it',
|
|
250
|
+
text: 'Open the site, go to Setup → Business profile. The page has three cards:\n- Business profile: what the business does, its services (one per line), who it is for, the area it serves, the tone of voice and any notes on tone.\n- From your site settings: the facts Aglyn AI reads from your other settings, each with a link to the card that edits it.\n- What Aglyn AI learned: the preferences it took from edits you applied.'
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
path: '/ai/business-profile',
|
|
254
|
+
title: 'Business profile',
|
|
255
|
+
heading: 'Where the values come from',
|
|
256
|
+
anchor: '#where-the-values-come-from',
|
|
257
|
+
text: 'When a site is started with Aglyn AI, the profile is filled from your answers to the guided start, and from what the plan wrote about the business. Each field says where its value came from:\n- Your answers when the site was started, or Suggested by Aglyn AI: a suggestion. Edit it and it becomes yours.\n- An empty field that Aglyn AI still has a value for says so: the description in your SEO settings, or the workspace\'s default.\nWhat you type is never replaced. A later job can fill an empty field, but it never overwrites one you wrote, and a field you cleared stays clear.\nWorkspace defaults\nSettings → Profile has a Business profile defaults card. A site uses those values wherever its own profile is empty, so a workspace that runs many sites for one business writes them once. Only managers can change them.'
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
path: '/ai/business-profile',
|
|
261
|
+
title: 'Business profile',
|
|
262
|
+
heading: 'Contact details are never invented',
|
|
263
|
+
anchor: '#contact-details-are-never-invented',
|
|
264
|
+
text: 'The name, business type, email, phone, address, opening hours and social profiles come only from Setup → Basic details and Setup → SEO, exactly as entered. A detail you have not entered reads Not entered, and Aglyn AI writes around it, or leaves a bracketed placeholder such as [phone number] for you to fill, instead of making one up. The same goes for prices, reviews and testimonials.'
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
path: '/ai/business-profile',
|
|
268
|
+
title: 'Business profile',
|
|
269
|
+
heading: 'What Aglyn AI learned',
|
|
270
|
+
anchor: '#what-aglyn-ai-learned',
|
|
271
|
+
text: 'When you apply an Assist edit that shows a preference, such as asking for shorter copy, a friendlier tone, no emoji, or removing a testimonials section, Aglyn AI keeps that as a short preference for the site. Later jobs read it.\nThe What Aglyn AI learned card lists each preference and how many applied edits it was seen in. Choose the close button beside one to forget it, or Forget all to clear the list. A preference replaces an opposite one: asking for detailed copy after asking for shorter copy keeps only the newer one.'
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
path: '/ai/business-profile',
|
|
275
|
+
title: 'Business profile',
|
|
276
|
+
heading: 'Which jobs read it',
|
|
277
|
+
anchor: '#which-jobs-read-it',
|
|
278
|
+
text: 'The site\'s plan, every build Assist plans for the site, Assist\'s edit turns, and analytics insights read the profile. Insights read what the business is, never its contact details. Free and paid workspaces get the same profile.\nThe profile is sent as one short block, at most about 400 tokens, that is cached for the site, so it adds almost nothing to what a job costs.'
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
path: '/ai/business-profile',
|
|
282
|
+
title: 'Business profile',
|
|
283
|
+
heading: 'Related',
|
|
284
|
+
anchor: '#related',
|
|
285
|
+
text: '- How Aglyn AI builds\n- Generate a site'
|
|
286
|
+
},
|
|
238
287
|
{
|
|
239
288
|
path: '/ai/copy-assist',
|
|
240
289
|
title: 'Rewrite and write copy with AI',
|
|
@@ -282,42 +331,42 @@ export const DOCS_SECTION_INDEX = [
|
|
|
282
331
|
title: 'Create images with AI',
|
|
283
332
|
heading: '',
|
|
284
333
|
anchor: '',
|
|
285
|
-
text: 'Create images with AI\nCreate with AI in the media library makes pictures from a description and adds them to the library you have open.
|
|
334
|
+
text: 'Create images with AI\nCreate with AI in the media library makes pictures from a description and adds them to the library you have open. The Kind menu lists what it can make, in four sections:\n| Section | Kinds | Made as |\n| Vector | Illustration (a spot illustration or small scene), Icon (one color, or two tones), Pattern (a seamless background that tiles), Logo mark (a simple symbol without lettering) | An SVG, sharp at any size. Available wherever Aglyn AI is. |\n| Photo | Photo (your description decides the style), Natural photo, Studio product shot, Lifestyle with people, Architecture & interiors, Food, Aerial & landscape | A picture made by Google\'s image models |\n| Art | 3D render, Watercolor, Oil painting, Flat vector art, Line drawing, Cartoon or anime | A picture made by Google\'s image models |\n| Design | Background or texture, Banner or hero image, Social post graphic, Mockup (your design on a device screen or packaging) | A picture made by Google\'s image models |\nEvery kind but Photo adds its own style to your description: a photographic kind asks for the lens, light and composition that genre is shot with, an art kind for its medium and strokes, and a design kind for its layout, such as a banner\'s calm space for a headline. The Photo, Art and Design sections are offered only where photo creation is turned on for the deployment your workspace runs on; where it is not, the menu lists the Vector kinds alone.\nEach picture is stored the way a file you upload is stored: in the open folder, counted toward your storage, served from the same addresses, and with alt text you can edit.'
|
|
286
335
|
},
|
|
287
336
|
{
|
|
288
337
|
path: '/ai/create-images',
|
|
289
338
|
title: 'Create images with AI',
|
|
290
339
|
heading: 'Make a picture',
|
|
291
340
|
anchor: '#make-a-picture',
|
|
292
|
-
text: '1. Open Media, on a site or for the organization, and open the folder the pictures should land in.\n2. Choose Create with AI, beside Upload media. An empty library offers it beside its own Upload media button too.\n3.
|
|
341
|
+
text: '1. Open Media, on a site or for the organization, and open the folder the pictures should land in.\n2. Choose Create with AI, beside Upload media. An empty library offers it beside its own Upload media button too.\n3. Choose a Kind. Each one shows what a picture of it costs, and choosing it picks a shape that suits it — Wide 16:9 for a banner, Square 1:1 for a social post — which you can change.\n4. Describe the picture: what is in it and the setting. For a Photo, describe the style too.\n5. Choose a shape: Square 1:1, Landscape 4:3, Portrait 3:4, Wide 16:9 or Tall 9:16, and how many pictures to make, from one to four.\n6. For a Vector kind, choose its colors: Use my site\'s theme colors, which reads your site\'s theme, or Choose colors to pick up to six. The organization\'s library belongs to no single site, so there you choose the colors. For an Art or Design kind, name the colors in your description if you want particular ones; a Photo kind takes the colors of the scene.\n7. The window shows what the pictures will cost in credits before you start. Choose Create.\nThe pictures appear in the library a few seconds later, selected, so you can move, tag or open them at once. Nothing is placed on a page: a picture is used only when you put it in an Image element, a gallery or anywhere else a media field asks for one.'
|
|
293
342
|
},
|
|
294
343
|
{
|
|
295
344
|
path: '/ai/create-images',
|
|
296
345
|
title: 'Create images with AI',
|
|
297
346
|
heading: 'What each picture gets',
|
|
298
347
|
anchor: '#what-each-picture-gets',
|
|
299
|
-
text: '- Alt text. A
|
|
348
|
+
text: '- Alt text. A picture from the Photo, Art or Design sections takes your description; a Vector picture gets a sentence the AI writes about what it drew. Edit it in the picture\'s details like any other alt text.\n- A file name made from the first few words of your description, starting ai- and numbered within the set: .svg for a Vector kind, the picture\'s own type for the others.\n- A record of how it was made: the model, your description, the kind and the shape, kept with the file.\n- For a picture from Google\'s image models, an invisible watermark. Google marks every picture its image models make with its SynthID watermark, so the picture can later be identified as generated. You cannot see it, and it does not change how the picture looks.'
|
|
300
349
|
},
|
|
301
350
|
{
|
|
302
351
|
path: '/ai/create-images',
|
|
303
352
|
title: 'Create images with AI',
|
|
304
353
|
heading: 'Credits',
|
|
305
354
|
anchor: '#credits',
|
|
306
|
-
text: 'Pictures are metered in AI credits from the workspace\'s pool. The window shows an estimate before you create anything:\n|
|
|
355
|
+
text: 'Pictures are metered in AI credits from the workspace\'s pool. The window shows an estimate before you create anything:\n| Kinds | About, per picture | What it is made of |\n| Vector | 18 credits | The words the AI reads and writes to draw the SVG, at the same rates as other AI text |\n| Photo, Art and Design, on the Free plan | 75 credits | A 512 px picture, plus the description and the thinking the image model does before it draws |\n| Photo, Art and Design, on a paid plan | 108 credits | A 1K picture (about 1024 px on its longer side), plus the same |\nThe size comes from your plan: pictures are 512 px on Free and 1K on every paid plan.\nWhat is charged is what was actually spent, so a picture can cost a little more or less than its estimate, and an illustration that needed a second attempt costs about twice its estimate. You are charged only for pictures that reach your library:\n- a picture the safety filter holds back is not charged;\n- an illustration that does not come out right is not charged. The window says This one\'s on us — you weren\'t charged.\n- a picture your library could not store, because your storage is full for example, is not charged;\n- when the AI service fails, nothing is charged.\nA Free workspace spends from its monthly allowance and is told before it starts when the pictures it asked for would cost more than it has left. A paid workspace past its included band keeps working at its plan\'s overage rate unless the workspace stops AI at the band, the same as every other AI request.'
|
|
307
356
|
},
|
|
308
357
|
{
|
|
309
358
|
path: '/ai/create-images',
|
|
310
359
|
title: 'Create images with AI',
|
|
311
360
|
heading: 'Safe by construction',
|
|
312
361
|
anchor: '#safety',
|
|
313
|
-
text: 'An illustration is checked before it is stored. It has to be one SVG in the shape you chose, no larger than 200 KB, and self-contained: no scripts, no links, no embedded images or web pages, and nothing loaded from anywhere else, such as a font. An illustration that fails the check is drawn again once with the problem pointed out; if the second one fails too, it is not stored and not charged. The media library then removes anything unsafe from every SVG it stores, as it does for an SVG you upload.\nThe AI declines to draw a real company\'s or organization\'s logo, a trademark or a recognizable brand symbol, a real, named person, and anything sexual, hateful, violent or otherwise unsafe; the window says why, and a declined request on a Free workspace costs nothing. A Logo mark is always a symbol without lettering.\
|
|
362
|
+
text: 'An illustration is checked before it is stored. It has to be one SVG in the shape you chose, no larger than 200 KB, and self-contained: no scripts, no links, no embedded images or web pages, and nothing loaded from anywhere else, such as a font. An illustration that fails the check is drawn again once with the problem pointed out; if the second one fails too, it is not stored and not charged. The media library then removes anything unsafe from every SVG it stores, as it does for an SVG you upload.\nThe AI declines to draw a real company\'s or organization\'s logo, a trademark or a recognizable brand symbol, a real, named person, and anything sexual, hateful, violent or otherwise unsafe; the window says why, and a declined request on a Free workspace costs nothing. A Logo mark is always a symbol without lettering.\nPictures from the Photo, Art and Design sections are checked by Google\'s safety filters, set to block content they rate as a medium risk or higher, and Google\'s own policies refuse some content whatever is asked, such as photorealistic depictions of children or celebrities that its policies do not allow. The window says so for those kinds: pictures of real, identifiable people, celebrities or brands may be declined. The people in a Lifestyle with people picture are asked for as made-up people, and a Cartoon or anime picture as original characters. A description that is declined is answered with a message and no picture is charged.'
|
|
314
363
|
},
|
|
315
364
|
{
|
|
316
365
|
path: '/ai/create-images',
|
|
317
366
|
title: 'Create images with AI',
|
|
318
367
|
heading: 'What is sent',
|
|
319
368
|
anchor: '#what-is-sent',
|
|
320
|
-
text: '-
|
|
369
|
+
text: '- Vector kinds: your description, the kind and shape of picture, and your site\'s theme colors or the colors you chose are sent to the AI service every other Aglyn AI feature uses.\n- Photo, Art and Design kinds: your description, followed by the kind\'s fixed style wording, and the shape you chose are sent to Google\'s image models on Vertex AI.\nNothing else is sent: no other content of your site, no file from your library, and no name, email address or account identifier. The pictures come back to Aglyn and are stored in your library; your description is kept with each picture as part of its record of how it was made.'
|
|
321
370
|
},
|
|
322
371
|
{
|
|
323
372
|
path: '/ai/create-images',
|
|
@@ -709,7 +758,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
709
758
|
title: 'Aglyn AI: the AI website builder',
|
|
710
759
|
heading: 'What it can build',
|
|
711
760
|
anchor: '#what-it-can-build',
|
|
712
|
-
text: 'Each capability has its own page, next to the thing it builds:\n| You want | Where you start | The page |\n| A page from a brief | Pages → Create with AI | Generate a page |\n| A whole small site | Pages, or Sites for several at once | Generate a site |\n| Many client sites, run as an agency | Sites | An AI website builder for agencies |\n| A layout — header, navigation, footer | Layouts → Create with AI | Generate a layout |\n| A page template | Templates → Create with AI | Generate a page template |\n| A reusable component | Components → Create with AI | Generate a component |\n| A form | Forms → Create with AI | Generate a form |\n| Illustrations, icons, patterns, logo marks and
|
|
761
|
+
text: 'Each capability has its own page, next to the thing it builds:\n| You want | Where you start | The page |\n| A page from a brief | Pages → Create with AI | Generate a page |\n| A whole small site | Pages, or Sites for several at once | Generate a site |\n| Many client sites, run as an agency | Sites | An AI website builder for agencies |\n| A layout — header, navigation, footer | Layouts → Create with AI | Generate a layout |\n| A page template | Templates → Create with AI | Generate a page template |\n| A reusable component | Components → Create with AI | Generate a component |\n| A form | Forms → Create with AI | Generate a form |\n| Illustrations, icons, patterns, logo marks, photos, art and design images | Media → Create with AI | Create images with AI |\n| A section on the canvas | The Besigner | Generate a section |\n| Copy, rewritten or fresh | Any text in the Besigner | Rewrite and write copy |\n| A change to your theme | Setup → Theme | Change your theme with AI |\n| Search titles and descriptions | SEO | SEO by AI |\n| Product copy, catalog and discount ideas | Products → Create with AI, and Build your catalog with AI on the products page | Products with AI |\n| Help working the CRM | A record, the composer, an import | CRM by AI |\n| A designed email | Emails → Templates → Create with AI | Generate an email |\n| A campaign | Marketing → Campaigns → Create with AI, or Also draft a campaign on an email | Generate an email |\n| Variants for an A/B test, and its result in words | Marketing → Experiments | A/B tests by AI |\n| Announcement bar and popup copy, or a new overlay | Marketing → Overlays | Marketing with AI |\n| What your analytics mean | Analytics → Insights | Insights |\n| What your campaigns caused and earned | Marketing → Conversions, or a campaign\'s report | Marketing '
|
|
713
762
|
},
|
|
714
763
|
{
|
|
715
764
|
path: '/ai/overview',
|
|
@@ -751,7 +800,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
751
800
|
title: 'Aglyn AI: the AI website builder',
|
|
752
801
|
heading: 'Related',
|
|
753
802
|
anchor: '#related',
|
|
754
|
-
text: '- How Aglyn AI builds\n- Aglyn Assist\n- AI allotments, usage and model choice\n- Add-ons\n- The Besigner'
|
|
803
|
+
text: '- How Aglyn AI builds\n- Business profile\n- Aglyn Assist\n- AI allotments, usage and model choice\n- Add-ons\n- The Besigner'
|
|
755
804
|
},
|
|
756
805
|
{
|
|
757
806
|
path: '/ai/products-with-ai',
|
|
@@ -989,7 +1038,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
989
1038
|
title: 'Drag-and-drop hierarchy',
|
|
990
1039
|
heading: 'Containers vs. leaf elements',
|
|
991
1040
|
anchor: '#containers-vs-leaf-elements',
|
|
992
|
-
text: 'Whether the center zone means "drop inside" depends on the kind of element you\'re over.\nContainers accept children\nContainers are built to hold other elements: Stack, Box, Section, Card, App Bar, Toolbar, and similar. Dropping onto a container\'s center nests your element inside it. This is how you build structure — a Stack of buttons, a Section full of blocks, and so on.\nLeaf elements don\'t — dropping on one makes a sibling\nLeaf elements have no slot for child elements. There are three kinds:\n- Text elements render their content as inline text — a Page Link, a Button, or
|
|
1041
|
+
text: 'Whether the center zone means "drop inside" depends on the kind of element you\'re over.\nContainers accept children\nContainers are built to hold other elements: Stack, Box, Section, Card, App Bar, Toolbar, and similar. Dropping onto a container\'s center nests your element inside it. This is how you build structure — a Stack of buttons, a Section full of blocks, and so on.\nTypography is a container too. Drop an element on its center and it nests inside, after the Typography\'s own text: a heading can carry a badge, an icon, or a second line of text. A Typography nested inside another continues the same line, the way a phrase continues a sentence, so add a space at the start of its text if you want one between them. Double-click the outer text to edit it as usual; the elements inside are left alone.\nLeaf elements don\'t — dropping on one makes a sibling\nLeaf elements have no slot for child elements. There are three kinds:\n- Text elements render their content as inline text — a Page Link, a Button, or an Inline Text run. Their words are their content; there\'s nowhere to nest a child.\n- Self-closing elements draw themselves and take no children at all — an Image, an Icon, or a Video.\n- Elements whose content is an attribute look like containers but draw only what their attributes say — a Markdown block (its document is the Content attribute), a List Item Text row (its words are Primary/Secondary), a Reusable Component instance (its content lives in the definition), and a Layout Slot (filled by the page bound to the layout). Anything nested inside one of these has nowhere to appear on the published page.\nDropping onto a leaf places your element as a sibling right after it, inside the leaf\'s parent — never nested inside the leaf. Over a leaf you\'ll only ever see a before/after p'
|
|
993
1042
|
},
|
|
994
1043
|
{
|
|
995
1044
|
path: '/building-sites/besigner/drag-drop-hierarchy',
|
|
@@ -3285,7 +3334,21 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3285
3334
|
title: 'Edit your theme',
|
|
3286
3335
|
heading: 'Set colors and fonts',
|
|
3287
3336
|
anchor: '#set-colors-and-fonts',
|
|
3288
|
-
text: '- Choose your palette and typography.\n- Pick any Google font. Your published site serves it from its own address
|
|
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.'
|
|
3338
|
+
},
|
|
3339
|
+
{
|
|
3340
|
+
path: '/building-sites/theme-builder/edit-your-theme',
|
|
3341
|
+
title: 'Edit your theme',
|
|
3342
|
+
heading: 'Fonts',
|
|
3343
|
+
anchor: '#fonts',
|
|
3344
|
+
text: 'The Fonts control in the Typography card sets two things: the font for your body text and, if you want one of their own, the font for your headings. Each is shown in your own site\'s name and words, so you judge a font by how it will actually read.\nPress Change beside either one to open the font browser:\n- Every Google font, most popular first. Search by name, or narrow the list with the Sans serif, Serif, Display, Handwriting and Monospace chips. Each font in the list previews your site\'s name in that font as it scrolls into view.\n- Theme default (for body text) keeps the font each visitor\'s device already has, which costs nothing to download. Same as body text (for headings) sets headings in the body font, in each heading\'s own weight.\n- Pick a font to see your heading and a paragraph in it, then choose the styles to load — the weights, and italics for headings. Body text always loads its italic, so emphasis is a true italic.\n- Use for body text or Use for headings puts the font in the editor. Nothing changes on your site until you press Save, and Discard changes takes it back.\nDownload size\nThe badge beside your fonts (for example ≈ 38 KB · 2 files) is what a visitor downloads for them: the Latin files your text styles and italics use, measured the way your published pages load them — one file per weight, or one variable file holding every weight, whichever is smaller. Your headings and other text styles load the weights they use as well, matched to the nearest one the font has, so they count too. 0 KB means your site uses the visitor\'s own system font. In the browser, This font is the font you are looking at and All your fonts is the total with it in place.\nFewer fonts and fewer weights load faster. One family with a regular and a bold weight is often all a site need'
|
|
3345
|
+
},
|
|
3346
|
+
{
|
|
3347
|
+
path: '/building-sites/theme-builder/edit-your-theme',
|
|
3348
|
+
title: 'Edit your theme',
|
|
3349
|
+
heading: 'Upload your own font',
|
|
3350
|
+
anchor: '#upload-your-own-font',
|
|
3351
|
+
text: 'Use a font that is not on Google Fonts (your brand\'s typeface, for example) from Your own fonts, at the bottom of the Typography card.\n1. Drop one or more font files on the box, or click it to choose them. Each file can be a WOFF2, WOFF, TTF or OTF file of up to 4 MB. Upload each weight and style (Regular, Bold, Italic) as its own file; a variable font is one file for every weight.\n2. Each file is checked before anything is stored. You see the family, weight and style read from the file, what its license allows, and its size before and after.\n3. Choose Use for body text or Use for headings from the family\'s ⋮ menu, then Save the theme. Until you save, the upload changes only your draft.\nWhat happens to the file:\n- The license is read from the file. A font carries embedding permissions set by its maker. One marked as not embeddable (a restricted license), or as bitmap-only, is refused, because it cannot be used on a website. One marked for viewing and printing only is installed with a warning: many such licenses still exclude websites, so check yours before you publish. By uploading a font you confirm that its license lets you use it on your website. The check reads the font\'s own flags; it cannot see the license you bought.\n- It is converted for the web. The file is stored as WOFF2 and trimmed to the scripts it covers among Latin, Latin Extended, Cyrillic, Greek and Vietnamese, which usually makes it a fraction of its original size. A font whose license asks for it to be embedded whole is converted without trimming. A variable font keeps all of its weights.\n- It lives in your media library, and counts toward your storage like any other file. Uploading a new file for the same family, weight and style replaces the one already there rather than adding a second copy, and yo'
|
|
3289
3352
|
},
|
|
3290
3353
|
{
|
|
3291
3354
|
path: '/building-sites/theme-builder/edit-your-theme',
|
|
@@ -3439,14 +3502,98 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3439
3502
|
title: 'Product catalog',
|
|
3440
3503
|
heading: 'Google Merchant Center feed',
|
|
3441
3504
|
anchor: '#merchant-center-feed',
|
|
3442
|
-
text: 'Your catalog is
|
|
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.'
|
|
3443
3506
|
},
|
|
3444
3507
|
{
|
|
3445
3508
|
path: '/commerce-and-bookings/commerce/catalog',
|
|
3446
3509
|
title: 'Product catalog',
|
|
3447
3510
|
heading: 'Related',
|
|
3448
3511
|
anchor: '#related',
|
|
3449
|
-
text: '- Commerce overview\n- SEO — products emit structured data and join the sitemap automatically.'
|
|
3512
|
+
text: '- Sales channels\n- Commerce overview\n- SEO — products emit structured data and join the sitemap automatically.'
|
|
3513
|
+
},
|
|
3514
|
+
{
|
|
3515
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3516
|
+
title: 'Order emails & status page',
|
|
3517
|
+
heading: '',
|
|
3518
|
+
anchor: '',
|
|
3519
|
+
text: 'Order emails & status page\nYour customers hear about their order at every step, without you doing anything: when it\'s paid, each time part of it ships, when it\'s delivered, when you refund it and when you cancel it. Every one of these emails links to a private order status page on your site where the customer can see the order, its shipments and their tracking.'
|
|
3520
|
+
},
|
|
3521
|
+
{
|
|
3522
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3523
|
+
title: 'Order emails & status page',
|
|
3524
|
+
heading: 'What your customers get',
|
|
3525
|
+
anchor: '#customer-emails',
|
|
3526
|
+
text: '| When | Email | What it says |\n| -- | -- | -- |\n| An order is paid | Order receipt | The items, the total, any license keys and download links, and your receipt footer. Sent for checkout and Buy buttons, for payment links you send from a draft order, and for register sales when the customer gives an email. |\n| You ship part or all of an order | Order shipped | The items in that package, the carrier and tracking number with a tracking link, and how many items are still to ship. One email per package. |\n| You mark an order delivered | Order delivered | The order and its items. |\n| You refund an order | Order refunded | The amount, the items you refunded by name (if you picked any), and whether the order is now refunded in full. One email per refund. |\n| You cancel an order | Order canceled | The order and its items. Canceling doesn\'t refund a payment: refund first if the customer paid. |\nA dropship supplier who posts tracking for their part of an order sends the customer the same Order shipped email.\nEach email is sent once. If a payment confirmation arrives twice, or you click a button twice, the customer still gets one email. A second package or a second partial refund is a new email.\nRegister sales and orders with only digital or service items don\'t send a shipping or delivery email unless you add a tracking number.\nTracking links\nTracking links are built from the carrier you type when you fulfill: USPS, UPS, FedEx, DHL, Canada Post, Royal Mail and Australia Post are recognized, including spellings like "UPS Ground" or "Fed Ex". For any other carrier the email shows the carrier and tracking number without a link.\nTurning emails off\nAll five emails are on for every store. To turn one off, open Commerce → Settings → Customer notifications and switch it off. Switching th'
|
|
3527
|
+
},
|
|
3528
|
+
{
|
|
3529
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3530
|
+
title: 'Order emails & status page',
|
|
3531
|
+
heading: 'The order status page',
|
|
3532
|
+
anchor: '#order-status-page',
|
|
3533
|
+
text: 'Every order email links to /order-status on your site, with a private link for that one order. The page shows, in your site\'s header, footer and theme:\n- the order number and status, with a timeline from placed to delivered\n- each package, its carrier and tracking number, and a Track package button\n- the items, what\'s shipped so far, and the totals, refunds included\nCustomers don\'t need an account. The link only works for that order, and the page never shows the customer\'s email, phone or address, so a forwarded email reveals nothing the email didn\'t already say. Search engines are told not to index it.\nTo design the page yourself, create a page at /order-status and place the Order status element on it (under Commerce in the Besigner). Your page is used instead of the built-in one.'
|
|
3534
|
+
},
|
|
3535
|
+
{
|
|
3536
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3537
|
+
title: 'Order emails & status page',
|
|
3538
|
+
heading: 'Resend a receipt',
|
|
3539
|
+
anchor: '#resend-receipt',
|
|
3540
|
+
text: 'Open an order and click Resend receipt. The customer\'s email is filled in; change it to send the receipt somewhere else. The order\'s timeline records each send. To stop accidental floods, an order\'s receipt can be resent five times an hour.'
|
|
3541
|
+
},
|
|
3542
|
+
{
|
|
3543
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3544
|
+
title: 'Order emails & status page',
|
|
3545
|
+
heading: 'Text messages',
|
|
3546
|
+
anchor: '#text-messages',
|
|
3547
|
+
text: 'Rolling out Text messages for order updates aren\'t available yet. Until they are, every order notification is sent by email, and no option to text a customer appears anywhere in your console.\nWhen text messages are available, the Customer notifications settings get an Also send as texts switch, and Resend receipt can send by text. Customers can reply STOP to any text to stop receiving them. Receipts are texted right away; texts about shipping, delivery, refunds and cancellations that would arrive between 9 PM and 8 AM in your site\'s time zone are held until 8 AM.'
|
|
3548
|
+
},
|
|
3549
|
+
{
|
|
3550
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3551
|
+
title: 'Order emails & status page',
|
|
3552
|
+
heading: 'Related',
|
|
3553
|
+
anchor: '#related',
|
|
3554
|
+
text: '- Commerce overview\n- POS & reservations'
|
|
3555
|
+
},
|
|
3556
|
+
{
|
|
3557
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3558
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3559
|
+
heading: '',
|
|
3560
|
+
anchor: '',
|
|
3561
|
+
text: 'Fulfillment, returns and webhooks\nWhat happens to an order after it is paid: shipping it, in one parcel or several; taking items back; printing its paperwork; and telling your other systems about it. Everything here is in the order\'s dialog on the Orders tab of the Products hub, and under Returns and Settings beside it.'
|
|
3562
|
+
},
|
|
3563
|
+
{
|
|
3564
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3565
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3566
|
+
heading: 'Ship an order in parts',
|
|
3567
|
+
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.'
|
|
3569
|
+
},
|
|
3570
|
+
{
|
|
3571
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3572
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3573
|
+
heading: 'Invoices and packing slips',
|
|
3574
|
+
anchor: '#invoices',
|
|
3575
|
+
text: 'Invoice in the order\'s dialog opens the order as a bill, ready to print: your business name, the date, who it is billed and shipped to, each line with its unit price, the subtotal, discount, shipping, tax and total, and anything refunded. Your store\'s receipt footer and terms address print at the foot. To keep a PDF, choose Save as PDF in the print dialog.\nPacking slip prints what goes in the box — the shipping address and each line\'s quantity, name, option and SKU — with no prices.'
|
|
3576
|
+
},
|
|
3577
|
+
{
|
|
3578
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3579
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3580
|
+
heading: 'Returns',
|
|
3581
|
+
anchor: '#returns',
|
|
3582
|
+
text: 'A return is its own record beside the order: what is coming back and why, what you decided, the return label, what went back in stock, and the refund. Every return is listed under Returns in the Products hub, newest first; the Status filter shows one state at a time.\nHow a buyer asks {#buyer-requests}\nA buyer asks for a return themselves, from either of two places:\n- the Request a return link beside an order in their account on your store, when they are signed in;\n- the Request a return button on the order\'s status page — the View your order link in every order email — which needs no account. The button shows only while the return window is open and something on the order can still come back.\nBoth open the return page at /order-return in your site\'s header and footer. The page is unlisted, so search engines leave it out; to design your own, make a page at /order-return and place the Return request block on it. The buyer chooses how many of each item to send back and a reason for each — Arrived damaged, Wrong item, Not as described, Size or fit, No longer needed or Other — and can add a note. Only items that have shipped can be returned, and never more than were bought or are already coming back. You and the site\'s managers are told by email and in the console\'s notifications.\nUnder Settings → Returns:\n- Accept return requests online — turn it off to take returns only by contact. You can still start a return for a buyer from the order.\n- Return window in days — counted from the last shipment, or from the order date for an order with nothing to ship. 0 to 365.\n- Returnable product types — physical products only, by default.\nRun a return {#run-a-return}\nOpen a return from the list, or from the Returns section of its order\'s dialog, where Start return opens one for the buye'
|
|
3583
|
+
},
|
|
3584
|
+
{
|
|
3585
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3586
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3587
|
+
heading: 'Order webhooks',
|
|
3588
|
+
anchor: '#order-webhooks',
|
|
3589
|
+
text: 'An order webhook posts each order event to an address you choose, as it happens: a warehouse system, an ERP, a spreadsheet script. Add them under Settings → Order webhooks in the Products hub. Managing webhooks needs the admin role and organization-wide membership, the same as refunds.\nAdd endpoint asks for:\n- Endpoint URL — an https:// address on a public server. Redirects are not followed, so give the final address.\n- Events — any of the events below.\nWhen you add an endpoint, its signing secret is shown once. Copy it into your endpoint\'s settings; Roll secret makes a new one if it is lost. A store can keep 10 endpoints. Pause stops deliveries to one without deleting it, and Send test event posts a webhook.test event now.\n| Event | When |\n| order.paid | An order was paid: online, buy-now, a payment link, a POS sale or a subscription renewal. |\n| order.fulfilled | A shipment was recorded, once per shipment. |\n| order.delivered | The order was marked delivered. |\n| order.refunded | Money went back to the buyer, once per refund, including a refund made in the Stripe Dashboard. |\n| order.cancelled | The order was canceled. |\n| return.requested | A buyer asked for a return, or you opened one. |\n| return.approved | You approved a return, or opened one yourself. |\n| return.declined | You declined a return request. |\n| return.received | The returned items arrived. |\n| return.refunded | A return was refunded. |\nWhat your endpoint receives\nA POST with a JSON body:\ndata.order is the order in the same shape the API returns for GET /v1/sites/{siteId}/orders/{orderId}. Money is in whole cents. Three headers come with it:\n| Header | What it holds |\n| Aglyn-Event | The event, e.g. order.paid. |\n| Aglyn-Event-Id | The event\'s id. It is the same on every retry, so store it and ignore a'
|
|
3590
|
+
},
|
|
3591
|
+
{
|
|
3592
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3593
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3594
|
+
heading: 'Related',
|
|
3595
|
+
anchor: '#related',
|
|
3596
|
+
text: '- Commerce overview\n- Commerce end to end'
|
|
3450
3597
|
},
|
|
3451
3598
|
{
|
|
3452
3599
|
path: '/commerce-and-bookings/commerce/overview',
|
|
@@ -3488,14 +3635,21 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3488
3635
|
title: 'Commerce',
|
|
3489
3636
|
heading: 'Orders',
|
|
3490
3637
|
anchor: '#orders',
|
|
3491
|
-
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, print packing slips, add internal notes.\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
|
|
3638
|
+
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'
|
|
3639
|
+
},
|
|
3640
|
+
{
|
|
3641
|
+
path: '/commerce-and-bookings/commerce/overview',
|
|
3642
|
+
title: 'Commerce',
|
|
3643
|
+
heading: 'Payment methods',
|
|
3644
|
+
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'
|
|
3492
3646
|
},
|
|
3493
3647
|
{
|
|
3494
3648
|
path: '/commerce-and-bookings/commerce/overview',
|
|
3495
3649
|
title: 'Commerce',
|
|
3496
3650
|
heading: 'Shipping & taxes',
|
|
3497
3651
|
anchor: '#shipping--taxes',
|
|
3498
|
-
text: '- Shipping zones own countries (\'\' = rest of world); rates are flat, free-over-subtotal, or subtotal/weight tiers; optional local pickup.\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
|
|
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'
|
|
3499
3653
|
},
|
|
3500
3654
|
{
|
|
3501
3655
|
path: '/commerce-and-bookings/commerce/overview',
|
|
@@ -3509,7 +3663,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3509
3663
|
title: 'Commerce',
|
|
3510
3664
|
heading: 'Related',
|
|
3511
3665
|
anchor: '#related',
|
|
3512
|
-
text: '- Product catalog\n- Billing & plans\n- Bookings & scheduling'
|
|
3666
|
+
text: '- Product catalog\n- Use ShipStation with Aglyn\n- Use ShippingEasy with Aglyn\n- Use Pirate Ship with Aglyn\n- Billing & plans\n- Bookings & scheduling'
|
|
3513
3667
|
},
|
|
3514
3668
|
{
|
|
3515
3669
|
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
@@ -3530,7 +3684,42 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3530
3684
|
title: 'POS & reservations',
|
|
3531
3685
|
heading: 'The register',
|
|
3532
3686
|
anchor: '#the-register',
|
|
3533
|
-
text: 'Open /{site}/pos in the console for a touch-first register. Pick which register you\'re on at the top of the panel (skipped automatically when you have only one):\n- Product grid —
|
|
3687
|
+
text: 'Open /{site}/pos in the console for a touch-first register. Pick which register you\'re on at the top of the panel (skipped automatically when you have only one):\n- Product grid — photo tiles with the price, a stock note when only a few are left or none, and a count of how many are already in the basket. Tap a product to add it. A product with variants or modifiers opens a sheet first: pick the size (or other option), the modifiers, and the quantity, and the Add button shows the line\'s price as you go. A required modifier must be picked before the item can be added. The grid shows your first 500 active products by name; typing in the search box finds a product by the start of a word in its name across the whole catalog.\n- Quick keys — the ★ Quick keys chip, first in the category bar, shows only the products you marked Quick key at the register in the product editor: your best sellers, one tap away. Each register device reopens on the chip it was left on. Typing in the search box searches the whole catalog, not just the quick keys.\n- Categories — the chips after All show one category each.\n- Changing a line — tap a line in the basket to change its variant, modifiers or quantity (type a number or use + and −), or remove it. The + and − beside each line change the quantity by one. Two of the same item with the same choices are one line; the same item with a different choice is a line of its own.\n- Barcode scanners — any keyboard-wedge scanner works: it types the code into the search box and presses Enter, which adds the exact SKU/barcode match, variant included. A product with modifiers opens its sheet with that variant already picked. No drivers or pairing needed.\n- Charge — when the basket is ready, tap Charge. That prices the sale (tax is added at this step) and opens it'
|
|
3688
|
+
},
|
|
3689
|
+
{
|
|
3690
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3691
|
+
title: 'POS & reservations',
|
|
3692
|
+
heading: 'Taking payment',
|
|
3693
|
+
anchor: '#taking-payment',
|
|
3694
|
+
text: 'A sale can take as many payments as it needs. The amount box above the payment buttons starts at the whole balance; to split the bill, type a smaller amount and pick a tender, and the rest stays open for the next one. Every payment is listed with its status (Waiting, Approved, Declined, Canceled). The sale is paid when the balance reaches zero, and only then is the stock taken and the order completed.\n| Tender | What happens |\n| Cash | Enter what the customer handed you, or tap Exact or a round-up amount. The register shows the change to give. Less than the amount due is taken toward the sale and the rest stays open. |\n| Card reader | Sends the amount to a card reader; the customer taps, inserts or swipes there. Shown only when card readers are available for your store and one is registered. With more than one reader, pick which one under the buttons. |\n| Type card | Staff type the card into Stripe\'s own card form (card not present, such as an order taken over the phone). The card never touches the register, and the payment goes through Stripe\'s normal online checks, 3-D Secure included. |\n| Card (QR) | Shows a QR code; the customer scans it and pays on their phone, and the payment appears on the register as soon as it goes through. |\n| Gift card | Type or scan the code. Check balance shows what the card can spend; Apply card takes the smaller of that balance and what is due, so a card worth less than the sale leaves the rest open. |\n| Room | Charges a checked-in stay\'s folio. Shown only when a guest is checked in. |\nCard payments that are still waiting can be canceled, which frees that amount for another tender. If the card reader declines a card, Retry sends the same charge back to the reader, so the customer can try again or use another card.\nVoid sale cancels the wh'
|
|
3695
|
+
},
|
|
3696
|
+
{
|
|
3697
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3698
|
+
title: 'POS & reservations',
|
|
3699
|
+
heading: 'Tips',
|
|
3700
|
+
anchor: '#tips',
|
|
3701
|
+
text: 'Tips are off until you turn them on. The settings are on your site\'s Admin → Plugins → Commerce page, in the Commerce settings card:\n- Ask for tips at the register — off by default.\n- Tip choices (%) — up to four percentages, separated by commas. Defaults to 15, 18, 20, 25.\nWith tips on, the payment panel shows a button for each percentage and No tip, so the cashier can choose one for the customer. With a customer display paired, Ask on display lets the customer pick a percentage, type an amount or choose no tip on their own screen. When no tip has been added yet, the card reader asks the customer itself, showing the first three of your percentages.\nA tip is added on top of the payment it rides on and can be at most that payment\'s amount. Tips are yours: they are not counted as sales and carry no platform fee.'
|
|
3702
|
+
},
|
|
3703
|
+
{
|
|
3704
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3705
|
+
title: 'POS & reservations',
|
|
3706
|
+
heading: 'Receipts',
|
|
3707
|
+
anchor: '#receipts',
|
|
3708
|
+
text: 'When a sale is paid, the register shows the change due (for cash) and the receipt options. Receipts at the register, in the same Commerce settings card, decides what happens first:\n| Setting | What happens when the sale is paid |\n| Ask the customer (default) | With a customer display paired, the customer chooses email, text, print or no receipt on their screen. Without one, the cashier offers it. |\n| Always print | The receipt prints straight away. |\n| No receipt unless asked | Nothing is sent or printed unless the cashier does it. |\nWhatever the setting, the cashier can always type an address into Email receipt to and tap Send, type a phone number into Text receipt to and tap Text, or tap Print receipt (or Gift receipt, which leaves the prices off). Text receipts are shown only when text messages are available for your store. Receipts print on the 80 mm layout described in Printed receipts, through the browser\'s print dialog, so any receipt printer with a system print driver works; see POS hardware. Tap New sale to start the next one.'
|
|
3709
|
+
},
|
|
3710
|
+
{
|
|
3711
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3712
|
+
title: 'POS & reservations',
|
|
3713
|
+
heading: 'Card readers',
|
|
3714
|
+
anchor: '#card-readers',
|
|
3715
|
+
text: 'A card reader takes card payments at the counter: the customer taps, inserts or swipes, and the reader can ask for a tip. The register works with Stripe\'s smart readers, the Stripe Reader S700 (and S710) and the BBPOS WisePOS E. Card readers are shown only when they are available for your store; when they are not, the POS devices card has no card reader controls and the register has no Card reader button.\nTo add a reader:\n1. On the reader, open Settings and choose Generate pairing code.\n2. In the console, open Commerce → Settings → POS devices and choose Add card reader.\n3. Enter the registration code the reader shows, give the reader a name (such as "Front counter reader") and, optionally, pick the register it belongs to. A reader left on Any register can be used from every register.\n4. The first reader you add asks for the store\'s address — where the reader is used. Stripe sets the reader up for that country.\nEach reader is listed with its register and an Online or Offline status, and can be renamed, moved to another register, or removed. A removed reader has to be registered again with a new code to be used. A reader must be switched on and connected to the internet to take a payment; the register warns you when the selected reader looks offline. See POS hardware for setup notes.\nTrying it in test mode In test mode, add a reader with the code simulated-wpe to get Stripe\'s simulated reader. While a payment waits on it, the register shows Simulate tap to complete it with a test card.'
|
|
3716
|
+
},
|
|
3717
|
+
{
|
|
3718
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3719
|
+
title: 'POS & reservations',
|
|
3720
|
+
heading: 'Customer display',
|
|
3721
|
+
anchor: '#customer-display',
|
|
3722
|
+
text: 'A customer display is a tablet facing your customer. It shows your store\'s logo (or name) and a welcome line between sales, the basket with its total as you ring it up, and it lets the customer choose a tip and a receipt themselves.\nTo pair one:\n1. On the register, tap Pair display next to the Register heading. It shows an address and a 6-digit code. The code works once and expires in 10 minutes.\n2. On the tablet, open that address — your console address followed by /kiosk/commerce/pos-display — and enter the code. No one signs in on the tablet.\nOnce paired, the register\'s button reads Display connected. During a sale the display shows:\n- The basket — each line, the subtotal, any discount, the total and what has been paid so far. Once a tip is added it is shown on its own line, with the Total with tip under it. Amounts are in your store\'s currency.\n- Tip choices — when tips are on and the cashier taps Ask on display: a button per percentage, an amount the customer types, or no tip.\n- "Tap, insert or swipe your card on the reader." while a card reader payment waits.\n- Receipt choice — when Receipts at the register is Ask the customer: email, text (shown only when text messages are available for your store), print or no receipt. When the customer asks for an email receipt and Offer email sign-up on the customer display is on (it is by default), an unticked Email me news and offers box is shown under the address. Only a ticked box adds them to your marketing audience.\nAfter the customer answers, the display thanks them and says the cashier will finish up. When the sale is paid and the receipt is handled, it shows Thank you! for a few seconds and then returns to the welcome screen. The email address or phone number the customer typed is not kept on the display: it is cleare'
|
|
3534
3723
|
},
|
|
3535
3724
|
{
|
|
3536
3725
|
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
@@ -3544,21 +3733,224 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3544
3733
|
title: 'POS & reservations',
|
|
3545
3734
|
heading: 'Related',
|
|
3546
3735
|
anchor: '#related',
|
|
3547
|
-
text: '- Commerce overview\n- Product catalog'
|
|
3736
|
+
text: '- POS hardware\n- Commerce overview\n- Product catalog'
|
|
3737
|
+
},
|
|
3738
|
+
{
|
|
3739
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3740
|
+
title: 'POS hardware',
|
|
3741
|
+
heading: '',
|
|
3742
|
+
anchor: '',
|
|
3743
|
+
text: 'POS hardware\nThe register runs in a browser, so it works on an iPad, an Android tablet, a laptop or a desktop at the counter. This page covers the hardware around it: a card reader, a customer display, a receipt printer, a kitchen printer, the cash drawer, barcode scanners and a label printer.\nPlan availability POS hardware comes with POS, on Pro and above. There is no extra charge for printers, scanners or customer displays.'
|
|
3744
|
+
},
|
|
3745
|
+
{
|
|
3746
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3747
|
+
title: 'POS hardware',
|
|
3748
|
+
heading: 'Recommended kit',
|
|
3749
|
+
anchor: '#recommended-kit',
|
|
3750
|
+
text: '| Device | Recommended | Why |\n| Register | iPad (10th gen or newer) or an Android tablet on a stand | Touch-first, and the camera scans barcodes |\n| Receipt printer | Star mC-Print3 or Star TSP143IV (CloudPRNT), or Epson TM-m30III (Server Direct Print) | Prints from any device over the internet: no driver, no pairing, no app |\n| Cash drawer | Any 24 V drawer with an RJ12 cable, such as the Star CD3-1616 or the APG Vasario | Plugs into the printer\'s drawer port and opens when the printer tells it to |\n| Barcode scanner | Any USB or Bluetooth scanner in keyboard mode, or the tablet\'s camera | A scanner types the code like a keyboard, so it needs no setup |\n| Label printer | Rollo, Zebra ZD421/ZD621 or GK420d, DYMO LabelWriter 4XL or 5XL, Brother QL-1100 | Prints product labels and 4x6 shipping labels on thermal stock |'
|
|
3751
|
+
},
|
|
3752
|
+
{
|
|
3753
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3754
|
+
title: 'POS hardware',
|
|
3755
|
+
heading: 'Card readers',
|
|
3756
|
+
anchor: '#card-readers',
|
|
3757
|
+
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'
|
|
3758
|
+
},
|
|
3759
|
+
{
|
|
3760
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3761
|
+
title: 'POS hardware',
|
|
3762
|
+
heading: 'Receipt printers',
|
|
3763
|
+
anchor: '#receipt-printers',
|
|
3764
|
+
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 '
|
|
3765
|
+
},
|
|
3766
|
+
{
|
|
3767
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3768
|
+
title: 'POS hardware',
|
|
3769
|
+
heading: 'Cash drawer',
|
|
3770
|
+
anchor: '#cash-drawer',
|
|
3771
|
+
text: 'Plug the drawer\'s RJ12 cable into the DK (drawer kick) port on the back of the printer, and turn on A cash drawer is plugged into this printer in the printer\'s settings. The drawer then opens:\n- on every sale paid in cash, including a sale paid partly in cash and partly by card, as the receipt starts printing (or on its own when that printer does not print receipts),\n- when the shift records cash paid in, paid out or dropped to the safe, and when a return is refunded in cash,\n- from Open drawer on the Hardware card.\nA drawer only opens within two minutes of the sale that asked for it. If the printer was offline for longer, the drawer stays shut rather than springing open later at an unattended counter.'
|
|
3772
|
+
},
|
|
3773
|
+
{
|
|
3774
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3775
|
+
title: 'POS hardware',
|
|
3776
|
+
heading: 'Barcode scanning',
|
|
3777
|
+
anchor: '#barcode-scanning',
|
|
3778
|
+
text: '- USB or Bluetooth scanners work with no setup: the scanner types the code and presses Enter, and the register adds the product whose barcode or SKU matches. It works whether or not the search box has focus, so you can scan straight after tapping a product or a button. A scan made while a payment window is open is ignored. Set the scanner to send Enter after each code; most do out of the box.\n- The camera works on a tablet or phone: select the scan button beside the register\'s search box, or beside a variant\'s Barcode field in the product editor, and hold the barcode inside the frame. The camera reads EAN-13, UPC-A, EAN-8 and Code128 everywhere. Chrome on Android and on a Mac also reads UPC-E, Code 39 and QR codes. The first time, allow the browser to use the camera.\nFor a busy counter, a handheld scanner is faster than the camera.'
|
|
3779
|
+
},
|
|
3780
|
+
{
|
|
3781
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3782
|
+
title: 'POS hardware',
|
|
3783
|
+
heading: 'Label printers',
|
|
3784
|
+
anchor: '#label-printers',
|
|
3785
|
+
text: 'Product labels\nPrint price and barcode labels for your shelves and stock:\n1. Go to Commerce → Catalog and select Labels on a physical product.\n2. Choose the label size, 2.25 x 1.25 in or 2 x 1 in, and how many copies of each variant to print. Each label carries the product name, the variant\'s options, its price, and a barcode of the variant\'s barcode, or of its SKU when it has no barcode. A variant with neither cannot print a label; add one in the product editor first.\n3. Select Print, choose the label printer and the same label size in the print dialog, and print at 100% scale. Or select Download ZPL and send the file to a Zebra printer (with Zebra Setup Utilities, for example), which prints it without a print dialog.\nA valid EAN-13, UPC-A or EAN-8 prints as that symbology; any other code prints as Code 128. Every label scans back at the register, with a handheld scanner or the camera.\nShipping labels\nShipping labels bought through Pirate Ship or ShipStation come as 4x6 inch PDFs, which any thermal label printer prints from the browser:\n1. Install the printer\'s driver (Rollo, Zebra, DYMO and Brother all provide one for Mac and Windows) and load 4x6 labels.\n2. Open the label PDF and print it. In the print dialog choose the label printer, the 4x6 (or 100 x 150 mm) paper size, and Actual size or 100% scale, never Fit to page.\n3. Print one label to check the barcode is sharp and nothing is cut off. The browser remembers these settings for the next label.'
|
|
3786
|
+
},
|
|
3787
|
+
{
|
|
3788
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3789
|
+
title: 'POS hardware',
|
|
3790
|
+
heading: 'Customer display tablet',
|
|
3791
|
+
anchor: '#customer-display-tablet',
|
|
3792
|
+
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.'
|
|
3793
|
+
},
|
|
3794
|
+
{
|
|
3795
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3796
|
+
title: 'POS hardware',
|
|
3797
|
+
heading: 'Related',
|
|
3798
|
+
anchor: '#related',
|
|
3799
|
+
text: '- POS & reservations\n- Running the register\n- Product catalog'
|
|
3800
|
+
},
|
|
3801
|
+
{
|
|
3802
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3803
|
+
title: 'Running the register',
|
|
3804
|
+
heading: '',
|
|
3805
|
+
anchor: '',
|
|
3806
|
+
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.'
|
|
3807
|
+
},
|
|
3808
|
+
{
|
|
3809
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3810
|
+
title: 'Running the register',
|
|
3811
|
+
heading: 'Shifts and the cash drawer',
|
|
3812
|
+
anchor: '#shifts-and-the-cash-drawer',
|
|
3813
|
+
text: 'A shift is one stretch of trading on one register, counted against one cash drawer.\n1. Open a shift from the strip above the basket and enter the starting cash (the float) you counted into the drawer.\n2. While it is open, every sale on that register is counted in the shift. Use Cash in/out to record cash that moves without a sale:\n- Paid in — cash added to the drawer, such as change from the bank.\n- Paid out — cash taken for an expense, with a reason.\n- Safe drop — cash moved from the drawer to the safe.\n3. X report shows the shift so far at any time and changes nothing.\n4. Close shift, count the drawer and enter what is in it. The Z report freezes the shift\'s figures, and the register is free for the next shift.\nA register has one open shift at a time. If two tablets try to open the same register at once, one opens it and the other is told a shift is already open.\nWhat the reports show\nSales (orders, gross sales, discounts, tax, tips, refunds and net sales), the same broken down by tender (cash, card, gift card and room charge), and the drawer:\n| | |\n| Starting cash | the float you counted when the shift opened |\n| + Cash sales | what cash sales took (change handed back is not counted), plus cash tips |\n| + Paid in | |\n| − Paid out | |\n| − Safe drops | |\n| − Cash refunds | returns paid out of the drawer during the shift |\n| = Expected in drawer | |\nThe variance is what you counted minus what was expected: positive means the drawer is over, negative means it is short. Print either report on your receipt printer from its dialog.\nShift history\nCommerce → Orders → Shift history lists each register\'s shifts, newest first, with net sales, expected and counted cash and the variance. Click a closed shift for its Z report, and use Export CSV for a spreadsheet of the shifts list'
|
|
3814
|
+
},
|
|
3815
|
+
{
|
|
3816
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3817
|
+
title: 'Running the register',
|
|
3818
|
+
heading: 'Staff PINs',
|
|
3819
|
+
anchor: '#staff-pins',
|
|
3820
|
+
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.'
|
|
3821
|
+
},
|
|
3822
|
+
{
|
|
3823
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3824
|
+
title: 'Running the register',
|
|
3825
|
+
heading: 'Customers at the register',
|
|
3826
|
+
anchor: '#customers-at-the-register',
|
|
3827
|
+
text: 'Search the Customer field by name, email or phone to attach a customer to the sale. The register shows how many orders they have placed at your store and what they have spent. The order is saved under their email and their name, so it appears on their record, prints their name on the receipt and can have its receipt emailed.\nNew customer adds someone in a few taps (an email is required, a phone is optional). Adding a customer does not sign them up for marketing email.\nThe search reads the people your workspace keeps in the CRM. Without it you can still type an email for the receipt.'
|
|
3828
|
+
},
|
|
3829
|
+
{
|
|
3830
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3831
|
+
title: 'Running the register',
|
|
3832
|
+
heading: 'Returns and exchanges',
|
|
3833
|
+
anchor: '#returns-and-exchanges',
|
|
3834
|
+
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.'
|
|
3835
|
+
},
|
|
3836
|
+
{
|
|
3837
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3838
|
+
title: 'Running the register',
|
|
3839
|
+
heading: 'Printed receipts',
|
|
3840
|
+
anchor: '#printed-receipts',
|
|
3841
|
+
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.'
|
|
3842
|
+
},
|
|
3843
|
+
{
|
|
3844
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3845
|
+
title: 'Running the register',
|
|
3846
|
+
heading: 'Related',
|
|
3847
|
+
anchor: '#related',
|
|
3848
|
+
text: '- POS & reservations\n- Commerce overview'
|
|
3849
|
+
},
|
|
3850
|
+
{
|
|
3851
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3852
|
+
title: 'Sales channels',
|
|
3853
|
+
heading: '',
|
|
3854
|
+
anchor: '',
|
|
3855
|
+
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.'
|
|
3856
|
+
},
|
|
3857
|
+
{
|
|
3858
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3859
|
+
title: 'Sales channels',
|
|
3860
|
+
heading: 'Turn on a channel',
|
|
3861
|
+
anchor: '#turn-on-a-channel',
|
|
3862
|
+
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.'
|
|
3863
|
+
},
|
|
3864
|
+
{
|
|
3865
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3866
|
+
title: 'Sales channels',
|
|
3867
|
+
heading: 'What each product sends',
|
|
3868
|
+
anchor: '#what-each-product-sends',
|
|
3869
|
+
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'
|
|
3870
|
+
},
|
|
3871
|
+
{
|
|
3872
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3873
|
+
title: 'Sales channels',
|
|
3874
|
+
heading: 'Check your products',
|
|
3875
|
+
anchor: '#check-your-products',
|
|
3876
|
+
text: 'Select Check products on the Sales channels card. Each channel\'s card then counts the products it lists, leaves out and lists with suggestions, and Show products names each one with what to fix.\nA product is left out of a channel\'s feed when the channel would refuse it anyway:\n- it has no photo or no price;\n- it is a service, or sold only as a subscription — shopping channels list goods sold at one price;\n- the site has no web address yet, or no product page template is chosen in the store settings, so the product\'s link would not open.\nA suggestion means the product is listed but may show less widely: no barcode or part number, no description (its name is sent instead), a name longer than the channel shows, clothing without a Color and a Size option, or missing shipping.'
|
|
3877
|
+
},
|
|
3878
|
+
{
|
|
3879
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3880
|
+
title: 'Sales channels',
|
|
3881
|
+
heading: 'How fresh the feed is',
|
|
3882
|
+
anchor: '#how-fresh-the-feed-is',
|
|
3883
|
+
text: 'A product you edit and save reaches the next fetch at once. Stock that a sale takes reaches it within 30 minutes. Each card shows when the channel last read its feed.'
|
|
3884
|
+
},
|
|
3885
|
+
{
|
|
3886
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3887
|
+
title: 'Sales channels',
|
|
3888
|
+
heading: 'The earlier Google Merchant Center address',
|
|
3889
|
+
anchor: '#earlier-merchant-center-address',
|
|
3890
|
+
text: 'Stores that set up Merchant Center before sales channels existed used an address ending in /api/commerce/feed?hostId=…. It keeps working, now with everything above, until you retire it: once Merchant Center reads the Google card\'s address, select Turn off beside the earlier address on the Google card. Replacing the Google address turns it off too.'
|
|
3891
|
+
},
|
|
3892
|
+
{
|
|
3893
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3894
|
+
title: 'Sales channels',
|
|
3895
|
+
heading: 'Turn sales channels off for a site',
|
|
3896
|
+
anchor: '#turn-off',
|
|
3897
|
+
text: 'Sales channels are on for every site in a workspace. A site admin can switch them off for one site under Admin → Plugins → Sales channels. Every feed of that site, the earlier Google address included, then stops answering; each feed\'s address, switch and the defaults are kept for when it is switched back on.'
|
|
3898
|
+
},
|
|
3899
|
+
{
|
|
3900
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3901
|
+
title: 'Sales channels',
|
|
3902
|
+
heading: 'Related',
|
|
3903
|
+
anchor: '#related',
|
|
3904
|
+
text: '- Catalog\n- Shipping'
|
|
3905
|
+
},
|
|
3906
|
+
{
|
|
3907
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3908
|
+
title: 'Shipping',
|
|
3909
|
+
heading: '',
|
|
3910
|
+
anchor: '',
|
|
3911
|
+
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.'
|
|
3912
|
+
},
|
|
3913
|
+
{
|
|
3914
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3915
|
+
title: 'Shipping',
|
|
3916
|
+
heading: 'Zones and rates',
|
|
3917
|
+
anchor: '#zones-and-rates',
|
|
3918
|
+
text: 'A zone owns countries; is the rest of the world. A rate belongs to one zone and prices a parcel in one of four ways:\n| Rate type | What the shopper pays |\n| -- | -- |\n| Flat | One price. |\n| Free over subtotal | One price, or nothing once the cart reaches the subtotal you set. |\n| Subtotal tiers | The price of the first tier the cart\'s subtotal fits under. |\n| Weight tiers | The price of the first tier the cart\'s weight fits under. Weight is each variant\'s weight times its quantity. |\nLocal pickup adds a free collection choice beside your rates. It does not widen where you ship: a destination no rate reaches is still refused.\nCheckout charges only the rates of the zone the destination falls in, and narrows the address it collects to that destination, so a shopper cannot pick another zone\'s cheaper rate. The destination coverage rules explain what your zones make checkout ask and refuse.'
|
|
3919
|
+
},
|
|
3920
|
+
{
|
|
3921
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3922
|
+
title: 'Shipping',
|
|
3923
|
+
heading: 'Where parcels ship from',
|
|
3924
|
+
anchor: '#where-parcels-ship-from',
|
|
3925
|
+
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.'
|
|
3926
|
+
},
|
|
3927
|
+
{
|
|
3928
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3929
|
+
title: 'Shipping',
|
|
3930
|
+
heading: 'Carrier accounts',
|
|
3931
|
+
anchor: '#carrier-accounts',
|
|
3932
|
+
text: 'The Carrier accounts card lists the carriers your labels and checkout rates come from, for every site in the workspace. By default these are Aglyn\'s own accounts, marked Discounted rates. A switch on each row turns that carrier on or off.\nIf you have your own negotiated carrier account, choose Connect your own account and pick the carrier. Which carriers are listed depends on the shipping provider behind your labels. For UPS and FedEx you enter the account number, a contact and the account\'s address, and UPS then asks you to sign in at UPS; a row that still needs it shows Sign-in needed or Reconnect needed. Other carriers, such as DHL Express or Canada Post, ask for the credentials that carrier issued you, which are passed to the provider to connect the account and not kept by Aglyn. Labels bought on your own account are billed to you by the carrier, so Aglyn charges nothing for them.'
|
|
3933
|
+
},
|
|
3934
|
+
{
|
|
3935
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3936
|
+
title: 'Shipping',
|
|
3937
|
+
heading: 'Shipping labels',
|
|
3938
|
+
anchor: '#shipping-labels',
|
|
3939
|
+
text: 'A label bought on Aglyn\'s carrier accounts is charged to the workspace at the carrier\'s price, with nothing added. It is taken from your Stripe balance when the label is bought, once a member has agreed to that; when Stripe cannot take it, the label goes on the workspace\'s monthly invoice instead. A voided label that the carrier refunds is given back the same way it was paid.\nBilling → Usage shows a Shipping labels card once the workspace has bought a label: for each month, how many labels, how much came from the Stripe balance, how much went on the invoice, and what voided labels returned.'
|
|
3548
3940
|
},
|
|
3549
3941
|
{
|
|
3550
3942
|
path: '/commerce-and-bookings/commerce/store-import-and-export',
|
|
3551
3943
|
title: 'Import and export store data',
|
|
3552
3944
|
heading: '',
|
|
3553
3945
|
anchor: '',
|
|
3554
|
-
text: 'Import and export store data\nYour store\'s products, categories, orders, discounts, coupons and gift cards each have an Export button, and the ones a file may change have an Import button. Export lets you pick every field, including computed ones. Import shows you how each column is read and which record each row matches, and asks how to handle every conflict before anything is written.\n| What | Where | Import | Export |\n| Products and variants | Products page, above the table | Yes | Yes |\n| Categories | Categories & collections card | Yes | Yes |\n| Discounts | Discounts card | Yes | Yes |\n| Coupons | Coupons card | Yes | Yes |\n| Orders | Orders tab, Export orders | No | Yes |\n| Gift cards | Gift cards card | Yes, by issuing each card | Yes |\nYou need permission to manage the site\'s data to import or undo an import. Importing gift cards also needs you to be an owner or admin of the workspace, or an admin of the site. Exporting needs read access to the site.'
|
|
3946
|
+
text: 'Import and export store data\nYour store\'s products, categories, orders, discounts, coupons and gift cards each have an Export button, and the ones a file may change have an Import button. Export lets you pick every field, including computed ones. Import shows you how each column is read and which record each row matches, and asks how to handle every conflict before anything is written.\n| What | Where | Import | Export |\n| Products and variants | Products page, above the table | Yes | Yes |\n| Categories | Categories & collections card | Yes | Yes |\n| Discounts | Discounts card | Yes | Yes |\n| Coupons | Coupons card | Yes | Yes |\n| Orders | Orders tab, Export orders or Export for shipping | No | Yes |\n| Gift cards | Gift cards card | Yes, by issuing each card | Yes |\n| Tracking numbers | Orders tab, Import tracking | Yes, by shipping each order | Yes |\nYou need permission to manage the site\'s data to import or undo an import. Importing gift cards also needs you to be an owner or admin of the workspace, or an admin of the site. Exporting needs read access to the site.'
|
|
3555
3947
|
},
|
|
3556
3948
|
{
|
|
3557
3949
|
path: '/commerce-and-bookings/commerce/store-import-and-export',
|
|
3558
3950
|
title: 'Import and export store data',
|
|
3559
3951
|
heading: 'Export',
|
|
3560
3952
|
anchor: '#export',
|
|
3561
|
-
text: 'Export opens a dialog with every field the records have, grouped and searchable:\n- Presets fill the field list. Re-importable (the default) puts the Aglyn ID and the fields a re-import matches on first, then every field an import can write, so the file comes back in and finds its records. Everything adds computed and system fields. Minimal keeps the ID and the match fields. You can save your own list as a preset, and your last choice is remembered.\n- Records: everything, or what the list\'s filters and search find. On the Products page and the Orders tab, the filter is the same query the table runs, so the file holds every match in the store, not only the page on screen. There is no 5,000-order limit.\n- Format: CSV for a spreadsheet (with an optional byte-order mark for Excel), JSON, or NDJSON.\nThe file is built on the server and checked when it arrives. A download that stops short is refused rather than saved half-written.\nProducts are a row per variant\nA product with three variants is three rows. The product\'s own fields (title, description, tags and so on) are on its first row, and every row carries the product\'s Handle and its ID. Images follow the same pattern: the first image on the first row, the next on the second, and extra rows holding only the handle and an image when a product has more images than variants.\nThe Shopify preset\nProducts have a Shopify preset. It writes Shopify\'s product CSV: Shopify\'s columns, in Shopify\'s order, under Shopify\'s column names (Handle, Title, Body (HTML), Option1 Name, Variant SKU, Variant Price, Image Src and the rest), so the file can be uploaded to Shopify as it is. It leaves out Status, because Published says the same thing, and Kind, which Shopify\'s Type column does not mean
|
|
3953
|
+
text: 'Export opens a dialog with every field the records have, grouped and searchable:\n- Presets fill the field list. Re-importable (the default) puts the Aglyn ID and the fields a re-import matches on first, then every field an import can write, so the file comes back in and finds its records. Everything adds computed and system fields. Minimal keeps the ID and the match fields. You can save your own list as a preset, and your last choice is remembered.\n- Records: everything, or what the list\'s filters and search find. On the Products page and the Orders tab, the filter is the same query the table runs, so the file holds every match in the store, not only the page on screen. There is no 5,000-order limit.\n- Format: CSV for a spreadsheet (with an optional byte-order mark for Excel), JSON, or NDJSON.\nThe file is built on the server and checked when it arrives. A download that stops short is refused rather than saved half-written.\nProducts are a row per variant\nA product with three variants is three rows. The product\'s own fields (title, description, tags and so on) are on its first row, and every row carries the product\'s Handle and its ID. Images follow the same pattern: the first image on the first row, the next on the second, and extra rows holding only the handle and an image when a product has more images than variants.\nThe Shopify preset\nProducts have a Shopify preset. It writes Shopify\'s product CSV: Shopify\'s columns, in Shopify\'s order, under Shopify\'s column names (Handle, Title, Body (HTML), Option1 Name, Variant SKU, Variant Price, Image Src and the rest), so the file can be uploaded to Shopify as it is. It leaves out Status, because Published says the same thing, and Kind, which Shopify\'s Type column does not mean.\nExport for shipping, in the Orders card\'s header,'
|
|
3562
3954
|
},
|
|
3563
3955
|
{
|
|
3564
3956
|
path: '/commerce-and-bookings/commerce/store-import-and-export',
|
|
@@ -3567,6 +3959,209 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3567
3959
|
anchor: '#import',
|
|
3568
3960
|
text: 'Import opens an eight-step wizard:\n1. Upload a CSV, JSON or NDJSON file. The separator, encoding and header row are detected, and you can change any of them.\n2. Columns: each column is matched to a field, with how sure the match is and why. A Shopify product export is recognized column for column. Remap or ignore any column.\n3. Values: list values the store does not hold. For a product\'s Kind, Status or When sold out, map each unknown value to one the store has, leave it blank, or refuse the rows. For Categories, you can also add a name as a new category.\n4. Matching: how many rows find an existing record, how many are new, and which are ambiguous.\n5. Conflicts: what happens on a match (update, skip or make a copy), on no match (create or skip), and per field (overwrite, fill only blank fields, keep what is there). Rules the store keeps are shown locked with the reason. A gift card import adds a Confirm the cards step here (see Gift cards).\n6. Review: a dry run of every row, with a before → after table and every class of warning. Each class needs an "I understand" before Import is enabled.\n7. Import writes in chunks. You can pause and resume it.\n8. Results: a result file of every row, and Undo for seven days. A record edited since the import is shown to you rather than overwritten.\nBy default an import fills blank fields and never overwrites what a record already has. To change prices, stock or anything else that is set, choose Overwrite for those fields in the Conflicts step.\nProducts\nRows that share a Handle are one product: the first row\'s product fields, every row\'s variant, every row\'s image. A row without a handle is a product of its own, and its handle is made from its title.\n- Matching tries the Handle, then the SKU, then the Aglyn ID. A matched product is updat'
|
|
3569
3961
|
},
|
|
3962
|
+
{
|
|
3963
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
3964
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
3965
|
+
heading: '',
|
|
3966
|
+
anchor: '',
|
|
3967
|
+
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.'
|
|
3968
|
+
},
|
|
3969
|
+
{
|
|
3970
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
3971
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
3972
|
+
heading: 'Before you start',
|
|
3973
|
+
anchor: '#before-you-start',
|
|
3974
|
+
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.'
|
|
3975
|
+
},
|
|
3976
|
+
{
|
|
3977
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
3978
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
3979
|
+
heading: 'Connect',
|
|
3980
|
+
anchor: '#connect',
|
|
3981
|
+
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.'
|
|
3982
|
+
},
|
|
3983
|
+
{
|
|
3984
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
3985
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
3986
|
+
heading: 'How sales are taxed',
|
|
3987
|
+
anchor: '#how-sales-are-taxed',
|
|
3988
|
+
text: '| Where | What the service is asked |\n| -- | -- |\n| Storefront cart and Buy now | The tax on each line, after discounts, at your ship-from address. The shopper\'s address is collected inside the payment page, after the tax is set, so these online sales are taxed at your address, as your own rates are. |\n| Register | The tax on each line, after the cashier\'s discount, at your ship-from address. |\n- A product you marked tax-exempt is sent as non-taxable and charged no tax.\n- A subscription keeps your own recurring rate: a quote taken today cannot price next month\'s renewal.\n- Shipping charges are not taxed at checkout, as with your own rates.\n- If the service does not answer within 5 seconds, or refuses, the sale is taxed at your own rates and goes through. The order says which service was asked and that it fell back, so you can review those sales.'
|
|
3989
|
+
},
|
|
3990
|
+
{
|
|
3991
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
3992
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
3993
|
+
heading: 'Product tax codes',
|
|
3994
|
+
anchor: '#product-tax-codes',
|
|
3995
|
+
text: 'Each vendor has codes for kinds of goods taxed differently from the general rate, such as clothing or food. Set a product\'s Tax code in the product editor, and a Default tax code on the Tax service card for products without one. A product with neither is sent as general goods.'
|
|
3996
|
+
},
|
|
3997
|
+
{
|
|
3998
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
3999
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
4000
|
+
heading: 'Exempt customers',
|
|
4001
|
+
anchor: '#exempt-customers',
|
|
4002
|
+
text: 'Under Exempt customers on the Tax service card, record a customer who does not pay sales tax — a reseller, a nonprofit, a school, a government buyer — by their email address, with the reason, their certificate number and, if the exemption covers only some states, those states. A sale to that email address is sent to the service with the exemption, and the service decides the tax. AvaTax receives the reason and certificate number; TaxJar receives the reason. Keep the certificates themselves: the service and your auditors may ask for them.'
|
|
4003
|
+
},
|
|
4004
|
+
{
|
|
4005
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
4006
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
4007
|
+
heading: 'Recording orders and refunds',
|
|
4008
|
+
anchor: '#recording-orders-and-refunds',
|
|
4009
|
+
text: 'With Record paid orders and refunds on (the default), each paid order is recorded in your account under its order id, at the tax the buyer actually paid. Recording it again — a retry — updates the same record rather than adding one.\n- A refund, in full or in part, and a return at the register reverse their share of the sale in the service.\n- A canceled order that was never refunded is voided.\n- The order\'s Tax service record shows where it stands: Recorded, Recording (the service was busy; Aglyn tries again), Not recorded (with the service\'s reason, and Record it again once you have fixed it) or Voided.'
|
|
4010
|
+
},
|
|
4011
|
+
{
|
|
4012
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
4013
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
4014
|
+
heading: 'Disconnect',
|
|
4015
|
+
anchor: '#disconnect',
|
|
4016
|
+
text: 'Disconnect forgets your credentials. Sales are then taxed at your own rates again. What was already recorded stays in your account, and your product tax codes and exempt customers are kept for when you connect again.'
|
|
4017
|
+
},
|
|
4018
|
+
{
|
|
4019
|
+
path: '/commerce-and-bookings/commerce/tax-services',
|
|
4020
|
+
title: 'Tax services (Avalara AvaTax and TaxJar)',
|
|
4021
|
+
heading: 'What is sent to the vendor',
|
|
4022
|
+
anchor: '#what-is-sent-to-the-vendor',
|
|
4023
|
+
text: 'For each quote and each recorded sale: your ship-from address, the buyer\'s address (or yours for an in-person sale), the order id, each line\'s product, name, quantity, amount and tax code, and any exemption you recorded. AvaTax also receives the buyer\'s email address as its customer code. No payment details are sent. The data goes to your own Avalara or TaxJar account, with your own credentials, so the vendor acts for you and is not an Aglyn subprocessor; the subprocessors page names both among the services a merchant connects.'
|
|
4024
|
+
},
|
|
4025
|
+
{
|
|
4026
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
4027
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
4028
|
+
heading: '',
|
|
4029
|
+
anchor: '',
|
|
4030
|
+
text: 'Use Pirate Ship with Aglyn\nPirate Ship has no connection other apps can call, so you move orders with two files: one out, one back. The same steps work for Shippo, EasyPost and any label tool that reads a spreadsheet.\n1. Export for shipping in Aglyn writes the orders you still have to ship.\n2. Upload it to Pirate Ship and buy the labels.\n3. Export Pirate Ship\'s shipments and Import tracking in Aglyn. Each order is marked shipped and your customer gets the shipped email with the tracking link.\nBoth buttons are in the header of the Orders card, on the Orders tab of your site\'s Products hub.'
|
|
4031
|
+
},
|
|
4032
|
+
{
|
|
4033
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
4034
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
4035
|
+
heading: 'Export the orders to ship',
|
|
4036
|
+
anchor: '#export',
|
|
4037
|
+
text: '1. Select Export for shipping and choose Pirate Ship.\n2. The export dialog opens on the orders still to ship: paid and partly shipped orders that have something physical in them. Downloads, services and register sales aren\'t included.\n3. Select Export. The file has one row per order with the columns Pirate Ship expects: Order ID, Name, Email, Phone, Address 1, Address 2, City, State, Zip, Country, Ounces and Items.\nOunces is the weight of what is still to ship, from each product\'s variant weight. When no product in the order has a weight, the cell is blank and Pirate Ship uses the default package weight you enter when you upload. A partly shipped order lists only what is left.\nThe other presets lay out the same orders for other tools:\n| Preset | Columns |\n| Shippo | Shippo\'s order CSV: Order Number, Recipient Name, Street Line 1, City, State/Province, Zip/Postal Code, Country, Order Weight and Order Weight Unit (oz), and more. |\n| EasyPost | reference, toaddress. and parcel.weightoz. EasyPost also needs your from address, carrier and service in each row; add those columns before you upload. |\n| Shipping (any tool) | Every shipping column under its own name, with the weight in ounces and pounds. |\nYou can change the fields before you export, like any export.'
|
|
4038
|
+
},
|
|
4039
|
+
{
|
|
4040
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
4041
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
4042
|
+
heading: 'Buy the labels in Pirate Ship',
|
|
4043
|
+
anchor: '#labels',
|
|
4044
|
+
text: '1. In Pirate Ship, choose Ship → Upload a Spreadsheet and drop in the file.\n2. The first time, Pirate Ship asks what each column holds. Map Ounces to the weight override. Pirate Ship remembers the mapping for next time.\n3. Buy the labels.'
|
|
4045
|
+
},
|
|
4046
|
+
{
|
|
4047
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
4048
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
4049
|
+
heading: 'Import the tracking numbers',
|
|
4050
|
+
anchor: '#import',
|
|
4051
|
+
text: '1. In Pirate Ship, open your shipments (a blank search on the Ship page), make sure the Order ID, Tracking Number and Carrier columns are showing, and select Export.\n2. In Aglyn, select Import tracking on the Orders card and upload the file.\n3. Aglyn matches the columns: order number, tracking number, carrier, and optionally a tracking link, a SKU and a quantity. Check the matching and continue.\n4. Each row is matched to its order by the order number. Review what will happen, then Apply.\nWhat each row does:\n- The order still has items to ship: the row records a shipment with the tracking number and ships everything left on the order. Your customer gets the shipped email. To split an order across parcels, give each row the SKU and Quantity in that parcel.\n- The tracking number is already on the order: nothing changes. Importing the same file twice is safe.\n- The order has already shipped with a different tracking number: that\'s a conflict, and you decide on the Conflicts step. Keep existing (the default) leaves the order as it is. Overwrite for Tracking number replaces the tracking on its latest shipment.\n- No order with that number, or a canceled, refunded or unpaid order: the row fails and the results say why. A tracking file never creates an order.\nYou need to be an admin or editor of the site to import tracking numbers. Undo on the import\'s results takes back what it recorded: each shipment it made is canceled, and each tracking number it replaced is put back.'
|
|
4052
|
+
},
|
|
4053
|
+
{
|
|
4054
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
4055
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
4056
|
+
heading: 'Related',
|
|
4057
|
+
anchor: '#related',
|
|
4058
|
+
text: '- Use ShipStation with Aglyn\n- Use ShippingEasy with Aglyn\n- Import and export store data\n- Commerce'
|
|
4059
|
+
},
|
|
4060
|
+
{
|
|
4061
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4062
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4063
|
+
heading: '',
|
|
4064
|
+
anchor: '',
|
|
4065
|
+
text: 'Use ShippingEasy with Aglyn\nIf you buy labels in ShippingEasy, connect it to your Aglyn store. Each order is sent to your ShippingEasy account as soon as it is paid. When you buy a label there, ShippingEasy tells Aglyn: the order is marked shipped with its tracking number, and your customer gets the shipped email with the tracking link.\nYou need to be an admin of the site to connect ShippingEasy, because the connection sends every order\'s name and address to your ShippingEasy account. You use your own ShippingEasy account and its API keys. There is nothing to sign up for in Aglyn.'
|
|
4066
|
+
},
|
|
4067
|
+
{
|
|
4068
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4069
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4070
|
+
heading: 'Before you start',
|
|
4071
|
+
anchor: '#before-you-start',
|
|
4072
|
+
text: 'In ShippingEasy:\n1. Add a store of the API type, if you don\'t have one yet. Aglyn sends orders into this store.\n2. Note three values:\n- the API key and API secret, under Settings → API Credentials;\n- the store API key of your API store, under Settings → Stores & Orders.'
|
|
4073
|
+
},
|
|
4074
|
+
{
|
|
4075
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4076
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4077
|
+
heading: 'Connect ShippingEasy',
|
|
4078
|
+
anchor: '#connect',
|
|
4079
|
+
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.'
|
|
4080
|
+
},
|
|
4081
|
+
{
|
|
4082
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4083
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4084
|
+
heading: 'What Aglyn sends',
|
|
4085
|
+
anchor: '#what-is-sent',
|
|
4086
|
+
text: '- Paid orders are sent when they are paid, as Awaiting Shipment, with the ship-to and billing address, the customer\'s email and phone, each item\'s SKU, quantity, price, weight and options, and the order\'s shipping, tax and discount.\n- Partly shipped orders list only what is still to ship.\n- An order you cancel or fully refund in Aglyn is canceled in ShippingEasy.\n- Test orders from Stripe\'s test mode aren\'t sent, because a label you buy in ShippingEasy is real postage.\n- Digital products, services and register sales handed over at the counter aren\'t sent, because there is nothing to ship. An order without a complete ship-to address (street, city, postal code and country) isn\'t sent either.\nWeights come from each product\'s variant weight in Aglyn. Each order is sent once: sending open orders again skips the ones already in ShippingEasy.'
|
|
4087
|
+
},
|
|
4088
|
+
{
|
|
4089
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4090
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4091
|
+
heading: 'When you ship in ShippingEasy',
|
|
4092
|
+
anchor: '#ship',
|
|
4093
|
+
text: 'Buy the label as usual. When the label is ready, printed or the order is marked shipped, ShippingEasy sends Aglyn the tracking number, the carrier and the items. Aglyn:\n- records a shipment on the order for those items, with the tracking number and a tracking link for USPS, UPS, FedEx, DHL, Canada Post, Royal Mail and Australia Post;\n- marks the order Fulfilled, or Partially fulfilled when items are still to ship;\n- sends your customer the shipped email with the tracking link.\nThe same tracking number on the same order is recorded once. If ShippingEasy sends the shipment again, or you already typed that tracking number into the order in Aglyn, nothing changes. To avoid your customer getting two shipped emails, turn off ShippingEasy\'s own customer notification for this store.\nA label you void in ShippingEasy isn\'t recorded.'
|
|
4094
|
+
},
|
|
4095
|
+
{
|
|
4096
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4097
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4098
|
+
heading: 'Change keys or disconnect',
|
|
4099
|
+
anchor: '#manage',
|
|
4100
|
+
text: '- Change keys replaces the API key, secret and store API key, for example after you make a new secret in ShippingEasy.\n- Send open orders sends the open orders from the last 90 days that aren\'t in ShippingEasy yet, up to 100 at a time.\n- Disconnect deletes the keys from Aglyn. New orders stop going to ShippingEasy and shipments it sends afterwards are refused. Orders already in ShippingEasy stay there, and orders already shipped stay shipped.\nThe card shows when an order was last sent and a shipment last received. When something goes wrong, the card says Needs attention and shows why, and the site\'s admins and editors get a notification if an order could not be sent after several tries.'
|
|
4101
|
+
},
|
|
4102
|
+
{
|
|
4103
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4104
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4105
|
+
heading: 'Troubleshooting',
|
|
4106
|
+
anchor: '#troubleshooting',
|
|
4107
|
+
text: '| The card says | What to do |\n| ShippingEasy did not accept these keys | Copy all three again. The store API key belongs to an API store. |\n| ShippingEasy refused the API key, secret or store API key | The keys changed in ShippingEasy. Select Change keys and paste the new ones. |\n| Order n was refused by ShippingEasy | Fix what ShippingEasy names, usually the address, then select Send open orders. |\n| Order n could not be canceled in ShippingEasy | Cancel it in ShippingEasy yourself. |\n| Shipments never arrive | Check that the callback URL in your ShippingEasy API store is the one on the card. |'
|
|
4108
|
+
},
|
|
4109
|
+
{
|
|
4110
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
4111
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4112
|
+
heading: 'Related',
|
|
4113
|
+
anchor: '#related',
|
|
4114
|
+
text: '- Use ShipStation with Aglyn\n- Use Pirate Ship with Aglyn\n- Commerce'
|
|
4115
|
+
},
|
|
4116
|
+
{
|
|
4117
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4118
|
+
title: 'Use ShipStation with Aglyn',
|
|
4119
|
+
heading: '',
|
|
4120
|
+
anchor: '',
|
|
4121
|
+
text: 'Use ShipStation with Aglyn\nIf you already buy labels in ShipStation, keep doing it. Connect your store to ShipStation as a Custom Store and ShipStation imports the orders you still have to ship. When you create a label, or mark an order shipped, ShipStation sends the shipment back to Aglyn: the order is marked shipped with its tracking number, and your customer gets the shipped email with the tracking link.\nYou need to be an admin of the site to connect ShipStation, because the connection can read every order\'s name and address. You don\'t need a ShipStation API key: ShipStation calls Aglyn, not the other way around.'
|
|
4122
|
+
},
|
|
4123
|
+
{
|
|
4124
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4125
|
+
title: 'Use ShipStation with Aglyn',
|
|
4126
|
+
heading: 'Connect ShipStation',
|
|
4127
|
+
anchor: '#connect',
|
|
4128
|
+
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.'
|
|
4129
|
+
},
|
|
4130
|
+
{
|
|
4131
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4132
|
+
title: 'Use ShipStation with Aglyn',
|
|
4133
|
+
heading: 'What ShipStation imports',
|
|
4134
|
+
anchor: '#what-imports',
|
|
4135
|
+
text: 'ShipStation asks Aglyn for the orders that changed in a time window, and Aglyn answers with every order that has something to ship:\n- Paid orders arrive as Awaiting Shipment, with the ship-to address, the customer\'s email and phone, each item\'s SKU, quantity, price, weight, image and options, and the order\'s shipping, tax and discount.\n- Partly shipped orders list only what is still to ship, so a second parcel never asks for the whole order again.\n- An order you cancel or refund in Aglyn moves to ShipStation\'s canceled orders the next time it imports, and an order you ship from Aglyn moves to Shipped.\n- Digital products, services and register sales handed over at the counter aren\'t sent, because there is nothing to ship.\nWeights come from each product\'s variant weight in Aglyn. A product with no weight is sent without one, and ShipStation uses the package you choose there.\nAn order without a complete ship-to address (street, city, postal code and two-letter country) isn\'t sent, because ShipStation can\'t make a label for it and refuses the whole import if one order is incomplete.'
|
|
4136
|
+
},
|
|
4137
|
+
{
|
|
4138
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4139
|
+
title: 'Use ShipStation with Aglyn',
|
|
4140
|
+
heading: 'When you ship in ShipStation',
|
|
4141
|
+
anchor: '#ship',
|
|
4142
|
+
text: 'Create the label as usual. ShipStation sends Aglyn the order number, the carrier, the service, the tracking number and the items in the parcel. Aglyn:\n- records a shipment on the order for those items, with the tracking number and a tracking link for USPS, UPS, FedEx, DHL, Canada Post, Royal Mail and Australia Post;\n- marks the order Fulfilled, or Partially fulfilled when items are still to ship;\n- sends your customer the shipped email with the tracking link.\nThe same tracking number on the same order is recorded once. If ShipStation sends the shipment again, or you already typed that tracking number into the order in Aglyn, nothing changes. To avoid your customer getting two shipped emails, turn off ShipStation\'s own customer notification for this store, or untick Notify customer there.'
|
|
4143
|
+
},
|
|
4144
|
+
{
|
|
4145
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4146
|
+
title: 'Use ShipStation with Aglyn',
|
|
4147
|
+
heading: 'Make a new password or disconnect',
|
|
4148
|
+
anchor: '#manage',
|
|
4149
|
+
text: '- Show next to the password shows it again. Only a site admin can see it, and each time it\'s shown is recorded in the site\'s activity.\n- New password on the ShipStation card makes a new password and ends the old one at once. Paste the new password into ShipStation\'s store settings.\n- Disconnect stops ShipStation reading your orders. Shipments it sends afterwards are refused. Orders it already shipped stay shipped.\nThe card also shows when ShipStation last imported orders and last sent a shipment, so you can tell the connection is working.'
|
|
4150
|
+
},
|
|
4151
|
+
{
|
|
4152
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4153
|
+
title: 'Use ShipStation with Aglyn',
|
|
4154
|
+
heading: 'Troubleshooting',
|
|
4155
|
+
anchor: '#troubleshooting',
|
|
4156
|
+
text: '| ShipStation says | What to do |\n| The username or password is wrong | Make a new password on the card and paste the new one into ShipStation. |\n| Commerce is switched off for this site | Turn the store back on for the site in Aglyn. |\n| This site\'s plan does not include selling | Selling needs a plan with commerce. |\n| No order n on this site | The order was deleted, or ShipStation is connected to a different site\'s URL. |\n| Too many requests | ShipStation retries on its own. |'
|
|
4157
|
+
},
|
|
4158
|
+
{
|
|
4159
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4160
|
+
title: 'Use ShipStation with Aglyn',
|
|
4161
|
+
heading: 'Related',
|
|
4162
|
+
anchor: '#related',
|
|
4163
|
+
text: '- Use Pirate Ship with Aglyn\n- Use ShippingEasy with Aglyn\n- Import and export store data\n- Commerce'
|
|
4164
|
+
},
|
|
3570
4165
|
{
|
|
3571
4166
|
path: '/concepts/glossary',
|
|
3572
4167
|
title: 'Glossary & naming conventions',
|
|
@@ -4853,7 +5448,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
4853
5448
|
title: 'Share records across sites',
|
|
4854
5449
|
heading: '',
|
|
4855
5450
|
anchor: '',
|
|
4856
|
-
text: 'Share records across sites\nEach site in your workspace sees the people it captured. A site in a consent group also sees the records of the group\'s other sites. Every other record is hidden from it, which is what keeps one agency client\'s CRM apart from another\'s.\nWhen you run several brands and want one brand\'s team to work records another brand captured, a workspace owner or admin can share them. You can share a lead, a contact, a company or a deal:\n- By hand: one record from its page, or a selection from the Leads or Contacts list.\n- By a sharing rule: every record the rule matches, including the ones you already have and every one captured or changed later.\nYou can share with chosen sites or with All sites. All sites includes sites you add to the workspace later.'
|
|
5451
|
+
text: 'Share records across sites\nEach site in your workspace sees the people it captured. A site in a consent group also sees the records of the group\'s other sites. Every other record is hidden from it, which is what keeps one agency client\'s CRM apart from another\'s.\nTo start every new record on All sites instead, a workspace owner or admin can change Default sharing for new records in the CRM\'s Settings. It covers new contacts, companies, deals and tasks, and changes nothing that already exists. It is separate from the defaults for new datasets and media files, which are set on the organization Data and Media pages.\nWhen you run several brands and want one brand\'s team to work records another brand captured, a workspace owner or admin can share them. You can share a lead, a contact, a company or a deal:\n- By hand: one record from its page, or a selection from the Leads or Contacts list.\n- By a sharing rule: every record the rule matches, including the ones you already have and every one captured or changed later.\nYou can share with chosen sites or with All sites. All sites includes sites you add to the workspace later.'
|
|
4857
5452
|
},
|
|
4858
5453
|
{
|
|
4859
5454
|
path: '/content-and-data/crm/sharing',
|
|
@@ -4909,7 +5504,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
4909
5504
|
title: 'Tasks & follow-ups',
|
|
4910
5505
|
heading: '',
|
|
4911
5506
|
anchor: '',
|
|
4912
|
-
text: 'Tasks & follow-ups\nA task is a piece of work somebody on your team owes a person in the CRM: a call to return, an email to send, a meeting to hold, or a plain to-do. Every task has a subject, a type, a priority, a status, an optional due date and time, an optional assignee, notes, and a link to the contact, company or deal it is about.\nTasks live in the CRM hub at …/hosts/{site}/crm/tasks and, over every site at once, at …/{organization}/crm/tasks; every record page carries its own short list of them. They follow the same per-site visibility as the contacts themselves: a task made from one site\'s console is seen from that site (and the sites it shares an audience with), and an organization that has
|
|
5507
|
+
text: 'Tasks & follow-ups\nA task is a piece of work somebody on your team owes a person in the CRM: a call to return, an email to send, a meeting to hold, or a plain to-do. Every task has a subject, a type, a priority, a status, an optional due date and time, an optional assignee, notes, and a link to the contact, company or deal it is about.\nTasks live in the CRM hub at …/hosts/{site}/crm/tasks and, over every site at once, at …/{organization}/crm/tasks; every record page carries its own short list of them. They follow the same per-site visibility as the contacts themselves: a task made from one site\'s console is seen from that site (and the sites it shares an audience with), and an organization that has set Default sharing for new records to All sites sees every task everywhere. A task is also the one CRM record that can belong to no site at all — see Organization tasks.\nPlan availability Tasks are part of the CRM, included from Starter. On Free the section is shown locked, with the rest of the CRM. See What each plan includes.'
|
|
4913
5508
|
},
|
|
4914
5509
|
{
|
|
4915
5510
|
path: '/content-and-data/crm/tasks',
|
|
@@ -5182,7 +5777,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
5182
5777
|
title: 'Datasets & Dynamic Content',
|
|
5183
5778
|
heading: 'Who a dataset is shared with',
|
|
5184
5779
|
anchor: '#who-a-dataset-is-shared-with',
|
|
5185
|
-
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
|
|
5780
|
+
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'
|
|
5186
5781
|
},
|
|
5187
5782
|
{
|
|
5188
5783
|
path: '/content-and-data/datasets/overview',
|
|
@@ -5385,7 +5980,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
5385
5980
|
title: 'Media Library & CDN',
|
|
5386
5981
|
heading: 'Upload',
|
|
5387
5982
|
anchor: '#upload',
|
|
5388
|
-
text: '- Upload images, PDFs, ZIP archives and documents (Word, Excel, PowerPoint, CSV, RTF, plain text, Markdown and JSON). Click Upload media, or drag files straight from your desktop onto the library — dropped files land in the folder you have open.\n- Video uploads are paused. New MP4, WebM and QuickTime files are not accepted on any plan for now, from the console or the API, and a video\'s file cannot be replaced. Videos already in your library keep playing, and the Video element can still use them. While the pause lasts, the library shows a Video uploads paused chip beside Upload media.\n- Create images with AI. Create with AI, beside Upload media, draws an illustration, icon, pattern or logo mark as an SVG from a description, or makes a photo
|
|
5983
|
+
text: '- Upload images, PDFs, ZIP archives and documents (Word, Excel, PowerPoint, CSV, RTF, plain text, Markdown and JSON). Click Upload media, or drag files straight from your desktop onto the library — dropped files land in the folder you have open.\n- Video uploads are paused. New MP4, WebM and QuickTime files are not accepted on any plan for now, from the console or the API, and a video\'s file cannot be replaced. Videos already in your library keep playing, and the Video element can still use them. While the pause lasts, the library shows a Video uploads paused chip beside Upload media.\n- Create images with AI. Create with AI, beside Upload media, draws an illustration, icon, pattern or logo mark as an SVG from a description, or, where photos are on, makes a photo, a piece of art such as a watercolor or a 3D render, or a design asset such as a banner or a social post graphic, and adds it to the folder you have open with alt text. Each picture is stored like an upload and costs AI credits — see Create images with AI.\n- Web fonts (WOFF2) are accepted too. The usual way to add one is Upload your own font in the theme editor, which checks the font\'s license, converts a TTF, OTF or WOFF to WOFF2 and stores it here.\n- Documents and archives are stored and served exactly as you uploaded them — nothing is opened, extracted or converted. Macro-enabled Office files (.docm, .xlsm, .pptm) are not accepted.\n- Rename, replace the file behind an asset, and edit images in place. Replace works for images, PDFs, archives and documents alike, and for video once video uploads resume — it is available from the asset\'s details drawer and straight from the card\'s overflow menu, and it keeps the asset\'s link, folder, tags, alt text, custom fields and sharing exactly as they were. Swapping one kin'
|
|
5389
5984
|
},
|
|
5390
5985
|
{
|
|
5391
5986
|
path: '/content-and-data/media/overview',
|
|
@@ -5399,7 +5994,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
5399
5994
|
title: 'Media Library & CDN',
|
|
5400
5995
|
heading: 'Who an asset is shared with',
|
|
5401
5996
|
anchor: '#who-an-asset-is-shared-with',
|
|
5402
|
-
text: 'Workspace media is shared across every site by default. The Shared with control narrows that, with the same two choices as datasets — All sites or Selected sites…. You\'ll find it in three places:\n- on a single asset, in its details drawer;\n- on a selection — tick several files and use Shared with… in the toolbar;\n- on a folder, from its ⋮ menu, which offers to apply the same sharing to the files inside it and its subfolders (it names the count, so you know what you\'re about to change).\nA folder applies its sharing when you save it — files keep their own setting afterwards, so moving a file into a "Client A" folder later does not re-share it. Narrowing a file that sites are already using names those sites first and asks you to confirm. Only workspace owners and admins can change sharing.\nA new folder or file starts shared with All sites, so it appears everywhere the moment you create it — or with the site you were working in, if your workspace has been set to make new
|
|
5997
|
+
text: 'Workspace media is shared across every site by default. The Shared with control narrows that, with the same two choices as datasets — All sites or Selected sites…. You\'ll find it in three places:\n- on a single asset, in its details drawer;\n- on a selection — tick several files and use Shared with… in the toolbar;\n- on a folder, from its ⋮ menu, which offers to apply the same sharing to the files inside it and its subfolders (it names the count, so you know what you\'re about to change).\nA folder applies its sharing when you save it — files keep their own setting afterwards, so moving a file into a "Client A" folder later does not re-share it. Narrowing a file that sites are already using names those sites first and asks you to confirm. Only workspace owners and admins can change sharing.\nA new folder or file starts shared with All sites, so it appears everywhere the moment you create it — or with the site you were working in, if your workspace has been set to make new media site-scoped by default. That default is Default sharing for new media, at the top of the workspace\'s Media page, and it changes nothing that already exists. The site you were working in is the one whose Media tab you uploaded on, or the one you were editing when you opened the media picker. A folder or file created on the workspace Media page has no site to limit it to, so it starts on All sites either way. New datasets have a default of their own, Default sharing for new datasets on the organization Data page, so files can start on every site while datasets start on one, or the other way round. If the Shared with dialog ever opens on "Not shared with any site", that folder or file has no sharing stored at all: it is hidden from every site, and any file inside it turns up under No folder there. Pick a'
|
|
5403
5998
|
},
|
|
5404
5999
|
{
|
|
5405
6000
|
path: '/content-and-data/media/overview',
|
|
@@ -6127,7 +6722,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6127
6722
|
title: 'Injection zones',
|
|
6128
6723
|
heading: 'How a zone spaces your widget',
|
|
6129
6724
|
anchor: '#how-a-zone-spaces-your-widget',
|
|
6130
|
-
text: 'Most zones are a stack. The shell draws their widgets one under another, with the same gap the page puts between its own cards, and keeps that gap between the zone and the page\'s cards beside it. Render your card with no outer margin: the zone spaces it, and a margin on your widget\'s root is reset.\nThe other zones hand each widget to a layout the page draws itself, and the page spaces it there:\n- hostDashboard, commerceGlance and orgDashboard: a tile of a dashboard grid.\n- hostScreens, hostTemplates, hostLayouts, hostForms, hostEmailTemplates, productsCreate, hostComponents, mediaLibrary and besignerToolbar: a control in a row.\n- hostAutomations, automationEditor and automationRun: a control the workflows plugin places beside its Actions buttons and in its Workflows card\'s header, in an automation\'s editor, and on a failed run.\n- orgAutomations: a control the workflows plugin places in its Org automations card\'s header.\n- hostLogic, logicFunctionEditor and logicReferenceIssue: a control the logic plugin places in its Functions and Variables cards\' headers, in a function\'s editor, and on a broken reference.\n- funnelsCreate and funnelInsight: a control the funnels plugin places beside New funnel and under a funnel\'s results.\n- siteMember: a section of a site user\'s drawer.\n- besignerInspector and seoFields: a section among a panel\'s own fields.\n- besignerPageProperties: a section of the Page Properties drawer\'s column.\n- hostScreenRow: a chip in a Pages list row, beside the page\'s own chips.\n- productEditor, productsHub and productImport: a section the commerce plugin places among its product editor\'s fields, above its catalog table, and in its import wizard\'s After import step.\n-
|
|
6725
|
+
text: 'Most zones are a stack. The shell draws their widgets one under another, with the same gap the page puts between its own cards, and keeps that gap between the zone and the page\'s cards beside it. Render your card with no outer margin: the zone spaces it, and a margin on your widget\'s root is reset.\nThe other zones hand each widget to a layout the page draws itself, and the page spaces it there:\n- hostDashboard, commerceGlance and orgDashboard: a tile of a dashboard grid.\n- hostScreens, hostTemplates, hostLayouts, hostForms, hostEmailTemplates, productsCreate, hostComponents, mediaLibrary and besignerToolbar: a control in a row.\n- hostAutomations, automationEditor and automationRun: a control the workflows plugin places beside its Actions buttons and in its Workflows card\'s header, in an automation\'s editor, and on a failed run.\n- orgAutomations: a control the workflows plugin places in its Org automations card\'s header.\n- hostLogic, logicFunctionEditor and logicReferenceIssue: a control the logic plugin places in its Functions and Variables cards\' headers, in a function\'s editor, and on a broken reference.\n- funnelsCreate and funnelInsight: a control the funnels plugin places beside New funnel and under a funnel\'s results.\n- siteMember: a section of a site user\'s drawer.\n- besignerInspector and seoFields: a section among a panel\'s own fields.\n- besignerPageProperties: a section of the Page Properties drawer\'s column.\n- hostScreenRow: a chip in a Pages list row, beside the page\'s own chips.\n- productEditor, productsHub and productImport: a section the commerce plugin places among its product editor\'s fields, above its catalog table, and in its import wizard\'s After import step.\n- orderDetail and orderFulfillment: a section the commerce plugin places in its order dialog, '
|
|
6131
6726
|
},
|
|
6132
6727
|
{
|
|
6133
6728
|
path: '/developers/plugins/reference/injection-zones',
|
|
@@ -6260,7 +6855,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6260
6855
|
title: 'Plugin-manager API reference',
|
|
6261
6856
|
heading: 'Console extensions — `feature-plugins`',
|
|
6262
6857
|
anchor: '#console-extensions--feature-plugins',
|
|
6263
|
-
text: '| API | What it does |\n| registerConsoleExtension(extension) | Declares everything a plugin adds to the console shell. Idempotent by pluginId (re-registration replaces). |\n| listConsoleNavItems() / resolveConsolePluginPage(href) | How the shell renders nav + serves plugin pages under /[orgSlug]/hosts/[host]/[...pluginSlug]. The resolver matches an exact href, or a declared section beneath one — longest href wins, prefixes match on a segment boundary, and a tie between two enabled plugins refuses. It answers { extension, navItem, section?, segments }. |\n| listConsoleOrgNavItems() / resolveConsoleOrgPluginPage(href) | The same pair for organization-level surfaces — the extension\'s orgNavItems, listed on the organization\'s tab strip and served under /[orgSlug]/[...pluginSlug] with the same matching rules. Neither pair reads the other\'s list. |\n| listConsoleWidgets(slot) | Widgets registered for a named zone — see Injection zones. |\n| listConsoleStaffPages() / resolveConsoleStaffPage(id) | How the shell draws a plugin\'s staff pages: a tab after the staff strip\'s own, and a page at /admin/{id} from the generic staff route. Two plugins claiming one id resolve to nothing, and say so. |\n|
|
|
6858
|
+
text: '| API | What it does |\n| registerConsoleExtension(extension) | Declares everything a plugin adds to the console shell. Idempotent by pluginId (re-registration replaces). |\n| listConsoleNavItems() / resolveConsolePluginPage(href) | How the shell renders nav + serves plugin pages under /[orgSlug]/hosts/[host]/[...pluginSlug]. The resolver matches an exact href, or a declared section beneath one — longest href wins, prefixes match on a segment boundary, and a tie between two enabled plugins refuses. It answers { extension, navItem, section?, segments }. |\n| listConsoleOrgNavItems() / resolveConsoleOrgPluginPage(href) | The same pair for organization-level surfaces — the extension\'s orgNavItems, listed on the organization\'s tab strip and served under /[orgSlug]/[...pluginSlug] with the same matching rules. Neither pair reads the other\'s list. |\n| listConsoleWidgets(slot) | Widgets registered for a named zone — see Injection zones. |\n| listConsoleStaffPages() / resolveConsoleStaffPage(id) | How the shell draws a plugin\'s staff pages: a tab after the staff strip\'s own, and a page at /admin/{id} from the generic staff route. Two plugins claiming one id resolve to nothing, and say so. |\n| listConsolePublicPages() / resolveConsolePublicPage(pluginId, path) | How the console serves a plugin\'s full-screen page that needs no staff session, at /kiosk/{pluginId}{path} — a screen facing customers, for example. The route loads only that plugin\'s console bundle, and only for a path its manifest lists in contributes.console.publicRoutes; the path matches exactly. First-party plugins only. |\n| listConsoleProviders() | App-level providers mounted around every console page. |\n| defineUiFeatureBundle(options, components) | Site/canvas component bundle; auto-depends on the base mui bundle. Co'
|
|
6264
6859
|
},
|
|
6265
6860
|
{
|
|
6266
6861
|
path: '/developers/plugins/reference/plugin-manager-api',
|
|
@@ -6612,6 +7207,13 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6612
7207
|
anchor: '#platform-events--plugin-events-server',
|
|
6613
7208
|
text: 'Core raises the events; a plugin that must react to what a core route did subscribes from its serverDeclarations entry, so the subscription is in place before the first request. Payloads carry the actor and the before / after, never a reference to the plugin.\n| Event | Raised by | Payload |\n| org.seatAddons.changed | the add-on checkout and the billing webhook | { orgId, actor, before, after } — the org.seatAddons maps |\n| org.permissions.changed | the member, role and host-member routes | { orgId, actor, subject: { type, id?, name? }, permission, granted } |\n| host.records.removed | the public API\'s deletes and a person\'s erasure, after the delete lands | { orgId, hostIds, collection, records: [{ id, data }] } — each removed document as it stood |\n| host.email.engaged | the email delivery webhook, for a message tagged with a site, after the delivery log records it | { hostId, events: [{ to, type, at, firstOfType }] } — opens and clicks only; firstOfType marks the first of its type for that message |\n| billing.invoice.paid | the billing webhook, once the invoice resolves to a workspace | { orgId, invoiceId, amountPaidCents, currency, paidOutOfBand, metadata } |\n| billing.invoice.failed | the billing webhook | { orgId, invoiceId, amountDueCents, metadata } |\n| billing.invoice.closed | the billing webhook, on voided and on markeduncollectible | { orgId, invoiceId, reason: \'voided\' \\| \'uncollectible\', metadata } |\n| billing.dispute.opened | the billing webhook, on a dispute that matched a workspace | { orgId, chargeId, invoiceId, amountCents } |\n| billing.paymentMethod.changed | the billing webhook, after reading the customer\'s default | { orgId, defaultType } |\nThe five billing events carry the Stripe object\'s own metadata, which core does not read. A plugin that stamped '
|
|
6614
7209
|
},
|
|
7210
|
+
{
|
|
7211
|
+
path: '/developers/plugins/reference/plugin-manager-api',
|
|
7212
|
+
title: 'Plugin-manager API reference',
|
|
7213
|
+
heading: 'Plugin events — `plugin-domain-events` (`/server`)',
|
|
7214
|
+
anchor: '#plugin-events--plugin-domain-events-server',
|
|
7215
|
+
text: 'Events a plugin raises for other plugins, with payloads the raising plugin declares. A subscriber reaches an event by its name and never imports the plugin that raises it.\n| Call | What it does |\n| definePluginDomainEvent (name) | A typed token for one event name: dotted lower-case words, the first naming what it is about (order.paid). A subscriber in another plugin restates the payload type and defines its own token under the same name. |\n| declarePluginDomainEvents([{ event, label, description, payloadKeys? }], { pluginId? }) | Declares the events a plugin raises. One plugin owns a name; a second declaring it throws. |\n| subscribePluginDomainEvent(event, handler, { pluginId?, name? }) | Subscribes from serverDeclarations. name keeps two handlers of one plugin apart. The handler gets { id, event, hostId, orgId, occurredAtMs, attempt, payload }. |\n| listPluginDomainEvents() / listPluginDomainEventSubscribers(event) | What is declared and who listens, for pickers and diagnostics. |\nRaising goes through the outbox in the admin data lib (@aglyn/tenant-data-admin/server/plugin-event-outbox): stagePluginEvent inside the transaction that writes the fact, or raisePluginEvent after it. Both take a key naming the occurrence, so the same fact raised twice is one event. A core job delivers the outbox every minute.\nDelivery is at least once, per subscriber. A handler that throws is retried alone, with backoff from 30 seconds to 12 hours, eight times, and the event is then kept as a dead letter with each subscriber\'s last error. A subscriber that already took the event is not called again, but a handler can still see an event twice (it succeeded and the record of that did not land), so dedupe on the envelope\'s id. A locked site\'s events wait until the lock lifts.\nCommerce\'s order an'
|
|
7216
|
+
},
|
|
6615
7217
|
{
|
|
6616
7218
|
path: '/developers/plugins/reference/plugin-manager-api',
|
|
6617
7219
|
title: 'Plugin-manager API reference',
|
|
@@ -6913,6 +7515,13 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6913
7515
|
anchor: '#email',
|
|
6914
7516
|
text: 'Where to get these: with the default provider, resend.com → API Keys, and Domains to verify the domain you send from. To send through anything else, see Which provider carries your mail.\nThe shared pool is yours to create, and nothing works until it exists\nA published site never sends from USAGEEMAILFROM. A site with a sending domain of its own sends as that; every other site sends its transactional mail — receipts, password resets, booking confirmations — from a member of a small shared pool inside your mail apex. Nothing provisions that pool for you.\nBefore any site sends, create AGLYNTENANTSHAREDPOOLSIZE domains at your mail provider — shared1.{mail apex} through shared{n}, four by default — publish the three records each one issues into your own zone, and verify all of them. Twelve records in total for the default pool, and that number does not grow with sites.\nSkip this and every site without a domain of its own refuses every message, receipts included, with tenant-identity-unprovisioned. Do not create a domain object for the bare mail apex: nothing sends from it, and the pool members are one label deeper so each one signs for itself.\nWhich provider carries your mail {#email-provider}\nEverything that decides whether a message may leave — suppressions, the send rate, the phishing screen, the sending identity, the unsubscribe footer — runs inside the product. The provider only carries the finished message, and you choose which one:\n| AGLYNMAILPROVIDER | What carries the mail |\n| resend | Resend, with RESENDAPIKEY. The only provider with a delivery feed, a credential probe and a read API, so it is the only one under which open and click statistics, automatic bounce and complaint suppression, the staff delivery history, the shared-pool health check and CRM email captur'
|
|
6915
7517
|
},
|
|
7518
|
+
{
|
|
7519
|
+
path: '/developers/self-hosting-environment',
|
|
7520
|
+
title: 'Environment variables',
|
|
7521
|
+
heading: 'Mobile apps and push',
|
|
7522
|
+
anchor: '#mobile',
|
|
7523
|
+
text: 'The native apps (Aglyn and Aglyn POS, for iOS, iPadOS and macOS from apps/ios, and for Android and the Windows desktop from apps/android) are built, not served by your containers. Their settings are build settings, compiled into the app, so changing one means building and shipping the app again. None of them is a secret. On Apple they are xcconfig keys (copy apps/ios/Config/Production.xcconfig.example); on Android and the desktop they are Gradle settings, -Paglyn. =… or the AGLYN environment variable.\n| Apple (xcconfig) | Android (Gradle) | Need | Value |\n| AGLYNCONSOLEURL | consoleUrl | Required | Your console origin. Every API call and console page the app opens is on it, and it is the app\'s universal-link host. Default https://app.aglyn.com. |\n| AGLYNBRANDNAME | — | Optional | The app\'s name and the product name its copy says. Default Aglyn. |\n| AGLYNFIREBASEAPIKEY | firebaseApiKey | Required | The Firebase app config of the app you registered in your project, per bundle. |\n| AGLYNFIREBASEAUTHDOMAIN | firebaseAuthDomain | Required | As above. |\n| AGLYNFIREBASEPROJECTID | firebaseProjectId | Required | As above. |\n| AGLYNFIREBASEAPPID | firebaseAppId | Required | As above. |\n| AGLYNFIREBASEMESSAGINGSENDERID | firebaseMessagingSenderId | Optional | As above. |\n| AGLYNFIREBASESTORAGEBUCKET | — | Optional | As above. |\n| AGLYNGOOGLEIOSCLIENTID, AGLYNGOOGLEWEBCLIENTID | — | Optional | Google sign-in\'s OAuth client ids. The Google button is hidden until both are set. |\n| AGLYNAUTHEMULATORHOST | authEmulatorHost | Development | host:port of a local Auth emulator. Never set in a store build. |\n| AGLYNFIRESTOREEMULATORHOST | firestoreEmulatorHost | Development | host:port of a local Firestore emulator. Never set in a store build. |\nThe server side of push is configured in you'
|
|
7524
|
+
},
|
|
6916
7525
|
{
|
|
6917
7526
|
path: '/developers/self-hosting-environment',
|
|
6918
7527
|
title: 'Environment variables',
|
|
@@ -7380,7 +7989,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
7380
7989
|
title: 'Create a site',
|
|
7381
7990
|
heading: 'Create your first site',
|
|
7382
7991
|
anchor: '#create-your-first-site',
|
|
7383
|
-
text: '1. Sign in to the console.\n2. Open the site switcher in the app bar (top-left) and choose Create site.\n3. Give it a name. Aglyn generates a working subdomain immediately, so the site has a real address from the first moment — you can attach a custom domain later.\nWhen you can use Aglyn AI, the new site opens on Start your site, which asks how you want to start: Start from the starter site, or Start with AI, which plans your pages from a few questions — see Generate a website from a prompt. Choosing the starter site, skipping or closing the window all give the site the starter described below. Until you choose, the site\'s address shows a short coming soon page with its name, kept out of search results.\nEvery other new site starts with the starter straight away. The starter is a complete website, published and open to search engines from the first visit:\n- a Home page at the site root with the sections an ordinary business site has — a hero with your site\'s name, what you offer, an about section, a photo gallery, testimonials, frequently asked questions, a call to action and a working contact form. Each section says how to make it yours, and the photos are placeholders to swap for your own under Media;\n- a shared header and footer layout every page you add renders inside, with your site\'s name, search, a light/dark switch and a Contact button. It is the site\'s one shared layout on the Free plan;\n- a theme (colors and fonts) under Setup → Theme, and a title, description and sharing image under Setup → SEO.\nOpen the Home page from Pages to make it your own: once you publish your changes it is your home page like
|
|
7992
|
+
text: '1. Sign in to the console.\n2. Open the site switcher in the app bar (top-left) and choose Create site.\n3. Give it a name. Aglyn generates a working subdomain immediately, so the site has a real address from the first moment — you can attach a custom domain later.\nWhen you can use Aglyn AI, the new site opens on Start your site, which asks how you want to start: Start from the starter site, or Start with AI, which plans your pages from a few questions — see Generate a website from a prompt. Choosing the starter site, skipping or closing the window all give the site the starter described below. Choosing Start from the starter site publishes it at once, and the console says so: Your site is live, with the site\'s address, View your site and Edit your pages. Until you choose, the site\'s address shows a short coming soon page with its name, kept out of search results.\nEvery other new site starts with the starter straight away. The starter is a complete website, published and open to search engines from the first visit:\n- a Home page at the site root with the sections an ordinary business site has — a hero with your site\'s name, what you offer, an about section, a photo gallery, testimonials, frequently asked questions, a call to action and a working contact form. Each section says how to make it yours, and the photos are placeholders to swap for your own under Media;\n- a shared header and footer layout every page you add renders inside, with your site\'s name, search, a light/dark switch and a Contact button. It is the site\'s one shared layout on the Free plan;\n- a theme (colors and fonts) under Setup → Theme, and a title, description and sharing image under Setup → SEO.\nOpen the Home page from Pages to make it your own: once you publish your changes it is your home page like '
|
|
7384
7993
|
},
|
|
7385
7994
|
{
|
|
7386
7995
|
path: '/getting-started/create-a-site',
|
|
@@ -7597,7 +8206,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
7597
8206
|
title: 'Commerce end to end',
|
|
7598
8207
|
heading: '4. What checkout does',
|
|
7599
8208
|
anchor: '#4-what-checkout-does',
|
|
7600
|
-
text: 'Both buy buttons and the cart\'s Checkout
|
|
8209
|
+
text: 'Both buy buttons and the cart\'s Checkout open the payment form in place, on your own site, below the button. After paying, the shopper lands back on the same page with a success marker.\nPaying without leaving your site\nThe shopper never leaves your store for checkout.stripe.com. Leaving the store mid-purchase is one of the most common places a cart gets abandoned, so the whole checkout happens on your pages:\n- Email for the receipt. If the shopper already typed it in the cart, it is shown rather than asked for again.\n- Shipping address and shipping method, only when the order ships. The methods listed are the rates your shipping settings give for that destination, and choosing one updates the total.\n- Card or other payment method, through Stripe\'s Payment Element.\n- A live total: subtotal, any discount, shipping and tax, recalculated as the address and shipping method change, so the amount on screen is the amount charged.\nThe form uses your site\'s theme: its primary color, background and text colors, corner radius and font carry into the payment fields.\nNothing about the sale itself differs from the Stripe-hosted page, and that is deliberate:\n- The price, tax, shipping and any coupon are computed by the same code. The in-page form is the same Stripe Checkout Session as the redirect, just drawn by us instead of by Stripe — so the two cannot quote different totals.\n- Your order is still created by Stripe\'s webhook, never by the browser. If a shopper pays and immediately closes the tab, the order, the stock decrement, the receipt and the gift-card or license-key steps all still happen. If they pay and then refresh the page, none of it happens twice.\n- A declined card stays on the form. The basket, address and payment method the shopper already entered are kept, with the de'
|
|
7601
8210
|
},
|
|
7602
8211
|
{
|
|
7603
8212
|
path: '/guides/commerce-end-to-end',
|
|
@@ -8192,7 +8801,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
8192
8801
|
title: 'Funnels',
|
|
8193
8802
|
heading: 'What counts as a visit, and its limits',
|
|
8194
8803
|
anchor: '#what-is-a-visit',
|
|
8195
|
-
text: 'A visit is one browser tab on your site, until it is closed. When a visitor\'s first step is recorded, their browser makes up a random visit id and keeps it in that tab\'s session storage — not a cookie, not shared with other sites, never derived from their address or device. Every step that tab takes is recorded under that id.\nThat means:\n- Two tabs are two visits, and a visitor who closes the tab and comes back tomorrow is a new visit. Nothing links one visit to another, or to a person — unless the visitor identifies themselves by submitting a form (see below).\n- Consent comes first. The visit id leaves the browser, so it is analytics storage: a step is recorded only once the visitor\'s cookie consent allows analytics. A visitor who declines, opts out or sends Global Privacy Control is never recorded, and steps taken before someone accepts are not recorded later. Funnels therefore count fewer visits than the traffic panel, and in regions where your site asks first, noticeably fewer.\n- Recording starts with your first funnel. A site with no funnels records nothing. Saving the first funnel turns recording on, and earlier visits cannot be measured. Deleting the last funnel turns it off.\n- Up to 60 steps per visit are recorded; a very long visit stops adding steps after that.\n- Visits are kept for 90 days and then deleted automatically.\n- Very busy sites: a result reads at most the 20,000 most recent visits in the range and says so when it stops there.\n- Visits from preview builds and from browsers marked as your own traffic are not recorded, the same as page views.'
|
|
8804
|
+
text: 'A visit is one browser tab on your site, until it is closed. When a visitor\'s first step is recorded, their browser makes up a random visit id and keeps it in that tab\'s session storage — not a cookie, not shared with other sites, never derived from their address or device. Every step that tab takes is recorded under that id.\nThat means:\n- Two tabs are two visits, and a visitor who closes the tab and comes back tomorrow is a new visit. Nothing links one visit to another, or to a person — unless the visitor identifies themselves by submitting a form (see below).\n- Consent comes first. The visit id leaves the browser, so it is analytics storage: a step is recorded only once the visitor\'s cookie consent allows analytics. A visitor who declines, opts out or sends Global Privacy Control is never recorded, and steps taken before someone accepts are not recorded later. Funnels therefore count fewer visits than the traffic panel, and in regions where your site asks first, noticeably fewer.\n- Recording starts with your first funnel. A site with no funnels records nothing. Saving the first funnel turns recording on, and earlier visits cannot be measured. Deleting the last funnel turns it off. A draft funnel never turns recording on.\n- Up to 60 steps per visit are recorded; a very long visit stops adding steps after that.\n- Visits are kept for 90 days and then deleted automatically.\n- Very busy sites: a result reads at most the 20,000 most recent visits in the range and says so when it stops there.\n- Visits from preview builds and from browsers marked as your own traffic are not recorded, the same as page views.'
|
|
8196
8805
|
},
|
|
8197
8806
|
{
|
|
8198
8807
|
path: '/marketing-and-automation/analytics/funnels',
|
|
@@ -8206,7 +8815,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
8206
8815
|
title: 'Funnels',
|
|
8207
8816
|
heading: 'Create a funnel',
|
|
8208
8817
|
anchor: '#create',
|
|
8209
|
-
text: '1. Open your site\'s Analytics page and find Funnels.\n2. Select New funnel, name it, and add steps with the pickers.\n3. Save. Saving needs a site admin or editor.\nCreate with AI {#create-with-ai}\nWhen Aglyn AI is available to your workspace, Create with AI turns a description — "people who read a blog post, then booked a consultation" — into a draft funnel. The draft uses only the pages, forms, services, products and bars or popups your site has; a step the model suggests that your site does not have is left out and listed. Nothing is saved until you review the draft and select Save. It uses AI credits like other generation.'
|
|
8818
|
+
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.'
|
|
8210
8819
|
},
|
|
8211
8820
|
{
|
|
8212
8821
|
path: '/marketing-and-automation/analytics/funnels',
|
|
@@ -8311,7 +8920,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
8311
8920
|
title: 'Insights',
|
|
8312
8921
|
heading: 'How an answer is made',
|
|
8313
8922
|
anchor: '#how-an-answer-is-made',
|
|
8314
|
-
text: '1. The figures are read, never written. Aglyn AI chooses which of your figures answer the question — for example your traffic and your top pages — and Aglyn reads them the same way the console\'s own cards do. AI never writes a database query and never sees a single visitor, contact, order, booking or submission: only totals, counts and rates.\n2. Each insight cites its rows. Choose Show the figures under an insight to see the rows it was written from, and follow the link to the page those figures come from.\n3. Untraceable insights are left out. Every number an insight writes must appear in a row it cites — as the table shows it, or rounded. An insight that adds figures together, works out a rate of its own, says a figure rose when it fell, or names a person is left out, and the answer says how many were.\nWhen your figures cannot answer part of a question, the answer says so in one sentence rather than filling the gap.'
|
|
8923
|
+
text: '1. The figures are read, never written. Aglyn AI chooses which of your figures answer the question — for example your traffic and your top pages — and Aglyn reads them the same way the console\'s own cards do. AI never writes a database query and never sees a single visitor, contact, order, booking or submission: only totals, counts and rates.\n2. Each insight cites its rows. Choose Show the figures under an insight to see the rows it was written from, and follow the link to the page those figures come from.\n3. Untraceable insights are left out. Every number an insight writes must appear in a row it cites — as the table shows it, or rounded. An insight that adds figures together, works out a rate of its own, says a figure rose when it fell, or names a person is left out, and the answer says how many were.\nWhen your figures cannot answer part of a question, the answer says so in one sentence rather than filling the gap.\nA question asked about a site is also given that site\'s status, as a Site status table an insight can cite: whether the site is published, its address, and its published pages. A site with no visits yet is still live when it is published, so an answer never reads a lack of traffic as a site that has not launched. The window you pick is the period the figures cover, not a countdown to anything.'
|
|
8315
8924
|
},
|
|
8316
8925
|
{
|
|
8317
8926
|
path: '/marketing-and-automation/analytics/insights',
|
|
@@ -8523,6 +9132,62 @@ export const DOCS_SECTION_INDEX = [
|
|
|
8523
9132
|
anchor: '#start-from-a-brief-instead',
|
|
8524
9133
|
text: 'Generate an email with AI writes a draft design from a description — blocks, copy, and three subject lines to choose between — which you then edit here like any other.'
|
|
8525
9134
|
},
|
|
9135
|
+
{
|
|
9136
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9137
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9138
|
+
heading: '',
|
|
9139
|
+
anchor: '',
|
|
9140
|
+
text: 'Email platforms: Mailchimp, Klaviyo and Omnisend\nIf you already send newsletters or automated flows from Mailchimp, Klaviyo or Omnisend, connect your account to a site and Aglyn keeps it in step with the site\'s contacts:\n- Contacts go out. Everyone the site holds that it may send marketing to is added or updated in your account, with their name, phone number, tags, lifetime value and order count. The first sync copies everyone; after that, only the people who changed.\n- Unsubscribes go both ways. Someone who unsubscribes from your site\'s emails is unsubscribed in your account. Someone who unsubscribes in Mailchimp, Klaviyo or Omnisend is unsubscribed from the site\'s own campaigns too, and your contact\'s record says where they left.\n- Orders go to Klaviyo and Omnisend. Started checkouts, paid orders (with each product), fulfillments with tracking, refunds and cancellations, for the abandoned-cart and post-purchase flows those platforms build on.\nEmail platform connections come with every plan that includes the CRM, at no extra cost.'
|
|
9141
|
+
},
|
|
9142
|
+
{
|
|
9143
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9144
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9145
|
+
heading: 'Connect a platform',
|
|
9146
|
+
anchor: '#connect',
|
|
9147
|
+
text: '1. Open the site, then Setup. Scroll to Email platforms.\n2. On the platform\'s card, select Connect.\n3. Paste your API key, then Check and connect. Aglyn checks the key with the platform before it saves it, and stores it encrypted; it is never shown again.\n- Mailchimp: in Mailchimp, Profile → Extras → API keys → Create a key. It ends in your data center, like -us21.\n- Klaviyo: in Klaviyo, Settings → API keys → Create private API key, with full access to Profiles, Lists, Subscriptions and Events.\n- Omnisend: in Omnisend, Store settings → API keys → Create API key, with access to Contacts and Events.\n4. For Mailchimp and Klaviyo, choose the audience or list contacts go into. If your account has only one, it is chosen for you.\nThe first sync starts within 15 minutes. Sync now runs it straight away.\nOnly a site admin can connect, change or disconnect a platform; editors can see the card and its log.'
|
|
9148
|
+
},
|
|
9149
|
+
{
|
|
9150
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9151
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9152
|
+
heading: 'Who is sent, and as what',
|
|
9153
|
+
anchor: '#who-is-sent',
|
|
9154
|
+
text: 'Each person is sent with the answer the site\'s own campaigns would give them:\n| On the site | In your platform |\n| Gave consent to marketing (or is covered by your workspace\'s consent policy), and has not unsubscribed, bounced or complained | Subscribed — but only when they are new to your platform. Someone who unsubscribed there is never subscribed again by Aglyn. |\n| Unsubscribed, declined, bounced, complained or was erased | Unsubscribed |\n| No consent on record that the site may use | Not sent at all. Aglyn does not copy an address it has no standing to market to. |\nOrder events are sent only for people the site may market to, and an event more than a week old is not sent.'
|
|
9155
|
+
},
|
|
9156
|
+
{
|
|
9157
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9158
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9159
|
+
heading: 'When someone unsubscribes in your platform',
|
|
9160
|
+
anchor: '#unsubscribes-from-the-platform',
|
|
9161
|
+
text: 'Every sync reads back who unsubscribed in your account since the last one, before it sends anything, and adds them to the site\'s unsubscribe list. The site\'s campaigns, sequences and automated emails stop for them, and their contact record shows Unsubscribed in Mailchimp (or Klaviyo, or Omnisend).\nIf they later resubscribe in that same platform, the next sync lifts that unsubscribe again. Nothing else is lifted that way: an unsubscribe the person made on your site, a bounce, a complaint or an unsubscribe another platform reported stays in place.\nOmnisend reports unsubscribes but not resubscribes, so a return in Omnisend does not lift the site\'s unsubscribe.'
|
|
9162
|
+
},
|
|
9163
|
+
{
|
|
9164
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9165
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9166
|
+
heading: 'Settings',
|
|
9167
|
+
anchor: '#settings',
|
|
9168
|
+
text: '- Audience / List — where contacts go. Choosing a different one copies everyone into it on the next sync.\n- Tag — every contact this site sends carries it, so you can build a segment of them. Aglyn unless you change it.\n- Sync contacts and unsubscribes — turn off to stop contacts and consent syncing while keeping the connection.\n- Send orders and started checkouts — Klaviyo and Omnisend only.\n- Pause — stops the sync until you Resume. Orders that happen while it is paused are not sent later.'
|
|
9169
|
+
},
|
|
9170
|
+
{
|
|
9171
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9172
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9173
|
+
heading: 'The sync log, and when something goes wrong',
|
|
9174
|
+
anchor: '#sync-log',
|
|
9175
|
+
text: 'Each connected platform has a sync log under its card: what each run sent and read back, and every error, newest first.\n- Syncing — working normally; it runs about every 15 minutes.\n- Stopped — the platform failed many times in a row (it was retried with growing waits). Fix the cause shown, then Sync now.\n- Connect again — the platform refused the key (it was deleted, or its access changed). Create a new key and connect again; your settings are kept.\nWhen the platform asks Aglyn to slow down, the sync waits as long as it was told and carries on — nothing is lost. A person the platform will not take (for example an address it has permanently deleted) is skipped and named in the log, and the rest go on.'
|
|
9176
|
+
},
|
|
9177
|
+
{
|
|
9178
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9179
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9180
|
+
heading: 'Disconnect',
|
|
9181
|
+
anchor: '#disconnect',
|
|
9182
|
+
text: 'Disconnect deletes the stored key, the log and any orders not yet sent. Nothing more is sent to the platform. Contacts already in your account stay there, and unsubscribes already read back stay on the site\'s list.'
|
|
9183
|
+
},
|
|
9184
|
+
{
|
|
9185
|
+
path: '/marketing-and-automation/email-campaigns/email-platforms',
|
|
9186
|
+
title: 'Email platforms (Mailchimp, Klaviyo, Omnisend)',
|
|
9187
|
+
heading: 'One-off imports',
|
|
9188
|
+
anchor: '#one-off-imports',
|
|
9189
|
+
text: 'To bring a list in once, without connecting — for example an old Mailchimp audience export — use Import on the site\'s contacts or suppressions instead.'
|
|
9190
|
+
},
|
|
8526
9191
|
{
|
|
8527
9192
|
path: '/marketing-and-automation/email-campaigns/generate-with-ai',
|
|
8528
9193
|
title: 'Generate an email campaign with AI',
|
|
@@ -9417,7 +10082,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
9417
10082
|
title: 'Signing In & Sessions',
|
|
9418
10083
|
heading: 'Automatic sign-out after inactivity',
|
|
9419
10084
|
anchor: '#automatic-sign-out-after-inactivity',
|
|
9420
|
-
text: 'For security, an idle console session expires after
|
|
10085
|
+
text: 'For security, an idle console session expires after 2 hours of no activity (in any open tab, on any of your workspace subdomains). When that happens you\'re returned to the sign-in page, and the page you were on is preserved — after signing back in you resume exactly where you left off.\nActivity means any interaction: pointer movement, typing, scrolling, or touching. Active work in one tab keeps your other tabs alive too.\nInactivity is the only thing that ends a session early: a background tab losing its own authentication (a laptop waking from sleep, a suspended tab, a network blip) recovers silently from the shared session instead of signing you out everywhere. Only an explicit sign-out — yours, or a staff-initiated revocation — retires the shared session.\nSelf-hosting The idle window is configurable via the NEXTPUBLICAUTHIDLETIMEOUTMINUTES environment variable (default 120; set 0 to disable).'
|
|
9421
10086
|
},
|
|
9422
10087
|
{
|
|
9423
10088
|
path: '/workspace-and-billing/signing-in-and-sessions',
|