Yes, you can customise Shopify order confirmation emails based on the products ordered, but there is an important catch. Shopify only gives you one Order confirmation template per store, so the usual approach is to add Liquid conditional logic that shows different content depending on what is in the order.
In my experience building Shopify apps and working with merchant notification flows, this is one of those tasks that sounds harder than it is. For most stores, you do not need a separate app and you do not need Shopify Plus. You just need to edit the notification template carefully, test it properly, and choose the right condition such as product handle, tag, variant, or metafield-driven content.
If you only need to show a special note, delivery caveat, digital download instruction, personalisation reminder, or service-specific next steps, native Shopify notifications are usually enough. If you need truly separate email designs, advanced branching, attachments, or marketing automation, then apps or external email tools become more relevant.
This guide shows exactly how to do it, what code to use, when to use apps, and the mistakes I see merchants make most often.
Can you send different confirmation emails for different products in Shopify?
Not as separate native templates. Shopify uses one order confirmation email template, but you can make that template behave differently based on the products in the order.
That distinction matters. A lot of forum answers stop at saying Shopify cannot send separate confirmation emails per product, which is technically true. But in practice, conditional Liquid inside the single template solves the problem for most merchants.
For example, if someone buys a made-to-order item, you can show production lead times. If they buy a digital product, you can show download instructions. If they buy a service, you can show booking steps. If they buy a pre-order item, you can show shipping expectations. All of that can happen inside the same Shopify notification.
What is the best way to customise confirmation emails based on products ordered in Shopify?
The best method for most stores is editing the Order confirmation template with Liquid conditions. It is free, native to Shopify, and usually faster than installing another app.
I recommend starting with Liquid if your goal is to change text blocks, instructions, warnings, download links, or simple sections based on the products ordered. If the whole email needs a completely different layout or you need separate workflows, then look at apps or external platforms.
| Approach | Best for | Pros | Cons |
|---|---|---|---|
| Liquid in Shopify notification template | Most stores needing product-specific messages | Free, native, flexible, quick to implement | Still one template, can get messy if logic grows |
| Product tags or metafields with Liquid | Stores with many products and reusable rules | More scalable, easier to maintain | Needs setup discipline |
| Shopify Flow or webhooks | Complex operational workflows | Powerful automation options | Not ideal for replacing the native customer confirmation email on its own |
| Third-party email apps | Advanced layouts, branching, extra notification types | Less coding, more visual editing | Extra cost, app dependency |
| Klaviyo or external email platform | Merchants already running advanced lifecycle email | Strong segmentation and automation | Can duplicate or complicate transactional messaging |
How do I edit the Shopify order confirmation email template?
Go to Settings > Notifications > Order confirmation in your Shopify admin, then edit the email body HTML. That is where you add your conditional logic.
Shopify’s notification editor has improved over time, but the core principle is still the same in 2026. You are editing the template that powers the customer’s order confirmation email, and you can insert Liquid conditions around the parts you want to show or hide.
- Open your Shopify admin.
- Go to Settings > Notifications.
- Under Customer notifications, open Order confirmation.
- Choose the option to edit the email template or code.
- Find the part of the template where you want your custom message to appear.
- Add Liquid conditions using product handles, tags, titles, variants, or metafields.
- Preview and test using real test orders before going live.
If you are nervous about editing the template, duplicate the code into a safe document first. I always keep a backup before touching notification templates, because one broken tag can affect every order email.
Shopify’s help documentation on customising notification templates is also worth keeping open while you work.
Which product condition should I use in Shopify email logic?
The most reliable condition for most merchants is the product handle. Product titles can change, variant names can be inconsistent, and IDs are accurate but less human-friendly.
In my experience, product handles give the best balance of reliability and readability. If you are managing dozens or hundreds of products with shared behaviour, tags or metafields are usually even better because they scale more cleanly.
How do I customise order confirmation emails by product handle?
Use the product handle when you want to target one specific product. This is the cleanest option for simple one-product rules.
If your product URL or admin reference includes something like golden-watch, that handle can be checked in the order confirmation template.
{% assign target_handle = "golden-watch" %}
{% assign order_handles = order.line_items | map: 'product' | map: 'handle' %}
{% if order_handles contains target_handle %}
<p>Special note: Your custom watch order includes a free engraving.</p>
{% endif %}
This works well for a single hero product, a high-touch service, or a flagship item with special next steps.
How do I customise confirmation emails by product title?
Use product title checks if you need a quick solution, but it is less robust than handles or tags. Titles are easier for merchants to change accidentally.
{% assign show_custom_message = false %}
{% for line_item in line_items %}
{% if line_item.title contains "Custom T-Shirt" %}
{% assign show_custom_message = true %}
{% endif %}
{% endfor %}
{% if show_custom_message %}
<p>This is a made-to-order item. We'll contact you to confirm the details.</p>
{% endif %}
I only use title matching for quick fixes or temporary campaigns. For anything long term, I would switch to a tag, handle, or metafield.
How do I customise confirmation emails by product tag?
Product tags are the best option when many products share the same email rule. They are especially useful for digital products, pre-orders, custom items, or fragile goods.
{% for line_item in line_items %}
{% if line_item.product.tags contains "digital" %}
<p>Your digital product will be delivered by email shortly. Please save this message for your records.</p>
{% endif %}
{% endfor %}
This is the pattern I prefer when merchants have a growing catalogue. Instead of hard-coding 20 product handles, you tag the relevant products once and let the template do the rest.
If you sell customised or operationally complex items, you might also like our guide on tracking customised orders in Shopify with workflows, tags, and automation.
How do I customise confirmation emails by variant?
Variant-based logic works when the email needs to change based on an option selection, such as size, material, service level, or fulfilment method.
{% for line_item in line_items %}
{% if line_item.variant.title == "Auto" %}
<p>Your Auto variant certificate is attached separately.</p>
{% endif %}
{% endfor %}
This is useful for service packages, subscription intervals, or premium add-ons. Just be careful with exact variant naming, because a small title change can break the condition.
How do I use metafields for more scalable email personalisation?
Metafields are the most scalable option when each product needs its own dynamic message or URL. Instead of writing a separate if statement for every product, you store the content on the product itself.
This is the method I would choose for stores with a large catalogue. For example, each product could have a metafield for post-purchase instructions, download URL, care guide, or lead time note.
{% for line_item in line_items %}
{% if line_item.product.metafields.custom.post_purchase_note != blank %}
<p>{{ line_item.product.metafields.custom.post_purchase_note }}</p>
{% endif %}
{% endfor %}
That keeps your template cleaner and moves the product-specific content into product data, which is far easier for a team to maintain.
What are real examples of product-specific order confirmation content?
The most common use cases are digital delivery, made-to-order instructions, service booking steps, pre-order notices, and upsell recommendations. The goal is not just personalisation for the sake of it. The goal is reducing confusion and cutting support tickets.
When I tested post-purchase messaging patterns across Shopify stores, the best-performing emails were not always the fanciest. They were the ones that answered the customer’s next question immediately.
- Digital products - explain when and how the download arrives.
- Made-to-order items - explain production timelines and approval steps.
- Personalised products - confirm custom text, artwork, or monogram process.
- Services - explain onboarding, booking, or consultation scheduling.
- Pre-orders - set realistic fulfilment expectations.
- Subscription products - explain billing cadence or first shipment timing.
- Fragile or regulated products - provide handling or compliance information.
If your goal is to increase revenue after purchase, consider pairing transactional clarity with subtle cross-sell logic. We have covered this in how to upsell on Shopify in 2026, how to create Shopify cart drawer upsells, and how to maximise revenue from your Shopify product pages.
What is the exact Liquid code to show a message if a product is in the order?
The simplest pattern is to loop through line items, set a flag, and then show the message once. This avoids repeating the same note multiple times if the triggering product appears more than once.
{% assign show_note = false %}
{% for line_item in line_items %}
{% if line_item.product.handle == "golden-watch" %}
{% assign show_note = true %}
{% endif %}
{% endfor %}
{% if show_note %}
<h2>Important information about your order</h2>
<p>Your watch is engraved to order and usually ships within 5-7 working days.</p>
{% endif %}
This flag-based approach is cleaner than printing the message inside the loop. It also makes it easier to combine multiple triggers later.
How do I show different messages for different products?
Use multiple flags or an if/elsif chain. This works well when each product type needs a different block of content.
{% assign has_product_a = false %}
{% assign has_product_b = false %}
{% assign has_product_c = false %}
{% for line_item in line_items %}
{% if line_item.product.handle == "product-a" %}
{% assign has_product_a = true %}
{% endif %}
{% if line_item.product.handle == "product-b" %}
{% assign has_product_b = true %}
{% endif %}
{% if line_item.product.handle == "product-c" %}
{% assign has_product_c = true %}
{% endif %}
{% endfor %}
{% if has_product_a %}
<p>Confirmation message 1 for Product A.</p>
{% endif %}
{% if has_product_b %}
<p>Confirmation message 2 for Product B.</p>
{% endif %}
{% if has_product_c %}
<p>Confirmation message 3 for Product C.</p>
{% endif %}
This is the practical answer to the original question most merchants ask. You are still sending one Shopify order confirmation email, but the content changes based on the products ordered.
What are the limitations of Shopify’s native notification system?
The biggest limitation is that Shopify does not provide multiple native order confirmation templates. Everything has to be handled inside one template unless you bring in apps or external systems.
Other limitations matter too. You may find it awkward to manage if your logic becomes very long, and some advanced use cases such as file attachments, deeply branched journeys, or totally separate branded layouts are better handled elsewhere.
- One template per notification type - no native per-product template library.
- Template complexity grows fast - large if blocks become hard to maintain.
- Limited content management - non-technical team members may struggle with Liquid.
- Testing is manual - you need to place test orders for different scenarios.
- Transactional scope - not every advanced marketing-style automation belongs here.
If your store is already doing sophisticated lifecycle messaging, you may also want to review how customer data is structured. Our guide on managing Shopify customer data without losing sales is a good next read.
When should I use an app instead of editing Shopify email code?
Use an app when you need more than conditional content inside one template. That includes visual editing, advanced rule builders, extra notification types, or operational notifications that go beyond the default Shopify setup.
As a Shopify app developer, I always tell merchants not to install an app unless it solves a real limitation. For this specific use case, native Liquid is often enough. But if your team wants a non-technical editor or more complex routing, apps can save time.
| App | Best for | Why you might use it |
|---|---|---|
|
|
Beautiful branded templates | Great if you want a polished visual upgrade with less manual HTML work |
|
|
Template flexibility | Useful if you want drag-and-drop editing plus Liquid support |
|
|
Rule-based notifications | Good for sending notifications based on SKU, vendor, tags, and order conditions |
|
|
Conditional logic and custom alerts | Useful when native notifications are too limited for your workflow |
Should I use Shopify Flow or webhooks for product-specific confirmation emails?
Usually not for the main customer order confirmation email. Shopify Flow and webhooks are better for operational automation, internal alerts, or triggering external systems.
This is where a lot of advice online gets fuzzy. Yes, webhooks can react when an order is created. Yes, Flow can branch based on order conditions. But if your goal is simply to change the customer-facing confirmation email content, editing the native template is normally simpler and more reliable.
Use Shopify Flow if you want to tag orders, alert staff, or trigger admin-side actions when a certain product is purchased. Use webhooks if you are building a custom app or server-side workflow that needs to process the order and send a separate message from an external system.
If you are considering custom automation, Shopify’s developer docs on webhooks and Shopify’s information on Shopify Flow are the right starting points.
How do I test product-specific Shopify confirmation emails safely?
Place test orders for every condition you add. Do not rely on visual preview alone. The fastest way to break trust after checkout is to send the wrong post-purchase message.
My usual testing checklist is simple but effective:
- Create a test order with none of the trigger products.
- Create a test order with one trigger product.
- Create a test order with multiple trigger products.
- Test edge cases like variant changes, renamed products, and tagged products.
- Check mobile email rendering as well as desktop.
- Send the email to a real inbox, not just a preview pane.
If you are adding offers or recommendations into transactional emails, be careful not to clutter the message. Transactional emails should prioritise clarity first. For more on AI-led post-purchase revenue ideas, see AI-powered upsells and how to upsell on Shopify leveraging AI.
What mistakes should I avoid when customising Shopify confirmation emails?
The most common mistake is using brittle logic. If your condition depends on a product title that someone later edits, your email logic silently stops working.
These are the issues I see most often:
- Using product titles instead of handles or tags for long-term logic.
- Printing a message inside the loop so it repeats for every matching line item.
- Not accounting for mixed carts where multiple product types are ordered together.
- Overcomplicating the template instead of using tags or metafields.
- Skipping test orders and assuming the preview is enough.
- Adding too much marketing content to a transactional email.
Another easy mistake is forgetting accessibility and readability. If you heavily customise notification HTML, make sure the email still reads clearly, especially on mobile. That is the same principle I talk about in our piece on website accessibility for Shopify merchants.
What is my recommended setup for most Shopify stores?
For most merchants, I recommend using one Shopify order confirmation template with Liquid conditions based on product tags or metafields. That gives you the best balance of flexibility, maintainability, and cost control.
If you only have one or two products needing special messaging, use product handles. If you have groups of products that share the same behaviour, use tags. If each product needs its own unique instruction, use metafields. Only move to apps or external automation once the native approach becomes genuinely limiting.
That is the approach I would use myself on a lean Shopify store today. It is simple, robust, and much closer to what searchers actually need than vague advice about “using webhooks” without explaining the trade-offs.
Final answer: how do I customise confirmation emails based on products ordered in Shopify?
Edit the Order confirmation notification in Shopify and add Liquid logic that checks the products in the order. The most practical options are product handles, tags, variants, and metafields.
Shopify does not give you multiple native order confirmation templates, so you are customising one template dynamically. For most stores, that is enough. For more advanced needs, use an app such as Orderly Emails, RenderKu, Smart Notifications, or Notifications by Modd Apps, or build a custom workflow with Flow or webhooks.
If you keep the logic clean and test properly, product-specific Shopify confirmation emails are absolutely achievable without overengineering the setup.