├── .gitignore
├── src
├── new_order_mobile.liquid
├── assets
│ └── notifications
│ │ ├── inline-styles.css
│ │ └── style.css
├── snippets
│ ├── default-content.liquid
│ ├── footer.liquid
│ ├── header.liquid
│ ├── shipment-items.liquid
│ └── order-summary.liquid
├── contact_customer.liquid
├── order_refund.liquid
├── fulfillment_request.liquid
├── order_cancelled.liquid
├── new_order.liquid
├── customer_account_welcome.liquid
├── customer_account_password_reset.liquid
├── customer_account_activation.liquid
├── gift_card_created.liquid
├── shipping_update.liquid
├── shipping_confirmation.liquid
├── shipping_out_for_delivery.liquid
├── shipment_delivered.liquid
├── abandoned_checkout.liquid
├── draft_order_invoice.liquid
└── order_confirmation.liquid
├── package.json
├── Gruntfile.js
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dest
3 | .DS_Store
4 |
--------------------------------------------------------------------------------
/src/new_order_mobile.liquid:
--------------------------------------------------------------------------------
1 |
{{ shop_name }},
2 |
3 | {{ customer.name | default: "A customer" }} placed a new order with you today ({{ date | date: "%b %d %I:%M%p" }}).
4 |
5 |
--------------------------------------------------------------------------------
/src/assets/notifications/inline-styles.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Custom styles
3 | * - instead of directly overwriting style.css (Shopify's default email stylesheet)
4 | * we use this separate stylesheet
5 | */
6 |
--------------------------------------------------------------------------------
/src/snippets/default-content.liquid:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | {{ email_title }}
9 | {{ email_body }}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/snippets/footer.liquid:
--------------------------------------------------------------------------------
1 |
16 |
17 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "shopify-email-templates",
3 | "version": "0.0.1",
4 | "description": "Makes it easier to create custom Shopify email templates by allowing you to edit and compile them offline locally before copy/pasting them to Shopifies admin",
5 | "main": "index.js",
6 | "dependencies": {
7 | "grunt-contrib-watch": "^1.0.0",
8 | "grunt-include-replace": "^5.0.0",
9 | "grunt-inline-css": "^0.1.5"
10 | },
11 | "devDependencies": {},
12 | "scripts": {
13 | "test": "echo \"Error: no test specified\" && exit 1"
14 | },
15 | "repository": {
16 | "type": "git",
17 | "url": "git+https://github.com/timmyomahony/shopify-email-templates.git"
18 | },
19 | "author": "Timmy O'Mahony",
20 | "license": "MIT",
21 | "bugs": {
22 | "url": "https://github.com/timmyomahony/shopify-email-templates/issues"
23 | },
24 | "homepage": "https://github.com/timmyomahony/shopify-email-templates#readme"
25 | }
26 |
--------------------------------------------------------------------------------
/src/snippets/header.liquid:
--------------------------------------------------------------------------------
1 |
33 |
--------------------------------------------------------------------------------
/src/contact_customer.liquid:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ email_title }}
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | {{ custom_message }}
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/src/order_refund.liquid:
--------------------------------------------------------------------------------
1 | {% if refund_line_items.size == item_count %}
2 | {% capture email_title %}Your order has been refunded {% endcapture %}
3 | {% elsif refund_line_items.size == 0 %}
4 | {% capture email_title %}You have received a refund {% endcapture %}
5 | {% else %}
6 | {% capture email_title %}Some items in your order have been refunded {% endcapture %}
7 | {% endif %}
8 | {% capture email_body %}Total amount refunded: {{ amount | money_with_currency }} {% endcapture %}
9 |
10 |
11 |
12 |
13 | {{ email_title }}
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | module.exports = function(grunt) {
2 |
3 | grunt.initConfig({
4 | paths: {
5 | src: 'src/',
6 | dest: 'dest/'
7 | },
8 | inlinecss: {
9 | main: {
10 | options: {
11 | removeStyleTags: false
12 | },
13 | files: [
14 | {
15 | cwd: '<%= paths.src %>',
16 | src: ['*.liquid'],
17 | dest: '<%= paths.dest %>',
18 | ext: '.inlined.html',
19 | expand: true
20 | },
21 | ]
22 | }
23 | },
24 | includereplace: {
25 | main: {
26 | options: {
27 | prefix: '',
29 | includesDir: '<%= paths.src %>snippets/',
30 | },
31 | files: [
32 | {
33 | cwd: '<%= paths.dest %>',
34 | src: ['*.html'],
35 | dest: '<%= paths.dest %>',
36 | expand: true
37 | },
38 | ]
39 | }
40 | },
41 | watch: {
42 | emails: {
43 | files: ["<%= paths.src %>**/*.liquid", "<%= paths.src %>**/*.css"],
44 | tasks: ["inlinecss", "includereplace"]
45 | }
46 | }
47 | });
48 |
49 | grunt.loadNpmTasks('grunt-contrib-watch');
50 | grunt.loadNpmTasks('grunt-include-replace');
51 | grunt.loadNpmTasks('grunt-inline-css');
52 |
53 | grunt.registerTask('default', ['watch:emails']);
54 |
55 | };
56 |
--------------------------------------------------------------------------------
/src/fulfillment_request.liquid:
--------------------------------------------------------------------------------
1 | {{ service_name }},
2 |
3 | Please fulfill order {{ name }}.
4 | Total number of items: {{ fulfillment.item_count }}
5 | Unique items: {{ fulfillment.fulfillment_line_items.size }}
6 |
7 | Items to fulfill:
8 | {% for line in fulfillment.fulfillment_line_items %}
9 | Variant Title: {{ line.line_item.title }}
10 | SKU: {{ line.line_item.sku }}
11 | Quantity: {{ line.quantity }}
12 | Grams: {{ line.line_item.grams }}
13 | Vendor: {{ line.line_item.vendor }}
14 | {% endfor %}
15 | {% if shipping_address %}
16 |
17 | Shipping Address:
18 | {{ shipping_address.name }}{% if shipping_address.company %}
19 | {{ shipping_address.company }}{% endif %}
20 | {{ shipping_address.address1 }}
21 | {{ shipping_address.address2 }}
22 | {{ shipping_address.city }}, {{ shipping_address.province }}
23 | {{ shipping_address.zip }}
24 | {{ shipping_address.country }}
25 | {% if shipping_address.phone %}Phone: {{ shipping_address.phone }}
{% endif %}
26 | {% endif %}
27 |
28 | Shipping Method:
29 | {% if shipping_method %}{{ shipping_method.title }}{% else %}None{% endif %}
30 |
31 | Tracking Number:
32 | {% if fulfillment.tracking_number %}{{ fulfillment.tracking_number }}{% else %}None{% endif %}
33 |
34 | Customer Email:
35 | {{ email }}
36 |
37 | Thank you,
38 | {{ shop_name }}
39 |
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Shopify Email Templates
2 |
3 | Creating custom email templates can be tedious with Shopify. You have to login to the admin of your store and edit each template repetitively using their editor. This repo tries to make this process a little bit easier. You will still have to manually copy and paste the templates from your local machine to the admin editor, but you can more easily edit the custom email template locally to make this process much quicker.
4 |
5 | #### Workflow:
6 |
7 | 1. Run the `grunt` task from the root of the repo
8 | 2. Open up the email template you want to edit in `src/[template-name].liquid`
9 | 3. Add any new styles to the `assets/notifications/inline-styles.css` stylesheet and change any of the markup
10 | 4. Grunt will automatically detect when you make changes and will compile a finished email templates with all of the CSS automatically inlined, ready to upload to the Shopify admin. These compiled templates are found in `dest/[template-name].inlined.html`
11 | 5. Go to the Shopify admin `/admin/email_templates/` and find the email template you are editing. Paste the contents of `dest/[template-name].inlined.html` into the editor and you can then preview the changes. Make further changes locally, paste it again into the editor and preview, and so on ...
12 |
13 | It's not perfect but it's a start ;)
14 |
15 | #### Notes
16 |
17 | - The reuseable elements of the email templates (such as the header and footer) have been moved to the `assets/snippts` folder. This means you can easily edit these elements once without having to then copy and paste the changes to *every* other template
18 |
--------------------------------------------------------------------------------
/src/order_cancelled.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %}Your order has been canceled{% endcapture %}
2 | {% capture email_body %}
3 | Order {{ name }} was canceled
4 | {% case cancel_reason %}
5 | {% when 'customer' %}
6 | at your request
7 | {% when 'inventory' %}
8 | because we did not have enough stock to fulfill your order
9 | {% when 'fraud' %}
10 | because we suspect it is fraudulent
11 | {% when 'other' %}
12 | due to unforeseen circumstances
13 | {% endcase %}
14 |
15 | {% if financial_status == 'voided' %}
16 | and your payment has been voided
17 | {% elsif financial_status == 'refunded' %}
18 | and your payment has been refunded
19 | {% endif %}
20 | .
21 | {% endcapture %}
22 |
23 |
24 |
25 |
26 | {{ email_title }}
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | {% assign order_summary_title = "Refunded items" %}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/new_order.liquid:
--------------------------------------------------------------------------------
1 | Hello {{ shop_name }},
2 |
3 | {% if customer.name %}{{ customer.name }}{% else %}Someone{% endif %} placed a new order with your store, {{ date | date: "%b %d %I:%M%p" }}:
4 |
5 | {% for line in line_items %} {{ line.quantity }}x {{ line.title }} {% if line.sku != "" %}(SKU: {{line.sku}}){% endif %} for {{ line.price | money }} each {% endfor %}
6 | View order {{order_name}}
7 | {% if fulfillment_aborted %}
8 | The above order was not automatically fulfilled because it was flagged as suspicious.
{% endif %}
9 |
10 | {% if has_high_risks? %}Security check:
11 | This order has a risk of being fraudulent. Review the order in your store's admin and contact the customer to verify their information.
12 |
{% endif %}
13 | Payment processing method:
14 | {{ gateway }}
15 |
16 | {% if requires_shipping and shipping_address %}
17 | Delivery method:
18 | {% for shipping_method in shipping_methods %}{{ shipping_method.title }}
{% endfor %}
19 |
20 | Shipping address:
21 | {{ shipping_address.name }}
22 | {{ shipping_address.street }}
23 | {{ shipping_address.city }}, {{ shipping_address.province }} {{ shipping_address.zip }}
24 | {{ shipping_address.country }}
25 | {{ shipping_address.phone }}{% endif %}
26 |
27 |
28 | {% if shopify_shipping_enabled %}
29 | Save time and money by fulfilling with Shopify Shipping
30 |
31 | {% endif %}
32 |
33 |
--------------------------------------------------------------------------------
/src/customer_account_welcome.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %}Welcome to {{ shop.name }}! {% endcapture %}
2 | {% capture email_body %}You've activated your customer account. Next time you shop with us, log in for faster checkout.{% endcapture %}
3 |
4 |
5 |
6 |
7 | {{ email_title }}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{ email_title }}
30 | {{ email_body }}
31 | {% if shop.url %}
32 |
33 |
34 |
35 |
40 |
41 |
42 |
43 | {% endif %}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/snippets/shipment-items.liquid:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Items in this shipment
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | {% for line in fulfillment.fulfillment_line_items %}
17 |
18 | {% if item_count == 1 %}
19 | {% assign columnWrapperClass = 'order-list__item--single' %}
20 | {% elsif forloop.first == true %}
21 | {% assign columnWrapperClass = 'order-list__item--first' %}
22 | {% elsif forloop.last == true %}
23 | {% assign columnWrapperClass = 'order-list__item--last' %}
24 | {% else %}
25 | {% assign columnWrapperClass = '' %}
26 | {% endif %}
27 |
28 |
29 |
30 |
31 | {% if line.line_item.image %}
32 |
33 | {% endif %}
34 |
35 |
36 | {% if line.line_item.product.title %}
37 | {% assign line_title = line.line_item.product.title %}
38 | {% else %}
39 | {% assign line_title = line.line_item.title %}
40 | {% endif %}
41 | {{ line_title }} × {{ line.line_item.quantity }}
42 | {% if line.line_item.variant.title != 'Default Title' %}
43 | {{ line.line_item.variant.title }}
44 | {% endif %}
45 |
46 |
47 |
48 | {% endfor %}
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/src/customer_account_password_reset.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %}Reset your password{% endcapture %}
2 | {% capture email_body %}Follow this link to reset your customer account password at {{shop.name}} . If you didn't request a new password, you can safely delete this email.{% endcapture %}
3 |
4 |
5 |
6 |
7 | {{ email_title }}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{ email_title }}
30 | {{ email_body }}
31 |
32 |
33 |
34 |
39 | {% if shop.url %}
40 |
45 | {% endif %}
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/src/customer_account_activation.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %} Activate your account {% endcapture %}
2 | {% capture email_body %}Hi {{ customer.first_name }}, you've created a new customer account at {{shop.name}} . All you have to do is activate it and choose a password. {% endcapture %}
3 |
4 |
5 |
6 |
7 | {{ email_title }}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{ email_title }}
30 | {% if custom_message != blank %}
31 | {{ custom_message }}
32 | {% else %}
33 | {{ email_body }}
34 | {% endif %}
35 |
36 |
37 |
38 |
43 | {% if shop.url %}
44 |
49 | {% endif %}
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/src/gift_card_created.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %}Your gift card is now available! {% endcapture %}
2 | {% capture email_body %}Hi{% if gift_card.customer %} {{ gift_card.customer.first_name }}{% endif %}, here is your {{ gift_card.balance | money_without_trailing_zeros }} gift card. Treat yourself, or send it to someone else as a gift.{% endcapture %}
3 |
4 |
5 |
6 |
7 | {{ email_title }}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{ email_title }}
30 | {{ email_body }}
31 |
32 |
33 |
34 |
39 | {% if shop.url %}
40 |
45 | {% endif %}
46 |
47 |
48 |
49 | {% if gift_card.pass_url %}
50 |
51 |
52 |
53 | {% endif %}
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/src/shipping_update.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %}Your shipping status has been updated {% endcapture %}
2 | {% capture email_body %}The following items have been updated with new shipping information.{% endcapture %}
3 |
4 |
5 |
6 |
7 | {{ email_title }}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{ email_title }}
30 | {{ email_body }}
31 | {{ email_emphasis }}
32 | {% if order_status_url %}
33 |
34 |
35 |
36 |
41 | {% if shop.url %}
42 |
47 | {% endif %}
48 |
49 |
50 |
51 | {% else %}
52 | {% if shop.url %}
53 |
54 |
55 |
56 |
61 |
62 |
63 |
64 | {% endif %}
65 | {% endif %}
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/src/shipping_confirmation.liquid:
--------------------------------------------------------------------------------
1 | {% if fulfillment.item_count == item_count %}
2 | {% capture shipment_name %}Your order is{% endcapture %}
3 | {% elsif fulfillment.item_count > 1 %}
4 | {% if fulfillment_status == 'fulfilled' %}
5 | {% capture shipment_name %}The last items in your order are{% endcapture %}
6 | {% else %}
7 | {% capture shipment_name %}Some items in your order are{% endcapture %}
8 | {% endif %}
9 | {% else %}
10 | {% if fulfillment_status == 'fulfilled' %}
11 | {% capture shipment_name %}The last item in your order is{% endcapture %}
12 | {% else %}
13 | {% capture shipment_name %}One item in your order is{% endcapture %}
14 | {% endif %}
15 | {% endif %}
16 |
17 | {% capture email_title %}{{ shipment_name }} on the way{% endcapture %}
18 | {% capture email_body %}{{ shipment_name }} on the way to you. Track your shipment to see the delivery status.{% endcapture %}
19 | {% capture email_emphasis %}Estimated delivery date: {{fulfillment.estimated_delivery_at | date: "%B %d, %Y"}} {% endcapture %}
20 |
21 |
22 |
23 |
24 | {{ email_title }}
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | {{ email_title }}
49 | {{ email_body }}
50 | {% if fulfillment.estimated_delivery_at %}
51 | {{ email_emphasis }}
52 | {% endif %}
53 | {% if order_status_url %}
54 |
55 |
56 |
57 |
62 | {% if shop.url %}
63 |
68 | {% endif %}
69 |
70 |
71 |
72 | {% else %}
73 | {% if shop.url %}
74 |
75 |
76 |
77 |
82 |
83 |
84 |
85 | {% endif %}
86 | {% endif %}
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
--------------------------------------------------------------------------------
/src/shipping_out_for_delivery.liquid:
--------------------------------------------------------------------------------
1 | {% if fulfillment.item_count == item_count %}
2 | {% capture shipment_name %}Your order is{% endcapture %}
3 | {% elsif fulfillment.item_count > 1 %}
4 | {% if fulfillment_status == 'fulfilled' %}
5 | {% capture shipment_name %}The last items in your order are{% endcapture %}
6 | {% else %}
7 | {% capture shipment_name %}Some items in your order are{% endcapture %}
8 | {% endif %}
9 | {% else %}
10 | {% if fulfillment_status == 'fulfilled' %}
11 | {% capture shipment_name %}The last item in your order is{% endcapture %}
12 | {% else %}
13 | {% capture shipment_name %}One item in your order is{% endcapture %}
14 | {% endif %}
15 | {% endif %}
16 |
17 | {% capture email_title %}{{ shipment_name }} out for delivery{% endcapture %}
18 | {% capture email_body %}{{ shipment_name }} out for delivery. Track your shipment to see the delivery status.{% endcapture %}
19 | {% capture email_emphasis %}Estimated delivery date: {{fulfillment.estimated_delivery_at | date: "%B %d, %Y"}} {% endcapture %}
20 |
21 |
22 |
23 |
24 | {{ email_title }}
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | {{ email_title }}
48 | {{ email_body }}
49 | {% if fulfillment.estimated_delivery_at %}
50 | {{ email_emphasis }}
51 | {% endif %}
52 | {% if order_status_url %}
53 |
54 |
55 |
56 |
61 | {% if shop.url %}
62 |
67 | {% endif %}
68 |
69 |
70 |
71 | {% else %}
72 | {% if shop.url %}
73 |
74 |
75 |
76 |
81 |
82 |
83 |
84 | {% endif %}
85 | {% endif %}
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
--------------------------------------------------------------------------------
/src/shipment_delivered.liquid:
--------------------------------------------------------------------------------
1 | {% if fulfillment.item_count == item_count %}
2 | {% capture shipment_name %}Your order has been{% endcapture %}
3 | {% elsif fulfillment.item_count > 1 %}
4 | {% if fulfillment_status == 'fulfilled' %}
5 | {% capture shipment_name %}The last items in your order have been{% endcapture %}
6 | {% else %}
7 | {% capture shipment_name %}Some items in your order have been{% endcapture %}
8 | {% endif %}
9 | {% else %}
10 | {% if fulfillment_status == 'fulfilled' %}
11 | {% capture shipment_name %}The last item in your order has been{% endcapture %}
12 | {% else %}
13 | {% capture shipment_name %}One item in your order has been{% endcapture %}
14 | {% endif %}
15 | {% endif %}
16 |
17 | {% capture email_title %}{{ shipment_name }} delivered{% endcapture %}
18 | {% capture email_body %}{{ shipment_name }} delivered. Track your shipment to see the delivery status.{% endcapture %}
19 |
20 |
21 |
22 |
23 | {{ email_title }}
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | {{ email_title }}
46 |
47 |
48 |
49 |
50 | Haven't received your package yet? Let us know
51 |
52 |
53 |
54 | {% if order_status_url %}
55 |
56 |
57 |
58 |
63 | {% if shop.url %}
64 |
69 | {% endif %}
70 |
71 |
72 |
73 | {% else %}
74 | {% if shop.url %}
75 |
76 |
77 |
78 |
83 |
84 |
85 |
86 | {% endif %}
87 | {% endif %}
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/src/abandoned_checkout.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %} Your shopping cart is waiting for you {% endcapture %}
2 | {% capture email_body %}
3 | {% if billing_address.first_name %}Hi {{ billing_address.first_name }}, w{% else %}
4 | W{% endif %}e noticed there {% if item_count == 1 %}was an item{% else %}were some items{% endif %} left in your shopping cart.
5 | If you're ready to complete your order, your cart is waiting for your return.
6 | {% endcapture %}
7 |
8 |
9 |
10 |
11 | {{ email_title }}
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | {{ email_title }}
34 | {% if custom_message != blank %}
35 | {{ custom_message }}
36 | {% else %}
37 | {{ email_body }}
38 | {% endif %}
39 |
40 |
41 |
42 |
47 | {% if shop.url %}
48 |
53 | {% endif %}
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | Items in your cart
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | {% for line in line_items %}
80 |
81 | {% if item_count == 1 %}
82 | {% assign columnWrapperClass = 'order-list__item--single' %}
83 | {% elsif forloop.first == true %}
84 | {% assign columnWrapperClass = 'order-list__item--first' %}
85 | {% elsif forloop.last == true %}
86 | {% assign columnWrapperClass = 'order-list__item--last' %}
87 | {% else %}
88 | {% assign columnWrapperClass = '' %}
89 | {% endif %}
90 |
91 |
92 |
93 |
94 | {% if line.image %}
95 |
96 | {% endif %}
97 |
98 |
99 | {% if line.product.title %}
100 | {% assign line_title = line.product.title %}
101 | {% else %}
102 | {% assign line_title = line.title %}
103 | {% endif %}
104 | {{ line_title }} × {{ line.quantity }}
105 | {% if line.variant.title != 'Default Title' %}
106 | {{ line.variant.title }}
107 | {% endif %}
108 |
109 |
110 |
111 | {% endfor %}
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
--------------------------------------------------------------------------------
/src/draft_order_invoice.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %}Complete your purchase{% endcapture %}
2 | {% capture email_body %}{% if item_count > 1 %}These items{% else %}This item{% endif %} will be reserved for you until: {{ reserve_inventory_until | date: "%B %d, %Y at %I:%M %p %Z" }} {% endcapture %}
3 |
4 |
5 |
6 |
7 | {{ email_title }}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | {{ email_title }}
30 | {% if custom_message != blank %}
31 | {{ custom_message }}
32 | {% elsif reserve_inventory_until %}
33 | {{ email_body }}
34 | {% endif %}
35 |
36 |
37 |
38 |
43 | {% if shop.url %}
44 |
49 | {% endif %}
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | {% if shipping_address or billing_address or shipping_method %}
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | Customer information
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | {% if shipping_address %}
82 |
83 | Shipping address
84 |
85 | {{ shipping_address.name }}
86 | {{ shipping_address.address1 }}
87 | {% if shipping_address.address2 %}
88 | {{ shipping_address.address2 }}
89 | {% endif %}
90 | {{ shipping_address.city }}, {{ shipping_address.province }} {{ shipping_address.zip }}
91 | {{ shipping_address.country }}
92 |
93 |
94 | {% endif %}
95 | {% if billing_address %}
96 |
97 | Billing address
98 |
99 | {{ billing_address.name }}
100 | {{ billing_address.address1 }}
101 | {% if billing_address.address2 %}
102 | {{ billing_address.address2 }}
103 | {% endif %}
104 | {{ billing_address.city }}, {{ billing_address.province }} {{ billing_address.zip }}
105 | {{ billing_address.country }}
106 |
107 |
108 | {% endif %}
109 |
110 |
111 | {% if shipping_method %}
112 |
113 |
114 |
115 | Shipping method
116 | {{ shipping_method.title }} {{ shipping_method.price | money }}
117 |
118 |
119 |
120 | {% endif %}
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 | {% endif %}
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
--------------------------------------------------------------------------------
/src/order_confirmation.liquid:
--------------------------------------------------------------------------------
1 | {% capture email_title %}Thank you for your purchase! {% endcapture %}
2 | {% capture email_body %}Hi {{ customer.first_name }}, we're getting your order ready to be shipped. We will notify you when it has been sent.{% endcapture %}
3 |
4 |
5 |
6 |
7 | {{ email_title }}
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | {{ email_title }}
31 | {{ email_body }}
32 | {% if order_status_url %}
33 |
34 |
35 |
36 |
41 | {% if shop.url %}
42 |
47 | {% endif %}
48 |
49 |
50 |
51 | {% else %}
52 | {% if shop.url %}
53 |
54 |
55 |
56 |
61 |
62 |
63 |
64 | {% endif %}
65 | {% endif %}
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 | Customer information
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 | {% if requires_shipping and shipping_address %}
94 |
95 | Shipping address
96 |
97 | {{ shipping_address.name }}
98 | {{ shipping_address.address1 }}
99 | {% if shipping_address.address2 %}
100 | {{ shipping_address.address2 }}
101 | {% endif %}
102 | {{ shipping_address.city }}, {{ shipping_address.province }} {{ shipping_address.zip }}
103 | {{ shipping_address.country }}
104 |
105 |
106 | {% endif %}
107 | {% if billing_address %}
108 |
109 | Billing address
110 |
111 | {{ billing_address.name }}
112 | {{ billing_address.address1 }}
113 | {% if billing_address.address2 %}
114 | {{ billing_address.address2 }}
115 | {% endif %}
116 | {{ billing_address.city }}, {{ billing_address.province }} {{ billing_address.zip }}
117 | {{ billing_address.country }}
118 |
119 |
120 | {% endif %}
121 |
122 |
123 |
124 |
125 |
126 | Shipping method
127 | {{ shipping_method.title }}
128 |
129 |
130 | Payment method
131 | {% for transaction in transactions %}
132 | {% if (transaction.status == "success") and (transaction.kind == "authorization" or transaction.kind == "sale") %}
133 |
134 | {% if transaction.payment_details.credit_card_company %}
135 | {% capture credit_card_url %}notifications/{{ transaction.payment_details.credit_card_company | downcase }}.png{% endcapture %}
136 | Ending in {{ transaction.payment_details.credit_card_last_four_digits }} — {{ total_price | money }}
137 | {% else %}
138 | {{ transaction.gateway | replace: "_", " " | capitalize }} — {{ transaction.amount | money }}
139 | {% endif %}
140 |
141 | {% endif %}
142 | {% endfor %}
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
--------------------------------------------------------------------------------
/src/assets/notifications/style.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Shopify's default stylesheet
3 | * - this can be found (minified) by visiting:
4 | *
5 | * www.you-shop.myshopify.com/assets/notifications/styles.css
6 | */
7 |
8 | body {
9 | margin: 0
10 | }
11 |
12 | .body {
13 | height: 100% !important;
14 | width: 100% !important
15 | }
16 |
17 | .row {
18 | width: 100%
19 | }
20 |
21 | .container {
22 | width: 560px;
23 | text-align: left;
24 | margin: 0 auto
25 | }
26 |
27 | @media (max-width: 600px) {
28 | .container {
29 | width: 94% !important
30 | }
31 | }
32 |
33 | table {
34 | border-spacing: 0;
35 | border-collapse: collapse
36 | }
37 |
38 | td {
39 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif
40 | }
41 |
42 | h1, h2, h3, h4, h5, h6 {
43 | font-weight: normal;
44 | margin: 0
45 | }
46 |
47 | h1, h1 a, h1 a:hover, h1 a:active, h1 a:visited {
48 | font-size: 30px;
49 | color: #333
50 | }
51 |
52 | h2 {
53 | font-size: 24px;
54 | margin-bottom: 10px
55 | }
56 |
57 | h3 {
58 | font-size: 20px;
59 | margin-bottom: 25px
60 | }
61 |
62 | h4 {
63 | font-size: 16px;
64 | font-weight: 500;
65 | color: #555;
66 | margin-bottom: 5px
67 | }
68 |
69 | p {
70 | margin: 0;
71 | color: #777;
72 | line-height: 150%
73 | }
74 |
75 | p+p {
76 | margin-top: 15px
77 | }
78 |
79 | span, strong, del, a, p {
80 | font-size: 16px
81 | }
82 |
83 | strong {
84 | color: #555
85 | }
86 |
87 | small {
88 | font-size: 14px;
89 | color: #999
90 | }
91 |
92 | a, a:hover, a:active, a:visited {
93 | text-decoration: none
94 | }
95 |
96 | .actions {
97 | margin-top: 20px
98 | }
99 |
100 | .main-action-cell {
101 | float: left;
102 | margin-right: 15px
103 | }
104 |
105 | @media (max-width: 600px) {
106 | .main-action-cell {
107 | float: none !important;
108 | margin-right: 0 !important
109 | }
110 | }
111 |
112 | .secondary-action-cell {
113 | margin-top: 19px
114 | }
115 |
116 | @media (max-width: 600px) {
117 | .secondary-action-cell {
118 | text-align: center;
119 | width: 100%
120 | }
121 | }
122 |
123 | .section {
124 | border-top: 1px solid #e5e5e5
125 | }
126 |
127 | .section__cell {
128 | padding: 40px 0
129 | }
130 |
131 | .content__cell {
132 | padding-bottom: 40px
133 | }
134 |
135 | .text-icon-row td {
136 | padding-bottom: 5px
137 | }
138 |
139 | .text-icon {
140 | padding-right: 8px
141 | }
142 |
143 | .text-icon__image {
144 | width: 18px;
145 | height: 18px;
146 | display: inline-block;
147 | vertical-align: middle
148 | }
149 |
150 | .header {
151 | margin: 40px 0 20px
152 | }
153 |
154 | @media (max-width: 600px) {
155 | .header {
156 | margin-top: 20px !important;
157 | margin-bottom: 2px !important
158 | }
159 | }
160 |
161 | @media (max-width: 600px) {
162 | .shop-name__cell {
163 | display: block
164 | }
165 | }
166 |
167 | .order-number__cell {
168 | text-transform: uppercase;
169 | font-size: 14px;
170 | text-align: right;
171 | color: #999
172 | }
173 |
174 | @media (max-width: 600px) {
175 | .order-number__cell {
176 | display: block;
177 | text-align: left !important;
178 | margin-top: 20px
179 | }
180 | }
181 |
182 | @media (max-width: 600px) {
183 | .button {
184 | width: 100%
185 | }
186 | }
187 |
188 | .button__cell {
189 | text-align: center;
190 | padding: 20px 25px;
191 | border-radius: 4px
192 | }
193 |
194 | .button__text, .button__text:hover, .button__text:active, .button__text:visited {
195 | color: #fff;
196 | text-decoration: none
197 | }
198 |
199 | .or {
200 | color: #999;
201 | display: inline-block;
202 | margin-right: 10px
203 | }
204 |
205 | @media (max-width: 600px) {
206 | .or {
207 | margin-right: 0 !important
208 | }
209 | }
210 |
211 | .apple-wallet-button {
212 | display: block;
213 | margin-top: 15px
214 | }
215 |
216 | @media (max-width: 600px) {
217 | .apple-wallet-button {
218 | text-align: center
219 | }
220 | }
221 |
222 | .customer-info__item {
223 | padding-bottom: 40px;
224 | width: 50%
225 | }
226 |
227 | @media (max-width: 600px) {
228 | .customer-info__item {
229 | display: block;
230 | width: 100% !important
231 | }
232 | }
233 |
234 | .customer-info__item--last {
235 | padding-bottom: 0
236 | }
237 |
238 | .customer-info__item-credit {
239 | height: 24px;
240 | display: inline-block;
241 | margin-right: 10px;
242 | margin-top: 5px;
243 | margin-bottom: -6px
244 | }
245 |
246 | .footer {
247 | border-top: 1px solid #e5e5e5
248 | }
249 |
250 | .footer__cell {
251 | padding: 35px 0
252 | }
253 |
254 | .disclaimer__subtext {
255 | font-size: 14px;
256 | color: #999
257 | }
258 |
259 | .disclaimer__subtext a {
260 | font-size: 14px
261 | }
262 |
263 | .spacer {
264 | min-width: 600px;
265 | height: 0
266 | }
267 |
268 | @media (max-width: 600px) {
269 | .spacer {
270 | display: none
271 | }
272 | }
273 |
274 | .order-list__item {
275 | width: 100%;
276 | border-bottom: 1px solid #e5e5e5
277 | }
278 |
279 | .order-list__item--single, .order-list__item--last {
280 | border-bottom: none !important
281 | }
282 |
283 | .order-list__item__cell {
284 | padding: 15px 0
285 | }
286 |
287 | .order-list__item--single .order-list__item__cell, .order-list__item--first .order-list__item__cell {
288 | padding-top: 0 !important
289 | }
290 |
291 | .order-list__item--single .order-list__item__cell, .order-list__item--last .order-list__item__cell {
292 | padding-bottom: 0 !important
293 | }
294 |
295 | .order-list__product-image {
296 | margin-right: 15px;
297 | border: 1px solid #e5e5e5;
298 | border-radius: 8px
299 | }
300 |
301 | .order-list__product-description-cell {
302 | width: 100%
303 | }
304 |
305 | .order-list__item-title {
306 | font-weight: 600;
307 | line-height: 1.4;
308 | color: #555
309 | }
310 |
311 | .order-list__item-variant {
312 | color: #999;
313 | font-size: 14px
314 | }
315 |
316 | .order-list__item-original-price {
317 | display: block;
318 | text-align: right;
319 | color: #999;
320 | font-size: 14px
321 | }
322 |
323 | .order-list__item-price {
324 | font-weight: 600;
325 | text-align: right;
326 | margin-left: 15px;
327 | color: #555
328 | }
329 |
330 | .order-list__price-cell {
331 | white-space: nowrap
332 | }
333 |
334 | .subtotal-lines {
335 | margin-top: 15px;
336 | border-top: 1px solid #e5e5e5
337 | }
338 |
339 | .subtotal-table {
340 | margin-top: 20px
341 | }
342 |
343 | .subtotal-line td {
344 | padding: 5px 0
345 | }
346 |
347 | .subtotal-line__value {
348 | text-align: right
349 | }
350 |
351 | .subtotal-line__title p {
352 | line-height: 1.2em
353 | }
354 |
355 | .subtotal-table--total {
356 | border-top: 2px solid #e5e5e5
357 | }
358 |
359 | .subtotal-table--total td {
360 | padding: 20px 0 0
361 | }
362 |
363 | .subtotal-table--total .subtotal-line__value strong {
364 | font-size: 24px
365 | }
366 |
367 | .subtotal-table--payment-methods {
368 | border-top: 1px solid #e5e5e5
369 | }
370 |
371 | .subtotal-table--payment-methods p, .subtotal-table--payment-methods strong {
372 | color: #999;
373 | font-size: 14px
374 | }
375 |
376 | .subtotal-table__small-space {
377 | height: 10px
378 | }
379 |
380 | .subtotal-table__line {
381 | border-bottom: 1px solid #e5e5e5;
382 | height: 1px;
383 | padding: 0
384 | }
385 |
386 | .subtotal-spacer {
387 | width: 40%
388 | }
389 |
390 | @media (max-width: 600px) {
391 | .subtotal-spacer {
392 | display: none
393 | }
394 | }
395 |
--------------------------------------------------------------------------------
/src/snippets/order-summary.liquid:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | {% if order_summary_title %}
10 | {{ order_summary_title }}
11 | {% else %}
12 | Order summary
13 | {% endif %}
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | {% for line in line_items %}
23 | {% if item_count == 1 %}
24 | {% assign columnWrapperClass = 'order-list__item--single' %}
25 | {% elsif forloop.first == true %}
26 | {% assign columnWrapperClass = 'order-list__item--first' %}
27 | {% elsif forloop.last == true %}
28 | {% assign columnWrapperClass = 'order-list__item--last' %}
29 | {% else %}
30 | {% assign columnWrapperClass = '' %}
31 | {% endif %}
32 |
33 |
34 |
35 |
36 | {% if line.image %}
37 |
38 | {% endif %}
39 |
40 |
41 | {% if line.product.title %}
42 | {% assign line_title = line.product.title %}
43 | {% else %}
44 | {% assign line_title = line.title %}
45 | {% endif %}
46 | {{ line_title }} × {{ line.quantity }}
47 | {% if line.variant.title != 'Default Title' %}
48 | {{ line.variant.title }}
49 | {% endif %}
50 |
51 |
52 | {% if line.original_line_price != line.line_price %}
53 | {{ line.original_line_price | money }}
54 | {% endif %}
55 | {{ line.line_price | money }}
56 |
57 |
58 |
59 |
60 | {% endfor %}
61 |
62 |
63 |
64 |
65 |
66 |
67 | {% if discounts %}
68 | {% capture discount_title %}Discount {% if discounts.first.code %}({{ discounts.first.code }}){% endif %}{% endcapture %}
69 |
70 |
71 |
72 | {{ discount_title }}
73 |
74 |
75 |
76 | {{ discounts_savings | money }}
77 |
78 |
79 | {% endif %}
80 |
81 |
82 |
83 | Subtotal
84 |
85 |
86 |
87 | {{ subtotal_price | money }}
88 |
89 |
90 |
91 |
92 |
93 | Shipping
94 |
95 |
96 |
97 | {{ shipping_price | money }}
98 |
99 |
100 | {% for line in tax_lines %}
101 |
102 |
103 |
104 | {{ line.title }}
105 |
106 |
107 |
108 | {{ line.price | money }}
109 |
110 |
111 | {% endfor %}
112 |
113 |
114 |
115 |
116 |
117 | Total
118 |
119 |
120 |
121 | {{ total_price | money_with_currency }}
122 |
123 |
124 |
125 | {% assign transaction_size = 0 %}
126 | {% for transaction in transactions %}
127 | {% unless transaction.kind == "capture" or transaction.kind == "void" %}
128 | {% assign transaction_size = transaction_size | plus: 1 %}
129 | {% endunless %}
130 | {% endfor %}
131 | {% if transaction_size > 1 %}
132 |
133 |
134 |
135 |
136 | {% for transaction in transactions %}
137 | {% if (transaction.status == "success") and (transaction.kind == "authorization" or transaction.kind == "sale") %}
138 | {% if transaction.payment_details.credit_card_company %}
139 | {% capture transaction_name %}{{ transaction.payment_details.credit_card_company }} (ending in {{ transaction.payment_details.credit_card_last_four_digits }}){% endcapture %}
140 | {% else %}
141 | {% capture transaction_name %}{{ transaction.gateway | replace: "_", " " | capitalize }}{% endcapture %}
142 | {% endif %}
143 |
144 |
145 |
146 | {{transaction_name}}
147 |
148 |
149 |
150 | {{ transaction.amount | money }}
151 |
152 |
153 | {% endif %}
154 | {% if transaction.kind == 'refund' %}
155 | {% if transaction.payment_details.credit_card_company %}
156 | {% assign refund_method_title = transaction.payment_details.credit_card_company %}
157 | {% else %}
158 | {% assign refund_method_title = transaction.gateway %}
159 | {% endif %}
160 |
161 |
162 |
163 | Refund
164 |
165 | {{ refund_method_title | capitalize }}
166 |
167 |
168 |
169 | - {{ transaction.amount | money }}
170 |
171 |
172 | {% endif %}
173 | {% endfor %}
174 |
175 | {% endif %}
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
--------------------------------------------------------------------------------