Running an import

Step 4. Imports run as background jobs on our servers, paced to stay within Shopify's rate limits, with a durable outcome recorded for every row. You can close the tab, cancel mid-run, and resume later without duplicating anything.

Starting

The final step summarises what's about to happen (how many rows will be written, what that costs, and your conflict mode), and then Start Import begins.

If your balance is zero, the button is disabled and you'll see “You have no credits. Buy credits before importing.” with a link to Credits. Your file and mapping are still there when you come back.

It runs on our servers

Once started, the job doesn't depend on your browser. Close the tab, navigate away, or lose your connection and the import carries on. Come back to Jobs to see where it got to.

The wizard says so too: the import runs on our servers, so you can leave the page and check progress under Jobs.

Watching progress

While a job runs you get:

The same live view is on Jobs, under Active, so you don't have to keep the wizard open to follow along.

Why it isn't instant

Rows are processed in parallel, up to 20 at a time, and ImportKit automatically slows down to stay within Shopify's rate limits. Shopify's Admin API throttles hard, so the pace is set by what your store's API allowance permits rather than by how fast we can send. Every row still gets its own recorded outcome.

Because rows run in parallel, don't rely on one row in a file being written before another. If some rows reference things created by other rows, import those in a separate, earlier file.

Transient failures are retried automatically: up to three attempts per row on a rate limit or a server error, backing off one second then two. Everything else isn't retried, because a validation error won't become valid on a second attempt.

Practically: expect thousands of rows to take minutes, not seconds. Start it and go do something else.

Cancelling

Press Cancel and the job stops between rows. What's already imported stays: cancelling isn't a rollback, and nothing is un-written.

Cancellation is checked every five rows rather than after each one, because checking per row would add a database query per row for a feature used rarely. So a cancel takes effect within a handful of rows rather than instantly.

Retry and resume

For a cancelled or failed job, the import screen offers Retry. It resumes from the first row that was never attempted.

Row stateWhat Retry does
Never attemptedImported now
SucceededLeft alone: never re-written, never re-charged
SkippedLeft alone
ErroredLeft as an error. A validation error won't fix itself; fix the file and import those rows separately
UncertainLeft as uncertain, deliberately (see below)

Retry uses the conflict mode the job started with, and the results list keeps both halves of the run in one place.

Cancelled, out of credits, or interrupted

You cancelled
Retry when you're ready. Nothing is duplicated.
You ran out of credits
The job stops cleanly with “Ran out of credits before all rows were imported.” You're charged only for rows that landed, because a credit is reserved before each write and released if nothing was written. Retry isn't offered in this case. To finish, buy a pack, then run the same file again in Skip mode: rows already in your store are skipped for free. Blog articles are the exception, since they'd be created again, so remove the article rows that already imported first.
The server restarted mid-import
The job stops safely and is marked as interrupted. Press Retry to carry on from the rows that hadn't started. Any row that was interrupted mid-write is marked uncertain, refunded and flagged for you to check. It's never silently re-sent.

Uncertain rows

Occasionally a row is interrupted after being sent to Shopify but before the outcome was recorded: a restart at exactly the wrong moment. ImportKit doesn't guess. That row is marked uncertain:

row message
Interrupted while this row was being sent to Shopify, so it may or may not
have been created. It wasn't charged. Check this row in Shopify before
importing it again.

It isn't silently retried, because that could duplicate your data. It isn't silently dropped, because that could lose it. It's surfaced, refunded, and left to you. Check that one row in the Shopify admin and import it on its own if it's missing.

Uncertain rows are rare. When they happen, the count appears in the job's stats so you know to look.

Rows that fail don't stop the import

A bad row is a bad row, not a failed import. Processing continues, the row is refunded, and the reason is recorded against it. A file with 900 good rows and 100 broken ones imports 900 and charges for 900.

This is also how permission-blocked owner types behave: those rows report the missing permission, and everything else imports normally.

Fixing and re-importing the failures →

Job statuses

StatusMeaning
PendingCreated, not started yet.
RunningRows are being processed.
DoneEvery row reached a final outcome. Some may have failed, so check the counts, not just the status.
CancellingCancel received; finishing the rows already in progress.
CancelledStopped early. Resumable with Retry.
ErrorThe job itself failed, not just individual rows, for example by running out of credits. The message says which. Retry is offered for failed jobs, except when the job ran out of credits (see above).

Running more than one import

You can start another import while one is running, and Jobs shows all active jobs with their own progress. Both compete for the same Shopify rate limit, so two imports aren't twice as fast as one. Sequential is generally the calmer choice.

They also share one credit balance, so a large job can consume the credits a smaller one was counting on.

When it finishes

The finished step gives you:

Then go to Jobs for the per-row detail, including the Shopify ID of everything created and a download of the rows needing attention.

Next