@aglyn/aglyn 1.0.0-beta.230 → 1.0.0-beta.231
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/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 +80 -2
- package/src/lib/app-utils/docs-help.generated.js +209 -1
- package/src/lib/app-utils/docs-help.generated.js.map +1 -1
- package/src/lib/app-utils/docs-index.generated.js +517 -20
- package/src/lib/app-utils/docs-index.generated.js.map +1 -1
- 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/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/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 +88 -0
- package/src/lib/plugin-manager/feature-plugins.js +44 -0
- package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
- package/src/lib/plugin-manager/first-party-plugins.generated.js +222 -2
- package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
- 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 +204 -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-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-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
|
@@ -3285,7 +3285,21 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3285
3285
|
title: 'Edit your theme',
|
|
3286
3286
|
heading: 'Set colors and fonts',
|
|
3287
3287
|
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
|
|
3288
|
+
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.'
|
|
3289
|
+
},
|
|
3290
|
+
{
|
|
3291
|
+
path: '/building-sites/theme-builder/edit-your-theme',
|
|
3292
|
+
title: 'Edit your theme',
|
|
3293
|
+
heading: 'Fonts',
|
|
3294
|
+
anchor: '#fonts',
|
|
3295
|
+
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'
|
|
3296
|
+
},
|
|
3297
|
+
{
|
|
3298
|
+
path: '/building-sites/theme-builder/edit-your-theme',
|
|
3299
|
+
title: 'Edit your theme',
|
|
3300
|
+
heading: 'Upload your own font',
|
|
3301
|
+
anchor: '#upload-your-own-font',
|
|
3302
|
+
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
3303
|
},
|
|
3290
3304
|
{
|
|
3291
3305
|
path: '/building-sites/theme-builder/edit-your-theme',
|
|
@@ -3439,14 +3453,98 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3439
3453
|
title: 'Product catalog',
|
|
3440
3454
|
heading: 'Google Merchant Center feed',
|
|
3441
3455
|
anchor: '#merchant-center-feed',
|
|
3442
|
-
text: 'Your catalog is
|
|
3456
|
+
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
3457
|
},
|
|
3444
3458
|
{
|
|
3445
3459
|
path: '/commerce-and-bookings/commerce/catalog',
|
|
3446
3460
|
title: 'Product catalog',
|
|
3447
3461
|
heading: 'Related',
|
|
3448
3462
|
anchor: '#related',
|
|
3449
|
-
text: '- Commerce overview\n- SEO — products emit structured data and join the sitemap automatically.'
|
|
3463
|
+
text: '- Sales channels\n- Commerce overview\n- SEO — products emit structured data and join the sitemap automatically.'
|
|
3464
|
+
},
|
|
3465
|
+
{
|
|
3466
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3467
|
+
title: 'Order emails & status page',
|
|
3468
|
+
heading: '',
|
|
3469
|
+
anchor: '',
|
|
3470
|
+
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.'
|
|
3471
|
+
},
|
|
3472
|
+
{
|
|
3473
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3474
|
+
title: 'Order emails & status page',
|
|
3475
|
+
heading: 'What your customers get',
|
|
3476
|
+
anchor: '#customer-emails',
|
|
3477
|
+
text: '| When | Email | What it says |\n| -- | -- | -- |\n| An order is paid | Order receipt | The items, the total, any license keys and download links, and your receipt footer. Sent for checkout and Buy buttons, for payment links you send from a draft order, and for register sales when the customer gives an email. |\n| You ship part or all of an order | Order shipped | The items in that package, the carrier and tracking number with a tracking link, and how many items are still to ship. One email per package. |\n| You mark an order delivered | Order delivered | The order and its items. |\n| You refund an order | Order refunded | The amount, the items you refunded by name (if you picked any), and whether the order is now refunded in full. One email per refund. |\n| You cancel an order | Order canceled | The order and its items. Canceling doesn\'t refund a payment: refund first if the customer paid. |\nA dropship supplier who posts tracking for their part of an order sends the customer the same Order shipped email.\nEach email is sent once. If a payment confirmation arrives twice, or you click a button twice, the customer still gets one email. A second package or a second partial refund is a new email.\nRegister sales and orders with only digital or service items don\'t send a shipping or delivery email unless you add a tracking number.\nTracking links\nTracking links are built from the carrier you type when you fulfill: USPS, UPS, FedEx, DHL, Canada Post, Royal Mail and Australia Post are recognized, including spellings like "UPS Ground" or "Fed Ex". For any other carrier the email shows the carrier and tracking number without a link.\nTurning emails off\nAll five emails are on for every store. To turn one off, open Commerce → Settings → Customer notifications and switch it off. Switching th'
|
|
3478
|
+
},
|
|
3479
|
+
{
|
|
3480
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3481
|
+
title: 'Order emails & status page',
|
|
3482
|
+
heading: 'The order status page',
|
|
3483
|
+
anchor: '#order-status-page',
|
|
3484
|
+
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.'
|
|
3485
|
+
},
|
|
3486
|
+
{
|
|
3487
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3488
|
+
title: 'Order emails & status page',
|
|
3489
|
+
heading: 'Resend a receipt',
|
|
3490
|
+
anchor: '#resend-receipt',
|
|
3491
|
+
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.'
|
|
3492
|
+
},
|
|
3493
|
+
{
|
|
3494
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3495
|
+
title: 'Order emails & status page',
|
|
3496
|
+
heading: 'Text messages',
|
|
3497
|
+
anchor: '#text-messages',
|
|
3498
|
+
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.'
|
|
3499
|
+
},
|
|
3500
|
+
{
|
|
3501
|
+
path: '/commerce-and-bookings/commerce/order-notifications',
|
|
3502
|
+
title: 'Order emails & status page',
|
|
3503
|
+
heading: 'Related',
|
|
3504
|
+
anchor: '#related',
|
|
3505
|
+
text: '- Commerce overview\n- POS & reservations'
|
|
3506
|
+
},
|
|
3507
|
+
{
|
|
3508
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3509
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3510
|
+
heading: '',
|
|
3511
|
+
anchor: '',
|
|
3512
|
+
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.'
|
|
3513
|
+
},
|
|
3514
|
+
{
|
|
3515
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3516
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3517
|
+
heading: 'Ship an order in parts',
|
|
3518
|
+
anchor: '#fulfillment',
|
|
3519
|
+
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.'
|
|
3520
|
+
},
|
|
3521
|
+
{
|
|
3522
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3523
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3524
|
+
heading: 'Invoices and packing slips',
|
|
3525
|
+
anchor: '#invoices',
|
|
3526
|
+
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.'
|
|
3527
|
+
},
|
|
3528
|
+
{
|
|
3529
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3530
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3531
|
+
heading: 'Returns',
|
|
3532
|
+
anchor: '#returns',
|
|
3533
|
+
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'
|
|
3534
|
+
},
|
|
3535
|
+
{
|
|
3536
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3537
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3538
|
+
heading: 'Order webhooks',
|
|
3539
|
+
anchor: '#order-webhooks',
|
|
3540
|
+
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'
|
|
3541
|
+
},
|
|
3542
|
+
{
|
|
3543
|
+
path: '/commerce-and-bookings/commerce/orders-and-returns',
|
|
3544
|
+
title: 'Fulfillment, returns and webhooks',
|
|
3545
|
+
heading: 'Related',
|
|
3546
|
+
anchor: '#related',
|
|
3547
|
+
text: '- Commerce overview\n- Commerce end to end'
|
|
3450
3548
|
},
|
|
3451
3549
|
{
|
|
3452
3550
|
path: '/commerce-and-bookings/commerce/overview',
|
|
@@ -3488,14 +3586,21 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3488
3586
|
title: 'Commerce',
|
|
3489
3587
|
heading: 'Orders',
|
|
3490
3588
|
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
|
|
3589
|
+
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'
|
|
3590
|
+
},
|
|
3591
|
+
{
|
|
3592
|
+
path: '/commerce-and-bookings/commerce/overview',
|
|
3593
|
+
title: 'Commerce',
|
|
3594
|
+
heading: 'Payment methods',
|
|
3595
|
+
anchor: '#payment-methods',
|
|
3596
|
+
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
3597
|
},
|
|
3493
3598
|
{
|
|
3494
3599
|
path: '/commerce-and-bookings/commerce/overview',
|
|
3495
3600
|
title: 'Commerce',
|
|
3496
3601
|
heading: 'Shipping & taxes',
|
|
3497
3602
|
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
|
|
3603
|
+
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
3604
|
},
|
|
3500
3605
|
{
|
|
3501
3606
|
path: '/commerce-and-bookings/commerce/overview',
|
|
@@ -3509,7 +3614,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3509
3614
|
title: 'Commerce',
|
|
3510
3615
|
heading: 'Related',
|
|
3511
3616
|
anchor: '#related',
|
|
3512
|
-
text: '- Product catalog\n- Billing & plans\n- Bookings & scheduling'
|
|
3617
|
+
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
3618
|
},
|
|
3514
3619
|
{
|
|
3515
3620
|
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
@@ -3530,7 +3635,42 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3530
3635
|
title: 'POS & reservations',
|
|
3531
3636
|
heading: 'The register',
|
|
3532
3637
|
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 —
|
|
3638
|
+
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'
|
|
3639
|
+
},
|
|
3640
|
+
{
|
|
3641
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3642
|
+
title: 'POS & reservations',
|
|
3643
|
+
heading: 'Taking payment',
|
|
3644
|
+
anchor: '#taking-payment',
|
|
3645
|
+
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'
|
|
3646
|
+
},
|
|
3647
|
+
{
|
|
3648
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3649
|
+
title: 'POS & reservations',
|
|
3650
|
+
heading: 'Tips',
|
|
3651
|
+
anchor: '#tips',
|
|
3652
|
+
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.'
|
|
3653
|
+
},
|
|
3654
|
+
{
|
|
3655
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3656
|
+
title: 'POS & reservations',
|
|
3657
|
+
heading: 'Receipts',
|
|
3658
|
+
anchor: '#receipts',
|
|
3659
|
+
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.'
|
|
3660
|
+
},
|
|
3661
|
+
{
|
|
3662
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3663
|
+
title: 'POS & reservations',
|
|
3664
|
+
heading: 'Card readers',
|
|
3665
|
+
anchor: '#card-readers',
|
|
3666
|
+
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.'
|
|
3667
|
+
},
|
|
3668
|
+
{
|
|
3669
|
+
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
3670
|
+
title: 'POS & reservations',
|
|
3671
|
+
heading: 'Customer display',
|
|
3672
|
+
anchor: '#customer-display',
|
|
3673
|
+
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
3674
|
},
|
|
3535
3675
|
{
|
|
3536
3676
|
path: '/commerce-and-bookings/commerce/pos-and-reservations',
|
|
@@ -3544,21 +3684,224 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3544
3684
|
title: 'POS & reservations',
|
|
3545
3685
|
heading: 'Related',
|
|
3546
3686
|
anchor: '#related',
|
|
3547
|
-
text: '- Commerce overview\n- Product catalog'
|
|
3687
|
+
text: '- POS hardware\n- Commerce overview\n- Product catalog'
|
|
3688
|
+
},
|
|
3689
|
+
{
|
|
3690
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3691
|
+
title: 'POS hardware',
|
|
3692
|
+
heading: '',
|
|
3693
|
+
anchor: '',
|
|
3694
|
+
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.'
|
|
3695
|
+
},
|
|
3696
|
+
{
|
|
3697
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3698
|
+
title: 'POS hardware',
|
|
3699
|
+
heading: 'Recommended kit',
|
|
3700
|
+
anchor: '#recommended-kit',
|
|
3701
|
+
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 |'
|
|
3702
|
+
},
|
|
3703
|
+
{
|
|
3704
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3705
|
+
title: 'POS hardware',
|
|
3706
|
+
heading: 'Card readers',
|
|
3707
|
+
anchor: '#card-readers',
|
|
3708
|
+
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'
|
|
3709
|
+
},
|
|
3710
|
+
{
|
|
3711
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3712
|
+
title: 'POS hardware',
|
|
3713
|
+
heading: 'Receipt printers',
|
|
3714
|
+
anchor: '#receipt-printers',
|
|
3715
|
+
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 '
|
|
3716
|
+
},
|
|
3717
|
+
{
|
|
3718
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3719
|
+
title: 'POS hardware',
|
|
3720
|
+
heading: 'Cash drawer',
|
|
3721
|
+
anchor: '#cash-drawer',
|
|
3722
|
+
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.'
|
|
3723
|
+
},
|
|
3724
|
+
{
|
|
3725
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3726
|
+
title: 'POS hardware',
|
|
3727
|
+
heading: 'Barcode scanning',
|
|
3728
|
+
anchor: '#barcode-scanning',
|
|
3729
|
+
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.'
|
|
3730
|
+
},
|
|
3731
|
+
{
|
|
3732
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3733
|
+
title: 'POS hardware',
|
|
3734
|
+
heading: 'Label printers',
|
|
3735
|
+
anchor: '#label-printers',
|
|
3736
|
+
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.'
|
|
3737
|
+
},
|
|
3738
|
+
{
|
|
3739
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3740
|
+
title: 'POS hardware',
|
|
3741
|
+
heading: 'Customer display tablet',
|
|
3742
|
+
anchor: '#customer-display-tablet',
|
|
3743
|
+
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.'
|
|
3744
|
+
},
|
|
3745
|
+
{
|
|
3746
|
+
path: '/commerce-and-bookings/commerce/pos-hardware',
|
|
3747
|
+
title: 'POS hardware',
|
|
3748
|
+
heading: 'Related',
|
|
3749
|
+
anchor: '#related',
|
|
3750
|
+
text: '- POS & reservations\n- Running the register\n- Product catalog'
|
|
3751
|
+
},
|
|
3752
|
+
{
|
|
3753
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3754
|
+
title: 'Running the register',
|
|
3755
|
+
heading: '',
|
|
3756
|
+
anchor: '',
|
|
3757
|
+
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.'
|
|
3758
|
+
},
|
|
3759
|
+
{
|
|
3760
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3761
|
+
title: 'Running the register',
|
|
3762
|
+
heading: 'Shifts and the cash drawer',
|
|
3763
|
+
anchor: '#shifts-and-the-cash-drawer',
|
|
3764
|
+
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'
|
|
3765
|
+
},
|
|
3766
|
+
{
|
|
3767
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3768
|
+
title: 'Running the register',
|
|
3769
|
+
heading: 'Staff PINs',
|
|
3770
|
+
anchor: '#staff-pins',
|
|
3771
|
+
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.'
|
|
3772
|
+
},
|
|
3773
|
+
{
|
|
3774
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3775
|
+
title: 'Running the register',
|
|
3776
|
+
heading: 'Customers at the register',
|
|
3777
|
+
anchor: '#customers-at-the-register',
|
|
3778
|
+
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.'
|
|
3779
|
+
},
|
|
3780
|
+
{
|
|
3781
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3782
|
+
title: 'Running the register',
|
|
3783
|
+
heading: 'Returns and exchanges',
|
|
3784
|
+
anchor: '#returns-and-exchanges',
|
|
3785
|
+
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.'
|
|
3786
|
+
},
|
|
3787
|
+
{
|
|
3788
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3789
|
+
title: 'Running the register',
|
|
3790
|
+
heading: 'Printed receipts',
|
|
3791
|
+
anchor: '#printed-receipts',
|
|
3792
|
+
text: 'Receipts print on any 80 mm receipt printer through your browser\'s print dialog. Each receipt has your logo and store name, the order number and its barcode, the date, cashier and register, the customer\'s name, every item, discounts, tax, the total, how it was paid (card with its last four digits), the tip and change, and your receipt footer from Commerce → Settings. Two more lines are set in Admin → Plugins → Commerce: Address on printed receipts, printed under your store name, and Return policy on printed receipts, printed at the foot.\n- After each sale, the register shows Print receipt and Gift receipt for that sale until the next one completes.\n- Gift receipt prints the items and the barcode without any prices.\n- Reprint any register sale from its order on the Orders page: open the order and use Print receipt or Gift receipt.\nMost network receipt printers open the cash drawer cabled to them whenever they print, so printing a cash sale\'s receipt also opens the drawer. That is a setting on the printer.'
|
|
3793
|
+
},
|
|
3794
|
+
{
|
|
3795
|
+
path: '/commerce-and-bookings/commerce/pos-operations',
|
|
3796
|
+
title: 'Running the register',
|
|
3797
|
+
heading: 'Related',
|
|
3798
|
+
anchor: '#related',
|
|
3799
|
+
text: '- POS & reservations\n- Commerce overview'
|
|
3800
|
+
},
|
|
3801
|
+
{
|
|
3802
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3803
|
+
title: 'Sales channels',
|
|
3804
|
+
heading: '',
|
|
3805
|
+
anchor: '',
|
|
3806
|
+
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.'
|
|
3807
|
+
},
|
|
3808
|
+
{
|
|
3809
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3810
|
+
title: 'Sales channels',
|
|
3811
|
+
heading: 'Turn on a channel',
|
|
3812
|
+
anchor: '#turn-on-a-channel',
|
|
3813
|
+
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.'
|
|
3814
|
+
},
|
|
3815
|
+
{
|
|
3816
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3817
|
+
title: 'Sales channels',
|
|
3818
|
+
heading: 'What each product sends',
|
|
3819
|
+
anchor: '#what-each-product-sends',
|
|
3820
|
+
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'
|
|
3821
|
+
},
|
|
3822
|
+
{
|
|
3823
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3824
|
+
title: 'Sales channels',
|
|
3825
|
+
heading: 'Check your products',
|
|
3826
|
+
anchor: '#check-your-products',
|
|
3827
|
+
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.'
|
|
3828
|
+
},
|
|
3829
|
+
{
|
|
3830
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3831
|
+
title: 'Sales channels',
|
|
3832
|
+
heading: 'How fresh the feed is',
|
|
3833
|
+
anchor: '#how-fresh-the-feed-is',
|
|
3834
|
+
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.'
|
|
3835
|
+
},
|
|
3836
|
+
{
|
|
3837
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3838
|
+
title: 'Sales channels',
|
|
3839
|
+
heading: 'The earlier Google Merchant Center address',
|
|
3840
|
+
anchor: '#earlier-merchant-center-address',
|
|
3841
|
+
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.'
|
|
3842
|
+
},
|
|
3843
|
+
{
|
|
3844
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3845
|
+
title: 'Sales channels',
|
|
3846
|
+
heading: 'Turn sales channels off for a site',
|
|
3847
|
+
anchor: '#turn-off',
|
|
3848
|
+
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.'
|
|
3849
|
+
},
|
|
3850
|
+
{
|
|
3851
|
+
path: '/commerce-and-bookings/commerce/sales-channels',
|
|
3852
|
+
title: 'Sales channels',
|
|
3853
|
+
heading: 'Related',
|
|
3854
|
+
anchor: '#related',
|
|
3855
|
+
text: '- Catalog\n- Shipping'
|
|
3856
|
+
},
|
|
3857
|
+
{
|
|
3858
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3859
|
+
title: 'Shipping',
|
|
3860
|
+
heading: '',
|
|
3861
|
+
anchor: '',
|
|
3862
|
+
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.'
|
|
3863
|
+
},
|
|
3864
|
+
{
|
|
3865
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3866
|
+
title: 'Shipping',
|
|
3867
|
+
heading: 'Zones and rates',
|
|
3868
|
+
anchor: '#zones-and-rates',
|
|
3869
|
+
text: 'A zone owns countries; is the rest of the world. A rate belongs to one zone and prices a parcel in one of four ways:\n| Rate type | What the shopper pays |\n| -- | -- |\n| Flat | One price. |\n| Free over subtotal | One price, or nothing once the cart reaches the subtotal you set. |\n| Subtotal tiers | The price of the first tier the cart\'s subtotal fits under. |\n| Weight tiers | The price of the first tier the cart\'s weight fits under. Weight is each variant\'s weight times its quantity. |\nLocal pickup adds a free collection choice beside your rates. It does not widen where you ship: a destination no rate reaches is still refused.\nCheckout charges only the rates of the zone the destination falls in, and narrows the address it collects to that destination, so a shopper cannot pick another zone\'s cheaper rate. The destination coverage rules explain what your zones make checkout ask and refuse.'
|
|
3870
|
+
},
|
|
3871
|
+
{
|
|
3872
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3873
|
+
title: 'Shipping',
|
|
3874
|
+
heading: 'Where parcels ship from',
|
|
3875
|
+
anchor: '#where-parcels-ship-from',
|
|
3876
|
+
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.'
|
|
3877
|
+
},
|
|
3878
|
+
{
|
|
3879
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3880
|
+
title: 'Shipping',
|
|
3881
|
+
heading: 'Carrier accounts',
|
|
3882
|
+
anchor: '#carrier-accounts',
|
|
3883
|
+
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.'
|
|
3884
|
+
},
|
|
3885
|
+
{
|
|
3886
|
+
path: '/commerce-and-bookings/commerce/shipping',
|
|
3887
|
+
title: 'Shipping',
|
|
3888
|
+
heading: 'Shipping labels',
|
|
3889
|
+
anchor: '#shipping-labels',
|
|
3890
|
+
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
3891
|
},
|
|
3549
3892
|
{
|
|
3550
3893
|
path: '/commerce-and-bookings/commerce/store-import-and-export',
|
|
3551
3894
|
title: 'Import and export store data',
|
|
3552
3895
|
heading: '',
|
|
3553
3896
|
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.'
|
|
3897
|
+
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
3898
|
},
|
|
3556
3899
|
{
|
|
3557
3900
|
path: '/commerce-and-bookings/commerce/store-import-and-export',
|
|
3558
3901
|
title: 'Import and export store data',
|
|
3559
3902
|
heading: 'Export',
|
|
3560
3903
|
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
|
|
3904
|
+
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
3905
|
},
|
|
3563
3906
|
{
|
|
3564
3907
|
path: '/commerce-and-bookings/commerce/store-import-and-export',
|
|
@@ -3567,6 +3910,146 @@ export const DOCS_SECTION_INDEX = [
|
|
|
3567
3910
|
anchor: '#import',
|
|
3568
3911
|
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
3912
|
},
|
|
3913
|
+
{
|
|
3914
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
3915
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
3916
|
+
heading: '',
|
|
3917
|
+
anchor: '',
|
|
3918
|
+
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.'
|
|
3919
|
+
},
|
|
3920
|
+
{
|
|
3921
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
3922
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
3923
|
+
heading: 'Export the orders to ship',
|
|
3924
|
+
anchor: '#export',
|
|
3925
|
+
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.'
|
|
3926
|
+
},
|
|
3927
|
+
{
|
|
3928
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
3929
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
3930
|
+
heading: 'Buy the labels in Pirate Ship',
|
|
3931
|
+
anchor: '#labels',
|
|
3932
|
+
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.'
|
|
3933
|
+
},
|
|
3934
|
+
{
|
|
3935
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
3936
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
3937
|
+
heading: 'Import the tracking numbers',
|
|
3938
|
+
anchor: '#import',
|
|
3939
|
+
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.'
|
|
3940
|
+
},
|
|
3941
|
+
{
|
|
3942
|
+
path: '/commerce-and-bookings/commerce/use-pirate-ship',
|
|
3943
|
+
title: 'Use Pirate Ship with Aglyn',
|
|
3944
|
+
heading: 'Related',
|
|
3945
|
+
anchor: '#related',
|
|
3946
|
+
text: '- Use ShipStation with Aglyn\n- Use ShippingEasy with Aglyn\n- Import and export store data\n- Commerce'
|
|
3947
|
+
},
|
|
3948
|
+
{
|
|
3949
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3950
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
3951
|
+
heading: '',
|
|
3952
|
+
anchor: '',
|
|
3953
|
+
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.'
|
|
3954
|
+
},
|
|
3955
|
+
{
|
|
3956
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3957
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
3958
|
+
heading: 'Before you start',
|
|
3959
|
+
anchor: '#before-you-start',
|
|
3960
|
+
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.'
|
|
3961
|
+
},
|
|
3962
|
+
{
|
|
3963
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3964
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
3965
|
+
heading: 'Connect ShippingEasy',
|
|
3966
|
+
anchor: '#connect',
|
|
3967
|
+
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.'
|
|
3968
|
+
},
|
|
3969
|
+
{
|
|
3970
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3971
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
3972
|
+
heading: 'What Aglyn sends',
|
|
3973
|
+
anchor: '#what-is-sent',
|
|
3974
|
+
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.'
|
|
3975
|
+
},
|
|
3976
|
+
{
|
|
3977
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3978
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
3979
|
+
heading: 'When you ship in ShippingEasy',
|
|
3980
|
+
anchor: '#ship',
|
|
3981
|
+
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.'
|
|
3982
|
+
},
|
|
3983
|
+
{
|
|
3984
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3985
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
3986
|
+
heading: 'Change keys or disconnect',
|
|
3987
|
+
anchor: '#manage',
|
|
3988
|
+
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.'
|
|
3989
|
+
},
|
|
3990
|
+
{
|
|
3991
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3992
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
3993
|
+
heading: 'Troubleshooting',
|
|
3994
|
+
anchor: '#troubleshooting',
|
|
3995
|
+
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. |'
|
|
3996
|
+
},
|
|
3997
|
+
{
|
|
3998
|
+
path: '/commerce-and-bookings/commerce/use-shippingeasy',
|
|
3999
|
+
title: 'Use ShippingEasy with Aglyn',
|
|
4000
|
+
heading: 'Related',
|
|
4001
|
+
anchor: '#related',
|
|
4002
|
+
text: '- Use ShipStation with Aglyn\n- Use Pirate Ship with Aglyn\n- Commerce'
|
|
4003
|
+
},
|
|
4004
|
+
{
|
|
4005
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4006
|
+
title: 'Use ShipStation with Aglyn',
|
|
4007
|
+
heading: '',
|
|
4008
|
+
anchor: '',
|
|
4009
|
+
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.'
|
|
4010
|
+
},
|
|
4011
|
+
{
|
|
4012
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4013
|
+
title: 'Use ShipStation with Aglyn',
|
|
4014
|
+
heading: 'Connect ShipStation',
|
|
4015
|
+
anchor: '#connect',
|
|
4016
|
+
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.'
|
|
4017
|
+
},
|
|
4018
|
+
{
|
|
4019
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4020
|
+
title: 'Use ShipStation with Aglyn',
|
|
4021
|
+
heading: 'What ShipStation imports',
|
|
4022
|
+
anchor: '#what-imports',
|
|
4023
|
+
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.'
|
|
4024
|
+
},
|
|
4025
|
+
{
|
|
4026
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4027
|
+
title: 'Use ShipStation with Aglyn',
|
|
4028
|
+
heading: 'When you ship in ShipStation',
|
|
4029
|
+
anchor: '#ship',
|
|
4030
|
+
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.'
|
|
4031
|
+
},
|
|
4032
|
+
{
|
|
4033
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4034
|
+
title: 'Use ShipStation with Aglyn',
|
|
4035
|
+
heading: 'Make a new password or disconnect',
|
|
4036
|
+
anchor: '#manage',
|
|
4037
|
+
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.'
|
|
4038
|
+
},
|
|
4039
|
+
{
|
|
4040
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4041
|
+
title: 'Use ShipStation with Aglyn',
|
|
4042
|
+
heading: 'Troubleshooting',
|
|
4043
|
+
anchor: '#troubleshooting',
|
|
4044
|
+
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. |'
|
|
4045
|
+
},
|
|
4046
|
+
{
|
|
4047
|
+
path: '/commerce-and-bookings/commerce/use-shipstation',
|
|
4048
|
+
title: 'Use ShipStation with Aglyn',
|
|
4049
|
+
heading: 'Related',
|
|
4050
|
+
anchor: '#related',
|
|
4051
|
+
text: '- Use Pirate Ship with Aglyn\n- Use ShippingEasy with Aglyn\n- Import and export store data\n- Commerce'
|
|
4052
|
+
},
|
|
3570
4053
|
{
|
|
3571
4054
|
path: '/concepts/glossary',
|
|
3572
4055
|
title: 'Glossary & naming conventions',
|
|
@@ -4853,7 +5336,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
4853
5336
|
title: 'Share records across sites',
|
|
4854
5337
|
heading: '',
|
|
4855
5338
|
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.'
|
|
5339
|
+
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
5340
|
},
|
|
4858
5341
|
{
|
|
4859
5342
|
path: '/content-and-data/crm/sharing',
|
|
@@ -4909,7 +5392,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
4909
5392
|
title: 'Tasks & follow-ups',
|
|
4910
5393
|
heading: '',
|
|
4911
5394
|
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
|
|
5395
|
+
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
5396
|
},
|
|
4914
5397
|
{
|
|
4915
5398
|
path: '/content-and-data/crm/tasks',
|
|
@@ -5182,7 +5665,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
5182
5665
|
title: 'Datasets & Dynamic Content',
|
|
5183
5666
|
heading: 'Who a dataset is shared with',
|
|
5184
5667
|
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
|
|
5668
|
+
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
5669
|
},
|
|
5187
5670
|
{
|
|
5188
5671
|
path: '/content-and-data/datasets/overview',
|
|
@@ -5385,7 +5868,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
5385
5868
|
title: 'Media Library & CDN',
|
|
5386
5869
|
heading: 'Upload',
|
|
5387
5870
|
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 where photos are on, and adds it to the folder you have open with alt text. Each picture is stored like an upload and costs AI credits — see Create images with AI.\n- Documents and archives are stored and served exactly as you uploaded them — nothing is opened, extracted or converted. Macro-enabled Office files (.docm, .xlsm, .pptm) are not accepted.\n- Rename, replace the file behind an asset, and edit images in place. Replace works for images, PDFs, archives and documents alike, and for video once video uploads resume — it is available from the asset\'s details drawer and straight from the card\'s overflow menu, and it keeps the asset\'s link, folder, tags, alt text, custom fields and sharing exactly as they were. Swapping one kind of file for another is not allowed: upload that as a new file. Cropping, rotating and resizing stay images-only,
|
|
5871
|
+
text: '- Upload images, PDFs, ZIP archives and documents (Word, Excel, PowerPoint, CSV, RTF, plain text, Markdown and JSON). Click Upload media, or drag files straight from your desktop onto the library — dropped files land in the folder you have open.\n- Video uploads are paused. New MP4, WebM and QuickTime files are not accepted on any plan for now, from the console or the API, and a video\'s file cannot be replaced. Videos already in your library keep playing, and the Video element can still use them. While the pause lasts, the library shows a Video uploads paused chip beside Upload media.\n- Create images with AI. Create with AI, beside Upload media, draws an illustration, icon, pattern or logo mark as an SVG from a description, or makes a photo where photos are on, and adds it to the folder you have open with alt text. Each picture is stored like an upload and costs AI credits — see Create images with AI.\n- Web fonts (WOFF2) are accepted too. The usual way to add one is Upload your own font in the theme editor, which checks the font\'s license, converts a TTF, OTF or WOFF to WOFF2 and stores it here.\n- Documents and archives are stored and served exactly as you uploaded them — nothing is opened, extracted or converted. Macro-enabled Office files (.docm, .xlsm, .pptm) are not accepted.\n- Rename, replace the file behind an asset, and edit images in place. Replace works for images, PDFs, archives and documents alike, and for video once video uploads resume — it is available from the asset\'s details drawer and straight from the card\'s overflow menu, and it keeps the asset\'s link, folder, tags, alt text, custom fields and sharing exactly as they were. Swapping one kind of file for another is not allowed: upload that as a new file. Cropping, rotating and resizing stay images-only, '
|
|
5389
5872
|
},
|
|
5390
5873
|
{
|
|
5391
5874
|
path: '/content-and-data/media/overview',
|
|
@@ -5399,7 +5882,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
5399
5882
|
title: 'Media Library & CDN',
|
|
5400
5883
|
heading: 'Who an asset is shared with',
|
|
5401
5884
|
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
|
|
5885
|
+
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
5886
|
},
|
|
5404
5887
|
{
|
|
5405
5888
|
path: '/content-and-data/media/overview',
|
|
@@ -6127,7 +6610,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6127
6610
|
title: 'Injection zones',
|
|
6128
6611
|
heading: 'How a zone spaces your widget',
|
|
6129
6612
|
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-
|
|
6613
|
+
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
6614
|
},
|
|
6132
6615
|
{
|
|
6133
6616
|
path: '/developers/plugins/reference/injection-zones',
|
|
@@ -6260,7 +6743,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6260
6743
|
title: 'Plugin-manager API reference',
|
|
6261
6744
|
heading: 'Console extensions — `feature-plugins`',
|
|
6262
6745
|
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|
|
|
6746
|
+
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
6747
|
},
|
|
6265
6748
|
{
|
|
6266
6749
|
path: '/developers/plugins/reference/plugin-manager-api',
|
|
@@ -6612,6 +7095,13 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6612
7095
|
anchor: '#platform-events--plugin-events-server',
|
|
6613
7096
|
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
7097
|
},
|
|
7098
|
+
{
|
|
7099
|
+
path: '/developers/plugins/reference/plugin-manager-api',
|
|
7100
|
+
title: 'Plugin-manager API reference',
|
|
7101
|
+
heading: 'Plugin events — `plugin-domain-events` (`/server`)',
|
|
7102
|
+
anchor: '#plugin-events--plugin-domain-events-server',
|
|
7103
|
+
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'
|
|
7104
|
+
},
|
|
6615
7105
|
{
|
|
6616
7106
|
path: '/developers/plugins/reference/plugin-manager-api',
|
|
6617
7107
|
title: 'Plugin-manager API reference',
|
|
@@ -6913,6 +7403,13 @@ export const DOCS_SECTION_INDEX = [
|
|
|
6913
7403
|
anchor: '#email',
|
|
6914
7404
|
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
7405
|
},
|
|
7406
|
+
{
|
|
7407
|
+
path: '/developers/self-hosting-environment',
|
|
7408
|
+
title: 'Environment variables',
|
|
7409
|
+
heading: 'Mobile apps and push',
|
|
7410
|
+
anchor: '#mobile',
|
|
7411
|
+
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'
|
|
7412
|
+
},
|
|
6916
7413
|
{
|
|
6917
7414
|
path: '/developers/self-hosting-environment',
|
|
6918
7415
|
title: 'Environment variables',
|
|
@@ -7380,7 +7877,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
7380
7877
|
title: 'Create a site',
|
|
7381
7878
|
heading: 'Create your first site',
|
|
7382
7879
|
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
|
|
7880
|
+
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
7881
|
},
|
|
7385
7882
|
{
|
|
7386
7883
|
path: '/getting-started/create-a-site',
|
|
@@ -7597,7 +8094,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
7597
8094
|
title: 'Commerce end to end',
|
|
7598
8095
|
heading: '4. What checkout does',
|
|
7599
8096
|
anchor: '#4-what-checkout-does',
|
|
7600
|
-
text: 'Both buy buttons and the cart\'s Checkout
|
|
8097
|
+
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
8098
|
},
|
|
7602
8099
|
{
|
|
7603
8100
|
path: '/guides/commerce-end-to-end',
|
|
@@ -8311,7 +8808,7 @@ export const DOCS_SECTION_INDEX = [
|
|
|
8311
8808
|
title: 'Insights',
|
|
8312
8809
|
heading: 'How an answer is made',
|
|
8313
8810
|
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.'
|
|
8811
|
+
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
8812
|
},
|
|
8316
8813
|
{
|
|
8317
8814
|
path: '/marketing-and-automation/analytics/insights',
|