Add products to a Customer Experience with a CSV file
The CSV upload in Timesact adds product variants to a Customer Experience, or removes them, from one spreadsheet file instead of picking them one by one. It suits large catalogues and moves from another pre-order app, and each row can carry its own start date, end date and pre-order quantity. You find it under Timesact → Products → Add Products → Upload by CSV → Import with CSV.
Plan: All plans · Where: Timesact → Products → Add Products → Upload by CSV → Import with CSV
Before you start
- The products already exist in your Shopify admin. The CSV upload links existing Shopify variants to Timesact; it does not create products in Shopify.
- You have at least one Customer Experience (template) set up under Experiences.
- You know how each variant will be identified: its SKU or its Shopify variant ID. One of the two is enough.
- Dates in the file are read in your store's time zone, set under Billing & Account → Store settings → Time zone.
Find the Customer Experience ID
Every row in the CSV names the Customer Experience it applies to by its ID, a short code such as Nzdtdzd0Ojk.
- In Timesact, open Experiences.
- Open the Customer Experience you want to add products to.
- In the card at the top left, under the template's name, find ID: followed by the code.
- Click the copy icon next to it. The message "ID copied to clipboard" confirms it.
The same code is the last part of the page address while that Customer Experience is open (…/customer-experiences/shop/Nzdtdzd0Ojk).

Fill in the CSV file
- On the Import with CSV page, click Timesact CSV Import Template. It opens a Google Sheet.
- Make your own copy (File → Make a copy in Google Sheets).
- Open the Products worksheet and enter one variant per row.
- Export that worksheet as a .csv file (File → Download → Comma Separated Values (.csv) in Google Sheets).
Keep the header row exactly as in the template, in lower case. The file has seven columns:
Column | Required | What to enter |
|---|---|---|
| Yes | The Customer Experience ID from the step above. |
| One of these two | The variant's SKU, as in Shopify. |
| One of these two | The Shopify variant ID (numbers only). When both are filled in, Timesact uses |
| Yes |
|
| No | The most pre-orders this variant accepts, as a whole number above 0. Leave empty for unlimited. |
| No | The day the Customer Experience starts on this variant, as YYYY-MM-DD. Leave empty to start as soon as the file is processed. |
| No | The day it stops, as YYYY-MM-DD. Leave empty for no end date. |
Example rows:
customer_experience_id,variant_sku,variant_id,pre_order_quantity,action,start_date,end_date
Nzdtdzd0Ojk,TSHIRT-BLU-M,,100,add,2026-12-01,2027-01-15
Nzdtdzd0Ojk,,48234567890123,,add,,
Nzdtdzd0Ojk,HOODIE-RED-L,,,remove,,
Each row applies to one variant (one size or colour). To add every variant of a product, give each variant its own row. A file can hold up to 5,000 rows.
Getting SKUs and variant IDs from Shopify:
- SKUs: in your Shopify admin, go to Products → Export and export the products you need. The SKU column of that file holds each variant's SKU, ready to paste into
variant_sku. See Shopify's guide to exporting products and the product CSV columns. - Variant IDs: open the variant in your Shopify admin. The number at the end of the page address, after
/variants/, is the variant ID. Use variant IDs when some variants have no SKU or share one.
How to upload the CSV file
- In Timesact, open Products and click Add Products.
- On Select products, find the Upload by CSV card and click Import with CSV.
- Click Upload CSV and choose your file, or drag the file onto the upload area.
- The message "CSV uploaded. Processing will begin shortly." confirms the upload, and the file appears at the top of Upload history with the status Processing.


When the file is rejected straight away
Timesact checks the layout of the whole file the moment you upload it. If any row breaks a rule, nothing in the file is processed, and the page shows the banner CSV validation failed with a Validation errors list underneath. Each line names the row, counted as in your spreadsheet with the header as row 1, for example:
Row 4: action must be one of add, remove (got "update")Row 7: at least one of variant_sku or variant_id must be providedRow 9: start_date must be in YYYY-MM-DD formatRow 12: pre_order_quantity must be a positive integerRow 3: customer_experience_id is invalidMissing required headers: …when a column name is missing or spelled differently
The list shows the first 20 errors, then "…and N more errors". Correct the rows in your sheet, export it again and upload the new file.
What happens next
Timesact processes the file in the background. Click Refresh above Upload history to see the latest status. Each upload is one row in Upload history, with these columns:
- File and Status: Processing, Success (every row worked), Partial success (some rows had errors), or Failed (no row could be processed).
- Added: variants attached to a Customer Experience for the first time.
- Removed: variants taken off a Customer Experience.
- Updated:
addrows for a variant that was already on that Customer Experience. The row's dates and quantity replace the ones it had. - Errors: rows that could not be processed.
- Uploaded and Processed: when you uploaded the file and when processing finished.
- Result: click the download icon (Download result CSV) to get a copy of your file with a
status(success or error) and anerrorcolumn for each row.

In the Products list, a product that a CSV file brings into Timesact for the first time shows the CSV label under the product name ("Product was added via CSV import"). A product that was already in Timesact keeps its existing label. Their functionality status reads Processing for a short time, then switches to its live status, and the storefront follows the Customer Experience's settings from then on.
Within one file, Timesact handles all remove rows first and then all add rows. When a remove row takes off a variant's last Customer Experience, that variant leaves the Products list. The product stays in Shopify.
Wait until an upload has left Processing before you upload the next file.
Read the result file
Common messages in the error column of the result CSV:
- Customer experience ID not found: the ID doesn't match a Customer Experience in your store. Copy it again from the template.
- Variant not found in local DB or Shopify (on an
addrow): no variant with that SKU or variant ID exists in your Shopify store. Check the SKU or ID against your Shopify admin. - Variant not found in local DB (on a
removerow): that variant isn't in Timesact, so there was nothing to remove. - Variant not assigned to customer experience "…": a
removerow for a variant that isn't on that Customer Experience, so there was nothing to remove. - Could not verify variant in Shopify due to an API error: Shopify didn't answer for that variant at that moment. Upload the failed rows again.
To fix only the failed rows, copy them into a new file, correct them and upload that file. Rows that already succeeded don't need to be uploaded again.
Questions merchants ask
Can I use my Shopify product export as the upload file?
No, the upload reads the seven columns of the Timesact template. Copy the SKUs from your Shopify export into the template's variant_sku column, add the Customer Experience ID and action, and upload that.
Can I add the same variant to two Customer Experiences?
Yes. Add one row per Customer Experience, each with the same SKU or variant ID and its own customer_experience_id.
Can I change dates or the pre-order limit with a CSV?
Yes: an add row for a variant that already has that Customer Experience updates it and counts as Updated. The row sets all three values, so an empty end_date removes the end date and an empty pre_order_quantity makes it unlimited. The variant's pre-order sold count for that Customer Experience also starts again from 0, so for live pre-orders the Update pre-order quantity and Update start and end dates actions on the Products page keep the count as it is.
What time does a start date begin?
At midnight at the start of that day, in your store's time zone (Billing & Account → Store settings → Time zone). An end date works the same way: the Customer Experience stops as that day begins.
Does removing a row delete the product from my store?
No. A remove row only takes the variant off that Customer Experience in Timesact. The product and its variants stay in Shopify as they are.
How do I know which rows failed?
Download the result file from the Result column of Upload history. Every row has a status, and rows with error say why.
Related articles
- Adding Products
- Customer Experience Templates Workflow
- Pre-Order Limit
- Tag Automation in V2
- [Bulk-edit pre-order products: quantity, dates and templates](NEW: bulk-edit-pre-order-products)
- [Set your store time zone for pre-order dates](NEW: set-store-time-zone)
- [Functionality statuses on the Products page, explained](NEW: functionality-statuses)
Updated on: 11/11/2026
Thank you!