Data catalog
Every tool the dashboard can connect to through its own API, with the field names that come in (from API research, each with a status) and the dashboard metrics they feed.
DC1Tools
52
Each with its own official API
DC2Documented fields
616
Field names from API research, see Status per field
DC3Categories
11
Shop to hospitality
DC4Verified against docs
21%
11 of 52 tools verified against live docs; 32 from knowledge, 9 uncertain
DC5Browse the tools
Filter by category, verification or access. The search box also looks inside field names, entities and metrics.
DC6Shopify: data that comes in
Select any card above to switch tool. 31 fields documented.
- API
- Admin GraphQL API + ShopifyQL + Bulk Operations
- Authentication
- OAuth 2.0 access token (X-Shopify-Access-Token), per shop
- Access and approval
- Custom app on own store needs no review; public app needs review. read_all_orders for orders older than 60 days; protected customer data level 1/2 for PII; read_reports for ShopifyQL.
- Connection effort
- MediumOAuth per shop and cost-based rate limits; read_all_orders and PII scopes need approval for public apps.
Derived dashboard metrics
- Gross / net revenue
- AOV
- Refund rate
- Cancellation rate
- New vs returning
- Repeat rate and LTV
- Revenue by UTM source
- Abandoned checkout rate
- Sessions and conversion rate (ShopifyQL)
Feeds dashboard pages
- /ecommerceE-commerce
- /revenueRevenue
- /retentionRetention
- /paid-mediaPaid media
Fields (31)
| Entity | Field | Feeds metric | Status |
|---|---|---|---|
| Order | id, name, createdAt, processedAt | Time series, order count | Verified |
| Order | totalPriceSet | Gross revenue | Verified |
| Order | currentTotalPriceSet | Net revenue | Verified |
| Order | subtotalPriceSet / currentSubtotalPriceSet | Product revenue | Verified |
| Order | totalDiscountsSet / currentTotalDiscountsSet | Discount amount, discount rate | Verified |
| Order | totalTaxSet / currentTotalTaxSet | Tax, ex-tax revenue | Verified |
| Order | totalShippingPriceSet | Shipping revenue | Verified |
| Order | totalRefundedSet | Refund amount, refund rate | Verified |
| Order | netPaymentSet | Cash-basis net | Verified |
| Order | currencyCode, presentmentCurrencyCode | Multi-currency normalisation | Verified |
| Order | sourceName | Revenue per sales channel | Verified |
| Order | channelInformation { channelId, channelDefinition { handle, channelName } } | Revenue per channel | Verified |
| Order | customerJourneySummary { firstVisit, lastVisit, daysToConversion, momentsCount, ready } | First / last touch attribution | Verified |
| CustomerVisit | landingPage, referrerUrl, source, sourceType, occurredAt, referralCode | Landing page, referrer | Verified |
| CustomerVisit | utmParameters { source, medium, campaign, content, term } | Revenue by UTM source / campaign | Verified |
| Order | cancelledAt, cancelReason | Cancellation rate | Verified |
| Order | displayFinancialStatus, displayFulfillmentStatus | Funnel, fulfilment rate | Verified |
| Order | test | Filter out test data | Verified |
| Order | customer { id, numberOfOrders, amountSpent, createdAt } | New vs returning, LTV | Verified |
| Order | discountCodes, discountApplications | Discount usage per code | Verified |
| Order | shippingAddress { countryCode, provinceCode, city } | Revenue per country | Verified |
| LineItem | quantity, sku, title, originalUnitPriceSet, discountedUnitPriceSet, totalDiscountSet | Units per order, top products | Verified |
| LineItem | variant.inventoryItem.unitCost | Gross margin | Uncertain |
| Refund | totalRefundedSet, createdAt, refundLineItems { quantity, subtotalSet, restockType } | Refund rate per product and month | Verified |
| OrderTransaction | kind, status, amountSet, gateway, processedAt | Payment mix, fees | Verified |
| Customer | numberOfOrders, amountSpent, createdAt, lastOrder, tags | LTV, repeat rate | Verified |
| AbandonedCheckout | abandonedCheckoutUrl, lineItems, subtotalPriceSet, totalPriceSet, discountCodes, createdAt | Abandoned checkout rate, recovery | Verified |
| InventoryLevel | quantities(names: [available, on_hand]) | Stock-outs, days of cover | Verified |
| SubscriptionContract | status, lines, nextBillingDate, billingPolicy | MRR, churn | Verified |
| ShopifyQL | FROM sales SHOW total_sales, net_sales, orders, average_order_value | Net sales, AOV | Verified |
| ShopifyQL | FROM sessions SHOW sessions, conversion_rate | Sessions, conversion rate | Uncertain |
Notes and limitations
- Orders default to the last 60 days unless read_all_orders is approved.
- customerJourneySummary is only filled for Online Store orders; headless or server-side orders can return ready=false. Pass UTMs as cart attributes as a workaround.
- Sessions, bounce and conversion are not per order; use ShopifyQL (read_reports) or the GA4 API.
- GraphQL cost-based rate limit (max 1000 points per query); use Bulk Operations for volume and webhooks plus a reconciliation poll.
- COGS only exists when the merchant fills in unitCost. Ad spend is not in Shopify.
DC7Unified data model
Where each normalised dashboard field comes from in every tool. A dash means the tool does not provide it.
Normalised orders, order lines and refunds across webshop platforms. Amounts as decimal plus currency; mark tax-inclusive amounts explicitly.
| Normalised field | Shopify | Magento | WooCommerce | BigCommerce | Shopware 6 | Squarespace | Wix |
|---|---|---|---|---|---|---|---|
| order_id | Order.id (GID), name | entity_id, increment_id | id, number | id | id, orderNumber | id, orderNumber | id, number |
| created_at | createdAt | created_at | date_created_gmt | date_created | orderDateTime | createdOn | purchasedDate / createdDate |
| gross (incl. tax) | totalPriceSet.shopMoney | grand_total (base_grand_total) | total | total_inc_tax | amountTotal | grandTotal | priceSummary.total |
| subtotal | subtotalPriceSet | subtotal | sum of line_items.subtotal | subtotal_ex_tax | positionPrice | subtotal | priceSummary.subtotal |
| discounts | totalDiscountsSet | discount_amount (abs) | discount_total | discount_amount + coupon_discount | order_line_item type=promotion | discountTotal | priceSummary.discount |
| tax | totalTaxSet | tax_amount | total_tax | total_tax | price.calculatedTaxes | taxTotal | priceSummary.tax |
| shipping | totalShippingPriceSet | shipping_amount | shipping_total | shipping_cost_ex_tax | shippingTotal | shippingTotal | priceSummary.shipping |
| refunds (total) | totalRefundedSet | total_refunded | sum of refunds[].total (negative) | refunded_amount | order_transaction refund state (uncertain) | refundedTotal | balanceSummary.refunded |
| net (after refunds) | currentTotalPriceSet | grand_total - total_refunded | total + sum(refunds.total) | total_inc_tax - refunded_amount | amountTotal - refund | grandTotal - refundedTotal | balanceSummary.paid - refunded |
| currency | currencyCode / presentmentCurrencyCode | order_currency_code / base_currency_code | currency | currency_code | currency.isoCode + currencyFactor | grandTotal.currency | currency |
| status | displayFinancialStatus, displayFulfillmentStatus | state, status | status | status_id | stateMachineState.technicalName | fulfillmentStatus, paymentState | status, paymentStatus |
| is_cancelled | cancelledAt != null | state = canceled | status in (cancelled, failed) | status_id = 5 | state cancelled | fulfillmentStatus = CANCELED | status = CANCELED |
| customer_id | customer.id (null = guest) | customer_id (customer_is_guest) | customer_id (0 = guest) | customer_id (0 = guest) | orderCustomer.customerId | - (email) | buyerInfo.contactId |
| customer_email | email (PII-limited) | customer_email | billing.email | billing_address.email | orderCustomer.email | customerEmail | buyerInfo.email |
| channel | sourceName, channelInformation | store_id (store view) | created_via | channel_id, order_source | salesChannelId | channel | channelInfo.type |
| utm_source / medium / campaign | customerJourneySummary.lastVisit.utmParameters | - (GA4 or extension) | meta_data._wc_order_attribution_utm_* | - | campaignCode, affiliateCode (limited) | - | - (attributionSource only) |
| referrer | lastVisit.referrerUrl | - | _wc_order_attribution_referrer | - | - | - | - |
| landing_page | lastVisit.landingPage | - | _wc_order_attribution_session_entry | - | - | - | - |
| discount_codes | discountCodes | coupon_code | coupon_lines[].code | /orders/{id}/coupons | promotion line items payload | discountLines[].promoCode | via activities (uncertain) |
| shipping_country | shippingAddress.countryCode | shipping_assignments[].shipping.address.country_id | shipping.country | shipping addresses country_iso2 | order_delivery.shippingOrderAddress.country | shippingAddress.countryCode | recipientInfo.address.country |
| line: sku | LineItem.sku | items[].sku | line_items[].sku | products[].sku | payload.productNumber | lineItems[].sku | physicalProperties.sku |
| line: qty | quantity | qty_ordered | quantity | quantity | quantity | quantity | quantity |
| line: unit price | originalUnitPriceSet | price | price | base_price | unitPrice | unitPricePaid | price / priceBeforeDiscounts |
| line: qty_refunded | refundLineItems.quantity | qty_refunded | refunds[].line_items[].quantity | refund items[] | limited | limited | refundQuantity |
| line: cogs | variant.inventoryItem.unitCost | base_cost | - (plugin) | cost_price_ex_tax | product.purchasePrices | - | - |
| abandoned checkout | abandonedCheckouts query | /carts/search (is_active) | - (plugin) | Abandoned Carts API / webhook | cart table / plugin | - | Abandoned Checkouts API |
| sessions / conversion | ShopifyQL sessions | GA4 | GA4 | GA4 | GA4 | GA4 | Wix Analytics API / GA4 |
| realtime push | ORDERS_CREATE etc. | Adobe I/O Events / observer | order.created / updated | store/order/created | app webhooks / flow | order.create | OrderApproved / OrderUpdated |
Source: _plan/research (section Gemeenschappelijk datamodel) per category
DC8Which client uses which source
29 of 52 catalog tools are in use by at least one demo client. Stacks come from the client portfolio.
| Tool | Maison Velours | Atelier Linen Co. | Fleur de Sel Paris | Hôtel Lumière Paris |
|---|---|---|---|---|
| Connected | Not used | Not used | Not used | |
| Not used | Connected | Not used | Not used | |
| Not used | Not used | Connected | Not used | |
| Connected | Connected | Not used | Not used | |
| Not used | Not used | Connected | Not used | |
| Connected | Connected | Not used | Not used | |
| Not used | Connected | Not used | Not used | |
| Not used | Not used | Connected | Not used | |
| Connected | Not used | Connected | Not used | |
| Not used | Connected | Not used | Connected | |
| Not used | Not used | Connected | Not used | |
| Connected | Connected | Not used | Connected | |
| Not used | Not used | Connected | Connected | |
| Not used | Connected | Not used | Not used | |
| Connected | Connected | Not used | Not used | |
| Connected | Connected | Connected | Connected | |
| Connected | Connected | Connected | Connected | |
| Not used | Not used | Connected | Not used | |
| Connected | Not used | Connected | Not used | |
| Connected | Connected | Connected | Connected | |
| Connected | Not used | Not used | Not used | |
| Not used | Connected | Connected | Not used | |
| Not used | Not used | Connected | Not used | |
| Connected | Not used | Not used | Not used | |
| Not used | Connected | Connected | Not used | |
| Connected | Not used | Not used | Not used | |
| Not used | Connected | Connected | Connected | |
| Not used | Not used | Not used | Connected | |
| Not used | Not used | Not used | Connected | |
| Sources per client | 13 | 14 | 15 | 9 |
Source: src/lib/clients.ts CLIENTS (webshop, marketplaces, email, crm, affiliate, ads, other)
DC9Connection effort
A rough estimate per tool based on authentication, approval and rate limits.
| Tool | Effort | Reason |
|---|---|---|
| Medium | OAuth per shop and cost-based rate limits; read_all_orders and PII scopes need approval for public apps. | |
| Medium | No review, but auth and rate limits differ per installation and attribution must come from GA4. | |
| Easy | Key and secret per site, no review; only hosting limits and missing sessions and abandoned carts need workarounds. | |
| Easy | Simple API account with scopes; limits per plan and no attribution in the order. | |
| Medium | Easy auth, but refunds and attribution are thin and field names must be checked per installation. | |
| Medium | Plan requirement and a thin API without refund lines, UTM or sessions. | |
| Medium | Rich order object, but premium plan and thin attribution and traffic data. | |
| Hard | Role approvals (Brand Analytics, PII), async reports, strict token buckets and a separate Ads auth. | |
| Hard | Separate application and approval, profile-scoped tokens, async reports with 31-day windows. | |
| Hard | Request signing, app review, region-dependent endpoints and unclear analytics availability. | |
| Easy | Self-service client credentials; only async exports and a separate ads credential to handle. | |
| Hard | Contract-only access and no traffic, ads or financial data. | |
| Medium | OAuth with PKCE, commercial access for multiple shops and no traffic or ads data. | |
| Medium | Keyset and scopes are manageable, but daily limits and restricted Finances access need care. | |
| Medium | Easy auth, but very tight reporting rate limits force a caching layer. | |
| Easy | API key and simple REST; monthly growth only and revenue needs a connected store. | |
| Easy | Single API key and a ready-made attribution endpoint. | |
| Medium | Easy auth, but only 55 report calls per day, so everything must be cached. | |
| Hard | No reporting API: aggregation from webhooks or SFTP feeds, and revenue is not available. | |
| Hard | Docs largely unreachable, endpoints and revenue fields unconfirmed. | |
| Medium | Easy private app token, but attribution depends on plan and needs custom logic on properties. | |
| Easy | Personal token and one endpoint; UTM depends on form setup. | |
| Easy | Token auth and a small, clear data model. | |
| Easy | API key and one endpoint; UTM needs hidden fields. | |
| Easy | Key and secret per site, no review. | |
| Hard | App review and business verification for client accounts, BUC rate limiting, versioned API and attribution quirks. | |
| Hard | Developer token and access levels via an MCC, GAQL segment compatibility rules and two-query joins. | |
| Hard | App review, per-event metric names that are partly unverified and per-level metric limits. | |
| Medium | Trial-to-Standard access upgrade and default attribution that must be aligned. | |
| Hard | MDP approval, versioned headers with a sunset date and hard response limits. | |
| Medium | Async reports and a developer token, but clear OAuth and no review. | |
| Easy | Free, service account auth and a well-documented schema; only quotas and sampling to watch. | |
| Easy | Free and a single endpoint; row limits and a 2 to 3 day delay. | |
| Easy | Basic auth with account SID and token; real work is the partner-type mapping. | |
| Easy | Personal API token; watch the 31-day window and 20 calls per minute. | |
| Medium | GraphQL with 31-day windows and clicks in a separate product. | |
| Hard | Account-manager gated access and unverified status and new-customer fields. | |
| Easy | Key and secret, but a small and partly unverified model. | |
| Easy | Key pair and Shopify-native data. | |
| Hard | Account-manager access and a fully unverified field list. | |
| Hard | Plan-gated API with unverified fields. | |
| Hard | Access on request and all fields unverified. | |
| Easy | Single token and a small clean model; MRR is a simple derivation. | |
| Easy | Key and secret; small data model. | |
| Easy | Key based and a small model. | |
| Easy | Public API key covers the read use case. | |
| Easy | Read-only key, stable and well-documented API. | |
| Medium | Feature must be enabled and the 31-day window forces chunked syncs. | |
| Hard | Partner-gated access and unverified field names. | |
| Hard | No open API: partner approval or manual exports. | |
| Medium | Token per property and the partner programme for production integrations. | |
| Medium | OAuth app per integration; model is simple. |