@aglyn/shared-util-email 1.0.0-beta.290 → 1.0.0-beta.291
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 +3 -3
- package/src/index.d.ts +1 -0
- package/src/index.js +3 -0
- package/src/index.js.map +1 -1
- package/src/lib/email-thread.d.ts +70 -0
- package/src/lib/email-thread.js +149 -0
- package/src/lib/email-thread.js.map +1 -0
- package/src/lib/tenant-emails.generated.js +321 -0
- package/src/lib/tenant-emails.generated.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aglyn/shared-util-email",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.291",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"homepage": "https://aglyn.com",
|
|
6
6
|
"repository": {
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"./package.json": "./package.json"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@aglyn/shared-data-enums": "1.0.0-beta.
|
|
29
|
-
"@aglyn/shared-util-http": "1.0.0-beta.
|
|
28
|
+
"@aglyn/shared-data-enums": "1.0.0-beta.291",
|
|
29
|
+
"@aglyn/shared-util-http": "1.0.0-beta.291",
|
|
30
30
|
"@msgpack/msgpack": "^3.1.3",
|
|
31
31
|
"@swc/helpers": "0.5.23"
|
|
32
32
|
},
|
package/src/index.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ export * from './lib/host-email-render';
|
|
|
39
39
|
export * from './lib/email-render';
|
|
40
40
|
export * from './lib/text-email-html';
|
|
41
41
|
export * from './lib/marketing-send';
|
|
42
|
+
export * from './lib/email-thread';
|
|
42
43
|
export * from './lib/list-unsubscribe';
|
|
43
44
|
export * from './lib/email-delivery-events';
|
|
44
45
|
export * from './lib/received-email';
|
package/src/index.js
CHANGED
|
@@ -43,6 +43,9 @@ export * from "./lib/host-email-render.js";
|
|
|
43
43
|
export * from "./lib/email-render.js";
|
|
44
44
|
export * from "./lib/text-email-html.js";
|
|
45
45
|
export * from "./lib/marketing-send.js";
|
|
46
|
+
// One conversation in the recipient's mailbox (AGL-4097): Message-ID,
|
|
47
|
+
// In-Reply-To and References for a record's later messages. Pure.
|
|
48
|
+
export * from "./lib/email-thread.js";
|
|
46
49
|
// The List-Unsubscribe setting sequences and campaigns share (AGL-3307).
|
|
47
50
|
export * from "./lib/list-unsubscribe.js";
|
|
48
51
|
export * from "./lib/email-delivery-events.js";
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../libs/shared/util/email/src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './lib/send-email'\n// Who carries the mail (AGL-3080): the provider contract, and the selection\n// of the deployment's provider from the built-ins and any a plugin\n// registered. The providers themselves are imported by their own paths —\n// `@aglyn/shared-util-email/mail-provider-resend`, `…/mail-provider-webhook`\n// — because nothing outside the seam should name one.\nexport * from './lib/mail-provider'\nexport * from './lib/mail-providers'\nexport * from './lib/send-rate'\nexport * from './lib/sender-reputation'\nexport * from './lib/send-ceilings'\nexport * from './lib/sending-domain'\nexport * from './lib/tracking-host'\nexport * from './lib/sending-mailbox'\nexport * from './lib/host-sender'\nexport * from './lib/platform-sending-domain'\nexport * from './lib/email-health'\nexport * from './lib/system-email-catalog'\nexport * from './lib/retention-emails'\nexport * from './lib/site-care-emails'\nexport * from './lib/site-care-project-emails'\nexport * from './lib/domain-emails'\nexport * from './lib/pos-hardware-emails'\nexport * from './lib/pos-cellular-emails'\nexport * from './lib/welcome-email'\nexport * from './lib/tenant-email-catalog'\nexport * from './lib/host-email-render'\nexport * from './lib/email-render'\nexport * from './lib/text-email-html'\nexport * from './lib/marketing-send'\n// The List-Unsubscribe setting sequences and campaigns share (AGL-3307).\nexport * from './lib/list-unsubscribe'\nexport * from './lib/email-delivery-events'\n// Received mail in the platform's vocabulary, which the CRM's capture route\n// files from (AGL-2657); the provider reads it.\n// Its neighbor `./lib/svix-signature` is deliberately NOT re-exported here:\n// it holds a `crypto` HMAC, and this barrel is reached from the browser\n// through `@aglyn/shared-ui-email-campaigns`, so a webhook imports it by its\n// own path — `@aglyn/shared-util-email/svix-signature`.\nexport * from './lib/received-email'\nexport * from './lib/email-revenue-window'\n// Exported so the console drift guard can pin it against @aglyn/aglyn.\nexport * from './lib/email-media-src'\n// Same arrangement, same reason (AGL-1223): a copy of `decodeStoredNodes`\n// this scope:shared lib may not import, pinned by `email-nodes-drift.spec.ts`.\nexport * from './lib/stored-email-nodes'\nexport * from './lib/email-merge'\n// The deliverability engine every send path asks (AGL-3328): the gateway an\n// MX names and its ledger, the bounce reader, and the address verdicts. Pure\n// — the DNS lookup and the store are injected by `@aglyn/tenant-data-admin`,\n// so nothing here reaches `node:dns` from the browser.\nexport * from './lib/mail-gateway'\nexport * from './lib/mail-bounce'\nexport * from './lib/email-deliverability'\n// The sender's side of the same engine (AGL-3328): SPF, DKIM and DMARC for\n// the domain mail leaves from, and whether they align. Pure as well; the\n// lookups are `@aglyn/tenant-data-admin`'s.\nexport * from './lib/sender-readiness'\n// The outbound phishing screen a young workspace's campaigns and automated\n// email pass (AGL-3356). Pure; the hold it leads to is `tenant-data-admin`'s.\nexport * from './lib/outbound-phishing-screen'\n// The send seam's gate for that screen — the store a hold writes is injected\n// by `@aglyn/tenant-data-admin`, like the governor's.\nexport * from './lib/outbound-screen-gate'\n// The same screen read over a published page (AGL-3356): lookalike links and\n// embeds, author-defined credential fields, a brand's call to action.\nexport * from './lib/hosted-page-screen'\n// The reputation lookup every foreign link a page, an email or a redirect\n// points at passes (AGL-3451). Pure; the lookup is injected by\n// `@aglyn/tenant-data-admin`, which holds the credential and the cache.\nexport * from './lib/link-reputation'\n// The site's theme palette as plain data (AGL-3370), so a palette token an\n// author picked resolves in mail. Built without MUI; `shared-ui-theme`'s\n// parity spec holds it equal to the theme.\nexport * from './lib/email-palette'\nexport * from './lib/email-design-chrome'\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,cAAc,sBAAkB;AAChC,4EAA4E;AAC5E,mEAAmE;AACnE,yEAAyE;AACzE,6EAA6E;AAC7E,sDAAsD;AACtD,cAAc,yBAAqB;AACnC,cAAc,0BAAsB;AACpC,cAAc,qBAAiB;AAC/B,cAAc,6BAAyB;AACvC,cAAc,yBAAqB;AACnC,cAAc,0BAAsB;AACpC,cAAc,yBAAqB;AACnC,cAAc,2BAAuB;AACrC,cAAc,uBAAmB;AACjC,cAAc,mCAA+B;AAC7C,cAAc,wBAAoB;AAClC,cAAc,gCAA4B;AAC1C,cAAc,4BAAwB;AACtC,cAAc,4BAAwB;AACtC,cAAc,oCAAgC;AAC9C,cAAc,yBAAqB;AACnC,cAAc,+BAA2B;AACzC,cAAc,+BAA2B;AACzC,cAAc,yBAAqB;AACnC,cAAc,gCAA4B;AAC1C,cAAc,6BAAyB;AACvC,cAAc,wBAAoB;AAClC,cAAc,2BAAuB;AACrC,cAAc,0BAAsB;AACpC,yEAAyE;AACzE,cAAc,4BAAwB;AACtC,cAAc,iCAA6B;AAC3C,4EAA4E;AAC5E,gDAAgD;AAChD,4EAA4E;AAC5E,wEAAwE;AACxE,6EAA6E;AAC7E,wDAAwD;AACxD,cAAc,0BAAsB;AACpC,cAAc,gCAA4B;AAC1C,uEAAuE;AACvE,cAAc,2BAAuB;AACrC,0EAA0E;AAC1E,+EAA+E;AAC/E,cAAc,8BAA0B;AACxC,cAAc,uBAAmB;AACjC,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,uDAAuD;AACvD,cAAc,wBAAoB;AAClC,cAAc,uBAAmB;AACjC,cAAc,gCAA4B;AAC1C,2EAA2E;AAC3E,yEAAyE;AACzE,4CAA4C;AAC5C,cAAc,4BAAwB;AACtC,2EAA2E;AAC3E,8EAA8E;AAC9E,cAAc,oCAAgC;AAC9C,6EAA6E;AAC7E,sDAAsD;AACtD,cAAc,gCAA4B;AAC1C,6EAA6E;AAC7E,sEAAsE;AACtE,cAAc,8BAA0B;AACxC,0EAA0E;AAC1E,+DAA+D;AAC/D,wEAAwE;AACxE,cAAc,2BAAuB;AACrC,2EAA2E;AAC3E,yEAAyE;AACzE,2CAA2C;AAC3C,cAAc,yBAAqB;AACnC,cAAc,+BAA2B"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/shared/util/email/src/index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport * from './lib/send-email'\n// Who carries the mail (AGL-3080): the provider contract, and the selection\n// of the deployment's provider from the built-ins and any a plugin\n// registered. The providers themselves are imported by their own paths —\n// `@aglyn/shared-util-email/mail-provider-resend`, `…/mail-provider-webhook`\n// — because nothing outside the seam should name one.\nexport * from './lib/mail-provider'\nexport * from './lib/mail-providers'\nexport * from './lib/send-rate'\nexport * from './lib/sender-reputation'\nexport * from './lib/send-ceilings'\nexport * from './lib/sending-domain'\nexport * from './lib/tracking-host'\nexport * from './lib/sending-mailbox'\nexport * from './lib/host-sender'\nexport * from './lib/platform-sending-domain'\nexport * from './lib/email-health'\nexport * from './lib/system-email-catalog'\nexport * from './lib/retention-emails'\nexport * from './lib/site-care-emails'\nexport * from './lib/site-care-project-emails'\nexport * from './lib/domain-emails'\nexport * from './lib/pos-hardware-emails'\nexport * from './lib/pos-cellular-emails'\nexport * from './lib/welcome-email'\nexport * from './lib/tenant-email-catalog'\nexport * from './lib/host-email-render'\nexport * from './lib/email-render'\nexport * from './lib/text-email-html'\nexport * from './lib/marketing-send'\n// One conversation in the recipient's mailbox (AGL-4097): Message-ID,\n// In-Reply-To and References for a record's later messages. Pure.\nexport * from './lib/email-thread'\n// The List-Unsubscribe setting sequences and campaigns share (AGL-3307).\nexport * from './lib/list-unsubscribe'\nexport * from './lib/email-delivery-events'\n// Received mail in the platform's vocabulary, which the CRM's capture route\n// files from (AGL-2657); the provider reads it.\n// Its neighbor `./lib/svix-signature` is deliberately NOT re-exported here:\n// it holds a `crypto` HMAC, and this barrel is reached from the browser\n// through `@aglyn/shared-ui-email-campaigns`, so a webhook imports it by its\n// own path — `@aglyn/shared-util-email/svix-signature`.\nexport * from './lib/received-email'\nexport * from './lib/email-revenue-window'\n// Exported so the console drift guard can pin it against @aglyn/aglyn.\nexport * from './lib/email-media-src'\n// Same arrangement, same reason (AGL-1223): a copy of `decodeStoredNodes`\n// this scope:shared lib may not import, pinned by `email-nodes-drift.spec.ts`.\nexport * from './lib/stored-email-nodes'\nexport * from './lib/email-merge'\n// The deliverability engine every send path asks (AGL-3328): the gateway an\n// MX names and its ledger, the bounce reader, and the address verdicts. Pure\n// — the DNS lookup and the store are injected by `@aglyn/tenant-data-admin`,\n// so nothing here reaches `node:dns` from the browser.\nexport * from './lib/mail-gateway'\nexport * from './lib/mail-bounce'\nexport * from './lib/email-deliverability'\n// The sender's side of the same engine (AGL-3328): SPF, DKIM and DMARC for\n// the domain mail leaves from, and whether they align. Pure as well; the\n// lookups are `@aglyn/tenant-data-admin`'s.\nexport * from './lib/sender-readiness'\n// The outbound phishing screen a young workspace's campaigns and automated\n// email pass (AGL-3356). Pure; the hold it leads to is `tenant-data-admin`'s.\nexport * from './lib/outbound-phishing-screen'\n// The send seam's gate for that screen — the store a hold writes is injected\n// by `@aglyn/tenant-data-admin`, like the governor's.\nexport * from './lib/outbound-screen-gate'\n// The same screen read over a published page (AGL-3356): lookalike links and\n// embeds, author-defined credential fields, a brand's call to action.\nexport * from './lib/hosted-page-screen'\n// The reputation lookup every foreign link a page, an email or a redirect\n// points at passes (AGL-3451). Pure; the lookup is injected by\n// `@aglyn/tenant-data-admin`, which holds the credential and the cache.\nexport * from './lib/link-reputation'\n// The site's theme palette as plain data (AGL-3370), so a palette token an\n// author picked resolves in mail. Built without MUI; `shared-ui-theme`'s\n// parity spec holds it equal to the theme.\nexport * from './lib/email-palette'\nexport * from './lib/email-design-chrome'\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,cAAc,sBAAkB;AAChC,4EAA4E;AAC5E,mEAAmE;AACnE,yEAAyE;AACzE,6EAA6E;AAC7E,sDAAsD;AACtD,cAAc,yBAAqB;AACnC,cAAc,0BAAsB;AACpC,cAAc,qBAAiB;AAC/B,cAAc,6BAAyB;AACvC,cAAc,yBAAqB;AACnC,cAAc,0BAAsB;AACpC,cAAc,yBAAqB;AACnC,cAAc,2BAAuB;AACrC,cAAc,uBAAmB;AACjC,cAAc,mCAA+B;AAC7C,cAAc,wBAAoB;AAClC,cAAc,gCAA4B;AAC1C,cAAc,4BAAwB;AACtC,cAAc,4BAAwB;AACtC,cAAc,oCAAgC;AAC9C,cAAc,yBAAqB;AACnC,cAAc,+BAA2B;AACzC,cAAc,+BAA2B;AACzC,cAAc,yBAAqB;AACnC,cAAc,gCAA4B;AAC1C,cAAc,6BAAyB;AACvC,cAAc,wBAAoB;AAClC,cAAc,2BAAuB;AACrC,cAAc,0BAAsB;AACpC,sEAAsE;AACtE,kEAAkE;AAClE,cAAc,wBAAoB;AAClC,yEAAyE;AACzE,cAAc,4BAAwB;AACtC,cAAc,iCAA6B;AAC3C,4EAA4E;AAC5E,gDAAgD;AAChD,4EAA4E;AAC5E,wEAAwE;AACxE,6EAA6E;AAC7E,wDAAwD;AACxD,cAAc,0BAAsB;AACpC,cAAc,gCAA4B;AAC1C,uEAAuE;AACvE,cAAc,2BAAuB;AACrC,0EAA0E;AAC1E,+EAA+E;AAC/E,cAAc,8BAA0B;AACxC,cAAc,uBAAmB;AACjC,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,uDAAuD;AACvD,cAAc,wBAAoB;AAClC,cAAc,uBAAmB;AACjC,cAAc,gCAA4B;AAC1C,2EAA2E;AAC3E,yEAAyE;AACzE,4CAA4C;AAC5C,cAAc,4BAAwB;AACtC,2EAA2E;AAC3E,8EAA8E;AAC9E,cAAc,oCAAgC;AAC9C,6EAA6E;AAC7E,sDAAsD;AACtD,cAAc,gCAA4B;AAC1C,6EAA6E;AAC7E,sEAAsE;AACtE,cAAc,8BAA0B;AACxC,0EAA0E;AAC1E,+DAA+D;AAC/D,wEAAwE;AACxE,cAAc,2BAAuB;AACrC,2EAA2E;AAC3E,yEAAyE;AACzE,2CAA2C;AAC3C,cAAc,yBAAqB;AACnC,cAAc,+BAA2B"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/** A conversation as the record it is about keeps it. */
|
|
18
|
+
export interface EmailThread {
|
|
19
|
+
/** The latest message's `Message-ID`, angle brackets included: `<a.b@example.com>`. */
|
|
20
|
+
messageId: string;
|
|
21
|
+
/** Every `Message-ID` in the conversation, oldest first; the last is {@link messageId}. */
|
|
22
|
+
references: string[];
|
|
23
|
+
/** The subject the conversation runs under, without any `Re:`. */
|
|
24
|
+
subject: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The most ids a `References` header carries. RFC 5322 sets no limit, but
|
|
28
|
+
* some servers refuse very long header lines; the first id (the conversation's
|
|
29
|
+
* root) and the latest ones are what threading reads, so the middle goes.
|
|
30
|
+
*/
|
|
31
|
+
export declare const EMAIL_THREAD_MAX_REFERENCES = 20;
|
|
32
|
+
/** Whether `value` is one well-formed `Message-ID`, brackets included. */
|
|
33
|
+
export declare function isEmailMessageId(value: unknown): value is string;
|
|
34
|
+
/**
|
|
35
|
+
* A fresh `Message-ID` on the first usable domain of `domains` (the sending
|
|
36
|
+
* domain first; an address such as a `From` value gives its domain):
|
|
37
|
+
* `<label.k3x9m1.9f2c4e1a0b7d3e65@mail.acme.com>`. The time and 64 random bits
|
|
38
|
+
* keep it unique; nothing in it identifies the customer or the record.
|
|
39
|
+
* Falls back to `localhost.localdomain` only when no domain is usable, which
|
|
40
|
+
* a send on a resolved identity never meets.
|
|
41
|
+
*/
|
|
42
|
+
export declare function mintEmailMessageId(domains: ReadonlyArray<string | null | undefined>, options?: {
|
|
43
|
+
label?: string;
|
|
44
|
+
atMs?: number;
|
|
45
|
+
random?: string;
|
|
46
|
+
}): string;
|
|
47
|
+
/**
|
|
48
|
+
* A stored thread, checked, or null. Every id must be a well-formed
|
|
49
|
+
* `Message-ID`, because each is written back into a header: a value that
|
|
50
|
+
* could carry a line break never reaches one.
|
|
51
|
+
*/
|
|
52
|
+
export declare function readEmailThread(raw: unknown): EmailThread | null;
|
|
53
|
+
/** The subject a message in `thread` goes under: the thread's, else `fallback`. */
|
|
54
|
+
export declare function emailThreadSubject(thread: EmailThread | null | undefined, fallback: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* The headers that send a message with `Message-ID` `messageId` into
|
|
57
|
+
* `thread`: the id itself, and, when the thread has begun, `In-Reply-To` the
|
|
58
|
+
* latest message and `References` the chain. With no thread, the message
|
|
59
|
+
* starts one and carries only its own id.
|
|
60
|
+
*/
|
|
61
|
+
export declare function nextThreadHeaders(thread: EmailThread | null | undefined, messageId: string): Record<string, string>;
|
|
62
|
+
/**
|
|
63
|
+
* The thread once a message went out in it: the message is the latest, the
|
|
64
|
+
* chain grows by it, and the subject stays the thread's (or becomes this
|
|
65
|
+
* message's, when it started the thread).
|
|
66
|
+
*/
|
|
67
|
+
export declare function emailThreadAfterSend(thread: EmailThread | null | undefined, sent: {
|
|
68
|
+
messageId: string;
|
|
69
|
+
subject: string;
|
|
70
|
+
}): EmailThread;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /*==========================================
|
|
17
|
+
* ONE CONVERSATION IN THE CUSTOMER'S MAILBOX (AGL-4097).
|
|
18
|
+
*
|
|
19
|
+
* A site that writes to one customer about one thing more than once (a
|
|
20
|
+
* request's confirmation, the quote, a revised quote, the invoice) keeps those
|
|
21
|
+
* messages in a single conversation by sending each one as a reply to the one
|
|
22
|
+
* before:
|
|
23
|
+
*
|
|
24
|
+
* - the first message carries a `Message-ID` minted here, and the record it
|
|
25
|
+
* is about keeps it as an {@link EmailThread};
|
|
26
|
+
* - every later message carries its own `Message-ID`, `In-Reply-To` naming
|
|
27
|
+
* the last one, and `References` naming the chain, and keeps the thread's
|
|
28
|
+
* subject ({@link nextThreadHeaders}, {@link emailThreadAfterSend}).
|
|
29
|
+
*
|
|
30
|
+
* How clients group (what is documented or widely reported, not measured
|
|
31
|
+
* here): Apple Mail and Thunderbird thread by `In-Reply-To`/`References`;
|
|
32
|
+
* Gmail groups by subject together with those headers; Outlook groups by
|
|
33
|
+
* subject (its conversation topic) and its own `Thread-Index`, which only
|
|
34
|
+
* Outlook writes. Keeping the subject the same is what every one of them
|
|
35
|
+
* honors, which is why the thread remembers it.
|
|
36
|
+
*
|
|
37
|
+
* Whether a provider keeps a caller's `Message-ID` is the provider's call:
|
|
38
|
+
* both built-in providers hand the header over unchanged, and the sender
|
|
39
|
+
* records the provider's own id beside it so a replaced one can be traced.
|
|
40
|
+
*
|
|
41
|
+
* Pure, and free of Node built-ins: this barrel is reached from the browser.
|
|
42
|
+
*=========================================*/ /** A conversation as the record it is about keeps it. */ /**
|
|
43
|
+
* The most ids a `References` header carries. RFC 5322 sets no limit, but
|
|
44
|
+
* some servers refuse very long header lines; the first id (the conversation's
|
|
45
|
+
* root) and the latest ones are what threading reads, so the middle goes.
|
|
46
|
+
*/ export const EMAIL_THREAD_MAX_REFERENCES = 20;
|
|
47
|
+
/** The longest subject kept on a thread. */ const MAX_SUBJECT = 300;
|
|
48
|
+
/** `dot-atom-text` on each side of the `@`, as RFC 5322 §3.6.4 allows a `msg-id`. */ const MESSAGE_ID = /^<[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+>$/;
|
|
49
|
+
/** A host name a `Message-ID` may end in. */ const DOMAIN = /^(?=.{1,253}$)[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$/;
|
|
50
|
+
/** Whether `value` is one well-formed `Message-ID`, brackets included. */ export function isEmailMessageId(value) {
|
|
51
|
+
return typeof value === 'string' && value.length <= 250 && MESSAGE_ID.test(value);
|
|
52
|
+
}
|
|
53
|
+
/** A domain as a `Message-ID` can carry it, or null. */ function messageIdDomain(value) {
|
|
54
|
+
const raw = String(value != null ? value : '').trim().toLowerCase();
|
|
55
|
+
// A `From` value ("Acme <hello@acme.com>") gives its address's domain.
|
|
56
|
+
const domain = raw.includes('@') ? raw.slice(raw.lastIndexOf('@') + 1).replace(/>.*$/, '') : raw;
|
|
57
|
+
return DOMAIN.test(domain) ? domain : null;
|
|
58
|
+
}
|
|
59
|
+
/** Sixteen random hex characters, from the platform's crypto. */ function randomHex() {
|
|
60
|
+
const bytes = new Uint8Array(8);
|
|
61
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
62
|
+
return Array.from(bytes, (byte)=>byte.toString(16).padStart(2, '0')).join('');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A fresh `Message-ID` on the first usable domain of `domains` (the sending
|
|
66
|
+
* domain first; an address such as a `From` value gives its domain):
|
|
67
|
+
* `<label.k3x9m1.9f2c4e1a0b7d3e65@mail.acme.com>`. The time and 64 random bits
|
|
68
|
+
* keep it unique; nothing in it identifies the customer or the record.
|
|
69
|
+
* Falls back to `localhost.localdomain` only when no domain is usable, which
|
|
70
|
+
* a send on a resolved identity never meets.
|
|
71
|
+
*/ export function mintEmailMessageId(domains, options = {}) {
|
|
72
|
+
var _domains_map_find, _options_label, _options_atMs, _options_random;
|
|
73
|
+
const domain = (_domains_map_find = domains.map(messageIdDomain).find(Boolean)) != null ? _domains_map_find : 'localhost.localdomain';
|
|
74
|
+
const label = String((_options_label = options.label) != null ? _options_label : 'm').toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/^-+|-+$/g, '') || 'm';
|
|
75
|
+
const time = Math.max(0, Math.floor(Number((_options_atMs = options.atMs) != null ? _options_atMs : Date.now()) || 0)).toString(36);
|
|
76
|
+
const random = String((_options_random = options.random) != null ? _options_random : randomHex()).toLowerCase().replace(/[^a-z0-9]+/g, '') || randomHex();
|
|
77
|
+
return `<${label}.${time}.${random}@${domain}>`;
|
|
78
|
+
}
|
|
79
|
+
/** The root and the latest ids, at most {@link EMAIL_THREAD_MAX_REFERENCES}. */ function capReferences(ids) {
|
|
80
|
+
const unique = ids.filter((id, index)=>ids.indexOf(id) === index);
|
|
81
|
+
if (unique.length <= EMAIL_THREAD_MAX_REFERENCES) return unique;
|
|
82
|
+
return [
|
|
83
|
+
unique[0],
|
|
84
|
+
...unique.slice(unique.length - (EMAIL_THREAD_MAX_REFERENCES - 1))
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* A stored thread, checked, or null. Every id must be a well-formed
|
|
89
|
+
* `Message-ID`, because each is written back into a header: a value that
|
|
90
|
+
* could carry a line break never reaches one.
|
|
91
|
+
*/ export function readEmailThread(raw) {
|
|
92
|
+
var _source_subject;
|
|
93
|
+
if (!raw || typeof raw !== 'object') return null;
|
|
94
|
+
const source = raw;
|
|
95
|
+
const messageId = source['messageId'];
|
|
96
|
+
if (!isEmailMessageId(messageId)) return null;
|
|
97
|
+
const listed = Array.isArray(source['references']) ? source['references'].filter(isEmailMessageId) : [];
|
|
98
|
+
const references = capReferences([
|
|
99
|
+
...listed.filter((id)=>id !== messageId),
|
|
100
|
+
messageId
|
|
101
|
+
]);
|
|
102
|
+
const subject = String((_source_subject = source['subject']) != null ? _source_subject : '').replace(/[\r\n]+/g, ' ').trim().slice(0, MAX_SUBJECT);
|
|
103
|
+
return {
|
|
104
|
+
messageId,
|
|
105
|
+
references,
|
|
106
|
+
subject
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** The subject a message in `thread` goes under: the thread's, else `fallback`. */ export function emailThreadSubject(thread, fallback) {
|
|
110
|
+
var _readEmailThread;
|
|
111
|
+
const own = (_readEmailThread = readEmailThread(thread)) == null ? void 0 : _readEmailThread.subject;
|
|
112
|
+
return own || String(fallback != null ? fallback : '').replace(/[\r\n]+/g, ' ').trim();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The headers that send a message with `Message-ID` `messageId` into
|
|
116
|
+
* `thread`: the id itself, and, when the thread has begun, `In-Reply-To` the
|
|
117
|
+
* latest message and `References` the chain. With no thread, the message
|
|
118
|
+
* starts one and carries only its own id.
|
|
119
|
+
*/ export function nextThreadHeaders(thread, messageId) {
|
|
120
|
+
if (!isEmailMessageId(messageId)) throw new Error('nextThreadHeaders: not a Message-ID');
|
|
121
|
+
const current = readEmailThread(thread);
|
|
122
|
+
if (!current) return {
|
|
123
|
+
'Message-ID': messageId
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
'Message-ID': messageId,
|
|
127
|
+
'In-Reply-To': current.messageId,
|
|
128
|
+
References: capReferences(current.references).join(' ')
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The thread once a message went out in it: the message is the latest, the
|
|
133
|
+
* chain grows by it, and the subject stays the thread's (or becomes this
|
|
134
|
+
* message's, when it started the thread).
|
|
135
|
+
*/ export function emailThreadAfterSend(thread, sent) {
|
|
136
|
+
var _ref;
|
|
137
|
+
if (!isEmailMessageId(sent.messageId)) throw new Error('emailThreadAfterSend: not a Message-ID');
|
|
138
|
+
const current = readEmailThread(thread);
|
|
139
|
+
return {
|
|
140
|
+
messageId: sent.messageId,
|
|
141
|
+
references: capReferences([
|
|
142
|
+
...(_ref = current == null ? void 0 : current.references) != null ? _ref : [],
|
|
143
|
+
sent.messageId
|
|
144
|
+
]),
|
|
145
|
+
subject: emailThreadSubject(current, sent.subject).slice(0, MAX_SUBJECT)
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
//# sourceMappingURL=email-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/shared/util/email/src/lib/email-thread.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * ONE CONVERSATION IN THE CUSTOMER'S MAILBOX (AGL-4097).\n *\n * A site that writes to one customer about one thing more than once (a\n * request's confirmation, the quote, a revised quote, the invoice) keeps those\n * messages in a single conversation by sending each one as a reply to the one\n * before:\n *\n * - the first message carries a `Message-ID` minted here, and the record it\n * is about keeps it as an {@link EmailThread};\n * - every later message carries its own `Message-ID`, `In-Reply-To` naming\n * the last one, and `References` naming the chain, and keeps the thread's\n * subject ({@link nextThreadHeaders}, {@link emailThreadAfterSend}).\n *\n * How clients group (what is documented or widely reported, not measured\n * here): Apple Mail and Thunderbird thread by `In-Reply-To`/`References`;\n * Gmail groups by subject together with those headers; Outlook groups by\n * subject (its conversation topic) and its own `Thread-Index`, which only\n * Outlook writes. Keeping the subject the same is what every one of them\n * honors, which is why the thread remembers it.\n *\n * Whether a provider keeps a caller's `Message-ID` is the provider's call:\n * both built-in providers hand the header over unchanged, and the sender\n * records the provider's own id beside it so a replaced one can be traced.\n *\n * Pure, and free of Node built-ins: this barrel is reached from the browser.\n *=========================================*/\n\n/** A conversation as the record it is about keeps it. */\nexport interface EmailThread {\n /** The latest message's `Message-ID`, angle brackets included: `<a.b@example.com>`. */\n messageId: string\n /** Every `Message-ID` in the conversation, oldest first; the last is {@link messageId}. */\n references: string[]\n /** The subject the conversation runs under, without any `Re:`. */\n subject: string\n}\n\n/**\n * The most ids a `References` header carries. RFC 5322 sets no limit, but\n * some servers refuse very long header lines; the first id (the conversation's\n * root) and the latest ones are what threading reads, so the middle goes.\n */\nexport const EMAIL_THREAD_MAX_REFERENCES = 20\n\n/** The longest subject kept on a thread. */\nconst MAX_SUBJECT = 300\n\n/** `dot-atom-text` on each side of the `@`, as RFC 5322 §3.6.4 allows a `msg-id`. */\nconst MESSAGE_ID = /^<[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+)+>$/\n\n/** A host name a `Message-ID` may end in. */\nconst DOMAIN = /^(?=.{1,253}$)[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?(?:\\.[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$/\n\n/** Whether `value` is one well-formed `Message-ID`, brackets included. */\nexport function isEmailMessageId(value: unknown): value is string {\n return typeof value === 'string' && value.length <= 250 && MESSAGE_ID.test(value)\n}\n\n/** A domain as a `Message-ID` can carry it, or null. */\nfunction messageIdDomain(value: string | null | undefined): string | null {\n const raw = String(value ?? '').trim().toLowerCase()\n // A `From` value (\"Acme <hello@acme.com>\") gives its address's domain.\n const domain = raw.includes('@') ? raw.slice(raw.lastIndexOf('@') + 1).replace(/>.*$/, '') : raw\n return DOMAIN.test(domain) ? domain : null\n}\n\n/** Sixteen random hex characters, from the platform's crypto. */\nfunction randomHex(): string {\n const bytes = new Uint8Array(8)\n globalThis.crypto.getRandomValues(bytes)\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n\n/**\n * A fresh `Message-ID` on the first usable domain of `domains` (the sending\n * domain first; an address such as a `From` value gives its domain):\n * `<label.k3x9m1.9f2c4e1a0b7d3e65@mail.acme.com>`. The time and 64 random bits\n * keep it unique; nothing in it identifies the customer or the record.\n * Falls back to `localhost.localdomain` only when no domain is usable, which\n * a send on a resolved identity never meets.\n */\nexport function mintEmailMessageId(\n domains: ReadonlyArray<string | null | undefined>,\n options: { label?: string; atMs?: number; random?: string } = {},\n): string {\n const domain = domains.map(messageIdDomain).find(Boolean) ?? 'localhost.localdomain'\n const label = String(options.label ?? 'm').toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/^-+|-+$/g, '') || 'm'\n const time = Math.max(0, Math.floor(Number(options.atMs ?? Date.now()) || 0)).toString(36)\n const random = String(options.random ?? randomHex()).toLowerCase().replace(/[^a-z0-9]+/g, '') || randomHex()\n return `<${label}.${time}.${random}@${domain}>`\n}\n\n/** The root and the latest ids, at most {@link EMAIL_THREAD_MAX_REFERENCES}. */\nfunction capReferences(ids: readonly string[]): string[] {\n const unique = ids.filter((id, index) => ids.indexOf(id) === index)\n if (unique.length <= EMAIL_THREAD_MAX_REFERENCES) return unique\n return [unique[0], ...unique.slice(unique.length - (EMAIL_THREAD_MAX_REFERENCES - 1))]\n}\n\n/**\n * A stored thread, checked, or null. Every id must be a well-formed\n * `Message-ID`, because each is written back into a header: a value that\n * could carry a line break never reaches one.\n */\nexport function readEmailThread(raw: unknown): EmailThread | null {\n if (!raw || typeof raw !== 'object') return null\n const source = raw as Record<string, unknown>\n const messageId = source['messageId']\n if (!isEmailMessageId(messageId)) return null\n const listed = Array.isArray(source['references']) ? (source['references'] as unknown[]).filter(isEmailMessageId) : []\n const references = capReferences([...listed.filter((id) => id !== messageId), messageId])\n const subject = String(source['subject'] ?? '').replace(/[\\r\\n]+/g, ' ').trim().slice(0, MAX_SUBJECT)\n return { messageId, references, subject }\n}\n\n/** The subject a message in `thread` goes under: the thread's, else `fallback`. */\nexport function emailThreadSubject(thread: EmailThread | null | undefined, fallback: string): string {\n const own = readEmailThread(thread)?.subject\n return own || String(fallback ?? '').replace(/[\\r\\n]+/g, ' ').trim()\n}\n\n/**\n * The headers that send a message with `Message-ID` `messageId` into\n * `thread`: the id itself, and, when the thread has begun, `In-Reply-To` the\n * latest message and `References` the chain. With no thread, the message\n * starts one and carries only its own id.\n */\nexport function nextThreadHeaders(\n thread: EmailThread | null | undefined,\n messageId: string,\n): Record<string, string> {\n if (!isEmailMessageId(messageId)) throw new Error('nextThreadHeaders: not a Message-ID')\n const current = readEmailThread(thread)\n if (!current) return { 'Message-ID': messageId }\n return {\n 'Message-ID': messageId,\n 'In-Reply-To': current.messageId,\n References: capReferences(current.references).join(' '),\n }\n}\n\n/**\n * The thread once a message went out in it: the message is the latest, the\n * chain grows by it, and the subject stays the thread's (or becomes this\n * message's, when it started the thread).\n */\nexport function emailThreadAfterSend(\n thread: EmailThread | null | undefined,\n sent: { messageId: string; subject: string },\n): EmailThread {\n if (!isEmailMessageId(sent.messageId)) throw new Error('emailThreadAfterSend: not a Message-ID')\n const current = readEmailThread(thread)\n return {\n messageId: sent.messageId,\n references: capReferences([...(current?.references ?? []), sent.messageId]),\n subject: emailThreadSubject(current, sent.subject).slice(0, MAX_SUBJECT),\n }\n}\n"],"names":["EMAIL_THREAD_MAX_REFERENCES","MAX_SUBJECT","MESSAGE_ID","DOMAIN","isEmailMessageId","value","length","test","messageIdDomain","raw","String","trim","toLowerCase","domain","includes","slice","lastIndexOf","replace","randomHex","bytes","Uint8Array","globalThis","crypto","getRandomValues","Array","from","byte","toString","padStart","join","mintEmailMessageId","domains","options","map","find","Boolean","label","time","Math","max","floor","Number","atMs","Date","now","random","capReferences","ids","unique","filter","id","index","indexOf","readEmailThread","source","messageId","listed","isArray","references","subject","emailThreadSubject","thread","fallback","own","nextThreadHeaders","Error","current","References","emailThreadAfterSend","sent"],"mappings":"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"}
|
|
@@ -7,6 +7,95 @@
|
|
|
7
7
|
* order. `TENANT_EMAILS` in `tenant-email-catalog.ts` is this list.
|
|
8
8
|
* Source of truth: plugins.config.json and the entries it names.
|
|
9
9
|
*/ export const PLUGIN_TENANT_EMAILS = [
|
|
10
|
+
{
|
|
11
|
+
"key": "form-confirmation",
|
|
12
|
+
"name": "Form confirmation",
|
|
13
|
+
"description": "Sent to the person who filled in a form, when the form is set to email them a confirmation: what they sent, the files they attached, what happens next and how to reach you. Your reply, such as a quote, arrives in the same conversation.",
|
|
14
|
+
"pluginId": "forms",
|
|
15
|
+
"plugin": "Forms",
|
|
16
|
+
"control": "besigner",
|
|
17
|
+
"defaultSubject": "{{form.subject}}",
|
|
18
|
+
"mergeTokens": [
|
|
19
|
+
{
|
|
20
|
+
"name": "form.subject",
|
|
21
|
+
"description": "The subject: what they sent, to whom",
|
|
22
|
+
"sample": "We got your quote request — Northwind Signs"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "form.name",
|
|
26
|
+
"description": "The form’s name",
|
|
27
|
+
"sample": "Request a quote"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "form.heading",
|
|
31
|
+
"description": "“We got your request” for a request, else “Thanks, we got your message”",
|
|
32
|
+
"sample": "We got your request"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "form.intro",
|
|
36
|
+
"description": "One sentence on what this email is",
|
|
37
|
+
"sample": "Thanks for asking Northwind Signs for a quote. Here is a copy of what you sent."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "form.answers",
|
|
41
|
+
"description": "Their answers, one per line, under the form’s own labels",
|
|
42
|
+
"sample": "Name: Jane Doe\nProduct: Vinyl banner — 3 × 6 ft / Matte\nDetails: Two banners for the spring fair."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "form.files",
|
|
46
|
+
"description": "The files they attached, by name; empty when there were none",
|
|
47
|
+
"sample": "Files you sent: logo.ai, banner-sketch.pdf"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "form.nextStep",
|
|
51
|
+
"description": "What happens next",
|
|
52
|
+
"sample": "Northwind Signs will look over your request and email you a quote. Reply to this email if anything changes."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "business.contact",
|
|
56
|
+
"description": "How to reach the business beyond a reply: its contact email, and its phone when it lists one",
|
|
57
|
+
"sample": "You can also reach Northwind Signs at hello@northwind.example or 555-0100."
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"defaultBody": [
|
|
61
|
+
{
|
|
62
|
+
"block": "text",
|
|
63
|
+
"text": "{{host.businessName}} · {{form.name}}",
|
|
64
|
+
"variant": "eyebrow"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"block": "text",
|
|
68
|
+
"text": "{{form.heading}}",
|
|
69
|
+
"variant": "heading"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"block": "text",
|
|
73
|
+
"text": "{{form.intro}}",
|
|
74
|
+
"variant": "body"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"block": "text",
|
|
78
|
+
"text": "{{form.answers}}",
|
|
79
|
+
"variant": "details"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"block": "text",
|
|
83
|
+
"text": "{{form.files}}",
|
|
84
|
+
"variant": "caption"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"block": "text",
|
|
88
|
+
"text": "{{form.nextStep}}",
|
|
89
|
+
"variant": "body"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"block": "text",
|
|
93
|
+
"text": "{{business.contact}}",
|
|
94
|
+
"variant": "caption"
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"footerReason": "You’re receiving this because you sent a form on the {{host.businessName}} website."
|
|
98
|
+
},
|
|
10
99
|
{
|
|
11
100
|
"key": "booking-confirmed",
|
|
12
101
|
"name": "Booking confirmed",
|
|
@@ -791,6 +880,238 @@
|
|
|
791
880
|
],
|
|
792
881
|
"footerReason": "You’re receiving this because you placed an order with {{host.businessName}}."
|
|
793
882
|
},
|
|
883
|
+
{
|
|
884
|
+
"key": "quote-sent",
|
|
885
|
+
"name": "Quote",
|
|
886
|
+
"description": "Sends a quote to the customer when you choose Send quote: your message, the proof, the quote as a PDF and a button to approve or pay it on your site. Later sends, such as a new revision, arrive in the same conversation.",
|
|
887
|
+
"pluginId": "commerce",
|
|
888
|
+
"plugin": "Commerce",
|
|
889
|
+
"control": "besigner",
|
|
890
|
+
"defaultSubject": "{{quote.subject}}",
|
|
891
|
+
"mergeTokens": [
|
|
892
|
+
{
|
|
893
|
+
"name": "quote.subject",
|
|
894
|
+
"description": "The subject typed when sending; it stays the same for every email about the quote",
|
|
895
|
+
"sample": "Quote #1042 from Northwind Signs"
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
"name": "quote.number",
|
|
899
|
+
"description": "The quote number",
|
|
900
|
+
"sample": "#1042"
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
"name": "quote.revision",
|
|
904
|
+
"description": "Which revision of the quote this is",
|
|
905
|
+
"sample": "2"
|
|
906
|
+
},
|
|
907
|
+
{
|
|
908
|
+
"name": "quote.total",
|
|
909
|
+
"description": "The quote total; “before tax” when tax is added at payment",
|
|
910
|
+
"sample": "$1,250.00"
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
"name": "quote.heading",
|
|
914
|
+
"description": "“Your quote from …”, or “Your updated quote” from the second revision on",
|
|
915
|
+
"sample": "Your quote from Northwind Signs"
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
"name": "quote.intro",
|
|
919
|
+
"description": "One sentence on what this email is: a new quote, or an updated revision",
|
|
920
|
+
"sample": "Here is your quote from Northwind Signs. The quote is attached as a PDF too."
|
|
921
|
+
},
|
|
922
|
+
{
|
|
923
|
+
"name": "quote.message",
|
|
924
|
+
"description": "The message typed when sending; empty when none was typed",
|
|
925
|
+
"sample": "Thanks for stopping by the shop. Here is the banner we talked about."
|
|
926
|
+
},
|
|
927
|
+
{
|
|
928
|
+
"name": "quote.proofImages",
|
|
929
|
+
"description": "Up to three proof images, each linked to the quote page; empty when the revision has none",
|
|
930
|
+
"sample": "<table role=\"presentation\"><tr><td><img src=\"https://shop.example.com/api/commerce/quote-proof?file=p1\" alt=\"Proof: banner.png\" width=\"552\" /></td></tr></table>"
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
"name": "quote.proofFiles",
|
|
934
|
+
"description": "The other proof files by name, to see on the quote page; empty when there are none",
|
|
935
|
+
"sample": "Also with this revision: banner.ai. See it on your quote page."
|
|
936
|
+
},
|
|
937
|
+
{
|
|
938
|
+
"name": "quote.nextStep",
|
|
939
|
+
"description": "What to do next: approve the proof first, or pay when ready",
|
|
940
|
+
"sample": "Look over the proof, then approve it on your quote page. Once you approve it, you can pay there."
|
|
941
|
+
},
|
|
942
|
+
{
|
|
943
|
+
"name": "quote.buttonLabel",
|
|
944
|
+
"description": "“Review and approve” while an approval is needed first, else “View and pay” with the total",
|
|
945
|
+
"sample": "View and pay $1,250.00"
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
"name": "quote.url",
|
|
949
|
+
"description": "The quote’s pay link on your site. Private to the customer; it needs no account",
|
|
950
|
+
"sample": "https://shop.example.com/pay-quote?q=quote_123&t=…"
|
|
951
|
+
}
|
|
952
|
+
],
|
|
953
|
+
"defaultBody": [
|
|
954
|
+
{
|
|
955
|
+
"block": "text",
|
|
956
|
+
"text": "{{host.businessName}} · Quote {{quote.number}}",
|
|
957
|
+
"variant": "eyebrow"
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
"block": "text",
|
|
961
|
+
"text": "{{quote.heading}}",
|
|
962
|
+
"variant": "heading"
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
"block": "text",
|
|
966
|
+
"text": "{{quote.intro}}",
|
|
967
|
+
"variant": "body"
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
"block": "text",
|
|
971
|
+
"text": "{{quote.message}}",
|
|
972
|
+
"variant": "body"
|
|
973
|
+
},
|
|
974
|
+
{
|
|
975
|
+
"block": "text",
|
|
976
|
+
"text": "Quote: {{quote.number}}\nRevision: {{quote.revision}}\nTotal: {{quote.total}}",
|
|
977
|
+
"variant": "details"
|
|
978
|
+
},
|
|
979
|
+
{
|
|
980
|
+
"block": "html",
|
|
981
|
+
"html": "{{quote.proofImages}}"
|
|
982
|
+
},
|
|
983
|
+
{
|
|
984
|
+
"block": "text",
|
|
985
|
+
"text": "{{quote.proofFiles}}",
|
|
986
|
+
"variant": "caption"
|
|
987
|
+
},
|
|
988
|
+
{
|
|
989
|
+
"block": "text",
|
|
990
|
+
"text": "{{quote.nextStep}}",
|
|
991
|
+
"variant": "body"
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
"block": "button",
|
|
995
|
+
"label": "{{quote.buttonLabel}}",
|
|
996
|
+
"href": "{{quote.url}}"
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
"block": "text",
|
|
1000
|
+
"text": "Reply to this email to reach {{host.businessName}}.",
|
|
1001
|
+
"variant": "caption"
|
|
1002
|
+
}
|
|
1003
|
+
],
|
|
1004
|
+
"footerReason": "You’re receiving this because {{host.businessName}} prepared a quote for you."
|
|
1005
|
+
},
|
|
1006
|
+
{
|
|
1007
|
+
"key": "order-invoice",
|
|
1008
|
+
"name": "Invoice",
|
|
1009
|
+
"description": "Sends an invoice for an order or a quote when you choose Send invoice: your message, the invoice as a PDF and, while it is unpaid, a button to pay it on your site. A paid invoice is the customer’s record. It arrives in the same conversation as the quote’s emails.",
|
|
1010
|
+
"pluginId": "commerce",
|
|
1011
|
+
"plugin": "Commerce",
|
|
1012
|
+
"control": "besigner",
|
|
1013
|
+
"defaultSubject": "{{invoice.subject}}",
|
|
1014
|
+
"mergeTokens": [
|
|
1015
|
+
{
|
|
1016
|
+
"name": "invoice.subject",
|
|
1017
|
+
"description": "The subject typed when sending; it stays the same as the conversation it joins",
|
|
1018
|
+
"sample": "Invoice #1042 from Northwind Signs"
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
"name": "invoice.number",
|
|
1022
|
+
"description": "The invoice number, which is the order number",
|
|
1023
|
+
"sample": "#1042"
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
"name": "invoice.date",
|
|
1027
|
+
"description": "The date of the order or quote",
|
|
1028
|
+
"sample": "October 28, 2026"
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"name": "invoice.total",
|
|
1032
|
+
"description": "The invoice total; “before tax” or “before shipping” when those are added at payment",
|
|
1033
|
+
"sample": "$1,250.00"
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
"name": "invoice.status",
|
|
1037
|
+
"description": "“Paid on …”, or what is still due",
|
|
1038
|
+
"sample": "Unpaid, $1,250.00 due"
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
"name": "invoice.heading",
|
|
1042
|
+
"description": "“Invoice #… from …”",
|
|
1043
|
+
"sample": "Invoice #1042 from Northwind Signs"
|
|
1044
|
+
},
|
|
1045
|
+
{
|
|
1046
|
+
"name": "invoice.intro",
|
|
1047
|
+
"description": "One sentence on what this email is: an invoice to pay, or a paid one for the customer’s records",
|
|
1048
|
+
"sample": "Northwind Signs sent you an invoice for your order. The details are below, and the invoice is attached as a PDF."
|
|
1049
|
+
},
|
|
1050
|
+
{
|
|
1051
|
+
"name": "invoice.message",
|
|
1052
|
+
"description": "The message typed when sending; empty when none was typed",
|
|
1053
|
+
"sample": "Thanks again for your order. Here is the invoice we talked about."
|
|
1054
|
+
},
|
|
1055
|
+
{
|
|
1056
|
+
"name": "invoice.nextStep",
|
|
1057
|
+
"description": "What to do next: pay with the button, or keep a paid invoice for the records",
|
|
1058
|
+
"sample": "Use the button below to pay it securely by card. The button keeps working until the invoice is paid."
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
"name": "invoice.buttonLabel",
|
|
1062
|
+
"description": "“Pay” with the amount; empty on a paid invoice, which leaves the button out",
|
|
1063
|
+
"sample": "Pay $1,250.00"
|
|
1064
|
+
},
|
|
1065
|
+
{
|
|
1066
|
+
"name": "invoice.url",
|
|
1067
|
+
"description": "The invoice’s pay link on your site. Private to the customer; it needs no account. Empty once paid",
|
|
1068
|
+
"sample": "https://shop.example.com/pay-quote?q=order_123&t=…"
|
|
1069
|
+
}
|
|
1070
|
+
],
|
|
1071
|
+
"defaultBody": [
|
|
1072
|
+
{
|
|
1073
|
+
"block": "text",
|
|
1074
|
+
"text": "{{host.businessName}} · Invoice {{invoice.number}}",
|
|
1075
|
+
"variant": "eyebrow"
|
|
1076
|
+
},
|
|
1077
|
+
{
|
|
1078
|
+
"block": "text",
|
|
1079
|
+
"text": "{{invoice.heading}}",
|
|
1080
|
+
"variant": "heading"
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
"block": "text",
|
|
1084
|
+
"text": "{{invoice.intro}}",
|
|
1085
|
+
"variant": "body"
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
"block": "text",
|
|
1089
|
+
"text": "{{invoice.message}}",
|
|
1090
|
+
"variant": "body"
|
|
1091
|
+
},
|
|
1092
|
+
{
|
|
1093
|
+
"block": "text",
|
|
1094
|
+
"text": "Invoice: {{invoice.number}}\nDate: {{invoice.date}}\nTotal: {{invoice.total}}\nStatus: {{invoice.status}}",
|
|
1095
|
+
"variant": "details"
|
|
1096
|
+
},
|
|
1097
|
+
{
|
|
1098
|
+
"block": "text",
|
|
1099
|
+
"text": "{{invoice.nextStep}}",
|
|
1100
|
+
"variant": "body"
|
|
1101
|
+
},
|
|
1102
|
+
{
|
|
1103
|
+
"block": "button",
|
|
1104
|
+
"label": "{{invoice.buttonLabel}}",
|
|
1105
|
+
"href": "{{invoice.url}}"
|
|
1106
|
+
},
|
|
1107
|
+
{
|
|
1108
|
+
"block": "text",
|
|
1109
|
+
"text": "Reply to this email to reach {{host.businessName}}.",
|
|
1110
|
+
"variant": "caption"
|
|
1111
|
+
}
|
|
1112
|
+
],
|
|
1113
|
+
"footerReason": "You’re receiving this because {{host.businessName}} sent you an invoice."
|
|
1114
|
+
},
|
|
794
1115
|
{
|
|
795
1116
|
"key": "sale-notification",
|
|
796
1117
|
"name": "New sale",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/shared/util/email/src/lib/tenant-emails.generated.ts"],"sourcesContent":["/**\n * GENERATED FILE — do not edit. Regenerate with:\n * node tools/scripts/generate-plugin-manifests.mjs\n *\n * The emails sites send their own customers (AGL-3080): what each plugin's\n * `tenantEmails` entry returned when this file was generated, in config\n * order. `TENANT_EMAILS` in `tenant-email-catalog.ts` is this list.\n * Source of truth: plugins.config.json and the entries it names.\n */\n\nimport type { TenantEmailEntry } from './tenant-email-catalog'\n\nexport const PLUGIN_TENANT_EMAILS: readonly TenantEmailEntry[] = [\n {\n \"key\": \"booking-confirmed\",\n \"name\": \"Booking confirmed\",\n \"description\": \"Confirms a booking to the customer, for paid and free services.\",\n \"pluginId\": \"bookings\",\n \"plugin\": \"Bookings\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Booking confirmed: {{service.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The customer's name\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"service.name\",\n \"description\": \"The booked service\",\n \"sample\": \"Consultation\"\n },\n {\n \"name\": \"when\",\n \"description\": \"Formatted date and time of the booking\",\n \"sample\": \"Monday, June 1, 2026 at 9:00 AM\"\n },\n {\n \"name\": \"timezone\",\n \"description\": \"Timezone the time is shown in\",\n \"sample\": \"America/Chicago\"\n },\n {\n \"name\": \"booking.payment\",\n \"description\": \"What a paid booking charged, as a sentence; empty for a free booking\",\n \"sample\": \"You paid $95.00.\"\n },\n {\n \"name\": \"booking.ref\",\n \"description\": \"Booking reference id\",\n \"sample\": \"bk_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Booking\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You’re booked: {{service.name}}\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Hi {{name}}, your booking with {{host.businessName}} is confirmed. Here are the details to keep.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Service: {{service.name}}\\nWhen: {{when}} ({{timezone}})\\nReference: {{booking.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{booking.payment}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Need to change it? Reply to this email and {{host.businessName}} will help.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you booked with {{host.businessName}}.\"\n },\n {\n \"key\": \"booking-reminder\",\n \"name\": \"Booking reminder\",\n \"description\": \"Reminds the customer of an upcoming booking.\",\n \"pluginId\": \"bookings\",\n \"plugin\": \"Bookings\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Reminder: {{service.name}} is coming up\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The customer's name\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"service.name\",\n \"description\": \"The booked service\",\n \"sample\": \"Consultation\"\n },\n {\n \"name\": \"when\",\n \"description\": \"Formatted date and time of the booking\",\n \"sample\": \"Tuesday, June 2, 2026 at 9:00 AM\"\n },\n {\n \"name\": \"timezone\",\n \"description\": \"Timezone the time is shown in\",\n \"sample\": \"America/Chicago\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Booking\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your booking is coming up\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Hi {{name}}, this is a reminder of your booking with {{host.businessName}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Service: {{service.name}}\\nWhen: {{when}} ({{timezone}})\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Can no longer make it? Reply to this email so {{host.businessName}} can offer the time to someone else.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you have a booking with {{host.businessName}}.\"\n },\n {\n \"key\": \"booking-rescheduled\",\n \"name\": \"Booking rescheduled\",\n \"description\": \"Tells the customer their booking moved to a new time.\",\n \"pluginId\": \"bookings\",\n \"plugin\": \"Bookings\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"New time for {{service.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The customer's name\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"service.name\",\n \"description\": \"The booked service\",\n \"sample\": \"Consultation\"\n },\n {\n \"name\": \"when\",\n \"description\": \"The new date and time of the booking\",\n \"sample\": \"Wednesday, June 3, 2026 at 10:30 AM\"\n },\n {\n \"name\": \"previousWhen\",\n \"description\": \"The date and time the booking moved from\",\n \"sample\": \"Monday, June 1, 2026 at 9:00 AM\"\n },\n {\n \"name\": \"timezone\",\n \"description\": \"Timezone the times are shown in\",\n \"sample\": \"America/Chicago\"\n },\n {\n \"name\": \"booking.ref\",\n \"description\": \"Booking reference id\",\n \"sample\": \"bk_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Booking\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your booking has a new time\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Hi {{name}}, your booking with {{host.businessName}} moved. The new time is below; the old one no longer applies.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Service: {{service.name}}\\nNew time: {{when}} ({{timezone}})\\nWas: {{previousWhen}}\\nReference: {{booking.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Does the new time not work? Reply to this email and {{host.businessName}} will help.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you have a booking with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-receipt\",\n \"name\": \"Order receipt\",\n \"description\": \"Sent to the buyer after a successful order or checkout.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Receipt for your order\",\n \"mergeTokens\": [\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line (with any license/download links)\",\n \"sample\": \"House Blend × 2 — $24.00\"\n },\n {\n \"name\": \"order.total\",\n \"description\": \"Order total\",\n \"sample\": \"$24.00\"\n },\n {\n \"name\": \"order.ref\",\n \"description\": \"Order reference id\",\n \"sample\": \"cs_test_123\"\n },\n {\n \"name\": \"store.receiptFooter\",\n \"description\": \"The Receipt footer from the store settings; empty when none is set\",\n \"sample\": \"Returns are accepted within 30 days.\"\n },\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks for your order\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Here is the receipt for your order from {{host.businessName}}. We will email you again as your order moves along, and the order page always shows where it is.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nTotal charged: {{order.total}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{store.receiptFooter}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Order {{order.number}} · payment reference {{order.ref}}. Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-shipped\",\n \"name\": \"Order shipped\",\n \"description\": \"Tells the buyer part or all of their order is on its way, with the carrier and a tracking link when the shipment has one. Sent once per shipment.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} has shipped\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"shipment.summary\",\n \"description\": \"The items in this shipment, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"shipment.carrier\",\n \"description\": \"The carrier; empty when none was recorded\",\n \"sample\": \"UPS\"\n },\n {\n \"name\": \"shipment.trackingNumber\",\n \"description\": \"The tracking number; empty when none was recorded\",\n \"sample\": \"1Z999AA10123456784\"\n },\n {\n \"name\": \"shipment.tracking\",\n \"description\": \"A sentence with the carrier, tracking number and tracking link; empty when the shipment has no tracking number\",\n \"sample\": \"Tracking: UPS 1Z999AA10123456784 — https://www.ups.com/track?tracknum=1Z999AA10123456784\"\n },\n {\n \"name\": \"shipment.remaining\",\n \"description\": \"A sentence saying how many items are still to ship; empty when this shipment completes the order\",\n \"sample\": \"1 more item will ship separately.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order is on its way\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} shipped these items from order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{shipment.summary}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{shipment.tracking}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{shipment.remaining}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Track your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"The order page shows every shipment and its tracking as it moves. Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-delivered\",\n \"name\": \"Order delivered\",\n \"description\": \"Tells the buyer their order was marked delivered.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} was delivered\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order was delivered\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} marked order {{order.number}} as delivered. We hope you enjoy it.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Something missing or not right? Reply to this email and {{host.businessName}} will sort it out.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-refunded\",\n \"name\": \"Order refunded\",\n \"description\": \"Tells the buyer a refund was issued, for how much and, when the store refunded named items, which ones. Sent once per refund.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Refund for your order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"refund.amount\",\n \"description\": \"The amount of this refund\",\n \"sample\": \"$12.00\"\n },\n {\n \"name\": \"refund.summary\",\n \"description\": \"The refunded items, one per line; empty when the refund was by amount only\",\n \"sample\": \"1× House Blend\"\n },\n {\n \"name\": \"refund.note\",\n \"description\": \"Whether the order is now fully refunded, as a sentence\",\n \"sample\": \"Your order has been refunded in full.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your refund is on its way\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} refunded {{refund.amount}} on order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{refund.summary}}\\nTotal refunded: {{refund.amount}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{refund.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Refunds go back to the original payment method and usually appear within 5 to 10 business days, depending on your bank.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-cancelled\",\n \"name\": \"Order canceled\",\n \"description\": \"Tells the buyer their order was canceled.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} was canceled\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"cancel.note\",\n \"description\": \"What happens to the payment, as a sentence; empty when nothing was paid\",\n \"sample\": \"Any payment you made will be refunded, and you will get a separate email when it is.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order was canceled\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} canceled order {{order.number}}. These items will not be sent.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{cancel.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-ready-for-pickup\",\n \"name\": \"Order ready for pickup\",\n \"description\": \"Tells the buyer their pickup order is ready, where to collect it, the pickup hours and any arrival instructions.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} is ready for pickup\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"pickup.location\",\n \"description\": \"The pickup location’s name and address\",\n \"sample\": \"Main Street shop, 12 Main St, Springfield\"\n },\n {\n \"name\": \"pickup.hours\",\n \"description\": \"The location’s pickup hours; empty when it lists none\",\n \"sample\": \"Pickup hours:\\nMo-Fr 09:00-17:00\"\n },\n {\n \"name\": \"pickup.instructions\",\n \"description\": \"What to do on arrival, as the store wrote it; empty when it wrote none\",\n \"sample\": \"Ring the bell at the side door.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order is ready for pickup\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Order {{order.number}} is packed and waiting for you at {{pickup.location}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nPick up at: {{pickup.location}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{pickup.hours}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{pickup.instructions}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Bring your order number, {{order.number}}. Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-picked-up\",\n \"name\": \"Order picked up\",\n \"description\": \"Confirms to the buyer that their pickup order was collected.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You picked up order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"pickup.location\",\n \"description\": \"The pickup location’s name and address\",\n \"sample\": \"Main Street shop, 12 Main St, Springfield\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks for picking up your order\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Order {{order.number}} was picked up from {{pickup.location}}. Enjoy it.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nPicked up at: {{pickup.location}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Something missing or not right? Reply to this email and {{host.businessName}} will sort it out.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-out-for-delivery\",\n \"name\": \"Order out for delivery\",\n \"description\": \"Tells the buyer the store’s own driver is on the way with their local delivery, in the window they booked.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} is out for delivery\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"delivery.window\",\n \"description\": \"The delivery window the buyer booked\",\n \"sample\": \"Tue, Oct 14, 9:00 AM – 12:00 PM\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order is out for delivery\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} is on the way with order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nDelivery window: {{delivery.window}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"sale-notification\",\n \"name\": \"New sale\",\n \"description\": \"Notifies the seller when an order is placed.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"New order on {{site.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"site.name\",\n \"description\": \"The site the sale happened on\",\n \"sample\": \"Northwind Coffee\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items\",\n \"sample\": \"House Blend — $12.00\"\n },\n {\n \"name\": \"order.total\",\n \"description\": \"Order total\",\n \"sample\": \"$12.00\"\n },\n {\n \"name\": \"buyer.email\",\n \"description\": \"The buyer's email\",\n \"sample\": \"buyer@example.com\"\n },\n {\n \"name\": \"order.ref\",\n \"description\": \"Order reference id\",\n \"sample\": \"cs_test_123\"\n },\n {\n \"name\": \"orders.url\",\n \"description\": \"The site’s Orders page in the console\",\n \"sample\": \"https://app.example.com/northwind/hosts/northwind/products/orders\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{site.name}} · New order\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You made a sale\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"A new paid order came in on {{site.name}}. Here is what was bought and who bought it.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nTotal: {{order.total}}\\nBuyer: {{buyer.email}}\\nPayment reference: {{order.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Open orders\",\n \"href\": \"{{orders.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Fulfill it from Orders: as you mark it shipped, ready for pickup or delivered, the buyer is emailed at each step.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you manage {{host.businessName}}.\"\n },\n {\n \"key\": \"reservation-confirmed\",\n \"name\": \"Reservation confirmed\",\n \"description\": \"Confirms a paid reservation to the customer.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Reservation confirmed\",\n \"mergeTokens\": [\n {\n \"name\": \"reservation.checkIn\",\n \"description\": \"Check-in date\",\n \"sample\": \"Mon, 01 Jun 2026\"\n },\n {\n \"name\": \"reservation.nights\",\n \"description\": \"Number of nights\",\n \"sample\": \"2\"\n },\n {\n \"name\": \"reservation.paid\",\n \"description\": \"What the guest was charged today, lodging tax included; a charge that carried lodging tax names it, as in “$254.40, including $14.40 lodging tax”\",\n \"sample\": \"$240.00\"\n },\n {\n \"name\": \"reservation.balance\",\n \"description\": \"What is still owed for the stay and where it is paid, as a sentence; empty when the stay is paid in full\",\n \"sample\": \"Still to pay: $360.00, at the property. It has not been charged.\"\n },\n {\n \"name\": \"reservation.ref\",\n \"description\": \"Reservation reference id\",\n \"sample\": \"resv_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Reservation\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your stay is confirmed\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your reservation at {{host.businessName}} is booked. Here are the details to keep.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Check-in: {{reservation.checkIn}}\\nNights: {{reservation.nights}}\\nPaid today: {{reservation.paid}}\\nReference: {{reservation.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{reservation.balance}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions before you arrive? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you made a reservation with {{host.businessName}}.\"\n },\n {\n \"key\": \"gift-card\",\n \"name\": \"Gift card delivery\",\n \"description\": \"Delivers a purchased gift card to its recipient.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your gift card for {{host.businessName}}\",\n \"mergeTokens\": [\n {\n \"name\": \"giftcard.code\",\n \"description\": \"The gift card code\",\n \"sample\": \"GC-ABC123DEF456\"\n },\n {\n \"name\": \"giftcard.value\",\n \"description\": \"The gift card value\",\n \"sample\": \"$25.00\"\n },\n {\n \"name\": \"giftcard.note\",\n \"description\": \"The note written when the card was issued by hand; empty for a card bought at checkout\",\n \"sample\": \"Happy birthday, Sam!\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Gift card\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your {{giftcard.value}} gift card\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You have a {{giftcard.value}} gift card for {{host.businessName}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{giftcard.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Value: {{giftcard.value}}\\nGift card code: {{giftcard.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter the code at checkout on {{host.url}} to use its balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Keep this email: the code is what you spend the card with.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because a gift card from {{host.businessName}} was sent to this address.\"\n },\n {\n \"key\": \"supplier-fulfillment\",\n \"name\": \"Supplier fulfillment\",\n \"description\": \"Tells a dropship supplier there is a new order to fulfill.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"fixed\"\n },\n {\n \"key\": \"back-in-stock\",\n \"name\": \"Back in stock\",\n \"description\": \"Tells a customer a product they watched is available again.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Back in stock: {{product.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"product.name\",\n \"description\": \"The product that restocked\",\n \"sample\": \"House Blend\"\n },\n {\n \"name\": \"product.url\",\n \"description\": \"Link to the product page\",\n \"sample\": \"https://shop.example.com/products/house-blend\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{product.name}} is back in stock\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You asked to hear when {{product.name}} was back at {{host.businessName}}. It is, and you can order it now.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{product.name}}\",\n \"href\": \"{{product.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You asked {{host.businessName}} to tell you when it was back. Nothing is held for you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you asked {{host.businessName}} to tell you when this was back.\"\n },\n {\n \"key\": \"abandoned-cart\",\n \"name\": \"Abandoned cart\",\n \"description\": \"Reminds a shopper of items left in their cart.\",\n \"requiresFeature\": \"abandonedCart\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You left something in your cart\",\n \"mergeTokens\": [\n {\n \"name\": \"cart.url\",\n \"description\": \"Link back to the shopper cart\",\n \"sample\": \"https://shop.example.com/cart\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You left something in your cart\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your cart at {{host.businessName}} still has your items in it. Pick up where you left off whenever you are ready.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Return to your cart\",\n \"href\": \"{{cart.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Nothing in your cart is held for you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you started a checkout with {{host.businessName}}.\"\n },\n {\n \"key\": \"review-request\",\n \"name\": \"Review request\",\n \"description\": \"Asks a buyer to review what they bought, a set number of days after the order is fulfilled. One per order; each product has its own single-use link. Turn it off or change the delay in Settings → Reviews.\",\n \"requiresFeature\": \"productReviews\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"How was your order from {{host.businessName}}?\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"review.products\",\n \"description\": \"Each product to review, one per line, with its own review link\",\n \"sample\": \"House Blend: https://shop.example.com/products/house-blend?review=…\"\n },\n {\n \"name\": \"review.url\",\n \"description\": \"The review link for the first product\",\n \"sample\": \"https://shop.example.com/products/house-blend?review=…\"\n },\n {\n \"name\": \"review.productName\",\n \"description\": \"The first product’s name\",\n \"sample\": \"House Blend\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"How did we do?\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks again for your order {{order.number}} from {{host.businessName}}. Would you tell other shoppers what you think? Each link opens the product with a review form ready.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{review.products}}\",\n \"variant\": \"links\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Write a review\",\n \"href\": \"{{review.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Each link works once, for 60 days.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"member-post\",\n \"name\": \"New member post\",\n \"description\": \"Notifies members when new members-only content is posted.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"{{post.title}}\",\n \"mergeTokens\": [\n {\n \"name\": \"post.title\",\n \"description\": \"The post’s title\",\n \"sample\": \"This month in the studio\"\n },\n {\n \"name\": \"post.body\",\n \"description\": \"The post, as its author wrote it\",\n \"sample\": \"Three new pieces are up for members first.\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Members\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{post.title}}\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{post.body}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Visit {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you’re a member of {{host.businessName}}.\"\n },\n {\n \"key\": \"member-password-reset\",\n \"name\": \"Member password reset\",\n \"description\": \"Resets a site member's password — a store-member account, separate from a console login. Sent when the member asks, and when a site administrator starts a reset for them.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Reset your {{site.name}} password\",\n \"mergeTokens\": [\n {\n \"name\": \"site.name\",\n \"description\": \"The site’s name\",\n \"sample\": \"Northwind Coffee\"\n },\n {\n \"name\": \"reset.intro\",\n \"description\": \"Who started the reset\",\n \"sample\": \"Someone asked to reset the password for your Northwind Coffee account.\"\n },\n {\n \"name\": \"resetUrl\",\n \"description\": \"The one-time reset link\",\n \"sample\": \"https://shop.example.com/recover?token=…\"\n },\n {\n \"name\": \"reset.note\",\n \"description\": \"How long the link lasts, and what to do if unexpected\",\n \"sample\": \"The link works once and expires in 1 hour. If you did not ask for this, you can safely ignore this email — your password is unchanged.\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{site.name}} · Account security\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Reset your password\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{reset.intro}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Set a new password\",\n \"href\": \"{{resetUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{reset.note}}\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because a password reset was started for your {{host.businessName}} account.\"\n },\n {\n \"key\": \"member-password-changed\",\n \"name\": \"Member password changed\",\n \"description\": \"Tells a site member that a site administrator set a new password on their account.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your {{site.name}} password was changed\",\n \"mergeTokens\": [\n {\n \"name\": \"site.name\",\n \"description\": \"The site’s name\",\n \"sample\": \"Northwind Coffee\"\n },\n {\n \"name\": \"signInUrl\",\n \"description\": \"Where the member signs back in\",\n \"sample\": \"https://shop.example.com\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{site.name}} · Account security\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your password was changed\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"An administrator of {{site.name}} set a new password on your account and signed you out on every device. To sign back in, get the new password from them, or choose \\\"Forgot password?\\\" on the sign-in page to set your own.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Sign in\",\n \"href\": \"{{signInUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"If you did not expect this, contact the site owner straight away.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because the password on your {{host.businessName}} account was changed.\"\n },\n {\n \"key\": \"newsletter-confirmation\",\n \"name\": \"Subscription confirmation\",\n \"description\": \"Asks someone who signed up for a site’s emails to confirm the address before anything is sent to it.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Confirm your subscription\",\n \"mergeTokens\": [\n {\n \"name\": \"stream.name\",\n \"description\": \"What they signed up for\",\n \"sample\": \"Newsletter\"\n },\n {\n \"name\": \"confirmUrl\",\n \"description\": \"The confirmation link\",\n \"sample\": \"https://shop.example.com/subscribe/confirm?token=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Confirm your subscription\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Please confirm that you want {{stream.name}} emails from {{host.businessName}} at this address. Nothing is sent until you do.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"List: {{stream.name}}\\nFrom: {{host.businessName}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Confirm my subscription\",\n \"href\": \"{{confirmUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"The link works for three days. If you did not sign up, ignore this message and nothing will be sent.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because this address was entered on {{host.businessName}}’s signup form.\"\n },\n {\n \"key\": \"return-requested\",\n \"name\": \"Return requested\",\n \"description\": \"Tells the store a buyer asked to return items, with what and why, so someone can approve or decline it.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Return requested for order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"buyer.email\",\n \"description\": \"The buyer’s email\",\n \"sample\": \"buyer@example.com\"\n },\n {\n \"name\": \"return.customerNote\",\n \"description\": \"What the buyer wrote; empty when they wrote nothing\",\n \"sample\": \"The lid was cracked.\"\n },\n {\n \"name\": \"return.url\",\n \"description\": \"The return in the console, to approve or decline\",\n \"sample\": \"https://app.example.com/northwind/hosts/northwind/products/returns?return=ret_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"A buyer asked for a return\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{buyer.email}} wants to return items from order {{order.number}}. Approve or decline it, and the buyer is emailed your answer.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\\nBuyer: {{buyer.email}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.customerNote}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Review the return\",\n \"href\": \"{{return.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Returns are under Products → Returns, beside the order they are for.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you manage {{host.businessName}}.\"\n },\n {\n \"key\": \"return-approved\",\n \"name\": \"Return approved\",\n \"description\": \"Tells the buyer their return was approved and how to send the items back, with the return label when the store attached one.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your return for order {{order.number}} is approved\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"return.note\",\n \"description\": \"The store’s note to the buyer on this return; empty when none\",\n \"sample\": \"Please include the original packaging.\"\n },\n {\n \"name\": \"return.label\",\n \"description\": \"A sentence with the return label link and its tracking; empty when the store attached no label\",\n \"sample\": \"Print your return label: https://labels.example.com/r/123\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your return is approved\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} approved the return of these items from order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"What to do next\",\n \"variant\": \"subheading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.label}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your refund is sent once {{host.businessName}} receives the items, and you will get an email when it is.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"return-declined\",\n \"name\": \"Return declined\",\n \"description\": \"Tells the buyer their return was declined, with the store’s note.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"About your return for order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"return.note\",\n \"description\": \"The store’s note to the buyer on this return; empty when none\",\n \"sample\": \"Please include the original packaging.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"We could not accept this return\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} declined the return of these items from order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions about it? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"return-refunded\",\n \"name\": \"Return refunded\",\n \"description\": \"Tells the buyer their return was received and refunded, and how much.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your refund for order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"return.refundTotal\",\n \"description\": \"The amount refunded for this return\",\n \"sample\": \"$24.00\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your return is refunded\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} received your return and refunded {{return.refundTotal}} to your original payment method.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\\nTotal refunded: {{return.refundTotal}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Refunds usually appear within 5 to 10 business days, depending on your bank.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"campaign\",\n \"name\": \"Campaign broadcast\",\n \"description\": \"A campaign sent to the site's subscriber list.\",\n \"pluginId\": \"marketing\",\n \"plugin\": \"Marketing\",\n \"control\": \"external\",\n \"authoredIn\": \"Marketing → Campaigns\",\n \"footerReason\": \"You’re receiving this email from {{host.businessName}}.\"\n },\n {\n \"key\": \"workflow-email\",\n \"name\": \"Workflow email step\",\n \"description\": \"An email sent by a workflow's send-email action when its trigger fires.\",\n \"pluginId\": \"workflows\",\n \"plugin\": \"Workflows\",\n \"control\": \"external\",\n \"authoredIn\": \"the workflow that sends it\",\n \"footerReason\": \"You’re receiving this because you’re in touch with {{host.businessName}}.\"\n },\n {\n \"key\": \"loyalty-points-earned\",\n \"name\": \"Rewards points earned\",\n \"description\": \"Tells a customer the points an order earned them, their balance and their rewards code.\",\n \"pluginId\": \"loyalty\",\n \"plugin\": \"Rewards\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You earned {{loyalty.points}} points\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The member's name, when the store knows it\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"loyalty.balance\",\n \"description\": \"Points the member holds now\",\n \"sample\": \"1,250\"\n },\n {\n \"name\": \"loyalty.value\",\n \"description\": \"What those points are worth\",\n \"sample\": \"$12.50\"\n },\n {\n \"name\": \"loyalty.credit\",\n \"description\": \"Store credit the member holds\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.code\",\n \"description\": \"The member’s rewards code, to spend their balance\",\n \"sample\": \"RW-7K3P-Q9XZ-2M4D\"\n },\n {\n \"name\": \"loyalty.referral\",\n \"description\": \"A sentence with the member’s referral code and what it gives; empty when referrals are off\",\n \"sample\": \"Share your referral code RF-7K3P9X: a friend gets $10.00 off their first order, and you get $10.00 in store credit.\"\n },\n {\n \"name\": \"loyalty.points\",\n \"description\": \"Points this order earned\",\n \"sample\": \"45\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Rewards\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You earned {{loyalty.points}} points\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks for your order with {{host.businessName}}, {{name}}. Here is where your rewards stand.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Points: {{loyalty.balance}} (worth {{loyalty.value}})\\nStore credit: {{loyalty.credit}}\\nRewards code: {{loyalty.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter your rewards code at checkout on {{host.url}}, or give it at the register, to spend your balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{loyalty.referral}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you earned rewards with an order from {{host.businessName}}.\"\n },\n {\n \"key\": \"loyalty-store-credit\",\n \"name\": \"Store credit given\",\n \"description\": \"Tells a customer the store gave them store credit, with their rewards code to spend it.\",\n \"pluginId\": \"loyalty\",\n \"plugin\": \"Rewards\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You have {{loyalty.amount}} in store credit\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The member's name, when the store knows it\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"loyalty.balance\",\n \"description\": \"Points the member holds now\",\n \"sample\": \"1,250\"\n },\n {\n \"name\": \"loyalty.value\",\n \"description\": \"What those points are worth\",\n \"sample\": \"$12.50\"\n },\n {\n \"name\": \"loyalty.credit\",\n \"description\": \"Store credit the member holds\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.code\",\n \"description\": \"The member’s rewards code, to spend their balance\",\n \"sample\": \"RW-7K3P-Q9XZ-2M4D\"\n },\n {\n \"name\": \"loyalty.referral\",\n \"description\": \"A sentence with the member’s referral code and what it gives; empty when referrals are off\",\n \"sample\": \"Share your referral code RF-7K3P9X: a friend gets $10.00 off their first order, and you get $10.00 in store credit.\"\n },\n {\n \"name\": \"loyalty.amount\",\n \"description\": \"The credit given\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.note\",\n \"description\": \"The note the store wrote; empty when none\",\n \"sample\": \"Sorry about the delay!\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Rewards\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You have {{loyalty.amount}} in store credit\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} added {{loyalty.amount}} of store credit to your rewards.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{loyalty.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Points: {{loyalty.balance}} (worth {{loyalty.value}})\\nStore credit: {{loyalty.credit}}\\nRewards code: {{loyalty.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter your rewards code at checkout on {{host.url}}, or give it at the register, to spend your balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because {{host.businessName}} gave you store credit.\"\n },\n {\n \"key\": \"loyalty-referral-reward\",\n \"name\": \"Referral reward\",\n \"description\": \"Tells a customer a friend’s first order earned them store credit.\",\n \"pluginId\": \"loyalty\",\n \"plugin\": \"Rewards\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"A friend’s first order earned you {{loyalty.amount}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The member's name, when the store knows it\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"loyalty.balance\",\n \"description\": \"Points the member holds now\",\n \"sample\": \"1,250\"\n },\n {\n \"name\": \"loyalty.value\",\n \"description\": \"What those points are worth\",\n \"sample\": \"$12.50\"\n },\n {\n \"name\": \"loyalty.credit\",\n \"description\": \"Store credit the member holds\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.code\",\n \"description\": \"The member’s rewards code, to spend their balance\",\n \"sample\": \"RW-7K3P-Q9XZ-2M4D\"\n },\n {\n \"name\": \"loyalty.referral\",\n \"description\": \"A sentence with the member’s referral code and what it gives; empty when referrals are off\",\n \"sample\": \"Share your referral code RF-7K3P9X: a friend gets $10.00 off their first order, and you get $10.00 in store credit.\"\n },\n {\n \"name\": \"loyalty.amount\",\n \"description\": \"The reward\",\n \"sample\": \"$10.00\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Rewards\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your referral paid off\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"A friend used your referral code at {{host.businessName}}, so you have {{loyalty.amount}} more in store credit. Thanks for spreading the word.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Points: {{loyalty.balance}} (worth {{loyalty.value}})\\nStore credit: {{loyalty.credit}}\\nRewards code: {{loyalty.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter your rewards code at checkout on {{host.url}}, or give it at the register, to spend your balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because a friend used your referral code at {{host.businessName}}.\"\n },\n {\n \"key\": \"waiver-signed\",\n \"name\": \"Signed waiver copy\",\n \"description\": \"Sends a signer their signed waiver as a PDF, with who it covers and for how long.\",\n \"pluginId\": \"waivers\",\n \"plugin\": \"Waivers\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your signed waiver for {{host.businessName}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The signer’s name\",\n \"sample\": \"Alex Rivera\"\n },\n {\n \"name\": \"waiver.title\",\n \"description\": \"The waiver’s title\",\n \"sample\": \"Rider release and waiver\"\n },\n {\n \"name\": \"waiver.signedAt\",\n \"description\": \"When it was signed, in the site’s time zone\",\n \"sample\": \"Oct 24, 2026, 9:14 AM\"\n },\n {\n \"name\": \"waiver.people\",\n \"description\": \"Everyone it covers: the signer and any minors\",\n \"sample\": \"Alex Rivera, Sam Rivera\"\n },\n {\n \"name\": \"waiver.validity\",\n \"description\": \"The days it covers\",\n \"sample\": \"Good for Oct 24, 2026\"\n },\n {\n \"name\": \"waiver.contact\",\n \"description\": \"How to reach the business, as a sentence: its contact email or phone when the site lists one\",\n \"sample\": \"Contact Ridgeline Moto at hello@example.com or (555) 010-0100.\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Waiver\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your signed waiver\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks, {{name}}. You signed {{waiver.title}} for {{host.businessName}}. Your signed copy is attached to this email as a PDF.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Signed: {{waiver.signedAt}}\\nCovers: {{waiver.people}}\\n{{waiver.validity}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You don’t need to print it: staff can find your waiver by name when you arrive. If anything on it is wrong, contact {{host.businessName}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your paper copy and your choices\",\n \"variant\": \"subheading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You can ask {{host.businessName}} for a paper copy at no charge, change the email address for your copy, or withdraw your agreement to sign electronically for anything not yet sent to you. Withdrawing doesn’t undo the signature you gave. {{waiver.contact}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Visit {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you signed a waiver for {{host.businessName}}.\"\n }\n]\n"],"names":["PLUGIN_TENANT_EMAILS"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/shared/util/email/src/lib/tenant-emails.generated.ts"],"sourcesContent":["/**\n * GENERATED FILE — do not edit. Regenerate with:\n * node tools/scripts/generate-plugin-manifests.mjs\n *\n * The emails sites send their own customers (AGL-3080): what each plugin's\n * `tenantEmails` entry returned when this file was generated, in config\n * order. `TENANT_EMAILS` in `tenant-email-catalog.ts` is this list.\n * Source of truth: plugins.config.json and the entries it names.\n */\n\nimport type { TenantEmailEntry } from './tenant-email-catalog'\n\nexport const PLUGIN_TENANT_EMAILS: readonly TenantEmailEntry[] = [\n {\n \"key\": \"form-confirmation\",\n \"name\": \"Form confirmation\",\n \"description\": \"Sent to the person who filled in a form, when the form is set to email them a confirmation: what they sent, the files they attached, what happens next and how to reach you. Your reply, such as a quote, arrives in the same conversation.\",\n \"pluginId\": \"forms\",\n \"plugin\": \"Forms\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"{{form.subject}}\",\n \"mergeTokens\": [\n {\n \"name\": \"form.subject\",\n \"description\": \"The subject: what they sent, to whom\",\n \"sample\": \"We got your quote request — Northwind Signs\"\n },\n {\n \"name\": \"form.name\",\n \"description\": \"The form’s name\",\n \"sample\": \"Request a quote\"\n },\n {\n \"name\": \"form.heading\",\n \"description\": \"“We got your request” for a request, else “Thanks, we got your message”\",\n \"sample\": \"We got your request\"\n },\n {\n \"name\": \"form.intro\",\n \"description\": \"One sentence on what this email is\",\n \"sample\": \"Thanks for asking Northwind Signs for a quote. Here is a copy of what you sent.\"\n },\n {\n \"name\": \"form.answers\",\n \"description\": \"Their answers, one per line, under the form’s own labels\",\n \"sample\": \"Name: Jane Doe\\nProduct: Vinyl banner — 3 × 6 ft / Matte\\nDetails: Two banners for the spring fair.\"\n },\n {\n \"name\": \"form.files\",\n \"description\": \"The files they attached, by name; empty when there were none\",\n \"sample\": \"Files you sent: logo.ai, banner-sketch.pdf\"\n },\n {\n \"name\": \"form.nextStep\",\n \"description\": \"What happens next\",\n \"sample\": \"Northwind Signs will look over your request and email you a quote. Reply to this email if anything changes.\"\n },\n {\n \"name\": \"business.contact\",\n \"description\": \"How to reach the business beyond a reply: its contact email, and its phone when it lists one\",\n \"sample\": \"You can also reach Northwind Signs at hello@northwind.example or 555-0100.\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · {{form.name}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{form.heading}}\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{form.intro}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{form.answers}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{form.files}}\",\n \"variant\": \"caption\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{form.nextStep}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{business.contact}}\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you sent a form on the {{host.businessName}} website.\"\n },\n {\n \"key\": \"booking-confirmed\",\n \"name\": \"Booking confirmed\",\n \"description\": \"Confirms a booking to the customer, for paid and free services.\",\n \"pluginId\": \"bookings\",\n \"plugin\": \"Bookings\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Booking confirmed: {{service.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The customer's name\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"service.name\",\n \"description\": \"The booked service\",\n \"sample\": \"Consultation\"\n },\n {\n \"name\": \"when\",\n \"description\": \"Formatted date and time of the booking\",\n \"sample\": \"Monday, June 1, 2026 at 9:00 AM\"\n },\n {\n \"name\": \"timezone\",\n \"description\": \"Timezone the time is shown in\",\n \"sample\": \"America/Chicago\"\n },\n {\n \"name\": \"booking.payment\",\n \"description\": \"What a paid booking charged, as a sentence; empty for a free booking\",\n \"sample\": \"You paid $95.00.\"\n },\n {\n \"name\": \"booking.ref\",\n \"description\": \"Booking reference id\",\n \"sample\": \"bk_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Booking\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You’re booked: {{service.name}}\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Hi {{name}}, your booking with {{host.businessName}} is confirmed. Here are the details to keep.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Service: {{service.name}}\\nWhen: {{when}} ({{timezone}})\\nReference: {{booking.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{booking.payment}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Need to change it? Reply to this email and {{host.businessName}} will help.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you booked with {{host.businessName}}.\"\n },\n {\n \"key\": \"booking-reminder\",\n \"name\": \"Booking reminder\",\n \"description\": \"Reminds the customer of an upcoming booking.\",\n \"pluginId\": \"bookings\",\n \"plugin\": \"Bookings\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Reminder: {{service.name}} is coming up\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The customer's name\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"service.name\",\n \"description\": \"The booked service\",\n \"sample\": \"Consultation\"\n },\n {\n \"name\": \"when\",\n \"description\": \"Formatted date and time of the booking\",\n \"sample\": \"Tuesday, June 2, 2026 at 9:00 AM\"\n },\n {\n \"name\": \"timezone\",\n \"description\": \"Timezone the time is shown in\",\n \"sample\": \"America/Chicago\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Booking\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your booking is coming up\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Hi {{name}}, this is a reminder of your booking with {{host.businessName}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Service: {{service.name}}\\nWhen: {{when}} ({{timezone}})\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Can no longer make it? Reply to this email so {{host.businessName}} can offer the time to someone else.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you have a booking with {{host.businessName}}.\"\n },\n {\n \"key\": \"booking-rescheduled\",\n \"name\": \"Booking rescheduled\",\n \"description\": \"Tells the customer their booking moved to a new time.\",\n \"pluginId\": \"bookings\",\n \"plugin\": \"Bookings\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"New time for {{service.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The customer's name\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"service.name\",\n \"description\": \"The booked service\",\n \"sample\": \"Consultation\"\n },\n {\n \"name\": \"when\",\n \"description\": \"The new date and time of the booking\",\n \"sample\": \"Wednesday, June 3, 2026 at 10:30 AM\"\n },\n {\n \"name\": \"previousWhen\",\n \"description\": \"The date and time the booking moved from\",\n \"sample\": \"Monday, June 1, 2026 at 9:00 AM\"\n },\n {\n \"name\": \"timezone\",\n \"description\": \"Timezone the times are shown in\",\n \"sample\": \"America/Chicago\"\n },\n {\n \"name\": \"booking.ref\",\n \"description\": \"Booking reference id\",\n \"sample\": \"bk_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Booking\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your booking has a new time\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Hi {{name}}, your booking with {{host.businessName}} moved. The new time is below; the old one no longer applies.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Service: {{service.name}}\\nNew time: {{when}} ({{timezone}})\\nWas: {{previousWhen}}\\nReference: {{booking.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Does the new time not work? Reply to this email and {{host.businessName}} will help.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you have a booking with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-receipt\",\n \"name\": \"Order receipt\",\n \"description\": \"Sent to the buyer after a successful order or checkout.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Receipt for your order\",\n \"mergeTokens\": [\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line (with any license/download links)\",\n \"sample\": \"House Blend × 2 — $24.00\"\n },\n {\n \"name\": \"order.total\",\n \"description\": \"Order total\",\n \"sample\": \"$24.00\"\n },\n {\n \"name\": \"order.ref\",\n \"description\": \"Order reference id\",\n \"sample\": \"cs_test_123\"\n },\n {\n \"name\": \"store.receiptFooter\",\n \"description\": \"The Receipt footer from the store settings; empty when none is set\",\n \"sample\": \"Returns are accepted within 30 days.\"\n },\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks for your order\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Here is the receipt for your order from {{host.businessName}}. We will email you again as your order moves along, and the order page always shows where it is.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nTotal charged: {{order.total}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{store.receiptFooter}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Order {{order.number}} · payment reference {{order.ref}}. Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-shipped\",\n \"name\": \"Order shipped\",\n \"description\": \"Tells the buyer part or all of their order is on its way, with the carrier and a tracking link when the shipment has one. Sent once per shipment.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} has shipped\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"shipment.summary\",\n \"description\": \"The items in this shipment, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"shipment.carrier\",\n \"description\": \"The carrier; empty when none was recorded\",\n \"sample\": \"UPS\"\n },\n {\n \"name\": \"shipment.trackingNumber\",\n \"description\": \"The tracking number; empty when none was recorded\",\n \"sample\": \"1Z999AA10123456784\"\n },\n {\n \"name\": \"shipment.tracking\",\n \"description\": \"A sentence with the carrier, tracking number and tracking link; empty when the shipment has no tracking number\",\n \"sample\": \"Tracking: UPS 1Z999AA10123456784 — https://www.ups.com/track?tracknum=1Z999AA10123456784\"\n },\n {\n \"name\": \"shipment.remaining\",\n \"description\": \"A sentence saying how many items are still to ship; empty when this shipment completes the order\",\n \"sample\": \"1 more item will ship separately.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order is on its way\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} shipped these items from order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{shipment.summary}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{shipment.tracking}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{shipment.remaining}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Track your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"The order page shows every shipment and its tracking as it moves. Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-delivered\",\n \"name\": \"Order delivered\",\n \"description\": \"Tells the buyer their order was marked delivered.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} was delivered\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order was delivered\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} marked order {{order.number}} as delivered. We hope you enjoy it.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Something missing or not right? Reply to this email and {{host.businessName}} will sort it out.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-refunded\",\n \"name\": \"Order refunded\",\n \"description\": \"Tells the buyer a refund was issued, for how much and, when the store refunded named items, which ones. Sent once per refund.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Refund for your order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"refund.amount\",\n \"description\": \"The amount of this refund\",\n \"sample\": \"$12.00\"\n },\n {\n \"name\": \"refund.summary\",\n \"description\": \"The refunded items, one per line; empty when the refund was by amount only\",\n \"sample\": \"1× House Blend\"\n },\n {\n \"name\": \"refund.note\",\n \"description\": \"Whether the order is now fully refunded, as a sentence\",\n \"sample\": \"Your order has been refunded in full.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your refund is on its way\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} refunded {{refund.amount}} on order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{refund.summary}}\\nTotal refunded: {{refund.amount}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{refund.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Refunds go back to the original payment method and usually appear within 5 to 10 business days, depending on your bank.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-cancelled\",\n \"name\": \"Order canceled\",\n \"description\": \"Tells the buyer their order was canceled.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} was canceled\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"cancel.note\",\n \"description\": \"What happens to the payment, as a sentence; empty when nothing was paid\",\n \"sample\": \"Any payment you made will be refunded, and you will get a separate email when it is.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order was canceled\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} canceled order {{order.number}}. These items will not be sent.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{cancel.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-ready-for-pickup\",\n \"name\": \"Order ready for pickup\",\n \"description\": \"Tells the buyer their pickup order is ready, where to collect it, the pickup hours and any arrival instructions.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} is ready for pickup\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"pickup.location\",\n \"description\": \"The pickup location’s name and address\",\n \"sample\": \"Main Street shop, 12 Main St, Springfield\"\n },\n {\n \"name\": \"pickup.hours\",\n \"description\": \"The location’s pickup hours; empty when it lists none\",\n \"sample\": \"Pickup hours:\\nMo-Fr 09:00-17:00\"\n },\n {\n \"name\": \"pickup.instructions\",\n \"description\": \"What to do on arrival, as the store wrote it; empty when it wrote none\",\n \"sample\": \"Ring the bell at the side door.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order is ready for pickup\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Order {{order.number}} is packed and waiting for you at {{pickup.location}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nPick up at: {{pickup.location}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{pickup.hours}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{pickup.instructions}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Bring your order number, {{order.number}}. Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-picked-up\",\n \"name\": \"Order picked up\",\n \"description\": \"Confirms to the buyer that their pickup order was collected.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You picked up order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"pickup.location\",\n \"description\": \"The pickup location’s name and address\",\n \"sample\": \"Main Street shop, 12 Main St, Springfield\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks for picking up your order\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Order {{order.number}} was picked up from {{pickup.location}}. Enjoy it.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nPicked up at: {{pickup.location}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Something missing or not right? Reply to this email and {{host.businessName}} will sort it out.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"order-out-for-delivery\",\n \"name\": \"Order out for delivery\",\n \"description\": \"Tells the buyer the store’s own driver is on the way with their local delivery, in the window they booked.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your order {{order.number}} is out for delivery\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items, one per line\",\n \"sample\": \"2× House Blend\"\n },\n {\n \"name\": \"delivery.window\",\n \"description\": \"The delivery window the buyer booked\",\n \"sample\": \"Tue, Oct 14, 9:00 AM – 12:00 PM\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your order is out for delivery\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} is on the way with order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nDelivery window: {{delivery.window}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions about your order? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"quote-sent\",\n \"name\": \"Quote\",\n \"description\": \"Sends a quote to the customer when you choose Send quote: your message, the proof, the quote as a PDF and a button to approve or pay it on your site. Later sends, such as a new revision, arrive in the same conversation.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"{{quote.subject}}\",\n \"mergeTokens\": [\n {\n \"name\": \"quote.subject\",\n \"description\": \"The subject typed when sending; it stays the same for every email about the quote\",\n \"sample\": \"Quote #1042 from Northwind Signs\"\n },\n {\n \"name\": \"quote.number\",\n \"description\": \"The quote number\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"quote.revision\",\n \"description\": \"Which revision of the quote this is\",\n \"sample\": \"2\"\n },\n {\n \"name\": \"quote.total\",\n \"description\": \"The quote total; “before tax” when tax is added at payment\",\n \"sample\": \"$1,250.00\"\n },\n {\n \"name\": \"quote.heading\",\n \"description\": \"“Your quote from …”, or “Your updated quote” from the second revision on\",\n \"sample\": \"Your quote from Northwind Signs\"\n },\n {\n \"name\": \"quote.intro\",\n \"description\": \"One sentence on what this email is: a new quote, or an updated revision\",\n \"sample\": \"Here is your quote from Northwind Signs. The quote is attached as a PDF too.\"\n },\n {\n \"name\": \"quote.message\",\n \"description\": \"The message typed when sending; empty when none was typed\",\n \"sample\": \"Thanks for stopping by the shop. Here is the banner we talked about.\"\n },\n {\n \"name\": \"quote.proofImages\",\n \"description\": \"Up to three proof images, each linked to the quote page; empty when the revision has none\",\n \"sample\": \"<table role=\\\"presentation\\\"><tr><td><img src=\\\"https://shop.example.com/api/commerce/quote-proof?file=p1\\\" alt=\\\"Proof: banner.png\\\" width=\\\"552\\\" /></td></tr></table>\"\n },\n {\n \"name\": \"quote.proofFiles\",\n \"description\": \"The other proof files by name, to see on the quote page; empty when there are none\",\n \"sample\": \"Also with this revision: banner.ai. See it on your quote page.\"\n },\n {\n \"name\": \"quote.nextStep\",\n \"description\": \"What to do next: approve the proof first, or pay when ready\",\n \"sample\": \"Look over the proof, then approve it on your quote page. Once you approve it, you can pay there.\"\n },\n {\n \"name\": \"quote.buttonLabel\",\n \"description\": \"“Review and approve” while an approval is needed first, else “View and pay” with the total\",\n \"sample\": \"View and pay $1,250.00\"\n },\n {\n \"name\": \"quote.url\",\n \"description\": \"The quote’s pay link on your site. Private to the customer; it needs no account\",\n \"sample\": \"https://shop.example.com/pay-quote?q=quote_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Quote {{quote.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{quote.heading}}\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{quote.intro}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{quote.message}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Quote: {{quote.number}}\\nRevision: {{quote.revision}}\\nTotal: {{quote.total}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"html\",\n \"html\": \"{{quote.proofImages}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{quote.proofFiles}}\",\n \"variant\": \"caption\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{quote.nextStep}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"{{quote.buttonLabel}}\",\n \"href\": \"{{quote.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Reply to this email to reach {{host.businessName}}.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because {{host.businessName}} prepared a quote for you.\"\n },\n {\n \"key\": \"order-invoice\",\n \"name\": \"Invoice\",\n \"description\": \"Sends an invoice for an order or a quote when you choose Send invoice: your message, the invoice as a PDF and, while it is unpaid, a button to pay it on your site. A paid invoice is the customer’s record. It arrives in the same conversation as the quote’s emails.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"{{invoice.subject}}\",\n \"mergeTokens\": [\n {\n \"name\": \"invoice.subject\",\n \"description\": \"The subject typed when sending; it stays the same as the conversation it joins\",\n \"sample\": \"Invoice #1042 from Northwind Signs\"\n },\n {\n \"name\": \"invoice.number\",\n \"description\": \"The invoice number, which is the order number\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"invoice.date\",\n \"description\": \"The date of the order or quote\",\n \"sample\": \"October 28, 2026\"\n },\n {\n \"name\": \"invoice.total\",\n \"description\": \"The invoice total; “before tax” or “before shipping” when those are added at payment\",\n \"sample\": \"$1,250.00\"\n },\n {\n \"name\": \"invoice.status\",\n \"description\": \"“Paid on …”, or what is still due\",\n \"sample\": \"Unpaid, $1,250.00 due\"\n },\n {\n \"name\": \"invoice.heading\",\n \"description\": \"“Invoice #… from …”\",\n \"sample\": \"Invoice #1042 from Northwind Signs\"\n },\n {\n \"name\": \"invoice.intro\",\n \"description\": \"One sentence on what this email is: an invoice to pay, or a paid one for the customer’s records\",\n \"sample\": \"Northwind Signs sent you an invoice for your order. The details are below, and the invoice is attached as a PDF.\"\n },\n {\n \"name\": \"invoice.message\",\n \"description\": \"The message typed when sending; empty when none was typed\",\n \"sample\": \"Thanks again for your order. Here is the invoice we talked about.\"\n },\n {\n \"name\": \"invoice.nextStep\",\n \"description\": \"What to do next: pay with the button, or keep a paid invoice for the records\",\n \"sample\": \"Use the button below to pay it securely by card. The button keeps working until the invoice is paid.\"\n },\n {\n \"name\": \"invoice.buttonLabel\",\n \"description\": \"“Pay” with the amount; empty on a paid invoice, which leaves the button out\",\n \"sample\": \"Pay $1,250.00\"\n },\n {\n \"name\": \"invoice.url\",\n \"description\": \"The invoice’s pay link on your site. Private to the customer; it needs no account. Empty once paid\",\n \"sample\": \"https://shop.example.com/pay-quote?q=order_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Invoice {{invoice.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{invoice.heading}}\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{invoice.intro}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{invoice.message}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Invoice: {{invoice.number}}\\nDate: {{invoice.date}}\\nTotal: {{invoice.total}}\\nStatus: {{invoice.status}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{invoice.nextStep}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"{{invoice.buttonLabel}}\",\n \"href\": \"{{invoice.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Reply to this email to reach {{host.businessName}}.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because {{host.businessName}} sent you an invoice.\"\n },\n {\n \"key\": \"sale-notification\",\n \"name\": \"New sale\",\n \"description\": \"Notifies the seller when an order is placed.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"New order on {{site.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"site.name\",\n \"description\": \"The site the sale happened on\",\n \"sample\": \"Northwind Coffee\"\n },\n {\n \"name\": \"order.summary\",\n \"description\": \"The ordered items\",\n \"sample\": \"House Blend — $12.00\"\n },\n {\n \"name\": \"order.total\",\n \"description\": \"Order total\",\n \"sample\": \"$12.00\"\n },\n {\n \"name\": \"buyer.email\",\n \"description\": \"The buyer's email\",\n \"sample\": \"buyer@example.com\"\n },\n {\n \"name\": \"order.ref\",\n \"description\": \"Order reference id\",\n \"sample\": \"cs_test_123\"\n },\n {\n \"name\": \"orders.url\",\n \"description\": \"The site’s Orders page in the console\",\n \"sample\": \"https://app.example.com/northwind/hosts/northwind/products/orders\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{site.name}} · New order\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You made a sale\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"A new paid order came in on {{site.name}}. Here is what was bought and who bought it.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{order.summary}}\\nTotal: {{order.total}}\\nBuyer: {{buyer.email}}\\nPayment reference: {{order.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Open orders\",\n \"href\": \"{{orders.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Fulfill it from Orders: as you mark it shipped, ready for pickup or delivered, the buyer is emailed at each step.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you manage {{host.businessName}}.\"\n },\n {\n \"key\": \"reservation-confirmed\",\n \"name\": \"Reservation confirmed\",\n \"description\": \"Confirms a paid reservation to the customer.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Reservation confirmed\",\n \"mergeTokens\": [\n {\n \"name\": \"reservation.checkIn\",\n \"description\": \"Check-in date\",\n \"sample\": \"Mon, 01 Jun 2026\"\n },\n {\n \"name\": \"reservation.nights\",\n \"description\": \"Number of nights\",\n \"sample\": \"2\"\n },\n {\n \"name\": \"reservation.paid\",\n \"description\": \"What the guest was charged today, lodging tax included; a charge that carried lodging tax names it, as in “$254.40, including $14.40 lodging tax”\",\n \"sample\": \"$240.00\"\n },\n {\n \"name\": \"reservation.balance\",\n \"description\": \"What is still owed for the stay and where it is paid, as a sentence; empty when the stay is paid in full\",\n \"sample\": \"Still to pay: $360.00, at the property. It has not been charged.\"\n },\n {\n \"name\": \"reservation.ref\",\n \"description\": \"Reservation reference id\",\n \"sample\": \"resv_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Reservation\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your stay is confirmed\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your reservation at {{host.businessName}} is booked. Here are the details to keep.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Check-in: {{reservation.checkIn}}\\nNights: {{reservation.nights}}\\nPaid today: {{reservation.paid}}\\nReference: {{reservation.ref}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{reservation.balance}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions before you arrive? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you made a reservation with {{host.businessName}}.\"\n },\n {\n \"key\": \"gift-card\",\n \"name\": \"Gift card delivery\",\n \"description\": \"Delivers a purchased gift card to its recipient.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your gift card for {{host.businessName}}\",\n \"mergeTokens\": [\n {\n \"name\": \"giftcard.code\",\n \"description\": \"The gift card code\",\n \"sample\": \"GC-ABC123DEF456\"\n },\n {\n \"name\": \"giftcard.value\",\n \"description\": \"The gift card value\",\n \"sample\": \"$25.00\"\n },\n {\n \"name\": \"giftcard.note\",\n \"description\": \"The note written when the card was issued by hand; empty for a card bought at checkout\",\n \"sample\": \"Happy birthday, Sam!\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Gift card\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your {{giftcard.value}} gift card\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You have a {{giftcard.value}} gift card for {{host.businessName}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{giftcard.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Value: {{giftcard.value}}\\nGift card code: {{giftcard.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter the code at checkout on {{host.url}} to use its balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Keep this email: the code is what you spend the card with.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because a gift card from {{host.businessName}} was sent to this address.\"\n },\n {\n \"key\": \"supplier-fulfillment\",\n \"name\": \"Supplier fulfillment\",\n \"description\": \"Tells a dropship supplier there is a new order to fulfill.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"fixed\"\n },\n {\n \"key\": \"back-in-stock\",\n \"name\": \"Back in stock\",\n \"description\": \"Tells a customer a product they watched is available again.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Back in stock: {{product.name}}\",\n \"mergeTokens\": [\n {\n \"name\": \"product.name\",\n \"description\": \"The product that restocked\",\n \"sample\": \"House Blend\"\n },\n {\n \"name\": \"product.url\",\n \"description\": \"Link to the product page\",\n \"sample\": \"https://shop.example.com/products/house-blend\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{product.name}} is back in stock\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You asked to hear when {{product.name}} was back at {{host.businessName}}. It is, and you can order it now.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{product.name}}\",\n \"href\": \"{{product.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You asked {{host.businessName}} to tell you when it was back. Nothing is held for you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you asked {{host.businessName}} to tell you when this was back.\"\n },\n {\n \"key\": \"abandoned-cart\",\n \"name\": \"Abandoned cart\",\n \"description\": \"Reminds a shopper of items left in their cart.\",\n \"requiresFeature\": \"abandonedCart\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You left something in your cart\",\n \"mergeTokens\": [\n {\n \"name\": \"cart.url\",\n \"description\": \"Link back to the shopper cart\",\n \"sample\": \"https://shop.example.com/cart\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You left something in your cart\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your cart at {{host.businessName}} still has your items in it. Pick up where you left off whenever you are ready.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Return to your cart\",\n \"href\": \"{{cart.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Nothing in your cart is held for you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you started a checkout with {{host.businessName}}.\"\n },\n {\n \"key\": \"review-request\",\n \"name\": \"Review request\",\n \"description\": \"Asks a buyer to review what they bought, a set number of days after the order is fulfilled. One per order; each product has its own single-use link. Turn it off or change the delay in Settings → Reviews.\",\n \"requiresFeature\": \"productReviews\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"How was your order from {{host.businessName}}?\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"review.products\",\n \"description\": \"Each product to review, one per line, with its own review link\",\n \"sample\": \"House Blend: https://shop.example.com/products/house-blend?review=…\"\n },\n {\n \"name\": \"review.url\",\n \"description\": \"The review link for the first product\",\n \"sample\": \"https://shop.example.com/products/house-blend?review=…\"\n },\n {\n \"name\": \"review.productName\",\n \"description\": \"The first product’s name\",\n \"sample\": \"House Blend\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"How did we do?\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks again for your order {{order.number}} from {{host.businessName}}. Would you tell other shoppers what you think? Each link opens the product with a review form ready.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{review.products}}\",\n \"variant\": \"links\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Write a review\",\n \"href\": \"{{review.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Each link works once, for 60 days.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"member-post\",\n \"name\": \"New member post\",\n \"description\": \"Notifies members when new members-only content is posted.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"{{post.title}}\",\n \"mergeTokens\": [\n {\n \"name\": \"post.title\",\n \"description\": \"The post’s title\",\n \"sample\": \"This month in the studio\"\n },\n {\n \"name\": \"post.body\",\n \"description\": \"The post, as its author wrote it\",\n \"sample\": \"Three new pieces are up for members first.\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Members\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{post.title}}\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{post.body}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Visit {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you’re a member of {{host.businessName}}.\"\n },\n {\n \"key\": \"member-password-reset\",\n \"name\": \"Member password reset\",\n \"description\": \"Resets a site member's password — a store-member account, separate from a console login. Sent when the member asks, and when a site administrator starts a reset for them.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Reset your {{site.name}} password\",\n \"mergeTokens\": [\n {\n \"name\": \"site.name\",\n \"description\": \"The site’s name\",\n \"sample\": \"Northwind Coffee\"\n },\n {\n \"name\": \"reset.intro\",\n \"description\": \"Who started the reset\",\n \"sample\": \"Someone asked to reset the password for your Northwind Coffee account.\"\n },\n {\n \"name\": \"resetUrl\",\n \"description\": \"The one-time reset link\",\n \"sample\": \"https://shop.example.com/recover?token=…\"\n },\n {\n \"name\": \"reset.note\",\n \"description\": \"How long the link lasts, and what to do if unexpected\",\n \"sample\": \"The link works once and expires in 1 hour. If you did not ask for this, you can safely ignore this email — your password is unchanged.\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{site.name}} · Account security\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Reset your password\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{reset.intro}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Set a new password\",\n \"href\": \"{{resetUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{reset.note}}\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because a password reset was started for your {{host.businessName}} account.\"\n },\n {\n \"key\": \"member-password-changed\",\n \"name\": \"Member password changed\",\n \"description\": \"Tells a site member that a site administrator set a new password on their account.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your {{site.name}} password was changed\",\n \"mergeTokens\": [\n {\n \"name\": \"site.name\",\n \"description\": \"The site’s name\",\n \"sample\": \"Northwind Coffee\"\n },\n {\n \"name\": \"signInUrl\",\n \"description\": \"Where the member signs back in\",\n \"sample\": \"https://shop.example.com\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{site.name}} · Account security\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your password was changed\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"An administrator of {{site.name}} set a new password on your account and signed you out on every device. To sign back in, get the new password from them, or choose \\\"Forgot password?\\\" on the sign-in page to set your own.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Sign in\",\n \"href\": \"{{signInUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"If you did not expect this, contact the site owner straight away.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because the password on your {{host.businessName}} account was changed.\"\n },\n {\n \"key\": \"newsletter-confirmation\",\n \"name\": \"Subscription confirmation\",\n \"description\": \"Asks someone who signed up for a site’s emails to confirm the address before anything is sent to it.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Confirm your subscription\",\n \"mergeTokens\": [\n {\n \"name\": \"stream.name\",\n \"description\": \"What they signed up for\",\n \"sample\": \"Newsletter\"\n },\n {\n \"name\": \"confirmUrl\",\n \"description\": \"The confirmation link\",\n \"sample\": \"https://shop.example.com/subscribe/confirm?token=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Confirm your subscription\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Please confirm that you want {{stream.name}} emails from {{host.businessName}} at this address. Nothing is sent until you do.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"List: {{stream.name}}\\nFrom: {{host.businessName}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Confirm my subscription\",\n \"href\": \"{{confirmUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"The link works for three days. If you did not sign up, ignore this message and nothing will be sent.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because this address was entered on {{host.businessName}}’s signup form.\"\n },\n {\n \"key\": \"return-requested\",\n \"name\": \"Return requested\",\n \"description\": \"Tells the store a buyer asked to return items, with what and why, so someone can approve or decline it.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Return requested for order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"buyer.email\",\n \"description\": \"The buyer’s email\",\n \"sample\": \"buyer@example.com\"\n },\n {\n \"name\": \"return.customerNote\",\n \"description\": \"What the buyer wrote; empty when they wrote nothing\",\n \"sample\": \"The lid was cracked.\"\n },\n {\n \"name\": \"return.url\",\n \"description\": \"The return in the console, to approve or decline\",\n \"sample\": \"https://app.example.com/northwind/hosts/northwind/products/returns?return=ret_123\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"A buyer asked for a return\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{buyer.email}} wants to return items from order {{order.number}}. Approve or decline it, and the buyer is emailed your answer.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\\nBuyer: {{buyer.email}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.customerNote}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Review the return\",\n \"href\": \"{{return.url}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Returns are under Products → Returns, beside the order they are for.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you manage {{host.businessName}}.\"\n },\n {\n \"key\": \"return-approved\",\n \"name\": \"Return approved\",\n \"description\": \"Tells the buyer their return was approved and how to send the items back, with the return label when the store attached one.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your return for order {{order.number}} is approved\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"return.note\",\n \"description\": \"The store’s note to the buyer on this return; empty when none\",\n \"sample\": \"Please include the original packaging.\"\n },\n {\n \"name\": \"return.label\",\n \"description\": \"A sentence with the return label link and its tracking; empty when the store attached no label\",\n \"sample\": \"Print your return label: https://labels.example.com/r/123\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your return is approved\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} approved the return of these items from order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"What to do next\",\n \"variant\": \"subheading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.label}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your refund is sent once {{host.businessName}} receives the items, and you will get an email when it is.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"return-declined\",\n \"name\": \"Return declined\",\n \"description\": \"Tells the buyer their return was declined, with the store’s note.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"About your return for order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"return.note\",\n \"description\": \"The store’s note to the buyer on this return; empty when none\",\n \"sample\": \"Please include the original packaging.\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"We could not accept this return\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} declined the return of these items from order {{order.number}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Questions about it? Reply to this email and {{host.businessName}} will get back to you.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"return-refunded\",\n \"name\": \"Return refunded\",\n \"description\": \"Tells the buyer their return was received and refunded, and how much.\",\n \"pluginId\": \"commerce\",\n \"plugin\": \"Commerce\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your refund for order {{order.number}}\",\n \"mergeTokens\": [\n {\n \"name\": \"order.number\",\n \"description\": \"The order number, as the store shows it\",\n \"sample\": \"#1042\"\n },\n {\n \"name\": \"return.items\",\n \"description\": \"The items being returned, one per line, with the reason\",\n \"sample\": \"1× House Blend — Arrived damaged\"\n },\n {\n \"name\": \"return.refundTotal\",\n \"description\": \"The amount refunded for this return\",\n \"sample\": \"$24.00\"\n },\n {\n \"name\": \"order.statusUrl\",\n \"description\": \"Link to the order status page: status, shipments and tracking. Private to the buyer; it needs no account\",\n \"sample\": \"https://shop.example.com/order-status?o=ord_123&t=…\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Order {{order.number}}\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your return is refunded\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} received your return and refunded {{return.refundTotal}} to your original payment method.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{return.items}}\\nTotal refunded: {{return.refundTotal}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"button\",\n \"label\": \"View your order\",\n \"href\": \"{{order.statusUrl}}\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Refunds usually appear within 5 to 10 business days, depending on your bank.\",\n \"variant\": \"caption\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you placed an order with {{host.businessName}}.\"\n },\n {\n \"key\": \"campaign\",\n \"name\": \"Campaign broadcast\",\n \"description\": \"A campaign sent to the site's subscriber list.\",\n \"pluginId\": \"marketing\",\n \"plugin\": \"Marketing\",\n \"control\": \"external\",\n \"authoredIn\": \"Marketing → Campaigns\",\n \"footerReason\": \"You’re receiving this email from {{host.businessName}}.\"\n },\n {\n \"key\": \"workflow-email\",\n \"name\": \"Workflow email step\",\n \"description\": \"An email sent by a workflow's send-email action when its trigger fires.\",\n \"pluginId\": \"workflows\",\n \"plugin\": \"Workflows\",\n \"control\": \"external\",\n \"authoredIn\": \"the workflow that sends it\",\n \"footerReason\": \"You’re receiving this because you’re in touch with {{host.businessName}}.\"\n },\n {\n \"key\": \"loyalty-points-earned\",\n \"name\": \"Rewards points earned\",\n \"description\": \"Tells a customer the points an order earned them, their balance and their rewards code.\",\n \"pluginId\": \"loyalty\",\n \"plugin\": \"Rewards\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You earned {{loyalty.points}} points\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The member's name, when the store knows it\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"loyalty.balance\",\n \"description\": \"Points the member holds now\",\n \"sample\": \"1,250\"\n },\n {\n \"name\": \"loyalty.value\",\n \"description\": \"What those points are worth\",\n \"sample\": \"$12.50\"\n },\n {\n \"name\": \"loyalty.credit\",\n \"description\": \"Store credit the member holds\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.code\",\n \"description\": \"The member’s rewards code, to spend their balance\",\n \"sample\": \"RW-7K3P-Q9XZ-2M4D\"\n },\n {\n \"name\": \"loyalty.referral\",\n \"description\": \"A sentence with the member’s referral code and what it gives; empty when referrals are off\",\n \"sample\": \"Share your referral code RF-7K3P9X: a friend gets $10.00 off their first order, and you get $10.00 in store credit.\"\n },\n {\n \"name\": \"loyalty.points\",\n \"description\": \"Points this order earned\",\n \"sample\": \"45\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Rewards\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You earned {{loyalty.points}} points\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks for your order with {{host.businessName}}, {{name}}. Here is where your rewards stand.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Points: {{loyalty.balance}} (worth {{loyalty.value}})\\nStore credit: {{loyalty.credit}}\\nRewards code: {{loyalty.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter your rewards code at checkout on {{host.url}}, or give it at the register, to spend your balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{loyalty.referral}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you earned rewards with an order from {{host.businessName}}.\"\n },\n {\n \"key\": \"loyalty-store-credit\",\n \"name\": \"Store credit given\",\n \"description\": \"Tells a customer the store gave them store credit, with their rewards code to spend it.\",\n \"pluginId\": \"loyalty\",\n \"plugin\": \"Rewards\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"You have {{loyalty.amount}} in store credit\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The member's name, when the store knows it\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"loyalty.balance\",\n \"description\": \"Points the member holds now\",\n \"sample\": \"1,250\"\n },\n {\n \"name\": \"loyalty.value\",\n \"description\": \"What those points are worth\",\n \"sample\": \"$12.50\"\n },\n {\n \"name\": \"loyalty.credit\",\n \"description\": \"Store credit the member holds\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.code\",\n \"description\": \"The member’s rewards code, to spend their balance\",\n \"sample\": \"RW-7K3P-Q9XZ-2M4D\"\n },\n {\n \"name\": \"loyalty.referral\",\n \"description\": \"A sentence with the member’s referral code and what it gives; empty when referrals are off\",\n \"sample\": \"Share your referral code RF-7K3P9X: a friend gets $10.00 off their first order, and you get $10.00 in store credit.\"\n },\n {\n \"name\": \"loyalty.amount\",\n \"description\": \"The credit given\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.note\",\n \"description\": \"The note the store wrote; empty when none\",\n \"sample\": \"Sorry about the delay!\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Rewards\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You have {{loyalty.amount}} in store credit\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} added {{loyalty.amount}} of store credit to your rewards.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"{{loyalty.note}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Points: {{loyalty.balance}} (worth {{loyalty.value}})\\nStore credit: {{loyalty.credit}}\\nRewards code: {{loyalty.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter your rewards code at checkout on {{host.url}}, or give it at the register, to spend your balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because {{host.businessName}} gave you store credit.\"\n },\n {\n \"key\": \"loyalty-referral-reward\",\n \"name\": \"Referral reward\",\n \"description\": \"Tells a customer a friend’s first order earned them store credit.\",\n \"pluginId\": \"loyalty\",\n \"plugin\": \"Rewards\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"A friend’s first order earned you {{loyalty.amount}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The member's name, when the store knows it\",\n \"sample\": \"Alex\"\n },\n {\n \"name\": \"loyalty.balance\",\n \"description\": \"Points the member holds now\",\n \"sample\": \"1,250\"\n },\n {\n \"name\": \"loyalty.value\",\n \"description\": \"What those points are worth\",\n \"sample\": \"$12.50\"\n },\n {\n \"name\": \"loyalty.credit\",\n \"description\": \"Store credit the member holds\",\n \"sample\": \"$10.00\"\n },\n {\n \"name\": \"loyalty.code\",\n \"description\": \"The member’s rewards code, to spend their balance\",\n \"sample\": \"RW-7K3P-Q9XZ-2M4D\"\n },\n {\n \"name\": \"loyalty.referral\",\n \"description\": \"A sentence with the member’s referral code and what it gives; empty when referrals are off\",\n \"sample\": \"Share your referral code RF-7K3P9X: a friend gets $10.00 off their first order, and you get $10.00 in store credit.\"\n },\n {\n \"name\": \"loyalty.amount\",\n \"description\": \"The reward\",\n \"sample\": \"$10.00\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Rewards\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your referral paid off\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"A friend used your referral code at {{host.businessName}}, so you have {{loyalty.amount}} more in store credit. Thanks for spreading the word.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Points: {{loyalty.balance}} (worth {{loyalty.value}})\\nStore credit: {{loyalty.credit}}\\nRewards code: {{loyalty.code}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Enter your rewards code at checkout on {{host.url}}, or give it at the register, to spend your balance.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Shop {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because a friend used your referral code at {{host.businessName}}.\"\n },\n {\n \"key\": \"waiver-signed\",\n \"name\": \"Signed waiver copy\",\n \"description\": \"Sends a signer their signed waiver as a PDF, with who it covers and for how long.\",\n \"pluginId\": \"waivers\",\n \"plugin\": \"Waivers\",\n \"control\": \"besigner\",\n \"defaultSubject\": \"Your signed waiver for {{host.businessName}}\",\n \"mergeTokens\": [\n {\n \"name\": \"name\",\n \"description\": \"The signer’s name\",\n \"sample\": \"Alex Rivera\"\n },\n {\n \"name\": \"waiver.title\",\n \"description\": \"The waiver’s title\",\n \"sample\": \"Rider release and waiver\"\n },\n {\n \"name\": \"waiver.signedAt\",\n \"description\": \"When it was signed, in the site’s time zone\",\n \"sample\": \"Oct 24, 2026, 9:14 AM\"\n },\n {\n \"name\": \"waiver.people\",\n \"description\": \"Everyone it covers: the signer and any minors\",\n \"sample\": \"Alex Rivera, Sam Rivera\"\n },\n {\n \"name\": \"waiver.validity\",\n \"description\": \"The days it covers\",\n \"sample\": \"Good for Oct 24, 2026\"\n },\n {\n \"name\": \"waiver.contact\",\n \"description\": \"How to reach the business, as a sentence: its contact email or phone when the site lists one\",\n \"sample\": \"Contact Ridgeline Moto at hello@example.com or (555) 010-0100.\"\n }\n ],\n \"defaultBody\": [\n {\n \"block\": \"text\",\n \"text\": \"{{host.businessName}} · Waiver\",\n \"variant\": \"eyebrow\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your signed waiver\",\n \"variant\": \"heading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Thanks, {{name}}. You signed {{waiver.title}} for {{host.businessName}}. Your signed copy is attached to this email as a PDF.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Signed: {{waiver.signedAt}}\\nCovers: {{waiver.people}}\\n{{waiver.validity}}\",\n \"variant\": \"details\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You don’t need to print it: staff can find your waiver by name when you arrive. If anything on it is wrong, contact {{host.businessName}}.\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"text\",\n \"text\": \"Your paper copy and your choices\",\n \"variant\": \"subheading\"\n },\n {\n \"block\": \"text\",\n \"text\": \"You can ask {{host.businessName}} for a paper copy at no charge, change the email address for your copy, or withdraw your agreement to sign electronically for anything not yet sent to you. Withdrawing doesn’t undo the signature you gave. {{waiver.contact}}\",\n \"variant\": \"body\"\n },\n {\n \"block\": \"button\",\n \"label\": \"Visit {{host.businessName}}\",\n \"href\": \"{{host.url}}\"\n }\n ],\n \"footerReason\": \"You’re receiving this because you signed a waiver for {{host.businessName}}.\"\n }\n]\n"],"names":["PLUGIN_TENANT_EMAILS"],"mappings":"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"}
|