# Product and customer reports

Find your best sellers and products that aren't selling, and see which customers buy, return or have stopped coming in. Export either report to CSV.

Source: https://getolet.com/resources/help/analytics/product-and-customer-reports/
Updated: 2026-10-15

# Product and customer reports

The **Product report** shows what sells and what doesn't. The **Customer report** shows who buys, how often, and who has stopped. Both are under **Analytics**. Filters, presets and **Apply** work as in [Reports overview](/resources/help/analytics/reports-overview/).

## Product report

Open **Analytics**, then **Product report**.

### Filters

- **Date range**: opens on yesterday.
- **Group by**: **Product** (the default), **Variant**, **Category** or **Brand**. **Product** adds a product's variants together on one row. **Variant** lists each one.
- **Outlets**, **Categories** and **Brands**.
- **Compare to**.

### Cards

| Card | What it shows |
| --- | --- |
| **Net sales** | Sales after discounts and returns, before tax |
| **Gross profit** | Net sales minus cost |
| **Margin** | "Gross profit as a share of net sales." |
| **Units sold** | Items sold |
| **Products sold** | "Different products and variants with at least one sale in this range." |
| **Return rate** | "Units returned as a share of units sold in this range." |

### Selling and Not selling

For **Product** and **Variant**, two tabs sit above the table: **Selling** and **Not selling**. **Category** and **Brand** show **Selling** only.

**Selling** has these columns, sorted by **Net sales** with the biggest first:

| Column | What it means |
| --- | --- |
| **Product** | The name, with the SKU underneath. Select it to open the product in a new tab. |
| **Category** | The product's category. Not shown when you group by category or brand. |
| **Units** | Items sold. |
| **Net sales** | Sales after discounts and returns, before tax. |
| **Discounts** | Discounts given, as a negative amount. |
| **Returns** | Units returned, with the return rate underneath. Sorting uses the rate. |
| **Gross profit / margin** | Profit, with the margin percent underneath. |
| **Share of sales** | The row's net sales as a share of the total. |
| **On hand** | "Current stock, not stock at the end of the range." |

**Not selling** lists stocked products with no sales in the range at the outlets you picked. It shows **Product**, **Category**, **On hand** and **Last sold** ("Never" if it has never sold), with the biggest stock first. Only active products that track stock are listed. Gift cards and products without stock tracking are left out. When every product sold, the tab says "Every stocked product sold in this range." The **Selling** tab says "No sales for this range." when empty.

The totals row shows on the **Selling** tab only.

### Row limit

Each tab holds up to 20,000 rows. If there are more, a "Showing partial results" notice says "Showing the top 20,000 of" the total, by net sales (or by stock on hand on **Not selling**). Narrow the dates or filters to see the rest.

### Export CSV

**Export CSV** saves the tab you're on. The file is named products, then selling or not-selling, then the grouping and dates. **Selling** has **Product**, **SKU**, **Category**, **Units**, **Net sales**, **Discounts**, **Returned units**, **Return rate**, **Gross profit**, **Margin %**, **Share of sales** and **On hand**, plus a **Total** row. **Not selling** has **Product**, **SKU**, **Category**, **On hand** and **Last sold**. If the 20,000 row limit applies, the file says so at the top.

### Margin depends on your costs

Gross profit uses the cost saved on each product. A product with no cost counts as a cost of $0.00, so it looks 100% profit. Keep supply prices up to date.

## Customer report

Open **Analytics**, then **Customer report**.

### Who can see what

You need **View reports**. To see customers by name, you also need **View customers**. Without it, a "Limited view" notice says "Customer details are hidden. Ask an admin to turn on View customers for your role." The report then only offers **Customer Group** as a grouping. Someone without **View reports** sees "Insufficient permissions".

### Filters

- **Date range**: opens on yesterday.
- **Group by**: **Customer** (the default) or **Customer Group**.
- **Outlets** and **Compare to**.

### Cards and customer mix

| Card | What it means |
| --- | --- |
| **Customers served** | "Unique customers with at least one sale in this period. Walk-ins are not counted." |
| **AOV** | "Net sales from identified customers divided by their transactions. Walk-in sales are excluded." |
| **LTV** | "Average all-time net sales per customer served in this period, up to the end date. This is spend so far, not a forecast. Walk-ins are excluded." |
| **Avg visits per customer** | "Identified customers' transactions divided by customers served. Each sale counts as one visit." |

Under the cards, **Customer mix** is a bar split into **Walk-in**, **New** and **Returning**. It shows each as a share of the period's transactions. New is a customer's first-ever purchase. Returning is any later purchase. Walk-in has no customer attached.

### Active customers and Lapsed customers

Grouped by **Customer**, two tabs appear.

**Active customers** lists customers who bought in the range, sorted by **Net sales**. A **Walk-in** row at the top holds sales with no customer attached. The columns are:

| Column | What it means |
| --- | --- |
| **Customer** | Name and customer code. Select the name to open the customer. |
| **Group** | The customer's group. |
| **Status** | **Active**, **At risk** or **Lapsed**, as of the end date. Select the heading for the day limits. |
| **Days since last visit** | Days from their last sale to the end date. |
| **Visits** | Sales in the range. |
| **Net sales** and **Returns** | What they bought, and what they returned. |
| **Gross profit / margin** | Profit and margin. Products with no cost count as zero cost, which overstates profit. |
| **LTV** | Their net sales over all time, up to the end date. |
| **AOV** | Net sales divided by visits. |
| **First visit** and **Last visit** | Their first and latest sale dates. |

**Lapsed customers** lists everyone whose status is **At risk** or **Lapsed** on the end date, with the highest **LTV** first. The columns are **Customer**, **Group**, **Status**, **Days since last visit**, **Lifetime visits**, **LTV**, **First visit** and **Last visit**. Use it to pick people to win back.

### How status is decided

Status compares the days since a customer's last visit to your store's own pattern. When your store has enough repeat visits, the tooltip reads like "Half of repeat visits happen within 20 days and 9 in 10 within 70 days, measured over the 12 months to" the end date. **Active** is within the first number of days. **At risk** is up to the second. **Lapsed** is beyond it. With too few repeat visits to measure, the report uses fixed limits: **Active** at 30 days or less, **At risk** from 31 to 90 days, **Lapsed** after 90.

### Customer Group view

Grouped by **Customer Group**, each row is a group: **Group**, **Customers**, **Visits**, **Net sales**, **Returns**, **Gross profit / margin**, **AOV** and **Share of sales**. There's no Lapsed tab. A **Walk-in** row and a **Total** row are included.

Erased customers show as "Erased customer" with part of their code, and aren't clickable.

### Row limit

The table holds up to 20,000 customers. A "Showing partial results" notice says "Showing the top 20,000 of" the total, by net sales (or by lifetime value on **Lapsed customers**).

### Export CSV

The customer export runs as a background job, so it can take a little while.

1. Select **Export CSV**. A message says "Export started".
2. When the file is ready, it downloads in a new tab.
3. If it takes over a minute, you'll see "Your export is still being prepared. Find it in Settings > Activity." Select **View activity** to go there.
4. If it fails, the message says "The export failed. Try again."

The file matches the tab and grouping you're on. Unlike the screen, the customer file includes contact details: **Company**, **Email**, **Phone**, **Mobile**, and whether the customer accepts email and SMS (**Email OK**, **SMS OK**). Treat it as personal data, and share it only with people who need it. The file is stored for seven days.

## If the numbers look wrong

- **A product is missing from Selling.** It had no sales in the range at those outlets, so look in **Not selling**. Or it was removed, in which case it shows "(deleted)" if it has sales.
- **A variant's stock looks different from the product's.** **Product** adds its variants together. **Variant** lists each one.
- **On hand doesn't match the range.** **On hand** is the stock now, not the stock at the end of the range.
- **A customer is missing.** They had no sale in the range, or the sale had no customer attached. Check **Lapsed customers**.
- **Customer totals differ from the Sales report.** The Customer report leaves walk-in sales out of **Customers served**, **AOV** and **LTV**.
