Shopify Channel Coverage
The Shopify Channel Coverage report lists every sales channel, app, and POS location your Shopify store could be segmented on, tells you whether a Bookkeep mapping books it (a segment's, or the parent connection's own), and shows the revenue Shopify itself recorded on it over a date range. Anything with revenue and no active mapping is money Bookkeep never turned into a journal entry.
It is the mirror of Template Reconciliation. That report starts from the mappings you have and shows the days with no entry. This one starts from Shopify's own list of channels and locations and shows the ones with no mapping at all.
This report is available for Shopify only.
You'll find the report in Bookkeep by clicking Reports in the left navigation menu, then choosing Channel Coverage Report under the Shopify section. It is available to every entity with a Shopify connection.
Why this report exists
Bookkeep books Shopify sales through segments. A segment claims one or more filters (a sales channel, an app, a POS location) and its journal entry mapping posts the orders that match. An order on a channel that no segment claims is not booked by anyone.
Shopify stores change. A subscription app goes live, a wholesale channel is added, a new POS location opens. Bookkeep learns about new channels when the connection's filters are refreshed, but a person still has to create the segment and map its accounts. Until then the revenue is real in Shopify and absent from your books, and nothing else in Bookkeep points it out: the mapping-required alerts cover mappings that exist but are incomplete, not channels that have no mapping.
This report closes that gap. Run it before a period close and every unmapped channel with money on it is at the top of the list.
Using it during onboarding
The same view answers the first question of setting up a Shopify connection: which channels, apps, and POS locations actually have revenue, and how much? Before segments exist, the parent connection's mapping covers everything, so the report is simply a complete list of the store's channels ranked by revenue over the last 60 days (or any range you choose).
That replaces logging in to the merchant's Shopify admin and working through Analytics to find out what sells where. Decide from this list which channels deserve their own segment and their own journal entry, create those segments, and re-run the report. Rows that read Covered · Parent connection are booked through the parent's mapping; rows that read Unclaimed are still to do.
How the report decides what's included
Which filters appear. The list is the same one you see in the Filter by app (or Filter by channel) picker when configuring a segment:
- Every app that has placed orders on the store, when the connection segments by app. Every sales channel, when it uses the older segment-by-channel mode. The Segmented by tile tells you which mode the connection is in.
- Point of Sale is expanded into one row per location, including inactive locations, because POS segments are claimed per location.
- Marketplace Connect is expanded into one row per marketplace sub-channel (Amazon, Walmart, and so on).
- Other, the picker's catch-all for orders with no app, appears only when a segment claims it.
Which filters count as covered. Two kinds of mapping book Shopify sales, and the report mirrors exactly how Bookkeep runs them:
- A segment covers the filters it claims when its journal entry mapping is switched on. When a segment has child segments of its own (for example a country segment with channel segments under it), the parent segment's mapping is superseded by its children and is not counted.
- The parent connection's own sales mapping books the remainder: every order on a channel no segment claims. So when that mapping is switched on, every filter no segment claims is covered too. A connection with no segments therefore shows everything as covered, and the Segments column reads Parent connection for these rows. Bookkeep switches that mapping off when you create the first segment, so on a segmented connection the parent normally books nothing and an unclaimed channel is simply Unclaimed.
Two details of how the parent's remainder is computed can surprise you. A channel claimed by any segment is removed from the parent's remainder even if that segment's mapping is switched off, so nobody books it (that is the Claimed by disabled JEM status). And the removal is by app, not by location: once one Point of Sale location is claimed by a segment, the parent no longer books any POS location, so the other locations need segments of their own. And on a store segmented by country, the parent's remainder is the unclaimed countries rather than unclaimed channels, which no channel row can express, so the report never credits the parent with a channel there: only the channel segments under each country count.
Where the revenue comes from. Revenue is read directly from Shopify Analytics, the same data behind Shopify's own Total sales by channel report, grouped by sales channel and POS location for the date range. The figure is net sales plus shipping charges, with tax excluded, in the store's currency, on the store's local calendar day. This is the basis most accountants reconcile against, and it is Shopify's number rather than Bookkeep's, so it shows revenue whether or not Bookkeep ever saw the orders.
Shopify Analytics lags the store by a day or two, so the most recent one to two days of any range may be incomplete.
How revenue is matched to filters. Shopify Analytics reports the channel's and location's display names, not their IDs, so the report joins revenue to filters by name. When a name matches no filter, or matches more than one, the revenue is kept on its own line rather than dropped (see the Unattributed and Ambiguous name statuses below). It is never silently attached to the wrong row.
Filters
Changing any filter reloads the report.
| Filter | What it does |
|---|---|
| Connection | The Shopify store to report on. |
| Start Date / End Date | The date range, inclusive, on the store's local calendar. Defaults to the last 60 days ending today. The end date cannot be in the future and the range cannot exceed 366 days. |
Totals
Three tiles appear above the table:
- Unmapped Revenue — net sales plus shipping on filters no active mapping books (no segment claims them and the parent connection's sales mapping is off or absent), plus revenue Shopify reported under a name that matches no filter or more than one. The sub-line shows the currency and the number of unclaimed filters. This is the number to drive to zero.
- Covered Revenue — net sales plus shipping on filters an active mapping books: a segment's, including segments that book to another entity, or the parent connection's own.
- Segmented by — whether this connection segments by App or by Sales channel, with the store's time zone. The report's days are that time zone's days.
Unmapped and covered revenue together equal Shopify's total sales for the range.
The table
One row per filter, sorted by total revenue with the largest first, 50 rows to a page. Every filter is listed, covered or not, including those with nothing recorded in the range (most often inactive POS locations); the Status column is the signal.
| Column | What it shows |
|---|---|
| Filter | The app, channel, or location name as Shopify reports it. POS rows show the location in parentheses. |
| Type | App, Sales channel, POS location, Marketplace channel, or Other. |
| Status | The coverage status, explained below. |
| Segments | The Bookkeep segments that claim this filter, if any. |
| Net Sales | Shopify's net sales for the filter over the range. |
| Shipping | Shopify's shipping charges for the filter over the range. |
| Total | Net sales plus shipping. The money columns show a sum at the bottom of the table. |
You can sort, reorder, resize, and show or hide columns from the Columns menu; those choices are remembered in your browser.
Statuses
| Status | Meaning | Counts as |
|---|---|---|
| Unclaimed | No segment claims this filter and the parent connection's sales mapping is off or absent. Any revenue here was never booked. | Unmapped |
| Claimed by disabled JEM | A segment claims the filter, but its journal entry mapping is switched off, so nothing posts. | Unmapped |
| Unattributed | Shopify reported revenue under a name that matches no filter in the list. Usually a channel that was renamed in Shopify after its segment was set up, or a brand-new channel Bookkeep has not imported yet. | Unmapped |
| Ambiguous name | Two or more filters share the same display name, so the revenue cannot be told apart. It is shown on its own line and both candidate filters show zero. | Unmapped |
| Covered | An active segment on this entity claims the filter, or the parent connection's own sales mapping books it. The Segments column says which. | Covered |
| Covered by other entity | An active segment claims the filter, but that segment has been moved to another entity in Bookkeep. The revenue is booked, just not here. | Covered |
What to do with what you find
- Unclaimed with revenue is the finding the report exists for. Create a segment on the connection that claims the filter, map its accounts, and re-run the entries for the period. (On a connection with no segments, switching the parent connection's sales mapping on has the same effect for every channel.) See Shopify Channel and App Segmentation.
- Claimed by disabled JEM means the segment exists; switch its mapping on and re-run the period.
- Unattributed usually means a rename. Refresh the connection's filters so Bookkeep imports the current channel list, then check which segment should claim it. A brand-new channel shows up here first, before it appears in the filter list.
- Ambiguous name is resolved in Shopify by giving the two channels or locations distinct names.
- Covered by other entity needs no action if the move was intentional.
Channel Coverage finds revenue with no mapping. It cannot tell you that a mapped channel posted the wrong amount. For that, compare the journal entries themselves with Template Reconciliation.
Exporting
Download CSV re-fetches the report for the range shown and exports every filter. Columns are filter, kind, status, segments (separated by semicolons), net_sales, shipping, total, and ambiguous.
Messages you may see
- Shopify Analytics is rate-limited for this store right now. Shopify allows a fixed amount of Analytics querying per store per five-minute window, shared with anything else that reads Shopify Analytics for that store. The message gives the time to try again. Nothing is wrong with your data.
- This Shopify connection does not have the read_reports permission. Shopify Analytics needs a permission this connection has not granted yet. Reconnect the store to grant it.
- Shopify reports this store as unavailable. The store is closed or frozen, or its access token has been revoked. Reconnect the store.