How to Send Shopify Orders to Power BI
Connect Shopify to Microsoft Power BI without an app subscription: a Spojit workflow reads new orders through the Shopify Admin API and pushes them into a Power BI dataset every 30 minutes.
What This Integration Does
Power BI has no native Shopify connector, so most stores either pay for a reporting app or export CSVs. This Spojit workflow gives you a direct feed. It queries Shopify for orders created since the last run, turns each into a flat row (order name, date, financial and fulfillment status, totals, discounts, country, channel) and pushes the rows into a Power BI push dataset. Reports built on it show new orders within half an hour, alongside data from your other systems.
Each run uses a Shopify search query on created_at with a small overlap, and drops order IDs that were already sent, so revenue is never double-counted. Push datasets only append rows; see the Tips for handling refunds and later status changes.
Prerequisites
- A Shopify connection in Spojit with the
read_ordersscope. Orders older than 60 days also needread_all_orders, which Shopify grants on request. - A Power BI HTTP Requests connection (OAuth 2.0) and a push dataset, as set up in the "How to Push JSON Data into Power BI from Any Workflow" tutorial in this help center, with an
Orderstable:order_id(String),name(String),created_at(DateTime),financial_status(String),fulfillment_status(String),subtotal(Double),discounts(Double),shipping(Double),tax(Double),total(Double),currency(String),country(String),channel(String).
Step 1: Schedule Trigger
Add a Trigger node with type Schedule and cron */30 * * * *.
Step 2: Query New Orders
Add a Connector node on Shopify in Direct Mode with list-orders:
query:created_at:>'{{ since.iso }}', wheresinceis a Date & Timesubtractstep that takes 40 minutes off the trigger time (its ISO 8601 result is in.iso).first:250
Name the output orders. Shopify returns a page of orders plus a cursor; if more orders exist, pass the cursor into after inside a Loop in While mode. Run the step once and copy the exact path to the order list and the page info from the output panel.
Step 3: Shape the Rows
Add a Transform node with Iterate over set to the orders. Map each order to the table's columns, reading the money values from the order's price sets (for example the shop-currency amount of the subtotal, total discounts, shipping, tax and total), displayFinancialStatus, displayFulfillmentStatus, the shipping address country code, and the sales channel name. Set the money fields to type number. Name the output rows.
Shopify's GraphQL IDs look like gid://shopify/Order/5551234567. Keep them as strings in order_id, or strip the prefix with the Text Tools replace tool if you want to join them with other systems that use the numeric ID.
Step 4: Push to Power BI
Add a Connector node on the Power BI HTTP connection with http-post, url /groups/YOUR_WORKSPACE_ID/datasets/YOUR_DATASET_ID/tables/Orders/rows and body { "rows": {{ rows }} }. Before this step, remove orders whose IDs were sent in the previous run (store them in a File Store file) so the overlap window never duplicates revenue.
Step 5: Build the Dashboard
In Power BI, build visuals on the dataset: revenue and orders by day, average order value, revenue by channel, unfulfilled orders, and revenue by country. Pin them to a dashboard; push dataset tiles update as each batch arrives.
Tips
- Line items: for product reporting, request line items in the same query (the
raw-graphqltool lets you choose exactly which fields to fetch) and push them to a secondOrderLinestable keyed byorder_id. - Refunds and edits: push datasets cannot update rows. Add a daily run that queries
updated_at:>'...' financial_status:refundedand pushes refund amounts to aRefundstable, then subtract in a measure. - Webhook option: for real-time tiles, start the workflow from a Shopify
orders/createwebhook instead of a schedule and push one row per order. - Multiple stores: add a
storecolumn and run one copy of the workflow per store connection into the same table.
Common Pitfalls
- The 60-day limit: without
read_all_orders, Shopify only returns the last 60 days of orders, so a backfill silently stops there. - Presentment versus shop currency: multi-currency stores have two amounts per price. Use the shop currency for reporting, or you will add euros to dollars.
- Query quoting: Shopify search needs the date in quotes,
created_at:>'2026-10-14T00:00:00Z'. Without them the filter can be ignored and you get the most recent orders instead. - Push dataset retirement: Microsoft plans to stop creation of new push datasets on 31 October 2027; for multi-year history, land the orders in a database Power BI reads.
Testing
Run the workflow manually for a single day and compare the order count and total sales with Shopify Analytics for that day. When the numbers match, turn on the schedule.