Shopify’s order confirmation email can’t include attachments, so it doesn’t deliver tickets. The Event Ticketing app sends a separate email after purchase with each customer’s tickets attached as a PDF and/or Apple Wallet pass.
Requirements: Event Ticketing app installed · Advanced plan or higher.
Enable the email
-
In the Event Ticketing app, go to Settings.
-
Find Ticket attachment email and turn it on.
-
Set when the email sends with the Fulfillment preference setting:
- Default — follows your Shopify order processing setting.
- Auto fulfill upon order creation — tickets send when the order is created.
- Auto fulfill upon order paid — tickets send once the order is paid.
Customers now receive their tickets by email after purchase.
Customize the email
The form has three fields: Reply To, Subject, and Body. The body supports HTML and Liquid.
This email’s Liquid variables are not the same as Shopify’s. To list every variable available, add {{ order.tickets }} to the body, send yourself a test order, and read the dump in the received email.
Tickets are an array on order.tickets (an order can hold several tickets). There is no top-level ticket variable — ticket exists only inside a {% for ticket in order.tickets %} loop. To reference one ticket’s value outside a loop, index the array: {{ order.tickets[0].name }}.
Show different content per event
Branch on the event with a Liquid conditional. Match by name:
{% if ticket.event.name == 'My event name' %}
Info about this event
{% else %}
Info about a different event
{% endif %}
Or match by event ID:
{% assign event_ids = order.events | map: "id" | string %}
{% if event_ids contains " 1093287 " %}
<p>Event-specific content here</p>
{% endif %}
Restore the default template
If you break the template, paste this back to reset it.
Subject
Your tickets for {{ order.events | map: 'name' | join: ', ' }} are attached!
Body
<p>Hello {{ first_name }},</p>
<p>Your tickets are attached to this email. Please bring them with you to the event.</p>
<ol>
{% for ticket in order.tickets %}
<li>
{% if ticket.name %}
<strong>{{ ticket.name }}</strong>
{% endif %}
(# {{ ticket.barcode }} - {{ ticket.ticket_type.name }} )
{% if ticket.valid %}
{% if ticket.links.edit %}
<a href="{{ ticket.links.edit }}">{{ ticket.labels.edit }}</a> |
{% endif %}
{% if ticket.links.transfer %}
<a href="{{ ticket.links.transfer }}">{{ ticket.labels.transfer }}</a> |
{% endif %}
{% if ticket.links.pdf %}
<a href="{{ ticket.links.pdf }}">{{ ticket.labels.download }}</a> |
{% endif %}
{% if ticket.links.wallet %}
<a href="{{ ticket.links.wallet }}">
Apple wallet
</a>
{% endif %}
{% else %}
{{ ticket.status }}
{% endif %}
</li>
{% endfor %}
</ol>
Related articles
FAQ
How do I test the email without paying the per-order fee?
Create a $0 order with a 100%-off discount code, or resend an existing test order.
My Liquid variables show up blank — why?
This email’s variables differ from Shopify’s and from the Guest Manager backend email. Edit the template in Settings → Ticket attachment email, and reference tickets through order.tickets (there is no top-level ticket outside a loop).
How do I remove the Transfer button from the email?
Edit the ticket type and turn off the Transferable option. The transfer link disappears from that ticket type’s emails.
Why don’t I see the “Update details” link?
That link appears only when the ticket type has registration questions attached. Add registration questions to the ticket type to show it.
What can’t I customize?
The voided-ticket email, the transfer forwarding email, and the email button colors aren’t editable. The footer with your company name and address can’t be removed without switching to a full custom HTML template, and the store address may re-sync even after you remove it manually.
Layout looks broken in Outlook — how do I fix it?
Outlook has limited CSS support. If buttons overlap or the layout breaks there, replace the default template with your own full custom HTML.