Import guide

Import Shopify orders, customers and products into monday.com

Shopify holds the money side of the business and monday.com holds the work that follows it — fulfilment, wholesale follow-ups, a restock list. The join between them is an export, a spreadsheet and somebody remembering to do it again.

Boardfeed reads one collection of one store on a schedule and writes it into a monday.com board, matching rows on the Shopify id so a change updates the item instead of adding another. Three collections are available: orders, customers and products.

Last checked : the three collections the connector reads, the custom-app token route, the 100-order page and the 5,000-page stop it adds up to (500,000), how money, tags and addresses arrive, and the cost-based rate limit, read off the connector and the Shopify pages `docs/connectors.md` cites

Doing it by hand, every time

  1. Export orders or customers as a CSV from the Shopify admin.
  2. Import it into the board and map the columns — again.
  3. Work out which rows are new and which are already there, or accept a second copy of everything.
  4. Repeat every morning, because yesterday’s orders are not today’s.

The scheduled route

  1. Create a custom app in your own store — Settings → Apps and sales channels → Develop apps — give it the read scopes for what you import (read_orders, read_customers, read_products) and install it. The Admin API access token it shows you once, starting shpat_, is the whole credential; there is no app review and nothing to install from a marketplace.
  2. Enter the store as its handle (acme) or as acme.myshopify.com, then paste the token and press Check connection. Boardfeed asks the store nothing but its own name, and says it back to you: the store that answered is the one you meant to connect.
  3. Choose the collection — orders, customers or products. One import reads one of them; a board that wants two is two imports.
  4. Map the fields to board columns and key the upsert on the Shopify id. It is a GraphQL id (gid://shopify/Order/1001) — unique and stable, and the only field that never changes under you.
  5. Pick the schedule, then read the value check before you save: on a remote source it covers the rows the preview read, and a run checks the rest as it writes them.
  6. Every run walks the whole collection, 100 records at a time, following Shopify’s cursor until it says there is no next page — and the walk stops at 5,000 pages rather than importing part of a longer collection, which is 500,000 records. Shopify’s own limit is a cost budget per store, and a run that outspends it waits for the bucket to refill rather than failing.

Field mapping notes for Shopify

This is the part that decides whether an import works on the first try. Everything below is handled in the mapping step, before the first run.

  • Money arrives as the decimal string Shopify sends — 129.90 stays 129.90, with the currency in its own column. Nothing is converted to minor units, so map the amount to a numbers column and set the currency on the board.
  • Every id is a GraphQL id (gid://shopify/…). It is long and it is stable: use it as the key column rather than a name, an email address or an order number, which can all be edited in the admin.
  • One order row carries its name, createdAt, updatedAt, processedAt, the two statuses (displayFinancialStatus, displayFulfillmentStatus), the email, the customer’s display name, the total and its currency, a tag list joined with commas, and a count of its line items. That count is the first 250 line items: an order with more than 250 reports 250.
  • One customer row carries the display name, email, phone, createdAt, the number of orders, the amount spent, the tags, and the default address flattened one level — defaultAddress.city, defaultAddress.zip and so on, nine columns in all. A customer with no address has those nine columns empty rather than missing.
  • One product row carries the title, handle, status, vendor, product type, both dates, the total inventory across variants, and the tags. Status arrives as Shopify’s own word for it — ACTIVE, DRAFT or ARCHIVED — so let the mapping create the labels or map it to a text column.
  • Tags arrive as one text value, the names joined with commas; no tags is an empty value, which the mapping skips rather than writing as a blank. Customer and product records bring nothing else with them: no orders, no variants, no metafields. Import what you need as its own board and relate the two there.

Shopify import questions

Do I need a Shopify app from the marketplace for this?

No. You create a custom app inside your own store and grant it the read scopes you need; the Admin API access token it shows you once is what Boardfeed stores, encrypted. Nothing is installed from a marketplace, nothing is reviewed by Shopify, and Boardfeed never writes to your store — the connector issues one read query per page and nothing else.

What if my store says the token was refused?

A 401 or 403 means Shopify did not accept the token: the app may have been uninstalled, the token rotated (Shopify shows it once), or the app is missing the read scope for the collection you chose. Check the app’s Admin API scopes in Settings → Apps and sales channels → Develop apps, and paste the current token.

How much of a collection does one run import?

As much as one run reads. The connector takes no date filter, so it walks the whole collection, 100 records a page — and it stops at 5,000 pages rather than importing part of a longer collection, which is 500,000 orders, customers or products. A store larger than that needs the REST API source with a filter of its own, or a narrower collection. The stop is not silent: the run ends as failed and its record says how many rows it had already written, and those rows stay on the board — so re-run it in update mode once the source is narrower, or a create-mode re-run adds them a second time.

Why are my older orders missing?

Shopify restricts an app’s access to orders from more than 60 days ago. Whether a custom app needs the read_all_orders scope for those is something we could not confirm from Shopify’s documentation, so start with read_orders, and if the collection comes back short of what the admin shows, request read_all_orders for the app and run the import again.

Does Boardfeed slow my store down?

No. Each request carries a cost against a bucket Shopify gives the store, and it is Shopify that decides how much a query may spend — Boardfeed reads one page at a time and, when the bucket is empty, waits the time Shopify’s own answer asks for before trying again. A big first import therefore takes a while rather than hammering the API.

Other sources