Free A verdict for every row before anything is written

Bulk-import Shopify metafields, metaobjects and articles

Build a whole custom data model from a spreadsheet — definitions, values, metaobject entries and blog posts. ImportKit checks every row against your store first, writes them one at a time, and charges only for the rows that land.

Free to install · Credits from $1.99 · No subscription · Nothing is written until you approve the preview

Imports
5 custom data types Metafield definitions and values, metaobject definitions and entries, blog articles
Files
CSV up to 50 GB 1,000,000 rows per import, read as a stream. Larger files on request
Before it writes
Create, update, skip or error A read-only pass reports every row and totals the exact credit cost. Free and unlimited
Pricing
1 credit per row written Skipped, failed and interrupted rows are refunded. One-time packs, no expiry
Screenshot

Hero shot — the pre-import check

Step 3 of the wizard: verdict badges (“to create”, “to update”, “to skip”) with the row-by-row report underneath. This is the most persuasive screen in the app; lead with it.

assets/screenshots/hero-pre-import-check.png

What you can import

The half of your store Shopify's CSV importer skips

Shopify handles products and customers. ImportKit handles the custom data layer wrapped around them — the part you otherwise build by hand, one definition and one product at a time.

The five import types
Data typeOne row isWhat people use it for
Metafield definitions one field definition Standing up 30 product fields without 30 trips through the admin. Types, validations, pinning, storefront access — 13 owner types.
Metafield values one value on one resource Filling those fields in across a catalogue from a supplier sheet. Reference products by handle, variants by SKU, anything by ID.
Metaobject definitions one content type, with all its fields Creating an Author, Size chart, Store location or FAQ structure — every field packed into a single cell.
Metaobject entries one entry Loading 200 locations or 50 ingredients. Columns come from your own definition, so nothing is generic.
Blog articles one article Moving a blog off WordPress, with HTML bodies, tags, handles, dates and article metafields in the same row.
And what it doesn't import

Products, collections, customers, orders and themes. ImportKit is narrow on purpose — it never asks for customer or order permissions, so it cannot read that data at all. Use Shopify's own product import for the catalogue, then ImportKit for everything wrapped around it.

The question everyone asks

“What happens if I import the same file twice?”

Nothing you didn't ask for. ImportKit recognises what already exists in your store, tells you before it runs, and does what you chose.

Every row has an identity

Data typeMatched on
Metafield definitionsowner type + namespace + key
Metafield valuesowner type + owner + namespace + key
Metaobject definitionstype
Metaobject entrieshandle
Blog articlesnothing — every row is new

Duplicate rows inside one file are caught too — the second is flagged as “duplicate of row 12” rather than colliding mid-import.

You choose what a match means

ModeResultCost
Skip Default Left completely unchanged Free
Update Patched with this row's values 1 credit
Fail Reported as an error Free

Re-running an already-imported file on the default setting costs nothing and changes nothing. How conflicts work →

Only the columns you map are touched

Set a column to Ignore and its contents never reach Shopify and are never stored. Fields absent from your file are left exactly as they are, so a partial spreadsheet makes a partial update — not a wipe. Blank cells are skipped rather than written, so gaps in an export can't clear existing values.

How it works

From spreadsheet to Shopify in four steps

Nothing reaches your store until you press Start Import — and by then you already know what every row will do, and what it costs.

1 Upload

Pick a type and drop in your file

Choose what you’re importing. No file yet? Download a filled-in template with worked example rows — correct headers, real examples, importable as-is.

Screenshot

Step 1 — Upload CSV

Content type selector, drop zone, and the template download panel.

assets/screenshots/step-1-upload.png

2 Map

Tell it which column means what

Your headers don’t have to match anything. Pick the Shopify field for each column from a dropdown. Extra columns? Set them to Ignore — they’re dropped before the import runs.

Screenshot

Step 2 — Map columns to Shopify fields

Mapping table with columns set to Ignore and sample values visible.

assets/screenshots/step-2-mapping.png

3 Check

See what every row will do — for free

A read-only pass gives every row a verdict: create, update, skip, conflict or error. It shows the exact credit cost. Writes nothing, costs nothing, and runs as many times as you like.

Screenshot

Step 3 — Pre-import check

Verdict badges, conflict-mode selector, and a per-row report.

assets/screenshots/step-3-check.png

4 Import

Import, then watch every row land

Runs on our servers — close the tab any time. Cancel stops cleanly between rows. Retry resumes from the first unprocessed row, never re-writing or re-charging what already succeeded.

Screenshot

Step 4 — Import running

Progress bar with live success / failed / skipped counts and Cancel.

assets/screenshots/step-4-running.png

Built for the boring failures

Bulk imports go wrong in predictable ways

Half a file imported. A handle that doesn't exist. Credits burned on rows that never landed. Most of ImportKit is the handling for those cases.

A failed import costs nothing

Rows that error, skip or conflict are refunded automatically. Credits are reserved just before each write and released the moment the outcome is known, so your balance never runs ahead of your store.

Interrupted imports resume

Cancel, run out of credits, or hit a server restart — the job stops cleanly and Retry picks up from the first unprocessed row. No duplicates, no paying twice for the same work.

Bring the file you already have

Any column names, any order, extra columns welcome. Export from another store, a PIM, or a client's spreadsheet and map what you got to what you need — nothing has to be renamed first.

Failures come back as a CSV

Every job keeps a per-row record: the Shopify ID for each success, the reason for each failure. Download just the problem rows, fix them in your spreadsheet, re-import that file alone.

Errors that name the fix

Not “invalid input”. Instead: ownerType “PRODUCTS_VARIANT” is not valid — did you mean “PRODUCTVARIANT”?, with the row number attached and the credit refunded.

No access to customers or orders

Those permissions aren't requested, so that data is unreadable by design. Rows targeting it are reported with the exact missing permission instead of failing quietly — and the rest of the file still imports.

Before you install

Is this the right tool for your job?

The right tool for the right job. See if ImportKit fits before you install.

A good fit if you’re…

  • Setting up metafields and metaobjects on a new store
  • Filling in custom fields across a catalogue from a sheet
  • Copying a custom data model from dev to production
  • An agency standing up the same structure for client after client
  • Migrating a blog with metafields included
  • Done paying subscriptions for a job you do a few times a year

On the roadmap

  • Products, customers & orders Coming soon
  • Customer & order metafields Coming soon
  • Scheduled & automatic imports Coming soon
  • Export Planned

For undo: the free pre-import check is the answer — read every row’s verdict before anything is written. Nothing is ever deleted.

The full list of what it deliberately won’t do, with the reasoning →

After the run

Every row leaves a receipt

A finished job tells you how many rows succeeded, failed, were skipped, and exactly how many credits it cost. Open it and every row is there with its own verdict.

  • Successes carry the Shopify ID of what they created, so you can trace anything back.
  • Failures carry the reason, and download as a CSV you can fix and re-import.
  • Warnings flag rows that imported with something missing — a reference that didn't resolve, say.
  • Interrupted rows are marked uncertain rather than guessed at, refunded, and left for you to check.

How to read a job's results →

Screenshot

Job detail — per-row results

A finished job in Jobs → detail: the stat tiles (total, succeeded, failed, skipped, credits used) and a results table showing a success with its Shopify ID next to a failure with its message.

assets/screenshots/job-results.png

The problem we solve

Getting custom data into Shopify shouldn’t be this hard

These are the complaints that come up year after year in the Shopify community. Each one is something we deliberately built around.

Pricing

Buy credits when you have an import to run

No monthly fee, nothing to cancel, no expiry. One credit imports one row — and rows that don't import come back to your balance.

Starter Pack

$1.99

50 credits

4.0¢ per row

Get started

Pro Pack

$16.99

600 credits

2.8¢ per row

Get started

Agency Pack

$34.99

1,500 credits

2.3¢ per row

Get started

A typical custom data setup runs about 50 credits. Filling two fields across 400 products is 800. Full pricing, with worked examples →

FAQ

Common questions

Do I need to understand metafields to use this?

Not much. Download the template for the type you want and it arrives with a correct header row plus worked example rows, each showing a different case. Change the values, keep the headers, import it. The quick start does a real import in about five minutes.

Can I undo an import?

No, and that's deliberate. ImportKit never deletes anything, which also means it can't reverse itself — undoing an import is manual work in the Shopify admin. An app that can bulk-delete from a spreadsheet is a far more dangerous thing to install. The free pre-import check is the trade we made instead: read every row's verdict before anything is written.

How do I know what an import will cost before running it?

The check reports “N of M rows will be written”, and N is the credit cost exactly. It's free and re-runnable after every edit to your file, so you can get the number to where you want it before spending anything.

How big a file can I import?

Up to 50 GB and 1,000,000 rows per import, streamed rather than loaded into memory. Need more? Ask us — higher limits and additional files can be arranged. The preview reads the whole file at once, so it caps at 50,000 rows; above that the import still works and conflict handling still applies per row, you just don't get the preview. All limits →

How long does an import take?

Rows go to Shopify one at a time, so thousands of rows take minutes rather than seconds. That's deliberate — Shopify's API throttles hard enough that parallel writes end up slower, and serial keeps every row's outcome unambiguous. The job runs on our servers, so you can close the tab.

Does it work with Excel files?

Upload CSVs. Excel, Google Sheets and Numbers all export one in a couple of clicks — here's the route through each, including the encoding setting that matters.

Is my data stored anywhere?

The uploaded file is never written to disk — it's read as a stream. The values from the columns you mapped are kept with the job so failures can be reviewed and imports resumed, and ignored columns are never stored at all. ImportKit holds no customer personal data and can't read your customers or orders. Privacy policy →

Do credits expire, or renew?

Neither. Packs are one-time purchases through Shopify, and credits sit on your store's balance until you use them — including across an uninstall and reinstall.

See what it would do to your store, for free

Install it, upload your CSV, and read the verdict on every row. Buy your first credit only once you agree with what it says.

Free to install · Test charges on development stores, so a full rehearsal costs nothing