Importing Locations

The Locations import creates and updates your store's locations — the physical or virtual places you stock inventory and fulfill orders — from a CSV/Excel file, a Google Sheet, or directly from another connected store. Rows are matched by name, so running the same file twice updates the same locations instead of creating duplicates.

Locations are the resolution target for Inventory imports (which match stock to a location by name), so getting your locations in first makes an inventory import line up cleanly.

For the wizard itself — uploading, mapping, dry runs, schedules — see Importing into EcomSolo.

Columns

ColumnNotes
NameThe location's name. Required — this is the identity used to match and create locations, and Shopify requires it to be unique within a store.
Address line 1Street address.
Address line 2Suite, unit, etc.
CityCity / town.
Country codeTwo-letter ISO country code (e.g. US, GB). Required when creating a new location — Shopify won't add a location without a country.
Province / state codeState/province/region code.
ZIP / postal codePostal code.
PhoneContact phone for the location.
Fulfills online orderstrue/false — whether stock here is available for online sale (Shopify defaults new locations to true).
ActiveExplicit flag. Leave blank to keep the current state. false deactivates the location; true reactivates it.
Deactivate destinationThe name of another location to move inventory and pending orders to when deactivating. Only used when Active is false.

Common export headers map automatically: Location / Location Name → Name, Country → Country code, State → Province code, Postal Code → ZIP, and so on.

How locations are matched

Every row is matched to an existing location by name in the target store:

  • If a location with that name exists, it is updated.
  • If no location has that name, a new one is created (needs a country code).

The dry run shows the create/update split before anything is written. If a location exists on Shopify but hasn't synced into EcomSolo yet, the import still recognizes the collision and updates it rather than failing.

Activating and deactivating

Activation state only changes when you include the Active column — a row that leaves it blank never touches whether a location is active.

  • Active = true reactivates a currently-inactive location.
  • Active = false deactivates a currently-active location. If the location still holds inventory or has pending orders, Shopify requires somewhere to move them — set Deactivate destination to the name of another location and its stock, pending orders and transfers are relocated there.

If the activate/deactivate step can't be applied — an unknown Deactivate destination, active inventory with no destination, or open purchase orders — the location is still created or updated and the row is reported as created/updated with a warning explaining why the activation state didn't change. The row isn't counted as failed; fix the flag and re-run to finish the state change.

Operations

Pick the operation in Step 1. The default is Upsert — the behavior above.

  • Create — only adds locations. A row whose name already exists fails.
  • Update — only changes existing locations. A row whose name isn't found fails.
  • Upsert — creates missing locations, updates existing ones. The safe default.
  • Delete — removes locations by name (see below).

Deleting locations

Pick the Delete operation in Step 1 (permission-gated) and upload a file with just the Name column. Each name is resolved to its location and removed from Shopify. A name that matches no location is skipped (a no-op), so re-running the same delete file is safe. Deleting a location permanently removes it from Shopify and cannot be undone.

Shopify won't delete an active location — the row fails with LOCATION_IS_ACTIVE. Deactivate it first (an update with Active = false, relocating any stock via Deactivate destination), then run the delete.

Plan limits

The number of locations a store can have is set by its Shopify plan. If a create would exceed that limit, Shopify rejects it and the reason appears as a per-row error in the report — raise your plan's location limit and re-run.

Importing from another store

On the wizard's Source step, pick From another store to copy locations from a connected store — no file needed. Name, address and the fulfills-online-orders setting come across, matched by name. Copied locations are created active; the Active / Deactivate destination columns are only honored from an uploaded file, so a bulk copy never deactivates anything. Combined with a schedule this becomes a recurring one-way location sync.

Results and freshness

Locations you create or update take effect in Shopify immediately, and EcomSolo's Locations dashboard refreshes within seconds of the run.

Sample file

Name,Address1,City,CountryCode,ProvinceCode,Zip,FulfillsOnlineOrders,Active,DeactivateDestination
WowStore Kiosk,,,US,,,,,
WowStore Main Warehouse,100 Market St,San Francisco,US,CA,94103,true,,
WowStore East Depot,25 Dock Rd,Newark,US,NJ,07102,false,,
WowStore Pop-Up Shop,88 Congress Ave,Austin,US,TX,73301,true,true,
WowStore Old Store,42 Retired Ave,Sacramento,US,CA,95814,,false,WowStore Main Warehouse

Each row is a case: a minimal create (name + country), a fully-populated create, a create that isn't sold online, a reactivation (Active = true), and a deactivation that relocates stock to another location. Dry run: will create the new names, update any that already exist. The same file ships as features/importing/examples/locations-sample.csv.

Troubleshooting

Error in the reportWhat it means / what to do
row requires a Name(failed) Every row needs the location's unique name.
creating a location requires a Country code(failed) A new location needs at least a country in its address.
cannot update: no existing location named …(failed) On an Update-only run, the named location wasn't found — use Upsert to create it, or fix the name.
location created/updated, but Location could not be deactivated without specifying where to relocate inventory(warning — location saved) It still has stock — set a Deactivate destination and re-run to deactivate.
location created/updated, but deactivate destination location '…' was not found(warning — location saved) The destination name doesn't match a location in this store; fix it and re-run.
LOCATION_IS_ACTIVE(failed, on a Delete run) Shopify won't delete an active location. Deactivate it first (Active = false) and re-run the delete.
plan-limit / location-count errorYour Shopify plan caps the number of locations — raise it and re-run.

FAQ

Will re-importing create duplicates? No — rows match by name and the operation is an upsert, so re-runs update in place.

Does it delete locations? Yes — run the Delete operation with a file of names. Delete is permission-gated and irreversible, unmatched names are skipped, and Shopify won't delete an active location (deactivate it first).

Why match by name and not address? Shopify enforces unique location names per store and a location has no handle, so the name is the only stable, human-readable identifier — the same choice keeps re-runs idempotent.