Quickvee Help Center

Hourly sales report

The Hourly Sales Report slices the day into one-hour buckets and shows how each hour performed — by sales count, net sales, cost of goods sold, gross profit, margin percentage, and tax collected. It is the answer to questions like "When is my store busiest?", "Which hour of the day actually makes me the most profit?", and "Should I add or cut staffing in the evening?"

A combined bar-and-line chart sits at the top to show net sales and sale count visually side by side, and a 22-column hourly table sits below it for the full numeric breakdown.

Access path: Quickvee Web → ReportingSales Reports → select Hourly Sales Report

1_ Quickvee Web (merchant backend) → Reporting → Sales Reports -20260602-081812.jpg
1_Sales Reports → select Hourly Sales Report-20260602-081834.jpg



The filter bar

Filters apply only after Search is tapped.

1_The Filter Bar (2)-20260602-082027.jpg

Date range

  • Quick filters — Today, Yesterday, Last 7 Days, Last 30 Days

  • Manual — pick a Start Date and End Date

When the date range spans more than one day, the hourly buckets aggregate across every day in the range — 9:00 AM–10:00 AM in a 7-day report shows the sum of seven 9 AM hours, not seven separate buckets. This is intentional: the report's purpose is to identify the time-of-day pattern, not the day-by-day trend (use Daily Sales Totals for that).

Outlet

For multi-store accounts, the Outlet dropdown selects which location to report on. Each store has its own hourly pattern — what's the busiest hour at one store can be a slow hour at another.

Search & Export

  • Search — applies the current filters and reloads

  • Export Report — particularly useful here because the table is 22 columns wide and reads more naturally in Excel


The Sales by Hour of Day chart

1_The Sales by Hour of Day Chart-20260602-082146.jpg

A combined bar-and-line chart sits at the top of the report.

Series

What it shows

Net Sales (bars)

Each hour's net sales as a vertical bar. Bar height represents revenue for that hour

Sale Count (line/markers)

Each hour's transaction count as a separate series overlaid on the same chart. Lets you spot mismatches — high sales with low transaction count means high-ticket hours; high count with modest sales means cheap-impulse hours

The X-axis runs from 12:00 AM to 10:00 PM (and beyond if the store has late activity). Hours with no activity show no bar — the chart only renders bars where there were sales.

Display Options

The Display Options control at the top right of the chart lets you toggle which metrics to display on the chart. Use it to focus on a single metric — for example, hiding Sale Count to see only revenue, or vice versa.

📷 Add screenshot: Hourly chart with bars and line series


Reading the detail table

Below the chart is a 22-column table — one column per hour of the day (12AM-1AM through 11PM-12AM, depending on activity) plus a Total column. Six rows of metrics span across every column.

1_Reading the Detail Table (1)-20260602-082103.jpg

Rows (Metrics)

Row

What it shows

Sales Count

Number of paid transactions completed in that hour. Refunded orders reduce the count

Net Sales

Revenue from sales completed in that hour after refunds and discounts. Pre-tax

Cost of good sold

Cost basis of the items sold in that hour, drawn from each product's configured cost price

Gross profit

Net Sales − Cost of goods sold for that hour

Margin (%)

Gross Profit ÷ Net Sales × 100 for that hour

Tax

Total tax collected on sales completed in that hour. This is the customer-paid tax for the hour

The Total column

The rightmost column sums every hour into a day-level (or range-level) total:

  • Total Sales Count — every transaction in the range

  • Total Net Sales — total revenue (matches Daily Sales Totals' total for the same range minus tax)

  • Total Cost of goods sold — total cost basis for the range

  • Total Gross profit — total dollars earned after cost

  • Total Margin — blended margin across every hour (computed against the Total Net Sales and Total Cost, not as the arithmetic mean of hourly margins)

  • Total Tax — total tax remitted in the range


Common workflows

"When is my busiest hour?"

Quick filter → Last 7 Days → Search. Read the Sales Count row across the columns. The hour with the highest count is your busiest transaction hour over the past week — useful for staffing decisions.

"When do I make the most money?"

Same report. Read the Net Sales row instead. The hour with the highest net sales is your most revenue-rich hour — this is often (but not always) the same as the busiest hour. Compare the two rows together to spot hours where one diverges from the other.

"Which hour has the best margin?"

Read the Margin (%) row. Hours with higher margin are selling a different product mix than hours with lower margin — typically because category mix shifts through the day. A high-margin morning hour might be selling accessories while a lower-margin evening hour is selling cigarettes and other low-margin commodity items.

"Should I open earlier or close later?"

Run the report for Last 30 Days to smooth out day-to-day noise. Look at the bookend hours — the first hour the store is open and the last hour. Compare their Gross Profit and Sales Count against the cost of the labor that hour requires.

"Find the dead zone"

Sort visually in the chart for the hour where the bar is shortest (but non-zero). That's your slowest selling hour — a candidate for a happy-hour promotion, a featured product, or a reduced-staff hour to control payroll cost.

"Reconcile against the day's totals"

Run the report for a single day. Compare the Total Net Sales + Total Tax to that day's total in Daily Sales Totals — they should match.

"Compare today against last week"

Run the report for Today, note the hourly pattern. Run for Last 7 Days, compare today's hour-by-hour shape against the rolling average — if today's evening is unusually slow vs. the 7-day evening pattern, something is off about today's traffic.


Important notes

Hours aggregate across the date range. For a multi-day report, 2:00 PM–3:00 PM sums every 2 PM hour in the range. The report shows time-of-day pattern, not day-by-day breakdown. Use Daily Sales Totals for per-day numbers.

Refunds reduce the hour they were processed, not the hour they were originally rung up. A refund processed at 4 PM today against a sale completed at 11 AM yesterday reduces today's 4 PM bucket — not yesterday's 11 AM bucket. This keeps the report time-accurate to when money was actually moving in or out.

Cost is drawn from each product's configured cost price. If a product has no configured cost, that product contributes $0 to Cost of goods sold — which inflates Gross profit and Margin for the hour artificially. Custom items (off-catalog) typically have no cost and can skew an hour's margin upward if many customs are sold.

Net Sales is pre-tax. Customer-paid total per hour is Net Sales + Tax. To match a day's till close, use the Total column's Net Sales + Tax, or use Daily Sales Totals (which is gross-of-tax).

Hours with zero activity are not shown in the chart but appear with zero values in the table. The table is the complete reference; the chart is the visual quick read.

Filters do not auto-apply. Changing dates or outlet requires tapping Search.

Margin is calculated against Net Sales (after discounts) and Cost (excluding tax). Margin is a per-hour figure, and the Total Margin is a blended figure weighted by hourly volume — not the average of the hourly margins.

Hour boundaries are merchant local time. The 9 AM bucket means the merchant's local 9 AM, not UTC. Cross-outlet comparisons assume each outlet's timezone is configured correctly.


Technical reference

Backend logic and calculations

Function used: sale_by_hour()

Tables used: my_order, order_items, refund_tbl, refund_items

Filters: Start Date, End Date, Merchant/Outlet IDs

Common conditions:

order_status = 'paid'
m_status IN ('4','7')

Hour bucket logic

Data is grouped into 24 hourly buckets: 00:00 → 23:00. Each hour always appears (even if no sales → values = 0).

Main calculations

1. Sales Count: Total Orders - Refunded Orders

2. Net Sales:

Net Sales = Subtotal - Refund Amount - Store Credit Refund - Discounts - BOGO Discount - Mix Match Discount - Loyalty Points Redeemed

3. Cost of Goods Sold (COGS): Total Cost Price - Refunded Cost Price

4. Gross Profit: Gross Profit = Net Sales - Cost Price

5. Margin (%): Margin = (Gross Profit / Net Sales) * 100

6. Tax: Tax = Collected Tax - Refunded Tax

Discount components included: Coupon Discount, BOGO Discount, Mix Match Discount, Loyalty Points

Refund logic

Refund sources: refund_items, refund_tbl

  • Refund Amount: All payment mode refunds (cash, card, gift card, etc.)

  • Store Credit Refund: Store credit refunds excluding tax

  • Refunded Cost Price: Cost of refunded items

  • Refunded Sales Count: Orders with m_status = 7

Final aggregation

For each hour: Final Metrics = Order Data - Refund Data - Discounts

At the end, totals are calculated: Total Sales Count, Total Net Sales, Total Cost Price, Total Gross Profit, Total Margin %, Total Tax.

Notes: All 24 hours displayed even if no data exists. Refunds and discounts fully adjusted in net sales. Supports multiple merchant/outlet aggregation. Margin calculated only when net sales > 0. Data aggregated hour-wise using order timestamp. Ensures accurate profit by deducting refunds and cost of refunded items.

Internal reference

Source ticket: MM-509 — Sales - Hourly Sales Report