Skip to main content

Import warranty registrations

For registering many pieces at once — a backlog from before you used SKU.io, or a list from another system — upload a CSV instead of using Register a Piece one at a time. Importing is an upsert: a row that matches an existing registration updates it, and a row that matches nothing creates a new one.

Before you begin​

  • You need the Manage repair settings permission. Without it the Import button is disabled with a tooltip explaining why.
  • The file must be .csv or .txt, up to 20 MB.

Import a file​

  1. Go to Orders → Repairs → Registrations.
  2. Click Import.
  3. Click Download a template for a starter file with every column and a sample row, or prepare your own with the columns below.
  4. Choose your CSV file.
  5. Click Import.

A file of 1,000 rows or fewer imports right away and shows Added, Updated, and Skipped counts, a Rows that need fixing table for anything skipped, and an Imported with a note list for rows that went in with a caveat. A larger file runs in the background instead — see Large files run in the background below.

The CSV columns​

The header row is case-insensitive, and a stray character some spreadsheet programs add to the first cell is stripped automatically. Columns you don't recognize are ignored rather than rejected. In the order the template downloads them:

ColumnRequiredFormatAccepted valuesNotes
registration_numberNoText—The primary match key. Leave blank on a new row to have one assigned automatically.
serialNoText—The second match key. Must be a real serial number already in SKU.io — optionally scoped to product_sku.
customer_emailNeeded to create a new registration (marked with a red asterisk in the dialog, though a row can still match an existing one without it)Email—Finds the customer, or creates one if no match exists.
customer_nameNoText—Only used when finding or creating the customer. Never clears an existing name.
customer_phoneNoText—Same as customer_name — never clears an existing phone number.
product_skuShown as required for a new rowText—Must be an existing SKU, or the row is skipped.
purchased_onNoDateYYYY-MM-DDMust parse as a date, or the row is skipped.
purchase_sourceNoTextorder, shopify, amazon, retail_store, wholesale_partner, gift, otherNot case- or spacing-sensitive — "Retail Store" and "retail-store" both match retail_store.
retailer_nameNoText—Free text.
order_numberNoText—Checked against the matched product's own sales orders. A number that doesn't match one is a note, not a skip.
quantityNoWhole numberA positive whole numberA value that isn't a positive whole number is ignored, not rejected.
lot_numberNoText—Free text.
statusNoTextactive, pending_verification, rejected, voidNot case- or spacing-sensitive. Changing an existing registration's status this way goes through the same verify, reject, or void steps as doing it by hand: rejecting emails the customer with no reason given, and voiding re-checks coverage on any open repair that cites it.

There's no equivalent export of registrations — the registrations list offers Past orders, Import, and Register a Piece, but no download. Download a template builds its sample file entirely in your browser; nothing is sent to or read back from SKU.io for it.

How a row is matched​

Each row is checked against your existing registrations in this order, and the first match wins:

  1. registration_number — an exact match.
  2. serial — the serial number's current registration.
  3. customer_email + product_sku + purchased_on — all three together.

A row that matches nothing creates a new registration, which needs a resolved customer (from customer_email) and a resolved piece (from product_sku, or a serial that identifies one) — otherwise it's skipped with "A new registration needs customer_email and product_sku (or a serial)."

Bad rows never stop the file​

Every row is checked on its own — one row's problem never stops the rest of the file from importing. A bad row is recorded with its spreadsheet row number and a reason, for example:

  • "No product with SKU "ABC-123"."
  • "No serial number "S-9981" for ABC-123."
  • ""next-day" isn't a place of purchase (use one of order, shopify, amazon, retail_store, wholesale_partner, gift, other)."

You always get a count of what was added and updated, the full list of what was skipped and why, and any notes — never an all-or-nothing failure.

Large files run in the background​

A file with more than 1,000 data rows always imports as a background job instead of right away — the dialog reads "The file is importing in the background. Follow it in the job tray; this list refreshes when it finishes." Follow its progress and completion summary from the Background Jobs tray, including the row-by-row list of anything skipped and why, exactly as the inline result shows for a smaller file.

Create registrations for past orders​

Past orders isn't a file upload — it re-runs the same automatic writer that registers a shipment, against every already-shipped order in a date range. Use it to cover orders that shipped before you turned on warranty tracking, or before a particular policy existed.

  1. On the registrations list, click Past orders.
  2. Set Shipped from and Shipped to — both are required, and Shipped to defaults to today.
  3. Optionally choose Only for this policy; leave it as Every matching policy otherwise.
  4. Click Start.

It always runs in the background and is safe to run more than once — a shipped line that already has a registration is skipped, so re-running a range never duplicates one. Its name in the Background Jobs tray includes the date range, and its summary reads something like "Checked 1,240 shipments: 980 registrations created, 15 updated."

Edge cases​

  • Choosing a file before both dates are set (backfill). The Start button stays disabled with "Choose both dates.", or "The start date must be on or before the end date." if they're reversed.
  • An empty file. A CSV with a header row and no data throws "The CSV file contains no data rows."
  • A header missing every match key. A file with none of registration_number, serial, or customer_email — or missing product_sku when neither of the first two is present — is refused with the full list of expected columns.

Next steps​

Video transcript

To cover many pieces at once, upload one spreadsheet. Go to Orders, then Repairs, then Registrations, the page that gathers every customer's warranty registration. Each row pairs a registered piece with its owner. Then click Import, which opens the dialog for uploading a spreadsheet file. The dialog lists all thirteen columns the file can carry. Anything marked with an asterisk is required for a new registration. Download a template gives you a starter file with a sample row. Fill it in with your own pieces and owners. Choose your CSV in the upload field. Then click Import, and a small file loads straight into the results. Three totals sum up the import, starting with Added. Updated counts entries that matched an existing registration. Each skipped row lists its row number and the reason. When you have read the results, click Done to close the dialog. Pieces you already sold need no file at all. Click Past orders for a dialog with a date range. Enter the earliest date you want covered in the first field. It registers every piece sent out within that window. Start runs it as a background job you can follow in the tray.

Last verified: