@storecraft/database-sql-base 1.0.11 → 1.0.13
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/index.js +23 -25
- package/migrations.mysql/00002_seed_email_templates.js +1 -0
- package/migrations.postgres/00002_seed_email_templates.js +1 -0
- package/migrations.shared/00002_seed_email_templates.js +27 -0
- package/migrations.sqlite/00002_seed_email_templates.js +1 -0
- package/package.json +1 -1
- package/src/con.auth_users.js +8 -9
- package/src/con.collections.js +3 -3
- package/src/con.customers.js +3 -3
- package/src/con.discounts.js +3 -3
- package/src/con.discounts.utils.js +22 -14
- package/src/con.images.js +7 -5
- package/src/con.notifications.js +3 -3
- package/src/con.orders.js +4 -3
- package/src/con.posts.js +4 -3
- package/src/con.products.js +8 -7
- package/src/con.search.js +9 -10
- package/src/con.shared.js +37 -36
- package/src/con.shipping.js +8 -8
- package/src/con.storefronts.js +3 -3
- package/src/con.tags.js +13 -4
- package/src/con.templates.js +16 -6
- package/src/kysely.sanitize.plugin.js +10 -8
- package/src/utils.funcs.js +5 -1
- package/src/utils.query.js +13 -10
- package/types.public.d.ts +2 -2
- package/migrations.mssql/00000_init_tables.js +0 -268
- package/migrations.shared/00001_seed_email_templates copy.js +0 -262
- package/tests/runner.mssql-local.test.js +0 -122
@@ -1,268 +0,0 @@
|
|
1
|
-
import { CreateTableBuilder, Kysely } from 'kysely'
|
2
|
-
|
3
|
-
/**
|
4
|
-
* @typedef {import('../types.sql.tables.js').Database} Database
|
5
|
-
*/
|
6
|
-
|
7
|
-
/**
|
8
|
-
* @template {string} TB
|
9
|
-
* @template {string} B
|
10
|
-
* @param {CreateTableBuilder<TB, B>} tb
|
11
|
-
*/
|
12
|
-
const add_base_columns = tb => {
|
13
|
-
return tb
|
14
|
-
.addColumn('id', 'VARCHAR(256)', (col) =>
|
15
|
-
col.primaryKey()
|
16
|
-
)
|
17
|
-
.addColumn('handle', 'VARCHAR(256)', (col) => col.unique())
|
18
|
-
.addColumn('created_at', 'text')
|
19
|
-
.addColumn('updated_at', 'text')
|
20
|
-
.addColumn('attributes', 'VARCHAR(MAX)')
|
21
|
-
.addColumn('description', 'text')
|
22
|
-
.addColumn('active', 'integer')
|
23
|
-
}
|
24
|
-
|
25
|
-
/**
|
26
|
-
* @param {Kysely<Database>} db
|
27
|
-
* @param {keyof Database} table_name
|
28
|
-
*/
|
29
|
-
const create_entity_to_value_table = (db, table_name) => {
|
30
|
-
|
31
|
-
return db.schema
|
32
|
-
.createTable(table_name)
|
33
|
-
.addColumn('id', 'integer',
|
34
|
-
(col) => col.autoIncrement().primaryKey()
|
35
|
-
)
|
36
|
-
.addColumn('entity_id', 'VARCHAR(256)', col => col.notNull())
|
37
|
-
.addColumn('entity_handle', 'VARCHAR(256)')
|
38
|
-
.addColumn('value', 'VARCHAR(256)')
|
39
|
-
.addColumn('reporter', 'VARCHAR(256)')
|
40
|
-
.addColumn('context', 'VARCHAR(256)')
|
41
|
-
}
|
42
|
-
|
43
|
-
/**
|
44
|
-
*
|
45
|
-
* @param {Kysely<Database>} db
|
46
|
-
* @param {keyof Database} table_name
|
47
|
-
*/
|
48
|
-
const create_safe_table = (db, table_name) => {
|
49
|
-
return db.schema.createTable(table_name);
|
50
|
-
}
|
51
|
-
|
52
|
-
/**
|
53
|
-
*
|
54
|
-
* @param {Kysely<Database>} db
|
55
|
-
* @param {keyof Database} table_name
|
56
|
-
*/
|
57
|
-
const drop_safe_table = (db, table_name) => {
|
58
|
-
return db.schema.dropTable(table_name).execute();
|
59
|
-
}
|
60
|
-
|
61
|
-
/**
|
62
|
-
*
|
63
|
-
* @param {Kysely<Database>} db
|
64
|
-
*/
|
65
|
-
export async function up(db) {
|
66
|
-
{ // auth_users
|
67
|
-
let tb = create_safe_table(db, 'auth_users');
|
68
|
-
tb = add_base_columns(tb);
|
69
|
-
tb = tb
|
70
|
-
.addColumn('email', 'VARCHAR(256)', (col) => col.unique())
|
71
|
-
.addColumn('password', 'text')
|
72
|
-
.addColumn('roles', 'VARCHAR(MAX)')
|
73
|
-
.addColumn('confirmed_mail', 'integer');
|
74
|
-
await tb.execute();
|
75
|
-
}
|
76
|
-
|
77
|
-
{ // tags
|
78
|
-
let tb = create_safe_table(db, 'tags');
|
79
|
-
tb = add_base_columns(tb);
|
80
|
-
tb = tb.addColumn('values', 'VARCHAR(MAX)');
|
81
|
-
await tb.execute();
|
82
|
-
}
|
83
|
-
|
84
|
-
{ // collections
|
85
|
-
let tb = create_safe_table(db, 'collections');
|
86
|
-
tb = add_base_columns(tb);
|
87
|
-
tb = tb
|
88
|
-
.addColumn('title', 'text')
|
89
|
-
.addColumn('published', 'text')
|
90
|
-
await tb.execute();
|
91
|
-
}
|
92
|
-
|
93
|
-
{ // products
|
94
|
-
let tb = create_safe_table(db, 'products');
|
95
|
-
tb = add_base_columns(tb);
|
96
|
-
tb = tb
|
97
|
-
.addColumn('title', 'text')
|
98
|
-
.addColumn('video', 'text')
|
99
|
-
.addColumn('price', 'numeric')
|
100
|
-
.addColumn('compare_at_price', 'numeric')
|
101
|
-
.addColumn('qty', 'integer')
|
102
|
-
.addColumn('variants_options', 'VARCHAR(MAX)')
|
103
|
-
.addColumn('parent_handle', 'text')
|
104
|
-
.addColumn('parent_id', 'text')
|
105
|
-
.addColumn('variant_hint', 'VARCHAR(MAX)')
|
106
|
-
await tb.execute();
|
107
|
-
}
|
108
|
-
|
109
|
-
{ // products_to_collections
|
110
|
-
let tb = create_entity_to_value_table(db, 'products_to_collections')
|
111
|
-
await tb.execute();
|
112
|
-
}
|
113
|
-
|
114
|
-
{ // products_to_discounts
|
115
|
-
let tb = create_entity_to_value_table(db, 'products_to_discounts')
|
116
|
-
await tb.execute();
|
117
|
-
}
|
118
|
-
|
119
|
-
{ // products_to_variants
|
120
|
-
let tb = create_entity_to_value_table(db, 'products_to_variants')
|
121
|
-
await tb.execute();
|
122
|
-
}
|
123
|
-
|
124
|
-
{ // shipping_methods
|
125
|
-
let tb = create_safe_table(db, 'shipping_methods');
|
126
|
-
tb = add_base_columns(tb);
|
127
|
-
tb = tb.addColumn('title', 'text')
|
128
|
-
.addColumn('price', 'numeric')
|
129
|
-
await tb.execute();
|
130
|
-
}
|
131
|
-
|
132
|
-
{ // posts
|
133
|
-
let tb = create_safe_table(db, 'posts');
|
134
|
-
tb = add_base_columns(tb);
|
135
|
-
tb = tb
|
136
|
-
.addColumn('title', 'text')
|
137
|
-
.addColumn('text', 'text')
|
138
|
-
await tb.execute();
|
139
|
-
}
|
140
|
-
|
141
|
-
{ // customers
|
142
|
-
let tb = create_safe_table(db, 'customers');
|
143
|
-
tb = add_base_columns(tb);
|
144
|
-
tb = tb
|
145
|
-
.addColumn('email', 'VARCHAR(256)', (col) => col.unique())
|
146
|
-
.addColumn('auth_id', 'VARCHAR(256)', (col) => col.unique())
|
147
|
-
.addColumn('firstname', 'text')
|
148
|
-
.addColumn('lastname', 'text')
|
149
|
-
.addColumn('phone_number', 'text')
|
150
|
-
.addColumn('address', 'VARCHAR(MAX)')
|
151
|
-
await tb.execute();
|
152
|
-
}
|
153
|
-
|
154
|
-
{ // orders
|
155
|
-
let tb = create_safe_table(db, 'orders');
|
156
|
-
tb = add_base_columns(tb);
|
157
|
-
tb = tb
|
158
|
-
.addColumn('contact', 'VARCHAR(MAX)')
|
159
|
-
.addColumn('address', 'VARCHAR(MAX)')
|
160
|
-
.addColumn('line_items', 'VARCHAR(MAX)')
|
161
|
-
.addColumn('notes', 'text')
|
162
|
-
.addColumn('shipping_method', 'VARCHAR(MAX)')
|
163
|
-
.addColumn('status', 'VARCHAR(MAX)')
|
164
|
-
.addColumn('pricing', 'VARCHAR(MAX)')
|
165
|
-
.addColumn('validation', 'VARCHAR(MAX)')
|
166
|
-
.addColumn('payment_gateway', 'VARCHAR(MAX)')
|
167
|
-
.addColumn('coupons', 'VARCHAR(MAX)')
|
168
|
-
.addColumn('_customer_id', 'text')
|
169
|
-
.addColumn('_customer_email', 'text')
|
170
|
-
.addColumn('_status_payment_id', 'integer')
|
171
|
-
.addColumn('_status_checkout_id', 'integer')
|
172
|
-
.addColumn('_status_fulfillment_id', 'integer')
|
173
|
-
|
174
|
-
await tb.execute();
|
175
|
-
}
|
176
|
-
|
177
|
-
{ // storefronts
|
178
|
-
let tb = create_safe_table(db, 'storefronts');
|
179
|
-
tb = add_base_columns(tb);
|
180
|
-
tb = tb
|
181
|
-
.addColumn('title', 'text')
|
182
|
-
.addColumn('video', 'text')
|
183
|
-
.addColumn('published', 'text')
|
184
|
-
await tb.execute();
|
185
|
-
}
|
186
|
-
|
187
|
-
{ // storefronts_to_other
|
188
|
-
let tb = create_entity_to_value_table(db, 'storefronts_to_other')
|
189
|
-
await tb.execute();
|
190
|
-
}
|
191
|
-
|
192
|
-
{ // notifications
|
193
|
-
let tb = create_safe_table(db, 'notifications');
|
194
|
-
tb = add_base_columns(tb);
|
195
|
-
tb = tb
|
196
|
-
.addColumn('message', 'text')
|
197
|
-
.addColumn('author', 'text')
|
198
|
-
.addColumn('actions', 'VARCHAR(MAX)')
|
199
|
-
await tb.execute();
|
200
|
-
}
|
201
|
-
|
202
|
-
{ // images
|
203
|
-
let tb = create_safe_table(db, 'images');
|
204
|
-
tb = add_base_columns(tb);
|
205
|
-
tb = tb
|
206
|
-
.addColumn('name', 'text')
|
207
|
-
.addColumn('url', 'text')
|
208
|
-
await tb.execute();
|
209
|
-
}
|
210
|
-
|
211
|
-
{ // discounts
|
212
|
-
let tb = create_safe_table(db, 'discounts');
|
213
|
-
tb = add_base_columns(tb);
|
214
|
-
tb = tb
|
215
|
-
.addColumn('title', 'text')
|
216
|
-
.addColumn('published', 'text')
|
217
|
-
.addColumn('priority', 'integer')
|
218
|
-
.addColumn('info', 'json')
|
219
|
-
.addColumn('application', 'VARCHAR(MAX)')
|
220
|
-
.addColumn('_application_id', 'integer')
|
221
|
-
.addColumn('_discount_type_id', 'integer')
|
222
|
-
await tb.execute();
|
223
|
-
}
|
224
|
-
|
225
|
-
{ // entity_to_tags_projections
|
226
|
-
let tb = create_entity_to_value_table(db, 'entity_to_tags_projections')
|
227
|
-
await tb.execute();
|
228
|
-
}
|
229
|
-
|
230
|
-
{ // entity_to_search_terms
|
231
|
-
let tb = create_entity_to_value_table(db, 'entity_to_search_terms')
|
232
|
-
await tb.execute();
|
233
|
-
}
|
234
|
-
|
235
|
-
{ // entity_to_media
|
236
|
-
let tb = create_entity_to_value_table(db, 'entity_to_media')
|
237
|
-
await tb.execute();
|
238
|
-
}
|
239
|
-
|
240
|
-
}
|
241
|
-
|
242
|
-
/**
|
243
|
-
*
|
244
|
-
* @param {Kysely<Database>} db
|
245
|
-
*/
|
246
|
-
export async function down(db) {
|
247
|
-
await Promise.all([
|
248
|
-
drop_safe_table(db, 'auth_users'),
|
249
|
-
drop_safe_table(db, 'tags'),
|
250
|
-
drop_safe_table(db, 'collections'),
|
251
|
-
drop_safe_table(db, 'customers'),
|
252
|
-
drop_safe_table(db, 'discounts'),
|
253
|
-
drop_safe_table(db, 'images'),
|
254
|
-
drop_safe_table(db, 'notifications'),
|
255
|
-
drop_safe_table(db, 'orders'),
|
256
|
-
drop_safe_table(db, 'posts'),
|
257
|
-
drop_safe_table(db, 'shipping_methods'),
|
258
|
-
drop_safe_table(db, 'products'),
|
259
|
-
drop_safe_table(db, 'products_to_collections'),
|
260
|
-
drop_safe_table(db, 'products_to_discounts'),
|
261
|
-
drop_safe_table(db, 'products_to_variants'),
|
262
|
-
drop_safe_table(db, 'storefronts'),
|
263
|
-
drop_safe_table(db, 'storefronts_to_other'),
|
264
|
-
drop_safe_table(db, 'entity_to_media'),
|
265
|
-
drop_safe_table(db, 'entity_to_search_terms'),
|
266
|
-
drop_safe_table(db, 'entity_to_tags_projections'),
|
267
|
-
]);
|
268
|
-
}
|
@@ -1,262 +0,0 @@
|
|
1
|
-
import { Kysely } from 'kysely'
|
2
|
-
import { upsert } from '../src/con.templates.js'
|
3
|
-
|
4
|
-
/**
|
5
|
-
* @typedef {import('../types.sql.tables.js').Database} Database
|
6
|
-
*/
|
7
|
-
|
8
|
-
/**
|
9
|
-
*
|
10
|
-
* @param {Kysely<Database>} db
|
11
|
-
*/
|
12
|
-
export async function up(db) {
|
13
|
-
|
14
|
-
for (const template of templates.slice(0, 1)) {
|
15
|
-
const result = await upsert(db)(template);
|
16
|
-
if(!result)
|
17
|
-
throw new Error('Failed to write a template object')
|
18
|
-
}
|
19
|
-
}
|
20
|
-
|
21
|
-
/**
|
22
|
-
*
|
23
|
-
* @param {Kysely<Database>} db
|
24
|
-
*/
|
25
|
-
export async function down(db) {
|
26
|
-
}
|
27
|
-
|
28
|
-
|
29
|
-
const templates = [
|
30
|
-
{
|
31
|
-
"title": "Welcome Customer",
|
32
|
-
"template_html": `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns=\"http://www.w3.org/1999/xhtml\" style=\"color-scheme: light dark; supported-color-schemes: light dark;\">\n <head>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <meta name=\"x-apple-disable-message-reformatting\" />\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <meta name=\"color-scheme\" content=\"light dark\" />\n <meta name=\"supported-color-schemes\" content=\"light dark\" />\n <title></title>\n <style type=\"text/css\" rel=\"stylesheet\" media=\"all\">\n /* Base ------------------------------ */\n \n @import url(\"https://fonts.googleapis.com/css?family=Nunito+Sans:400,700&display=swap\");\n body {\n width: 100% !important;\n height: 100%;\n margin: 0;\n -webkit-text-size-adjust: none;\n }\n \n a {\n color: #3869D4;\n }\n \n a img {\n border: none;\n }\n \n td {\n word-break: break-word;\n }\n \n .preheader {\n display: none !important;\n visibility: hidden;\n mso-hide: all;\n font-size: 1px;\n line-height: 1px;\n max-height: 0;\n max-width: 0;\n opacity: 0;\n overflow: hidden;\n }\n /* Type ------------------------------ */\n \n body,\n td,\n th {\n font-family: \"Nunito Sans\", Helvetica, Arial, sans-serif;\n }\n \n h1 {\n margin-top: 0;\n color: #333333;\n font-size: 22px;\n font-weight: bold;\n text-align: left;\n }\n \n h2 {\n margin-top: 0;\n color: #333333;\n font-size: 16px;\n font-weight: bold;\n text-align: left;\n }\n \n h3 {\n margin-top: 0;\n color: #333333;\n font-size: 14px;\n font-weight: bold;\n text-align: left;\n }\n \n td,\n th {\n font-size: 16px;\n }\n \n p,\n ul,\n ol,\n blockquote {\n margin: .4em 0 1.1875em;\n font-size: 16px;\n line-height: 1.625;\n }\n \n p.sub {\n font-size: 13px;\n }\n /* Utilities ------------------------------ */\n \n .align-right {\n text-align: right;\n }\n \n .align-left {\n text-align: left;\n }\n \n .align-center {\n text-align: center;\n }\n \n .u-margin-bottom-none {\n margin-bottom: 0;\n }\n /* Buttons ------------------------------ */\n \n .button {\n background-color: #3869D4;\n border-top: 10px solid #3869D4;\n border-right: 18px solid #3869D4;\n border-bottom: 10px solid #3869D4;\n border-left: 18px solid #3869D4;\n display: inline-block;\n color: #FFF;\n text-decoration: none;\n border-radius: 3px;\n box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16);\n -webkit-text-size-adjust: none;\n box-sizing: border-box;\n }\n \n .button--green {\n background-color: #22BC66;\n border-top: 10px solid #22BC66;\n border-right: 18px solid #22BC66;\n border-bottom: 10px solid #22BC66;\n border-left: 18px solid #22BC66;\n }\n \n .button--red {\n background-color: #FF6136;\n border-top: 10px solid #FF6136;\n border-right: 18px solid #FF6136;\n border-bottom: 10px solid #FF6136;\n border-left: 18px solid #FF6136;\n }\n \n @media only screen and (max-width: 500px) {\n .button {\n width: 100% !important;\n text-align: center !important;\n }\n }\n /* Attribute list ------------------------------ */\n \n .attributes {\n margin: 0 0 21px;\n }\n \n .attributes_content {\n background-color: #F4F4F7;\n padding: 16px;\n }\n \n .attributes_item {\n padding: 0;\n }\n /* Related Items ------------------------------ */\n \n .related {\n width: 100%;\n margin: 0;\n padding: 25px 0 0 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n \n .related_item {\n padding: 10px 0;\n color: #CBCCCF;\n font-size: 15px;\n line-height: 18px;\n }\n \n .related_item-title {\n display: block;\n margin: .5em 0 0;\n }\n \n .related_item-thumb {\n display: block;\n padding-bottom: 10px;\n }\n \n .related_heading {\n border-top: 1px solid #CBCCCF;\n text-align: center;\n padding: 25px 0 10px;\n }\n /* Discount Code ------------------------------ */\n \n .discount {\n width: 100%;\n margin: 0;\n padding: 24px;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #F4F4F7;\n border: 2px dashed #CBCCCF;\n }\n \n .discount_heading {\n text-align: center;\n }\n \n .discount_body {\n text-align: center;\n font-size: 15px;\n }\n /* Social Icons ------------------------------ */\n \n .social {\n width: auto;\n }\n \n .social td {\n padding: 0;\n width: auto;\n }\n \n .social_icon {\n height: 20px;\n margin: 0 8px 10px 8px;\n padding: 0;\n }\n /* Data table ------------------------------ */\n \n .purchase {\n width: 100%;\n margin: 0;\n padding: 35px 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n \n .purchase_content {\n width: 100%;\n margin: 0;\n padding: 25px 0 0 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n \n .purchase_item {\n padding: 10px 0;\n color: #51545E;\n font-size: 15px;\n line-height: 18px;\n }\n \n .purchase_heading {\n padding-bottom: 8px;\n border-bottom: 1px solid #EAEAEC;\n }\n \n .purchase_heading p {\n margin: 0;\n color: #85878E;\n font-size: 12px;\n }\n \n .purchase_footer {\n padding-top: 15px;\n border-top: 1px solid #EAEAEC;\n }\n \n .purchase_total {\n margin: 0;\n text-align: right;\n font-weight: bold;\n color: #333333;\n }\n \n .purchase_total--label {\n padding: 0 15px 0 0;\n }\n \n body {\n background-color: #F4F4F7;\n color: #51545E;\n }\n \n p {\n color: #51545E;\n }\n \n p.sub {\n color: #6B6E76;\n }\n \n .email-wrapper {\n width: 100%;\n margin: 0;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #F4F4F7;\n }\n \n .email-content {\n width: 100%;\n margin: 0;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n /* Masthead ----------------------- */\n \n .email-masthead {\n padding: 25px 0;\n text-align: center;\n }\n \n .email-masthead_logo {\n width: 94px;\n }\n \n .email-masthead_name {\n font-size: 16px;\n font-weight: bold;\n color: #A8AAAF;\n text-decoration: none;\n text-shadow: 0 1px 0 white;\n }\n /* Body ------------------------------ */\n \n .email-body {\n width: 100%;\n margin: 0;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #FFFFFF;\n }\n \n .email-body_inner {\n width: 570px;\n margin: 0 auto;\n padding: 0;\n -premailer-width: 570px;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #FFFFFF;\n }\n \n .email-footer {\n width: 570px;\n margin: 0 auto;\n padding: 0;\n -premailer-width: 570px;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n text-align: center;\n }\n \n .email-footer p {\n color: #6B6E76;\n }\n \n .body-action {\n width: 100%;\n margin: 30px auto;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n text-align: center;\n }\n \n .body-sub {\n margin-top: 25px;\n padding-top: 25px;\n border-top: 1px solid #EAEAEC;\n }\n \n .content-cell {\n padding: 35px;\n }\n /*Media Queries ------------------------------ */\n \n @media only screen and (max-width: 600px) {\n .email-body_inner,\n .email-footer {\n width: 100% !important;\n }\n }\n \n @media (prefers-color-scheme: dark) {\n body,\n .email-body,\n .email-body_inner,\n .email-content,\n .email-wrapper,\n .email-masthead,\n .email-footer {\n background-color: #333333 !important;\n color: #FFF !important;\n }\n p,\n ul,\n ol,\n blockquote,\n h1,\n h2,\n h3,\n span,\n .purchase_item {\n color: #FFF !important;\n }\n .attributes_content,\n .discount {\n background-color: #222 !important;\n }\n .email-masthead_name {\n text-shadow: none !important;\n }\n }\n \n :root {\n color-scheme: light dark;\n supported-color-schemes: light dark;\n }\n </style>\n <!--[if mso]>\n <style type=\"text/css\">\n .f-fallback {\n font-family: Arial, sans-serif;\n }\n </style>\n <![endif]-->\n <style type=\"text/css\" rel=\"stylesheet\" media=\"all\">\n body {\n width: 100% !important;\n height: 100%;\n margin: 0;\n -webkit-text-size-adjust: none;\n }\n \n body {\n font-family: \"Nunito Sans\", Helvetica, Arial, sans-serif;\n }\n \n body {\n background-color: #F4F4F7;\n color: #51545E;\n }\n </style>\n </head>\n <body style=\"width: 100% !important; height: 100%; -webkit-text-size-adjust: none; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; background-color: #F4F4F7; color: #51545E; margin: 0;\" bgcolor=\"#F4F4F7\">\n <span class=\"preheader\" style=\"display: none !important; visibility: hidden; mso-hide: all; font-size: 1px; line-height: 1px; max-height: 0; max-width: 0; opacity: 0; overflow: hidden;\">Thanks for signing up with us. We’re thrilled to have you on board.</span>\n <table class=\"email-wrapper\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; background-color: #F4F4F7; margin: 0; padding: 0;\" bgcolor=\"#F4F4F7\">\n <tr>\n <td align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <table class=\"email-content\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; margin: 0; padding: 0;\">\n <tr>\n <td class=\"email-masthead\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; text-align: center; padding: 25px 0;\" align=\"center\">\n <a href=\"{{info.general_store_website}}\" class=\"f-fallback email-masthead_name\" style=\"color: #A8AAAF; font-size: 16px; font-weight: bold; text-decoration: none; text-shadow: 0 1px 0 white;\">\n {{info.general_store_name}}\n </a>\n </td>\n </tr>\n <!-- Email Body -->\n <tr>\n <td class=\"email-body\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; background-color: #FFFFFF; margin: 0; padding: 0;\" bgcolor=\"#FFFFFF\">\n <table class=\"email-body_inner\" align=\"center\" width=\"570\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 570px; -premailer-width: 570px; -premailer-cellpadding: 0; -premailer-cellspacing: 0; background-color: #FFFFFF; margin: 0 auto; padding: 0;\" bgcolor=\"#FFFFFF\">\n <!-- Body content -->\n <tr>\n <td class=\"content-cell\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding: 35px;\">\n <div class=\"f-fallback\">\n <h1 style=\"margin-top: 0; color: #333333; font-size: 22px; font-weight: bold; text-align: left;\" align=\"left\">Welcome, {{customer.firstname}}!</h1>\n <p style=\"font-size: 16px; line-height: 1.625; color: #51545E; margin: .4em 0 1.1875em;\">Thanks for signing up with us. We’re thrilled to have you on board.</p>\n <!-- Action -->\n <table class=\"body-action\" align=\"center\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; text-align: center; margin: 30px auto; padding: 0;\">\n <tr>\n <td align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <!-- Border based button\n https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->\n <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\">\n <tr>\n <td align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <a href=\"{{info.general_confirm_email_base_url}}/user={{customer.id}}\" class=\"f-fallback button\" target=\"_blank\" style=\"color: #FFF; background-color: #3869D4; display: inline-block; text-decoration: none; border-radius: 3px; box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16); -webkit-text-size-adjust: none; box-sizing: border-box; border-color: #3869D4; border-style: solid; border-width: 10px 18px;\">Confirm your email</a>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n <p style=\"font-size: 16px; line-height: 1.625; color: #51545E; margin: .4em 0 1.1875em;\">For reference, here's your login information:</p>\n <table class=\"attributes\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"margin: 0 0 21px;\">\n <tr>\n <td class=\"attributes_content\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; background-color: #F4F4F7; padding: 16px;\" bgcolor=\"#F4F4F7\">\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\n <tr>\n <td class=\"attributes_item\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding: 0;\">\n <span class=\"f-fallback\">\n <strong>User ID:</strong> {{customer.id}}\n </span>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n <p style=\"font-size: 16px; line-height: 1.625; color: #51545E; margin: .4em 0 1.1875em;\">Need help, or have any questions ? Simply reply to this email, we'd love to help</p>\n <!-- Sub copy -->\n \n </div>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <table class=\"email-footer\" align=\"center\" width=\"570\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 570px; -premailer-width: 570px; -premailer-cellpadding: 0; -premailer-cellspacing: 0; text-align: center; margin: 0 auto; padding: 0;\">\n <tr>\n <td class=\"content-cell\" align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding: 35px;\">\n <p class=\"f-fallback sub align-center\" style=\"font-size: 13px; line-height: 1.625; text-align: center; color: #6B6E76; margin: .4em 0 1.1875em;\" align=\"center\">\n {{info.general_store_name}}\n </p>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n </body>\n</html>`,
|
33
|
-
"template_text": "Thanks for signing up with us. \nWe’re thrilled to have you on board.\n\n******************\nWelcome, {{customer.firstname}}!\n******************\n\nThanks for signing up with us. We’re thrilled to \nhave you on board.\n\nConfirm your email here: \n{{ info.general_confirm_email_base_url }}/user={{customer.id}}\n\nFor reference, here's your login information:\n\nUser ID: {{customer.id}}\n\nNeed help, or have any questions ?\nSimply reply to this email, we'd love to help\n\n[{{info.general_store_name}}] ({{info.general_store_website}})\n",
|
34
|
-
"reference_example_input": {
|
35
|
-
"customer": {
|
36
|
-
"email": "john@dow.com",
|
37
|
-
"firstname": "John",
|
38
|
-
"lastname": "Dow",
|
39
|
-
"id": "cus_65f2ae6e8bf30e6cd0ca95fa"
|
40
|
-
},
|
41
|
-
"info": {
|
42
|
-
"general_store_name": "Wush Wush Games",
|
43
|
-
"general_store_website": "https://wush.games/",
|
44
|
-
"general_store_description": "We sell retro video games",
|
45
|
-
"general_confirm_email_base_url": "https://wush.games/confirm-email"
|
46
|
-
}
|
47
|
-
},
|
48
|
-
"handle": "welcome-customer",
|
49
|
-
"id": "template_664afed24eba71b9ee185be4",
|
50
|
-
"created_at": "2024-05-20T07:42:10.436Z",
|
51
|
-
"updated_at": "2024-05-20T09:39:46.492Z",
|
52
|
-
"_relations": {
|
53
|
-
"search": [
|
54
|
-
"handle:welcome-customer",
|
55
|
-
"welcome-customer",
|
56
|
-
"id:template_664afed24eba71b9ee185be4",
|
57
|
-
"template_664afed24eba71b9ee185be4",
|
58
|
-
"664afed24eba71b9ee185be4",
|
59
|
-
"welcome",
|
60
|
-
"customer",
|
61
|
-
"welcome customer"
|
62
|
-
]
|
63
|
-
}
|
64
|
-
},
|
65
|
-
{
|
66
|
-
"title": "Checkout Complete",
|
67
|
-
"template_html": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns=\"http://www.w3.org/1999/xhtml\" style=\"color-scheme: light dark; supported-color-schemes: light dark;\">\n <head>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <meta name=\"x-apple-disable-message-reformatting\" />\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <meta name=\"color-scheme\" content=\"light dark\" />\n <meta name=\"supported-color-schemes\" content=\"light dark\" />\n <title></title>\n <style type=\"text/css\" rel=\"stylesheet\" media=\"all\">\n /* Base ------------------------------ */\n \n @import url(\"https://fonts.googleapis.com/css?family=Nunito+Sans:400,700&display=swap\");\n body {\n width: 100% !important;\n height: 100%;\n margin: 0;\n -webkit-text-size-adjust: none;\n }\n \n a {\n color: #3869D4;\n }\n \n a img {\n border: none;\n }\n \n td {\n word-break: break-word;\n }\n \n .preheader {\n display: none !important;\n visibility: hidden;\n mso-hide: all;\n font-size: 1px;\n line-height: 1px;\n max-height: 0;\n max-width: 0;\n opacity: 0;\n overflow: hidden;\n }\n /* Type ------------------------------ */\n \n body,\n td,\n th {\n font-family: \"Nunito Sans\", Helvetica, Arial, sans-serif;\n }\n \n h1 {\n margin-top: 0;\n color: #333333;\n font-size: 22px;\n font-weight: bold;\n text-align: left;\n }\n \n h2 {\n margin-top: 0;\n color: #333333;\n font-size: 16px;\n font-weight: bold;\n text-align: left;\n }\n \n h3 {\n margin-top: 0;\n color: #333333;\n font-size: 14px;\n font-weight: bold;\n text-align: left;\n }\n \n td,\n th {\n font-size: 16px;\n }\n \n p,\n ul,\n ol,\n blockquote {\n margin: .4em 0 1.1875em;\n font-size: 16px;\n line-height: 1.625;\n }\n \n p.sub {\n font-size: 13px;\n }\n /* Utilities ------------------------------ */\n \n .align-right {\n text-align: right;\n }\n \n .align-left {\n text-align: left;\n }\n \n .align-center {\n text-align: center;\n }\n \n .u-margin-bottom-none {\n margin-bottom: 0;\n }\n /* Buttons ------------------------------ */\n \n .button {\n background-color: #3869D4;\n border-top: 10px solid #3869D4;\n border-right: 18px solid #3869D4;\n border-bottom: 10px solid #3869D4;\n border-left: 18px solid #3869D4;\n display: inline-block;\n color: #FFF;\n text-decoration: none;\n border-radius: 3px;\n box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16);\n -webkit-text-size-adjust: none;\n box-sizing: border-box;\n }\n \n .button--green {\n background-color: #22BC66;\n border-top: 10px solid #22BC66;\n border-right: 18px solid #22BC66;\n border-bottom: 10px solid #22BC66;\n border-left: 18px solid #22BC66;\n }\n \n .button--red {\n background-color: #FF6136;\n border-top: 10px solid #FF6136;\n border-right: 18px solid #FF6136;\n border-bottom: 10px solid #FF6136;\n border-left: 18px solid #FF6136;\n }\n \n @media only screen and (max-width: 500px) {\n .button {\n width: 100% !important;\n text-align: center !important;\n }\n }\n /* Attribute list ------------------------------ */\n \n .attributes {\n margin: 0 0 21px;\n }\n \n .attributes_content {\n background-color: #F4F4F7;\n padding: 16px;\n }\n \n .attributes_item {\n padding: 0;\n }\n /* Related Items ------------------------------ */\n \n .related {\n width: 100%;\n margin: 0;\n padding: 25px 0 0 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n \n .related_item {\n padding: 10px 0;\n color: #CBCCCF;\n font-size: 15px;\n line-height: 18px;\n }\n \n .related_item-title {\n display: block;\n margin: .5em 0 0;\n }\n \n .related_item-thumb {\n display: block;\n padding-bottom: 10px;\n }\n \n .related_heading {\n border-top: 1px solid #CBCCCF;\n text-align: center;\n padding: 25px 0 10px;\n }\n /* Discount Code ------------------------------ */\n \n .discount {\n width: 100%;\n margin: 0;\n padding: 24px;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #F4F4F7;\n border: 2px dashed #CBCCCF;\n }\n \n .discount_heading {\n text-align: center;\n }\n \n .discount_body {\n text-align: center;\n font-size: 15px;\n }\n /* Social Icons ------------------------------ */\n \n .social {\n width: auto;\n }\n \n .social td {\n padding: 0;\n width: auto;\n }\n \n .social_icon {\n height: 20px;\n margin: 0 8px 10px 8px;\n padding: 0;\n }\n /* Data table ------------------------------ */\n \n .purchase {\n width: 100%;\n margin: 0;\n padding: 35px 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n \n .purchase_content {\n width: 100%;\n margin: 0;\n padding: 25px 0 0 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n \n .purchase_item {\n padding: 10px 0;\n color: #51545E;\n font-size: 15px;\n line-height: 18px;\n }\n \n .purchase_heading {\n padding-bottom: 8px;\n border-bottom: 1px solid #EAEAEC;\n }\n \n .purchase_heading p {\n margin: 0;\n color: #85878E;\n font-size: 12px;\n }\n \n .purchase_footer {\n padding-top: 15px;\n border-top: 1px solid #EAEAEC;\n }\n \n .purchase_total {\n margin: 0;\n text-align: right;\n font-weight: bold;\n color: #333333;\n }\n \n .purchase_total--label {\n padding: 0 15px 0 0;\n }\n \n body {\n background-color: #F4F4F7;\n color: #51545E;\n }\n \n p {\n color: #51545E;\n }\n \n p.sub {\n color: #6B6E76;\n }\n \n .email-wrapper {\n width: 100%;\n margin: 0;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #F4F4F7;\n }\n \n .email-content {\n width: 100%;\n margin: 0;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n }\n /* Masthead ----------------------- */\n \n .email-masthead {\n padding: 25px 0;\n text-align: center;\n }\n \n .email-masthead_logo {\n width: 94px;\n }\n \n .email-masthead_name {\n font-size: 16px;\n font-weight: bold;\n color: #A8AAAF;\n text-decoration: none;\n text-shadow: 0 1px 0 white;\n }\n /* Body ------------------------------ */\n \n .email-body {\n width: 100%;\n margin: 0;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #FFFFFF;\n }\n \n .email-body_inner {\n width: 570px;\n margin: 0 auto;\n padding: 0;\n -premailer-width: 570px;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n background-color: #FFFFFF;\n }\n \n .email-footer {\n width: 570px;\n margin: 0 auto;\n padding: 0;\n -premailer-width: 570px;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n text-align: center;\n }\n \n .email-footer p {\n color: #6B6E76;\n }\n \n .body-action {\n width: 100%;\n margin: 30px auto;\n padding: 0;\n -premailer-width: 100%;\n -premailer-cellpadding: 0;\n -premailer-cellspacing: 0;\n text-align: center;\n }\n \n .body-sub {\n margin-top: 25px;\n padding-top: 25px;\n border-top: 1px solid #EAEAEC;\n }\n \n .content-cell {\n padding: 35px;\n }\n /*Media Queries ------------------------------ */\n \n @media only screen and (max-width: 600px) {\n .email-body_inner,\n .email-footer {\n width: 100% !important;\n }\n }\n \n @media (prefers-color-scheme: dark) {\n body,\n .email-body,\n .email-body_inner,\n .email-content,\n .email-wrapper,\n .email-masthead,\n .email-footer {\n background-color: #333333 !important;\n color: #FFF !important;\n }\n p,\n ul,\n ol,\n blockquote,\n h1,\n h2,\n h3,\n span,\n .purchase_item {\n color: #FFF !important;\n }\n .attributes_content,\n .discount {\n background-color: #222 !important;\n }\n .email-masthead_name {\n text-shadow: none !important;\n }\n }\n \n :root {\n color-scheme: light dark;\n supported-color-schemes: light dark;\n }\n </style>\n <!--[if mso]>\n <style type=\"text/css\">\n .f-fallback {\n font-family: Arial, sans-serif;\n }\n </style>\n <![endif]-->\n <style type=\"text/css\" rel=\"stylesheet\" media=\"all\">\n body {\n width: 100% !important;\n height: 100%;\n margin: 0;\n -webkit-text-size-adjust: none;\n }\n \n body {\n font-family: \"Nunito Sans\", Helvetica, Arial, sans-serif;\n }\n \n body {\n background-color: #F4F4F7;\n color: #51545E;\n }\n </style>\n </head>\n <body style=\"width: 100% !important; height: 100%; -webkit-text-size-adjust: none; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; background-color: #F4F4F7; color: #51545E; margin: 0;\" bgcolor=\"#F4F4F7\">\n <table class=\"email-wrapper\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; background-color: #F4F4F7; margin: 0; padding: 0;\" bgcolor=\"#F4F4F7\">\n <tr>\n <td align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <table class=\"email-content\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; margin: 0; padding: 0;\">\n <tr>\n <td class=\"email-masthead\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; text-align: center; padding: 25px 0;\" align=\"center\">\n <a href=\"{{info.general_store_website}}\" class=\"f-fallback email-masthead_name\" style=\"color: #A8AAAF; font-size: 16px; font-weight: bold; text-decoration: none; text-shadow: 0 1px 0 white;\">\n {{info.general_store_name}}\n </a>\n </td>\n </tr>\n <!-- Email Body -->\n <tr>\n <td class=\"email-body\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; background-color: #FFFFFF; margin: 0; padding: 0;\" bgcolor=\"#FFFFFF\">\n <table class=\"email-body_inner\" align=\"center\" width=\"570\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 570px; -premailer-width: 570px; -premailer-cellpadding: 0; -premailer-cellspacing: 0; background-color: #FFFFFF; margin: 0 auto; padding: 0;\" bgcolor=\"#FFFFFF\">\n <!-- Body content -->\n <tr>\n <td class=\"content-cell\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding: 35px;\">\n <div class=\"f-fallback\">\n <h1 style=\"margin-top: 0; color: #333333; font-size: 22px; font-weight: bold; text-align: left;\" align=\"left\">Hi {{order.contact.firstname}},</h1>\n <p style=\"font-size: 16px; line-height: 1.625; color: #51545E; margin: .4em 0 1.1875em;\">Thank you for your purchase. This email is the receipt for your purchase.</p>\n <table class=\"purchase\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; margin: 0; padding: 0px 0;\">\n <tr>\n <td style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <h3 style=\"margin-top: 0; color: #333333; font-size: 14px; font-weight: bold; text-align: left;\" align=\"left\">{{order.id}}</h3></td>\n \n </tr>\n <tr>\n <td colspan=\"2\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <table class=\"purchase_content\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; margin: 0; padding: 25px 0 0;\">\n <tr>\n <th class=\"purchase_heading\" align=\"left\" style=\"font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-bottom: 8px; border-bottom-width: 1px; border-bottom-color: #EAEAEC; border-bottom-style: solid;\">\n <p class=\"f-fallback\" style=\"font-size: 12px; line-height: 1.625; color: #85878E; margin: 0;\">Description</p>\n </th>\n <th class=\"purchase_heading\" align=\"right\" style=\"font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-bottom: 8px; border-bottom-width: 1px; border-bottom-color: #EAEAEC; border-bottom-style: solid;\">\n <p class=\"f-fallback\" style=\"font-size: 12px; line-height: 1.625; color: #85878E; margin: 0;\">Amount</p>\n </th>\n </tr>\n {{#each order.line_items}}\n <tr>\n <td width=\"80%\" class=\"purchase_item\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 15px; color: #51545E; line-height: 18px; padding: 10px 0;\"><span class=\"f-fallback\">{{data.title}}</span></td>\n <td class=\"align-right\" width=\"20%\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; text-align: right;\" align=\"right\"><span class=\"f-fallback\">{{qty}}</span></td>\n </tr>\n {{/each}}\n <tr>\n <td width=\"80%\" class=\"purchase_footer\" valign=\"middle\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-top: 15px; border-top-width: 1px; border-top-color: #EAEAEC; border-top-style: solid;\">\n <p class=\"f-fallback purchase_total purchase_total--label\" style=\"font-size: 16px; line-height: 1.625; text-align: right; font-weight: bold; color: #333333; margin: 0; padding: 0 15px 0 0;\" align=\"right\">Shipping</p>\n </td>\n <td width=\"20%\" class=\"purchase_footer\" valign=\"middle\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-top: 15px; border-top-width: 1px; border-top-color: #EAEAEC; border-top-style: solid;\">\n <p class=\"f-fallback purchase_total\" style=\"font-size: 16px; line-height: 1.625; text-align: right; font-weight: bold; color: #333333; margin: 0;\" align=\"right\">{{order.shipping_method.price}}</p>\n </td>\n </tr>\n <tr>\n <td width=\"80%\" class=\"purchase_footer\" valign=\"middle\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-top: 15px; border-top-width: 1px; border-top-color: #EAEAEC; border-top-style: solid;\">\n <p class=\"f-fallback purchase_total purchase_total--label\" style=\"font-size: 16px; line-height: 1.625; text-align: right; font-weight: bold; color: #333333; margin: 0; padding: 0 15px 0 0;\" align=\"right\">Subtotal Discounts</p>\n </td>\n <td width=\"20%\" class=\"purchase_footer\" valign=\"middle\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-top: 15px; border-top-width: 1px; border-top-color: #EAEAEC; border-top-style: solid;\">\n <p class=\"f-fallback purchase_total\" style=\"font-size: 16px; line-height: 1.625; text-align: right; font-weight: bold; color: #333333; margin: 0;\" align=\"right\">-{{order.pricing.subtotal_discount}}</p>\n </td>\n </tr>\n <tr>\n <td width=\"80%\" class=\"purchase_footer\" valign=\"middle\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-top: 15px; border-top-width: 1px; border-top-color: #EAEAEC; border-top-style: solid;\">\n <p class=\"f-fallback purchase_total purchase_total--label\" style=\"font-size: 16px; line-height: 1.625; text-align: right; font-weight: bold; color: #333333; margin: 0; padding: 0 15px 0 0;\" align=\"right\">Total</p>\n </td>\n <td width=\"20%\" class=\"purchase_footer\" valign=\"middle\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding-top: 15px; border-top-width: 1px; border-top-color: #EAEAEC; border-top-style: solid;\">\n <p class=\"f-fallback purchase_total\" style=\"font-size: 16px; line-height: 1.625; text-align: right; font-weight: bold; color: #333333; margin: 0;\" align=\"right\">{{order.pricing.total}}</p>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n <p style=\"font-size: 16px; line-height: 1.625; color: #51545E; margin: .4em 0 1.1875em;\">If you have any questions about this receipt, simply reply to this email or reach out to our <a href=\"{{info.general_store_support_email}}\" style=\"color: #3869D4;\">support team</a> for help.</p>\n <p style=\"font-size: 16px; line-height: 1.625; color: #51545E; margin: .4em 0 1.1875em;\">Cheers,\n <br />The {{info.general_store_name}} team</p>\n <!-- Action -->\n <table class=\"body-action\" align=\"center\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 100%; -premailer-width: 100%; -premailer-cellpadding: 0; -premailer-cellspacing: 0; text-align: center; margin: 30px auto; padding: 0;\">\n <tr>\n <td align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <!-- Border based button\n https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->\n <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\">\n <tr>\n <td align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <a href=\"{{action_url}}\" class=\"f-fallback button button--blue\" target=\"_blank\" style=\"color: #FFF; background-color: #3869D4; display: inline-block; text-decoration: none; border-radius: 3px; box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16); -webkit-text-size-adjust: none; box-sizing: border-box; border-color: #3869D4; border-style: solid; border-width: 10px 18px;\">Download as PDF</a>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n <!-- Sub copy -->\n \n </div>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n <tr>\n <td style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px;\">\n <table class=\"email-footer\" align=\"center\" width=\"570\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" style=\"width: 570px; -premailer-width: 570px; -premailer-cellpadding: 0; -premailer-cellspacing: 0; text-align: center; margin: 0 auto; padding: 0;\">\n <tr>\n <td class=\"content-cell\" align=\"center\" style=\"word-break: break-word; font-family: "Nunito Sans", Helvetica, Arial, sans-serif; font-size: 16px; padding: 35px;\">\n <p class=\"f-fallback sub align-center\" style=\"font-size: 13px; line-height: 1.625; text-align: center; color: #6B6E76; margin: .4em 0 1.1875em;\" align=\"center\">\n {{info.general_store_name}} \n </p>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n </body>\n</html>",
|
68
|
-
"template_text": "[{{info.general_store_name}}] ({{info.general_store_website}})\n\n************\nHi {{order.contact.firstname}},\n************\n\nThank you for your purchase !!!\n\n\nOrder ID is {{order.id}}\n--------------\n\n{{date}}\n--------\n\nDescription\n\nItems\n{{#each order.line_items}}\n- {{data.title}} x {{qty}}\n{{/each}}\n\nShipping \n{{order.shipping_method.title}}, {{order.shipping_method.price}}\n\nDiscounts\n{{#each order.pricing.evo}}\n- {{discount.title}} - {{total_discount}}\n{{/each}}\n\nTotal\n{{order.pricing.total}}\n\nIf you have any questions about this receipt, simply reply to this \nemail or reach out to our support team ( {{ info.general_store_support_email }} ) for help.\n\nCheers,\nThe {{info.general_store_name}} team\n\n\n{{info.general_store_name}}\n{{info.general_store_website}}",
|
69
|
-
"reference_example_input": {
|
70
|
-
"order": {
|
71
|
-
"contact": {
|
72
|
-
"email": "john@doe.com",
|
73
|
-
"firstname": "John",
|
74
|
-
"phone_number": "000-000-000",
|
75
|
-
"customer_id": "cus_65f2ae6e8bf30e6cd0ca95fa"
|
76
|
-
},
|
77
|
-
"address": {},
|
78
|
-
"status": {
|
79
|
-
"checkout": {
|
80
|
-
"id": 0,
|
81
|
-
"name2": "created",
|
82
|
-
"name": "Created"
|
83
|
-
},
|
84
|
-
"payment": {
|
85
|
-
"id": 1,
|
86
|
-
"name": "Authorized",
|
87
|
-
"name2": "authorized"
|
88
|
-
},
|
89
|
-
"fulfillment": {
|
90
|
-
"id": 0,
|
91
|
-
"name2": "draft",
|
92
|
-
"name": "Draft"
|
93
|
-
}
|
94
|
-
},
|
95
|
-
"pricing": {
|
96
|
-
"evo": [
|
97
|
-
{
|
98
|
-
"quantity_discounted": 0,
|
99
|
-
"quantity_undiscounted": 11,
|
100
|
-
"subtotal": 1100,
|
101
|
-
"total": 1150
|
102
|
-
},
|
103
|
-
{
|
104
|
-
"quantity_discounted": 2,
|
105
|
-
"total_discount": 100,
|
106
|
-
"quantity_undiscounted": 9,
|
107
|
-
"discount": {
|
108
|
-
"active": true,
|
109
|
-
"handle": "discount-bundle-50-off-robot-arms-and-legs-not-recursive",
|
110
|
-
"title": "50% OFF Bundle: robot arms and legs (not recursive)",
|
111
|
-
"priority": 0,
|
112
|
-
"application": {
|
113
|
-
"id": 0,
|
114
|
-
"name": "Automatic",
|
115
|
-
"name2": "automatic"
|
116
|
-
},
|
117
|
-
"info": {
|
118
|
-
"details": {
|
119
|
-
"meta": {
|
120
|
-
"id": 4,
|
121
|
-
"type": "bundle",
|
122
|
-
"name": "Bundle Discount"
|
123
|
-
},
|
124
|
-
"extra": {
|
125
|
-
"fixed": 0,
|
126
|
-
"percent": 50,
|
127
|
-
"recursive": false
|
128
|
-
}
|
129
|
-
},
|
130
|
-
"filters": [
|
131
|
-
{
|
132
|
-
"meta": {
|
133
|
-
"id": 4,
|
134
|
-
"type": "product",
|
135
|
-
"op": "p-in-tags",
|
136
|
-
"name": "Product has Tag"
|
137
|
-
},
|
138
|
-
"value": [
|
139
|
-
"robot_arm"
|
140
|
-
]
|
141
|
-
},
|
142
|
-
{
|
143
|
-
"meta": {
|
144
|
-
"id": 4,
|
145
|
-
"type": "product",
|
146
|
-
"op": "p-in-tags",
|
147
|
-
"name": "Product has Tag"
|
148
|
-
},
|
149
|
-
"value": [
|
150
|
-
"robot_leg"
|
151
|
-
]
|
152
|
-
}
|
153
|
-
]
|
154
|
-
}
|
155
|
-
},
|
156
|
-
"discount_code": "discount-bundle-50-off-robot-arms-and-legs-not-recursive",
|
157
|
-
"subtotal": 1000,
|
158
|
-
"total": 1050
|
159
|
-
}
|
160
|
-
],
|
161
|
-
"shipping_method": {
|
162
|
-
"title": "",
|
163
|
-
"handle": "",
|
164
|
-
"price": 50
|
165
|
-
},
|
166
|
-
"subtotal_discount": 100,
|
167
|
-
"subtotal_undiscounted": 1100,
|
168
|
-
"subtotal": 1000,
|
169
|
-
"total": 1050,
|
170
|
-
"quantity_total": 11,
|
171
|
-
"quantity_discounted": 2,
|
172
|
-
"errors": []
|
173
|
-
},
|
174
|
-
"line_items": [
|
175
|
-
{
|
176
|
-
"id": "robot-leg-white",
|
177
|
-
"qty": 3,
|
178
|
-
"data": {
|
179
|
-
"tags": [
|
180
|
-
"robot_leg"
|
181
|
-
],
|
182
|
-
"qty": 100,
|
183
|
-
"active": true,
|
184
|
-
"title": "Robot Leg White",
|
185
|
-
"price": 100
|
186
|
-
}
|
187
|
-
},
|
188
|
-
{
|
189
|
-
"id": "battery",
|
190
|
-
"qty": 5,
|
191
|
-
"data": {
|
192
|
-
"tags": [
|
193
|
-
"would-not-be-discounted"
|
194
|
-
],
|
195
|
-
"qty": 100,
|
196
|
-
"active": true,
|
197
|
-
"title": "Battery",
|
198
|
-
"price": 100
|
199
|
-
}
|
200
|
-
},
|
201
|
-
{
|
202
|
-
"id": "robot-arm-red",
|
203
|
-
"qty": 2,
|
204
|
-
"data": {
|
205
|
-
"tags": [
|
206
|
-
"robot_arm"
|
207
|
-
],
|
208
|
-
"qty": 100,
|
209
|
-
"active": true,
|
210
|
-
"title": "Robot Arm Red",
|
211
|
-
"price": 100
|
212
|
-
}
|
213
|
-
},
|
214
|
-
{
|
215
|
-
"id": "robot-arm-green",
|
216
|
-
"qty": 1,
|
217
|
-
"data": {
|
218
|
-
"tags": [
|
219
|
-
"robot_arm"
|
220
|
-
],
|
221
|
-
"qty": 100,
|
222
|
-
"active": true,
|
223
|
-
"title": "Robot Arm Green",
|
224
|
-
"price": 100
|
225
|
-
}
|
226
|
-
}
|
227
|
-
],
|
228
|
-
"shipping_method": {
|
229
|
-
"handle": "ship-fast",
|
230
|
-
"title": "ship fast",
|
231
|
-
"price": 50
|
232
|
-
},
|
233
|
-
"id": "order_65d774c6445e4581b9e34c11",
|
234
|
-
"created_at": "2024-02-22T16:22:30.095Z",
|
235
|
-
"updated_at": "2024-02-22T16:22:30.095Z"
|
236
|
-
},
|
237
|
-
"info": {
|
238
|
-
"general_store_name": "Wush Wush Games",
|
239
|
-
"general_store_website": "https://wush.games/",
|
240
|
-
"general_store_description": "We sell retro video games",
|
241
|
-
"general_confirm_email_base_url": "https://wush.games/confirm-email",
|
242
|
-
"general_store_support_email": "support@wush.games"
|
243
|
-
}
|
244
|
-
},
|
245
|
-
"handle": "checkout-complete",
|
246
|
-
"id": "template_664b15174eba71b9ee185be5",
|
247
|
-
"created_at": "2024-05-20T09:17:11.255Z",
|
248
|
-
"updated_at": "2024-05-20T10:43:40.766Z",
|
249
|
-
"_relations": {
|
250
|
-
"search": [
|
251
|
-
"handle:checkout-complete",
|
252
|
-
"checkout-complete",
|
253
|
-
"id:template_664b15174eba71b9ee185be5",
|
254
|
-
"template_664b15174eba71b9ee185be5",
|
255
|
-
"664b15174eba71b9ee185be5",
|
256
|
-
"checkout",
|
257
|
-
"complete",
|
258
|
-
"checkout complete"
|
259
|
-
]
|
260
|
-
}
|
261
|
-
}
|
262
|
-
]
|