├── .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 | 15 | 16 |
4 |
5 | 6 | 7 | 11 | 12 |
8 |

{{ email_title }}

9 |

{{ email_body }}

10 |
13 |
14 |
17 | -------------------------------------------------------------------------------- /src/snippets/footer.liquid: -------------------------------------------------------------------------------- 1 | 2 | 3 | 14 | 15 | 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 | 2 | 3 | 31 | 32 |
4 |
5 | 6 | 7 | 27 | 28 |
8 | 9 | 10 | 19 | 24 | 25 |
11 | {% if shop.email_logo_url %} 12 | {{ shop.name }} 13 | {% else %} 14 |

15 | {{ shop.name }} 16 |

17 | {% endif %} 18 |
20 | 21 | Order {{ order_name }} 22 | 23 |
26 |
29 |
30 |
33 | -------------------------------------------------------------------------------- /src/contact_customer.liquid: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {{ email_title }} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 38 | 39 |
16 | 17 | 18 | 19 | 20 | 21 | 32 | 33 |
22 |
23 | 24 | 25 | 28 | 29 |
26 |

{{ custom_message }}

27 |
30 |
31 |
34 | 35 | 36 | 37 |
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 | 35 | 36 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
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 | 49 | 50 |
38 | 39 | 40 | 41 | 42 | 43 | {% assign order_summary_title = "Refunded items" %} 44 | 45 | 46 | 47 | 48 |
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 | 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 | 55 | 56 |
19 | 20 | 21 | 22 | 23 | 24 | 49 | 50 |
25 |
26 | 27 | 28 | 45 | 46 |
29 |

{{ email_title }}

30 |

{{ email_body }}

31 | {% if shop.url %} 32 | 33 | 34 | 41 | 42 |
35 | 36 | 37 | 38 | 39 |
Visit our store
40 |
43 | {% endif %} 44 |
47 |
48 |
51 | 52 | 53 | 54 |
57 | 58 | 59 | -------------------------------------------------------------------------------- /src/snippets/shipment-items.liquid: -------------------------------------------------------------------------------- 1 | 2 | 3 | 55 | 56 |
4 |
5 | 6 | 7 | 10 | 11 |
8 |

Items in this shipment

9 |
12 | 13 | 14 | 51 | 52 |
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 | 48 | {% endfor %} 49 |
29 | 30 | 35 | 46 |
31 | {% if line.line_item.image %} 32 | 33 | {% endif %} 34 | 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 |
47 |
50 |
53 |
54 |
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 | 60 | 61 |
19 | 20 | 21 | 22 | 23 | 24 | 54 | 55 |
25 |
26 | 27 | 28 | 50 | 51 |
29 |

{{ email_title }}

30 |

{{ email_body }}

31 | 32 | 33 | 47 | 48 |
34 | 35 | 36 | 37 | 38 |
Reset your password
39 | {% if shop.url %} 40 | 41 | 42 | 43 | 44 | 45 | {% endif %} 46 |
49 |
52 |
53 |
56 | 57 | 58 | 59 |
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 | 64 | 65 |
19 | 20 | 21 | 22 | 23 | 24 | 58 | 59 |
25 |
26 | 27 | 28 | 54 | 55 |
29 |

{{ email_title }}

30 | {% if custom_message != blank %} 31 |

{{ custom_message }}

32 | {% else %} 33 |

{{ email_body }}

34 | {% endif %} 35 | 36 | 37 | 51 | 52 |
38 | 39 | 40 | 41 | 42 |
Activate your account
43 | {% if shop.url %} 44 | 45 | 46 | 47 | 48 | 49 | {% endif %} 50 |
53 |
56 |
57 |
60 | 61 | 62 | 63 |
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 | 65 | 66 |
19 | 20 | 21 | 22 | 23 | 24 | 59 | 60 |
25 |
26 | 27 | 28 | 55 | 56 |
29 |

{{ email_title }}

30 |

{{ email_body }}

31 | 32 | 33 | 47 | 48 |
34 | 35 | 36 | 37 | 38 |
View your gift card
39 | {% if shop.url %} 40 | 41 | 42 | 43 | 44 | 45 | {% endif %} 46 |
49 | {% if gift_card.pass_url %} 50 | 51 | Add to Apple Wallet 52 | 53 | {% endif %} 54 |
57 |
58 |
61 | 62 | 63 | 64 |
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 | 79 | 80 |
19 | 20 | 21 | 22 | 23 | 24 | 71 | 72 |
25 |
26 | 27 | 28 | 67 | 68 |
29 |

{{ email_title }}

30 |

{{ email_body }}

31 |

{{ email_emphasis }}

32 | {% if order_status_url %} 33 | 34 | 35 | 49 | 50 |
36 | 37 | 38 | 39 | 40 |
View your order
41 | {% if shop.url %} 42 | 43 | 44 | 45 | 46 | 47 | {% endif %} 48 |
51 | {% else %} 52 | {% if shop.url %} 53 | 54 | 55 | 62 | 63 |
56 | 57 | 58 | 59 | 60 |
Visit our store
61 |
64 | {% endif %} 65 | {% endif %} 66 |
69 |
70 |
73 | 74 | 75 | 76 | 77 | 78 |
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 | 100 | 101 |
37 | 38 | 39 | 40 | 41 | 42 | 92 | 93 |
43 |
44 | 45 | 46 | 88 | 89 |
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 | 70 | 71 |
57 | 58 | 59 | 60 | 61 |
View your order
62 | {% if shop.url %} 63 | 64 | 65 | 66 | 67 | 68 | {% endif %} 69 |
72 | {% else %} 73 | {% if shop.url %} 74 | 75 | 76 | 83 | 84 |
77 | 78 | 79 | 80 | 81 |
Visit our store
82 |
85 | {% endif %} 86 | {% endif %} 87 |
90 |
91 |
94 | 95 | 96 | 97 | 98 | 99 |
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 | 99 | 100 |
36 | 37 | 38 | 39 | 40 | 41 | 91 | 92 |
42 |
43 | 44 | 45 | 87 | 88 |
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 | 69 | 70 |
56 | 57 | 58 | 59 | 60 |
Track my shipment
61 | {% if shop.url %} 62 | 63 | 64 | 65 | 66 | 67 | {% endif %} 68 |
71 | {% else %} 72 | {% if shop.url %} 73 | 74 | 75 | 82 | 83 |
76 | 77 | 78 | 79 | 80 |
Visit our store
81 |
84 | {% endif %} 85 | {% endif %} 86 |
89 |
90 |
93 | 94 | 95 | 96 | 97 | 98 |
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 | 101 | 102 |
35 | 36 | 37 | 38 | 39 | 40 | 93 | 94 |
41 |
42 | 43 | 44 | 89 | 90 |
45 |

{{ email_title }}

46 | 47 | 48 | 49 | 52 | 53 |
50 |

Haven't received your package yet? Let us know

51 |
54 | {% if order_status_url %} 55 | 56 | 57 | 71 | 72 |
58 | 59 | 60 | 61 | 62 |
View your order
63 | {% if shop.url %} 64 | 65 | 66 | 67 | 68 | 69 | {% endif %} 70 |
73 | {% else %} 74 | {% if shop.url %} 75 | 76 | 77 | 84 | 85 |
78 | 79 | 80 | 81 | 82 |
Visit our store
83 |
86 | {% endif %} 87 | {% endif %} 88 |
91 |
92 |
95 | 96 | 97 | 98 | 99 | 100 |
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 | 124 | 125 |
23 | 24 | 25 | 26 | 27 | 28 | 62 | 63 |
29 |
30 | 31 | 32 | 58 | 59 |
33 |

{{ email_title }}

34 | {% if custom_message != blank %} 35 |

{{ custom_message }}

36 | {% else %} 37 |

{{ email_body }}

38 | {% endif %} 39 | 40 | 41 | 55 | 56 |
42 | 43 | 44 | 45 | 46 |
Complete your purchase
47 | {% if shop.url %} 48 | 49 | 50 | 51 | 52 | 53 | {% endif %} 54 |
57 |
60 |
61 |
64 | 65 | 66 | 118 | 119 |
67 |
68 | 69 | 70 | 73 | 74 |
71 |

Items in your cart

72 |
75 | 76 | 77 | 114 | 115 |
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 | 111 | {% endfor %} 112 |
92 | 93 | 98 | 109 |
94 | {% if line.image %} 95 | 96 | {% endif %} 97 | 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 |
110 |
113 |
116 |
117 |
120 | 121 | 122 | 123 |
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 | 133 | 134 |
19 | 20 | 21 | 22 | 23 | 24 | 58 | 59 |
25 |
26 | 27 | 28 | 54 | 55 |
29 |

{{ email_title }}

30 | {% if custom_message != blank %} 31 |

{{ custom_message }}

32 | {% elsif reserve_inventory_until %} 33 |

{{ email_body }}

34 | {% endif %} 35 | 36 | 37 | 51 | 52 |
38 | 39 | 40 | 41 | 42 |
Complete your purchase
43 | {% if shop.url %} 44 | 45 | 46 | 47 | 48 | 49 | {% endif %} 50 |
53 |
56 |
57 |
60 | 61 | 62 | 63 | {% if shipping_address or billing_address or shipping_method %} 64 | 65 | 66 | 126 | 127 |
67 |
68 | 69 | 70 | 73 | 74 |
71 |

Customer information

72 |
75 | 76 | 77 | 122 | 123 |
78 | 79 | 80 | 81 | {% if shipping_address %} 82 | 94 | {% endif %} 95 | {% if billing_address %} 96 | 108 | {% endif %} 109 | 110 |
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 |
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 |
111 | {% if shipping_method %} 112 | 113 | 114 | 118 | 119 |
115 |

Shipping method

116 |

{{ shipping_method.title }}
{{ shipping_method.price | money }}

117 |
120 | {% endif %} 121 |
124 |
125 |
128 | {% endif %} 129 | 130 | 131 | 132 |
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 | 157 | 158 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 71 | 72 |
26 |
27 | 28 | 29 | 67 | 68 |
30 |

{{ email_title }}

31 |

{{ email_body }}

32 | {% if order_status_url %} 33 | 34 | 35 | 49 | 50 |
36 | 37 | 38 | 39 | 40 |
View your order
41 | {% if shop.url %} 42 | 43 | 44 | 45 | 46 | 47 | {% endif %} 48 |
51 | {% else %} 52 | {% if shop.url %} 53 | 54 | 55 | 62 | 63 |
56 | 57 | 58 | 59 | 60 |
Visit our store
61 |
64 | {% endif %} 65 | {% endif %} 66 |
69 |
70 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 151 | 152 |
80 |
81 | 82 | 83 | 86 | 87 |
84 |

Customer information

85 |
88 | 89 | 90 | 147 | 148 |
91 | 92 | 93 | {% if requires_shipping and shipping_address %} 94 | 106 | {% endif %} 107 | {% if billing_address %} 108 | 120 | {% endif %} 121 | 122 |
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 |
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 |
123 | 124 | 125 | 129 | 144 | 145 |
126 |

Shipping method

127 |

{{ shipping_method.title }}

128 |
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 |
146 |
149 |
150 |
153 | 154 | 155 | 156 |
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 | 184 | 185 |
4 |
5 | 6 | 7 | 16 | 17 |
8 |

9 | {% if order_summary_title %} 10 | {{ order_summary_title }} 11 | {% else %} 12 | Order summary 13 | {% endif %} 14 |

15 |
18 | 19 | 20 | 180 | 181 |
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 | 59 | 60 | {% endfor %} 61 |
34 | 35 | 40 | 51 | 57 |
36 | {% if line.image %} 37 | 38 | {% endif %} 39 | 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 |
52 | {% if line.original_line_price != line.line_price %} 53 | {{ line.original_line_price | money }} 54 | {% endif %} 55 |

{{ line.line_price | money }}

56 |
58 |
62 | 63 | 64 | 65 | 177 | 178 |
66 | 67 | {% if discounts %} 68 | {% capture discount_title %}Discount {% if discounts.first.code %}({{ discounts.first.code }}){% endif %}{% endcapture %} 69 | 70 | 75 | 78 | 79 | {% endif %} 80 | 81 | 86 | 89 | 90 | 91 | 96 | 99 | 100 | {% for line in tax_lines %} 101 | 102 | 107 | 110 | 111 | {% endfor %} 112 |
71 |

72 | {{ discount_title }} 73 |

74 |
76 | {{ discounts_savings | money }} 77 |
82 |

83 | Subtotal 84 |

85 |
87 | {{ subtotal_price | money }} 88 |
92 |

93 | Shipping 94 |

95 |
97 | {{ shipping_price | money }} 98 |
103 |

104 | {{ line.title }} 105 |

106 |
108 | {{ line.price | money }} 109 |
113 | 114 | 115 | 120 | 123 | 124 |
116 |

117 | Total 118 |

119 |
121 | {{ total_price | money_with_currency }} 122 |
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 | 149 | 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 | 168 | 171 | 172 | {% endif %} 173 | {% endfor %} 174 |
145 |

146 | {{transaction_name}} 147 |

148 |
150 | {{ transaction.amount | money }} 151 |
162 |

163 | Refund 164 |
165 | {{ refund_method_title | capitalize }} 166 |

167 |
169 | - {{ transaction.amount | money }} 170 |
175 | {% endif %} 176 |
179 |
182 |
183 |
186 | --------------------------------------------------------------------------------