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_orders scope. Orders older than 60 days also need read_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 Orders table: 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 }}', where since is a Date & Time subtract step 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-graphql tool lets you choose exactly which fields to fetch) and push them to a second OrderLines table keyed by order_id.
  • Refunds and edits: push datasets cannot update rows. Add a daily run that queries updated_at:>'...' financial_status:refunded and pushes refund amounts to a Refunds table, then subtract in a measure.
  • Webhook option: for real-time tiles, start the workflow from a Shopify orders/create webhook instead of a schedule and push one row per order.
  • Multiple stores: add a store column 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.

Learn More

Ready to build this?

Start on the free plan: 500 AI credits a month, no card needed.

Start free

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.