Gross Revenue
--
Before discounts
Net Revenue
--
AOV: --
COGS %
--
-- of revenue
Gross Profit
--
Margin: --
Orders
--
--/day
Unique Customers
--
Disc rate: --
Discounts Given
--
--
Refunds
--
--
In-Stock Revenue
--
--
Out-of-Stock Revenue
--
--
Revenue & Profit
DailyOrder Status Mix
Monthly Performance
Last 24 monthsAverage Order Value
DailyTop Profitable Products
| SKU | Qty | Revenue | Profit | Margin |
|---|
Worst Performing Products
| SKU | Qty | Revenue | Profit | Margin |
|---|
Paid Search
Spend comes from Google Ads. Orders, revenue and gross profit come from our own orders, credited to the ad click on the page where the buying session landed (last click). Revenue is net of refunds and profit uses booked cost of goods. Phone and draft orders carry no landing page and are never credited, so every ROAS here understates total payback. Profit ROAS = gross profit / spend; 1.0 is gross break-even before fulfillment and overhead.
Change vs comparison period
Campaigns ranked by change in gross profit. Both periods use the same filters. Year-over-year crosses Google's 2026-06-15 change to product-level PMax reporting, which affects vendor spend but not campaign spend.
Flags
Change history
Every edit made in Google Ads, with who made it. Google keeps 30 days; the dashboard stores them nightly so history builds from here. Campaign markers on the charts below show when these happened.
Spend, credited revenue and gross profit
Changes in Google Ads per period; hover a bar to read them
Profit ROAS
Gross profit / spend for each period. The dashed line marks 1.0. Dotted segments and hollow points are periods to read with care: the last 14 days (orders from recent clicks are still arriving) or a period the date range only partly covers. Small triangles along the bottom mark periods with budget, target or status changes; hover to see them.
Profit ROAS by campaign
Top 15 campaigns by spend. Dashed line at 1.0. Hover for spend and profit.
Spend vs profit ROAS
Each dot is a campaign; dot size is gross profit. Upper right: large and paying back. Lower right: large and under 1.0.
Campaigns
Tick campaigns and press "Filter to ticked" to scope the whole page to them. Google value is what Google Ads itself reports as conversion value, shown for comparison. Click a row to see its orders.
Spend by vendor
Product-level Google spend by brand: Shopping plus the shopping part of Performance Max. Spend that Google does not report per product (Search, and Performance Max video, display and search placements) stays in its own band rather than being spread across vendors.
Profit ROAS by vendor
Top 15 vendors by spend. Lighter bars have fewer than 10 credited orders, so treat them as noisy.
Vendors
Revenue and profit are the vendor's own line items on Google-credited orders, whichever campaign brought the click. A vendor can show revenue with no spend when its items sold on an order that another vendor's ad started.
Campaign spend vs vendor sales
Spend is the campaigns selected in the filter above (all Google campaigns when none are). Sales are every order line for the vendors chosen here, whichever channel brought the order, with the part credited to those campaigns broken out. Leave the vendor box empty for all sales.
Definitions and data lineage
Search terms
Geography
Budget pacing
Monthly plan per store against Google spend to date. Projection for the current month = spend so far + the last 7 days' average daily spend x days left; next month = today's enabled daily budgets x days in the month. Google can spend up to twice a daily budget on a given day, so judge pacing on months, not days. Managers and admins can set the plan; it ignores the date range and campaign filter.
Attribution brackets
The same campaigns under three rules, so the truth can be bracketed rather than declared. Last click is this page's rule. Within 7 / 30 days adds later orders by the same customer email that were not themselves paid-credited, on any channel including phone, within that many days of a credited order (an order-based proxy; there is no click log, so this understates assists). Google is Google's own reported conversion value and revenue ROAS. Top 15 by spend; totals cover every campaign in the filter.
Paid-acquired customers by month of first order
Customers whose first ever order was Google-credited, grouped by that month. Profit per customer counts every later order on any channel, including phone and draft orders. CAC is that month's spend / that month's first-time customers (upper bound). Blank cells are horizons the calendar has not reached. Ignores the date range and campaign filter; follows the store filter.
Cumulative gross profit per customer, by acquisition quarter
Data integrity
Numbers behind the numbers, for the current filters. Each line says how much of the page rests on complete data.
Concentration
Share of Google-credited gross profit from the top 5 in each group. One large account can flip a campaign's ROAS; these show how much rides on a few.
By store and channel
Search Log HIGH BETA
Every AI Search that settled: who ran it, what came back, and whether they said it helped. Use the notes and the no-result queries to see where search falls short. Click a query to run it again.
| When | Who | Mode | Query | Store / filters | Results | Took | Rating | Right part / top hit | Clicked |
|---|
All Orders
| Order | Date | Customer | Type | Acq | Status | Revenue | Cost | Profit | Margin |
|---|
Product Profitability
| SKU | Product | Qty Sold | Revenue | Cost | Profit | Margin |
|---|
Total Vendor Revenue
--
-- vendors
Avg Margin
--
Profit: --
Avg Orders/Vendor
--
-- total orders
Customer Mix
--
Vendor Performance
| Vendor | Revenue | In-Stock Rev | OOS Rev | Gross Profit | Margin % | Avg Disc % | Orders |
|---|
Net Revenue
--
Gross: --
COGS
--
-- of revenue
Gross Profit
--
Margin: --
Orders
--
AOV: --
Customers
--
-- SKUs
Discounts
--
Rate: --
Units Sold
--
Avg $/unit: --
Shipping
--
(order-level)
Customer Mix
Daily Revenue & Profit
Products
| SKU | Product | Qty | Gross Rev | Discount | Net Rev | Cost | Profit | Margin |
|---|
Orders
| Order | Date | Customer | Status | Vendor Rev | Vendor Cost | Vendor Profit | Units | Shipping |
|---|
Repeat Rate
--
-- repeat of -- orders
Repeat Revenue Share
--
$-- repeat revenue
Avg Customer LTV
--
B2B: -- / B2C: --
Orders per Customer
--
-- unique customers
Customer Analysis
Customers
--
Combined LTV
--
Avg LTV
--
Avg Orders
--
| Customer | Type | Orders | Total LTV | Profit | Avg Order | Days Since Last | Last Order |
|---|
Repeat Rate Over Time
Customer LTV Distribution
Purchase Frequency
Top Repeat Customers
Ordered 2+ times in period| Customer | Type | Orders | Revenue | Avg Order | Tenure | Last Order |
|---|
SKU Driver Detail
| SKU | Title | Type | Base Qty | Curr Qty | Base Rev | Curr Rev | Rev Δ | Price Eff. | Vol Eff. | Margin Δ |
|---|
Shipping Revenue
--
-- of total revenue
Avg per Order
--
-- orders
Free Shipping
--
-- orders
Paid Shipping Avg
--
-- paid orders
Daily Shipping Trend
Fulfillment Status
Shipping by State
| State | Orders | Shipping Rev | Avg Ship | Total Rev | % of Ship |
|---|
Shipping Methods
| Method | Orders | Shipping Rev | Avg Ship | Product Rev | Profit |
|---|
Top Cities
| City | Orders | Shipping Rev | Avg Ship |
|---|
Data Export
Select a dataset, choose columns, and download as CSV or Excel
| Loading preview... |
PIM Catalog Snapshots
Daily 1am CST snapshot of the PIM. Toggle store at top right.
Trend over time
Vendor changes since prior snapshot
Vendor breakdown
| Vendor | Total | Published | Unpublished | GAQ | Avg Cost | Avg Sell | Margin % |
|---|
Submit Feedback
All Feedback
Multi-Store Migration ADMIN
Tags all existing orders as Blackhawk, then pulls the entire Midwest Supply order history. Safe to re-run — subsequent runs only fetch new orders. Reconcile compares Shopify's last-48h order count against ours and re-syncs any drift (runs daily automatically).
PIM Inventory Flag Sync ADMIN
Mirrors the bhinstock tag into a top-level in_stock boolean on every PIM product. Runs automatically every Sunday at 2am CST — first run flips ~1.89M docs in 3–7 min, subsequent runs only touch deltas (~20–30s). This is the only place this app writes to MongoDB.
User Management
| User | Role | Status | Joined | Actions |
|---|