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
| Column | Notes |
|---|---|
| Name | The 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 1 | Street address. |
| Address line 2 | Suite, unit, etc. |
| City | City / town. |
| Country code | Two-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 code | State/province/region code. |
| ZIP / postal code | Postal code. |
| Phone | Contact phone for the location. |
| Fulfills online orders | true/false — whether stock here is available for online sale (Shopify defaults new locations to true). |
| Active | Explicit flag. Leave blank to keep the current state. false deactivates the location; true reactivates it. |
| Deactivate destination | The 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 = truereactivates a currently-inactive location.Active = falsedeactivates 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 report | What 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 error | Your 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.