Shopify
Connect your Shopify store so Meerkats has your orders, customers, products, inventory and payouts: the sales truth every ad number is checked against.
Shopify is the sales source for most stores on Meerkats. Once connected, Meerkats imports every order with its line items, discounts, refunds and attribution (UTMs and click IDs), your customers, products and variants with cost and stock per location, discounts, abandoned checkouts, fulfilments and Shopify Payments payouts.
This is what lets Meerkats show corrected ROAS (revenue from real orders matched to clicks), gross margin (needs cost per item), new vs returning customers, cohorts and days of cover. The Integrations page marks a sales source as Required because without one, revenue, orders and margin tiles in Cockpit stay empty.
| How it connects | Sign in and approve |
| Reads | Orders, Order attribution, Refunds and transactions, Payouts, Customers, Products and variants, Discounts, Abandoned checkouts, Fulfilments, Inventory movements, Web pixel events |
| Can change | Create a product, variant or collection (for example a bundle); Change a price or compare-at price; Create or end a discount; Adjust stock at a location; Fix tracking (pixel or UTM setup) |
| Refresh | On your plan's schedule, plus Resync anytime |
Before you start#
- A Shopify store where you are the Store owner or a staff member with permission to install apps.
- Cost per item filled in on your variants, if you want gross margin and contribution margin.
- If you use a custom checkout or headless storefront, check that UTM parameters and click IDs (gclid, fbclid, ttclid) survive to the order. Shopify's standard checkout keeps them.
Permissions#
Shopify asks you to approve these permissions. Each one is listed with why Meerkats needs it.
| Permission | Why Meerkats needs it |
|---|---|
read_orders, read_all_orders | Read every order, including orders older than 60 days, for history and cohorts |
read_customers | Read customers, marketing consent and order counts (contact details can be hashed) |
read_products, read_inventory | Read products, variants, cost per item and stock per location |
read_discounts, read_price_rules | Read discount codes and automatic discounts |
read_checkouts | Read abandoned checkouts |
read_fulfillments, read_shipping | Read fulfilment and delivery events |
read_shopify_payments_payouts | Read payouts, fees and balance transactions (what reconciles to the bank) |
read_marketing_events, read_reports | Read marketing activity and storefront analytics |
write_products, write_inventory, write_discounts, write_price_rules | Create or change products, collections, stock and discounts when you approve a change |
Connect#
1. Connect Shopify#
- Open Integrations
In the sidebar, select Integrations. Shopify is listed first, marked Required.
- Select Connect
Enter your store's myshopify.com address when asked.
- Install the Meerkats app
Shopify shows the permissions above. Select Install. You return to Meerkats with the store connected.
2. Run the first sync#
- Resync
Go to Data Hub › Bronze Layer, pick Shopify and select Resync. The first sync imports all orders, so a store with years of history can take a while. Sync History shows progress.
- Check Cockpit
Once orders land, Cockpit fills in Orders, Ad-reported revenue and, with cost per item, Gross margin. The tile note COGS not synced from Shopify yet disappears.
- Install the web pixel (optional)
Meerkats adds a Shopify web pixel during install so sessions, product views, add-to-carts and checkouts feed conversion rate. If you declined it, open Settings › Customer events in Shopify and turn the Meerkats pixel on.
What syncs#
| Shopify | In Meerkats |
|---|---|
| Orders | Order, created and processed time, line items with variant, quantity, price and discounts, customer, sales channel, payment and fulfilment status, cancellations, tags |
| Order attribution | Landing page, referrer, UTM source, medium, campaign, content and term, and click IDs (gclid, fbclid, ttclid): the basis of corrected ROAS |
| Refunds and transactions | Refund lines, amounts and reasons (kept separate from cancellations); per-order payments with gateway, kind, fees |
| Payouts | Shopify Payments payouts and balance transactions: charges, fees, adjustments |
| Customers | Customer, first order date, marketing consent, tags, order count, total spent, default address region |
| Products and variants | Title, SKU, price, compare-at price, cost per item, stock per location, status, collections, tags |
| Discounts | Price rules and codes: type, value, what they apply to, usage limits, active dates |
| Abandoned checkouts | Checkout, time, line items, landing page, referrer, whether it completed |
| Fulfilments | Carrier, tracking, shipped and delivered times per order |
| Inventory movements | Stock changes per location with reason |
| Web pixel events | Page views, product views, add to cart, checkout started and completed, with session UTMs and device |
Raw data lands in Data Hub › Bronze Layer. Modelled tables, with metrics defined once, are in Data Hub › Gold Layer. Every number in a report or an agent’s answer comes from a query on these tables, never from the model’s own arithmetic.
Metrics you get#
The metrics people ask for most, named as Shopify names them. The full list, with each definition, is in the metric catalog.
Gross salesNet salesOrdersAverage order valueNew vs returning customersRefundsDiscountsGross marginSessionsConversion rateRepeat rateLTVDays of cover
How often it syncs#
Meerkats syncs on your plan's schedule: daily on Free, hourly on the $49 plan, every 30 minutes on $149 and every 15 minutes on $399. You can run a sync at any time with Resync in Data Hub › Bronze Layer.
- Orders are dated by their processed time in the store's time zone. Cross-platform revenue uses order date, not the ad platform's attribution date.
- Corrected ROAS needs the click ID or UTMs on the order. Orders without either count as revenue but aren't attributed to a platform.
- Shopify's own Analytics replaced "Returns" with "Sales reversals" in March 2026. Meerkats keeps refunds and cancellations as separate streams, so both views are possible.
What Meerkats can change#
In every connected tool, Meerkats can create, read, update and delete records, within the permissions you grant and the permissions the tool allows. These are the changes it proposes for Shopify, and the limit that applies to each.
| Change | Limit |
|---|---|
| Create a product, variant or collection (for example a bundle) | Proposed for approval, with the full spec shown first |
| Change a price or compare-at price | Proposed with the margin impact shown; never automatic |
| Create or end a discount | Proposed for approval |
| Adjust stock at a location | Proposed for approval |
| Fix tracking (pixel or UTM setup) | Staged as a task for your store's owner or developer |
How every change is governed
Every change starts as a proposal in your Inbox. Nothing changes in the connected tool until a person approves it, unless you set that rule to act on its own.
Before it runs an approved change, Meerkats re-reads the live value. If the value moved since the proposal, it asks again instead of acting on stale data.
Meerkats stores the value it replaced, so every change can be undone from Agents run history.
Anything Meerkats creates starts paused. Switching it on is a second, separate approval.
Example automations#
Type any of these on the New automation page (Automation Agents › + New Agent).
- “Email me every morning with yesterday's orders, refunds and new customers”
- “Alert me on Slack when any product with active ad spend drops below 5 days of cover”
- “Send a weekly report of discount codes by orders and net sales”
Troubleshooting#
Revenue tiles still say No data
Open Data Hub › Bronze Layer › Shopify and check the sync chip. If it says Never synced, select Resync. If Sync History shows a failed run, the store may have removed the app; select Connect on Shopify to reinstall.
Gross margin is empty
Gross margin needs Cost per item on each variant in Shopify. Fill it in under the product's variant and it flows through on the next sync.
Orders from ads show as unattributed
Check that your ad URLs carry UTMs or that auto-tagging is on, and that your theme or checkout keeps the parameters through to the order. Headless storefronts often drop them.
Numbers differ from Shopify Analytics
Shopify Analytics counts by order date in the store time zone and nets refunds on the refund date. Meerkats does the same by default; make sure you're comparing the same date range and that refunds are shown the same way.
I have more than one store
Connect each store in its own workspace, or in the same workspace if you want them added up in cross-platform reports.