How to build Lightspeed sales dashboards in Metabase
Lightspeed is a commerce platform for retailers and restaurants — X-Series for retail point of sale and inventory, K-Series for hospitality — covering sales, catalog, registers, outlets, and payments. Metabase is where you turn that data into shared, trustworthy dashboards. This guide covers two complementary paths: a lightweight API + CLI route that pulls live data via the Lightspeed X-Series Sales API and loads a CSV into Metabase with the Metabase CLI, and a durable pipeline route that lands Lightspeed data in a database so you can build dashboards anyone can read.
How do you connect Lightspeed to Metabase?
Most teams combine both routes: quick answers through API exports and CLI uploads first, then recurring reporting on a warehouse-backed model.
Know which Lightspeed you have before you write a line of code. X-Series is retail point of sale (formerly Vend, on retail.lightspeed.app), K-Series is hospitality (on lsk.lightspeed.app), and R-Series and C-Series are older retail and eCom products. They have different APIs, hosts, and docs portals. This guide leads with X-Series, which has the stronger analytics surface, and notes the K-Series equivalents where they differ.
Live answers in, quick analysis out
Script a scoped export against the Lightspeed X-Series Sales API, write the result to CSV, then load it into Metabase as a ready-to-query table and model.
- Quick questions such as "show me net sales by outlet and register"
- Loading Lightspeed exports into Metabase in seconds
- Spot-checks and one-off investigations without pipeline work
- Great for exploration, not month-end reporting anyone signs off on
- Use read-only credentials or scoped tokens wherever supported
- CSV uploads are snapshots — refresh or move to the pipeline for history
Durable dashboards with history
Land Lightspeed data in a database or warehouse — via connector, scheduled API pulls, or a direct database connection — then point Metabase at it.
- Lightspeed dashboards the whole team reads from the same definitions
- Joining this data with orders, customers, and revenue from the rest of the stack
- Long-run trends for net sales by outlet and register and average transaction value and units per sale
- You own the refresh schedule and the rollup grain
- Model gross, fee, and net amounts once, in the warehouse layer
- Late-arriving records restate recent periods — plan for it
What can you analyze from Lightspeed data in Metabase?
Each of these is built from sales joined to the related sale line items and discounts, products and product categories, outlets and registers data your export exposes:
- Net sales by outlet and register
- Average transaction value and units per sale
- Category and product performance
- Discount and loyalty impact on margin
- Inventory turns and stock cover
Which Lightspeed dashboards should you build in Metabase?
Sales
The day-to-day trading picture.
- Net sales by location by day (line)
- Average check size (number + trend)
- Checks by daypart (bar)
- Sales this week vs. the same week last year (combo)
Item mix
What sells, and what earns.
- Top items by revenue and by units (table)
- Category mix over time (stacked area)
- Attach rate for add-ons and modifiers (number)
- Items with falling sales week over week (table)
Discounts and voids
The margin that quietly disappears.
- Discounts and comps as a share of gross sales (line)
- Void rate by location and employee (table)
- Comps by reason code (bar)
- Refunds after close (table)
Tenders and settlement
How money arrives and what it costs.
- Payment method mix (stacked bar)
- Effective processing fee rate (line)
- Tips by location and daypart (bar)
- Deposits received vs. net sales recorded (combo)
How do you use the Lightspeed X-Series Sales API with the Metabase CLI?
Pair the Lightspeed X-Series Sales API with the Metabase CLI for fast, hands-on analysis. A short scripted export covers the pulls an MCP server would otherwise make; the Metabase CLI's upload command loads CSV data into Metabase and creates a ready-to-query table and model.
Example workflow
- Ask the API for last month's sales summarized by day, location, and daypart — not raw check lines.
- Export the result as CSV, keeping stable IDs, dates, currency codes, and the fee breakdown intact.
- Run
mb upload csvto load it into Metabase as a table and model, then build questions and dashboards on top.
Be honest about the limits
- Scripted API pulls are excellent for exploration, not scheduled reporting.
- A CSV upload is a snapshot; refresh it with
mb upload replaceor move to the pipeline for real history. - Sales trends need complete business days; late-closed checks and end-of-day adjustments mean the last day or two keeps moving.
mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up the Lightspeed API and the Metabase CLI?
Lightspeed X-Series Sales APIno vendor data MCP
- Transport
- REST over HTTPS ({domain}.retail.lightspeed.app/api)
- Auth
- OAuth 2.0 via a private app (personal tokens on older accounts)
- Best for
- Scripted sales, product, and inventory exports
Metabase CLIofficial
- Install
npm install -g @metabase/cli- Auth
mb auth login- Load data
mb upload csv --file data.csv- Requires
- An uploads database (Admin → Settings → Uploads)
# Pull closed sales for a date range from X-Series (Retail).
# Versioning is date-based since Jan 2026 — pin the version you tested.
DOMAIN="your-store" # {domain}.retail.lightspeed.app
VERSION="2026-07"
curl -s -G \
"https://${DOMAIN}.retail.lightspeed.app/api/${VERSION}/sales" \
-H "Authorization: Bearer $LIGHTSPEED_TOKEN" \
--data-urlencode "since=2026-06-01T00:00:00Z" \
--data-urlencode "page_size=200" \
> lightspeed-sales.json
# Flatten sales -> line items into a CSV for the Metabase CLI.
# totals.price is tax-exclusive; totals.price_incl_tax includes tax.
jq -r '.data[] | . as $s | $s.line_items[]? | [
$s.id, $s.date, $s.outlet_id, $s.register_id, $s.status,
.product.id, .quantity, .pricing.price, .pricing.discount,
.tax.amount
] | @csv' lightspeed-sales.json > lightspeed-pos-checks.csvLightspeed publishes a documentation MCP server for the K-Series docs portal at https://api-docs.lsk.lightspeed.app/mcp — it searches the API reference and returns docs, not your sales. There is no vendor MCP server for the data itself (verified July 2026), and searches for “Lightspeed MCP” mostly surface Red Hat Lightspeed, an unrelated product. Zapier offers an X-Series MCP bridge; that's a Zapier product, not a Lightspeed one. So route 1 here is a scripted API export.
# Install the Metabase CLI
npm install -g @metabase/cli
# Log in (opens your browser; requires Metabase v62+)
mb auth login --url https://your-metabase.example.com
# Load a sales export — creates a table AND a model
mb upload csv --file lightspeed-sales.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file lightspeed-sales.csvCan you generate a Lightspeed dashboard with AI?
Yes. Use the prompt below with any assistant that can run shell commands (for the API export) and the Metabase CLI. It works end to end: if Lightspeed tables already exist in Metabase it analyzes those; otherwise it pulls scoped, summarized data, loads it with mb upload csv, then builds the dashboard and caveats any metric that needs missing history.
Create a polished Metabase dashboard for Lightspeed pos sales analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.
Goal: Help the team understand net sales by location, average check, item mix, discounts and voids, and tender mix from Lightspeed data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for lightspeed tables and
models). If durable Lightspeed data is already present — a warehouse sync, a
direct database connection, or an earlier upload — use it and skip to Step 2.
- If nothing is there, pull a scoped, summarized export by scripting the Lightspeed X-Series Sales API:
sales, plus sale line items and discounts, products and product categories, outlets and registers.
Write each result to a CSV, then load it with the Metabase CLI — run
"mb upload csv --file <export>.csv" so each upload creates a table and a
ready-to-query model. Use "mb upload replace <table-id> --file <export>.csv"
to refresh an existing table instead of creating duplicates.
Step 2 — Inspect before querying:
Do not assume exact table or column names. Inspect available fields, products,
locations or countries, currencies, and date ranges before creating trend cards.
Important:
- Build on whatever data is present; don't claim Metabase connects natively to
Lightspeed — it reads a database or CLI-uploaded tables.
- Separate gross amounts, platform and processing fees, taxes, and refunds into
distinct columns; never let one card silently mix gross and net.
- A single CSV is a point-in-time snapshot: only build trend cards if there is
a usable date column or multiple periods have been uploaded.
- Sales trends need complete business days; late-closed checks and end-of-day adjustments mean the last day or two keeps moving.
- If a metric can't be computed from the data present, say so on the card
instead of approximating it.
Dashboard title: Lightspeed POS Sales Overview
Sections:
1. Executive summary: Net sales; Average check; Checks; Discount rate;
Void rate.
2. Sales: Net sales by location and day; checks by daypart; year-over-year.
3. Menu: Top items by revenue and units; category mix; modifier attach rate.
4. Leakage: Discounts and comps; voids by location; refunds after close.
5. Settlement: Tender mix; processing fee rate; tips; deposits vs. sales.
Filters: Date range, Outlet, Register, Product category, Payment type.
Output: Build the dashboard if you have permission; otherwise provide the exact
questions, SQL, model definitions, and layout. Include caveats for any metric
that cannot be calculated from the available data.How do you sync Lightspeed data into a database or warehouse?
For dashboards that need history and reliability, land Lightspeed data in a database first, then connect Metabase to that database.
Connector options
- Managed connector — use Airbyte, Fivetran, or dlt when one genuinely covers the objects you need.
- Custom pipeline — use the Lightspeed X-Series Sales API for control over grain, fields, and refresh cadence.
- API + CSV — use this for quick exploration and one-off slices.
Airbyte's community <code>source-lightspeed-retail</code> connector covers X-Series with 24 streams — sales, products, inventory, outlets, registers, customers, consignments, and more. One caveat that matters at scale: <strong>every stream is full-refresh only</strong>, with no incremental sync, and X-Series rate limits work out to roughly 300 requests per register plus 50, per five minutes. Large catalogs will need patience and off-hours scheduling. No Fivetran or dlt source exists; scheduled API pulls are the alternative.
Notes
- Decide the grain first (one row per sale and one per line item, stamped with outlet) — it drives every trend card.
- Land raw tables first, then build clean Metabase models on top.
- Normalize business-date, location, daypart, check-id, net-sales, discounts, voids, and tender-type fields.
How should you model Lightspeed data in Metabase?
Core tables
| Table | Grain | Key columns |
|---|---|---|
pos_checks | one row per sale | sale_id, sale_date, outlet_id, register_id, customer_id, status, receipt_number, gross_sales, discount_amount, loyalty_amount, tax_amount, net_sales |
pos_check_items | one row per sale line item | line_item_id, sale_id, sale_date, product_id, quantity, unit_price, unit_cost, discount_amount, tax_amount, net_amount |
pos_locations | one row per outlet | outlet_id, name, timezone, register_count, region |
Modeling advice
- Build a clean
pos_checksmodel with the same column names you use for sibling tools, so cross-tool dashboards don't fork definitions. - Keep gross amount, platform fee, processing fee, tax, and net amount as separate, labeled columns — never let one card silently mix them.
- Filter to
status = 'closed'for sales reporting — parked and pending sales are open tabs, and voided sales are not revenue. - X-Series line items carry
pricing.costalongside price, so gross margin is computable at item level without a separate inventory feed. Carry both into the model. - Keep
loyalty_amountseparate fromdiscount_amount: loyalty redemption is a liability being settled, a discount is margin given away, and finance treats them differently. - Store amounts in minor units or with an explicit currency column, and convert once in the model layer rather than per card.
Which Lightspeed metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| Average check size | Net sales per closed sale, by outlet and register. | Retail calls it average transaction value — same metric. |
| Gross margin | Item revenue less item cost, available directly from line items. | Cost travels with the line item, so this is unusually easy. |
| Average order value | Order value across channels, when you also sell online. | Use one definition across POS and e-commerce or don't compare. |
| Repeat purchase rate | Share of identified customers who buy again. | Only customers attached to a sale can be tracked. |
What SQL powers Lightspeed dashboards in Metabase?
These assume a cleaned analytical model in a warehouse (PostgreSQL dialect). Adjust table and column names to match your pipeline.
Closed sales only, with tax handled once.
SELECT
l.name AS outlet,
date_trunc('week', c.sale_date)::date AS week,
COUNT(*) AS sales,
ROUND(SUM(c.net_sales), 2) AS net_sales,
ROUND(AVG(c.net_sales), 2) AS avg_transaction_value,
ROUND(
100.0 * SUM(c.discount_amount)
/ NULLIF(SUM(c.gross_sales), 0), 2
) AS discount_rate_pct
FROM pos_checks c
JOIN pos_locations l ON l.outlet_id = c.outlet_id
WHERE c.status = 'closed'
AND c.sale_date >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY l.name, week
ORDER BY week DESC, net_sales DESC;Cost travels with the line item, so margin needs no extra join.
SELECT
date_trunc('month', i.sale_date)::date AS month,
p.category,
SUM(i.quantity) AS units,
ROUND(SUM(i.net_amount), 2) AS revenue,
ROUND(SUM(i.unit_cost * i.quantity), 2) AS cost,
ROUND(
100.0 * (SUM(i.net_amount) - SUM(i.unit_cost * i.quantity))
/ NULLIF(SUM(i.net_amount), 0), 1
) AS gross_margin_pct
FROM pos_check_items i
JOIN pos_checks c ON c.sale_id = i.sale_id AND c.status = 'closed'
JOIN products p ON p.product_id = i.product_id
GROUP BY month, p.category
ORDER BY month DESC, revenue DESC;Whether bigger baskets or higher prices drive growth.
WITH basket AS (
SELECT
c.sale_id,
date_trunc('month', c.sale_date)::date AS month,
c.net_sales,
SUM(i.quantity) AS units
FROM pos_checks c
JOIN pos_check_items i ON i.sale_id = c.sale_id
WHERE c.status = 'closed'
GROUP BY c.sale_id, month, c.net_sales
)
SELECT
month,
COUNT(*) AS sales,
ROUND(AVG(units), 2) AS avg_units_per_sale,
ROUND(AVG(net_sales), 2) AS avg_transaction_value,
-- Price per unit isolates mix and pricing from basket size.
ROUND(SUM(net_sales) / NULLIF(SUM(units), 0), 2) AS avg_price_per_unit
FROM basket
GROUP BY month
ORDER BY month DESC;What are common mistakes when analyzing Lightspeed in Metabase?
Related
Related analytics
Related dashboards
Related integrations
FAQ
Does Metabase connect natively to Lightspeed?
Should Metabase replace Lightspeed's built-in reports?
Is there a Lightspeed MCP server for sales data?
How do I authenticate now that personal tokens are ending?
Which API version should I pin?
2026-07, released quarterly and supported for at least twelve months. Pin the version you tested against rather than tracking the latest, and schedule the upgrade inside the support window. The older v0.9 and v2.0 versions are deprecated.