Can Shopify Flow email a CSV file attachment?
Updated 2026-10-21. Checked against Shopify's own documentation; links are under Sources.
No. Flow's Send internal email action has three fields: email address, subject and message. None of them is an attachment. What you can do is fetch orders with Get order data and write them into the message as comma-separated lines, which you then paste into a spreadsheet.
What the email action can do
- Fields: email address, subject and message. There's no file or attachment option in Shopify's documentation for the action.
- Recipient: "You can't use variables to customize the email address." The address is fixed in the workflow.
- Audience: Shopify describes it as "best used to send emails to staff."
So Flow is good for "tell me when X happens" and short summaries. It's not built for sending files to people outside the business.
The workaround: CSV-style rows in the email body
- In the Shopify Flow app, create a workflow with the Scheduled time trigger. It can repeat every few days, weeks or months, and "the smallest possible interval is 10 minutes."
- Add the Get order data action with a query for the period you want, such as orders created in the last day or week. Shopify notes: "You can return up to 100 at a time."
- Add Send internal email. Put a header line in the message, then loop over the orders with Liquid.
Here's a sketch of the message. It shows the shape, but the exact variable names come from Flow's variable picker in your workflow, so insert them from there rather than copying these:
order,created_at,total
{% for order in getOrderData %}{{ order.name }},{{ order.createdAt }},{{ order.totalPriceSet.shopMoney.amount }}
{% endfor %}
When the email arrives, copy the lines into a plain-text file saved as .csv, or paste them into a spreadsheet and use its text-to-columns option to split on commas.
Choosing the period
Write the query in Get order data so that it matches the schedule. A daily workflow should fetch the previous day's orders, and a weekly one the previous seven days. If the period and the schedule don't match, orders get missed or show up in two emails. If the trigger runs early in the morning, orders that come in later that day go into the next email. Write the period into the subject line (for example, "Orders, week ending Sunday") so the recipient knows which days the email covers.
Where the workaround runs out
- 100 orders per Get order data action. A period with more orders than that gets cut off. Use a shorter period, or check the count every time.
- Commas and line breaks in values. A product title or note with a comma in it pushes later fields into the wrong columns. Keep to fields that don't contain commas (order number, dates, amounts), or wrap text fields in double quotes.
- Someone still has to do something. The data arrives as text, and a person has to turn it into a file before an accountant or a system can import it.
- Only staff, only one address. The address can't be a variable, and the action is meant for staff.
- Customer data. Be careful about putting customer names, emails or addresses into regular emails. Include them only when the recipient actually needs them.
Other ways to get an actual file
- Manual export. Go to Orders › Export › Orders by date. Shopify emails the CSV to you for exports by date or over 51 orders. It takes a few clicks each time, and you forward the file yourself. Step-by-step.
- An app that generates and emails the file on a schedule. Check which columns it includes, how many orders it handles, and who it can send to.
Test before you rely on it
- Run the workflow once with a short period and compare the lines with Orders filtered to the same dates.
- Paste the lines into a spreadsheet and check that every row has the same number of columns.
- Check the time zone on the dates against your store's settings.