How to build Square sales dashboards in Metabase
Square processes your in-person and online payments and holds your orders, catalog, and payouts. Metabase is where you turn that sales activity into shared dashboards for revenue, products, refunds, and settlement. This guide covers two complementary paths: a lightweightMCP + CLI route that pulls live data with the Square MCP server and loads a CSV into Metabase with the Metabase CLI for quick analysis, and a durable pipeline route that syncs Square into a database so you can build sales, refund, and payout dashboards anyone can read.
How do you connect Square to Metabase?
Most teams combine both routes: use the Square MCP server and Metabase CLI route to pull live data and stand up a quick analysis, and the pipeline route for the sales dashboards finance depends on.
Live data in, quick analysis out
Pair the Square MCP server (to look up live payments, orders, and payouts) with the Metabase CLI, whose upload command loads a CSV into Metabase as a ready-to-query table and model.
- Quick lookups like "what did we take at each location yesterday?"
- Loading a Square CSV export into Metabase in seconds
- Spot-checks and one-off analyses without a warehouse
- Great for exploration, not governed financial reporting
- Grant read-only Square scopes so analysis can't trigger writes
- CSV uploads are snapshots — refresh or move to the pipeline for history
Durable dashboards with history
Sync Square via its APIs (Payments, Orders, Payouts) or a managed connector into a database, then point Metabase at it.
- Sales, net-revenue, and payout dashboards finance relies on
- Location, catalog, and refund trends over time
- Joining sales with inventory, staffing, and marketing data
- Requires a destination database and a sync to maintain
- Processing fees and refunds affect net — model them explicitly
- Reconcile against Square Dashboard before anyone trusts the numbers
What can you analyze from Square data in Metabase?
- Gross and net sales — revenue before and after fees
- Products and catalog — top items, categories, and units sold
- Locations — performance across stores and registers
- Refunds and disputes — refund rate, chargebacks, and reasons
- Fees — processing cost as a share of sales
- Payouts — settlement timing and net deposits
Which Square dashboards should you build in Metabase?
Sales & net revenue
Gross sales and what lands after fees and refunds.
- Gross sales by day (line)
- Net sales after fees and refunds (line)
- Average order value (number)
- Sales by location (bar)
Products & catalog
What sells and where.
- Top items and categories by revenue (bar)
- Units sold by item (table)
- Sales by hour and day-of-week (heatmap)
- Discounts applied and their impact (table)
Refunds & disputes
Where money leaks back out.
- Refund rate and refunded amount (number + line)
- Disputes/chargebacks by month (bar)
- Refund reasons (bar)
- Payment success rate (line)
Fees & payouts
Cost of processing and cash landing in your account.
- Processing fees as a share of sales (line)
- Payouts and settlement timing (table)
- Net settlement by month (number)
- Tips and taxes collected (table)
How do you use the Square MCP server with the Metabase CLI?
Pair the Square MCP server with the Metabase CLI for fast, hands-on analysis. Square hosts a first-party remote MCP server that looks up live payments, orders, and payouts; the Metabase CLI's upload command loads a CSV into Metabase and creates a ready-to-query table and model. For analysis, grant read-only scopes.
Example workflow
- Ask the Square MCP what each location took yesterday, or which payments were refunded today.
- Export the payments, orders, and refunds you want to keep as CSVs.
- Run
mb upload csvto load them into Metabase as tables and models, then build questions and dashboards on top.
Be honest about the limits
- The Square MCP is great for live lookups — not for scheduled or audited financial reporting.
- A CSV upload is a point-in-time snapshot; sales and refund trends still need a warehouse sync, or refresh with
mb upload replace. - Grant read-only scopes so analysis can't trigger writes, and respect Square API rate limits.
mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up the Square MCP server and the Metabase CLI?
Square MCPofficial
- Endpoint
https://mcp.squareup.com/sse- Transport
- Remote (SSE via
mcp-remote) - Auth
- OAuth (browser) or an access token
- Scope
- Grant read scopes for analysis work
Metabase CLIofficial
- Install
npm install -g @metabase/cli- Auth
mb auth login(browser OAuth on v62+, or an API key)- Load data
mb upload csv --file data.csv- Requires
- An uploads database (Admin → Settings → Uploads)
# Square (remote, OAuth in browser)
claude mcp add square -- npx -y mcp-remote https://mcp.squareup.com/sse{
"mcpServers": {
"square": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.squareup.com/sse"]
}
}
}The remote server opens a browser to authorize on first connection. Grant read-only scopes for analysis, and use a sandbox application to test first.
# 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 Square CSV export — creates a table AND a model
mb upload csv --file square-payments.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file square-payments.csvThe Metabase CLI stores its credentials securely after mb auth login.
Can you generate a Square dashboard with AI?
Yes. Use the prompt below with any assistant that can run the Square MCP server and the Metabase CLI. It works end to end: if Square tables already exist in Metabase it analyzes those; otherwise it pulls the data over the Square MCP, loads it with mb upload csv, then builds the dashboard — separating gross from net and skipping cards it has no data for.
Create a polished Metabase dashboard for Square payments and sales analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.
Goal: Help founders and finance leaders understand gross and net sales,
products, refunds, disputes, fees, and payouts from Square data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for Square tables and
models). If durable Square data is already present — synced from a warehouse or
uploaded earlier — use it and skip to Step 2.
- If nothing is there, pull it with the Square MCP server using read-only scopes:
payments, orders, order line items, catalog items, customers, refunds, disputes,
locations, and payouts. 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 names. Map the available raw tables into these
analytical concepts where possible: Payments, Orders, Order line items, Catalog
items, Customers, Refunds, Disputes, Locations, and Payouts. Inspect the actual
tables and column names first.
Important:
- Build on whatever data is present; don't claim Metabase connects natively to
Square — it reads a database or CLI-uploaded tables.
- Separate gross sales from net (after Square processing fees and refunds).
- Compute payment success rate on a consistent denominator.
- Handle multi-location data: allow filtering and comparison by location.
- Keep tips and taxes separate from product revenue.
- Only build a card if its underlying column/metric exists in the data.
- A single CSV is a point-in-time snapshot: sales and refund trends need history,
so build trend cards only if a warehouse sync or multiple uploads provide it.
Dashboard title: Square Sales Overview
Sections:
1. Executive summary (KPI cards): Gross sales; Net sales; Fees %; Refund rate;
Average order value; Payments success rate.
2. Sales & net revenue: Gross sales by day; Gross vs. net; Sales by location.
3. Products & catalog: Top items/categories; Units sold; Sales by hour/day.
4. Refunds & disputes: Refund rate; Disputes by month; Refund reasons.
5. Fees & payouts: Fees as a share of sales; Payouts and settlement timing; Net
settlement.
Filters: Location, Item/category, Payment method, Date range.
Reuse the models Metabase auto-created from uploaded CSVs, or (for a warehouse)
create reusable models: modeled_square_payments, modeled_square_orders, and
modeled_square_refunds.
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. Reconcile totals against
Square Dashboard. Keep it practical, dense, and executive-readable. Avoid vanity
metrics.How do you build the Square → Metabase pipeline?
For dashboards that need history and reliability, land Square data in a database first, then connect Metabase to that database.
Connector options
- Square APIs (free, first-party) — Payments, Orders, Catalog, and Payouts APIs into your own pipeline.
- Airbyte — has a Square source covering payments, orders, and more. Free if you self-host the open-source version; paid on Airbyte Cloud.
- Fivetran (paid, managed) — a Square connector with a maintained schema and incremental syncs.
Notes
- Land raw tables first, then build clean models on top.
- Amounts are in the smallest currency unit — divide in a model layer.
- Separate processing fees and refunds so net sales are accurate.
- Keep
location_idon every fact so multi-location comparison is easy.
How should you model Square data in Metabase?
Core tables
| Concept | Grain | Key columns |
|---|---|---|
payments | one row per payment | id, order_id, location_id, amount_money, processing_fee, refunded_amount, status, created_at |
orders | one row per order | id, location_id, total_money, total_tax, total_tip, created_at |
order_line_items | one row per line | order_id, catalog_object_id, quantity, gross_sales |
refunds | one row per refund | id, payment_id, amount_money, reason, created_at |
payouts | one row per payout | id, location_id, amount_money, status, arrival_date |
locations | one row per location | id, name, currency, country |
Modeling advice
- Build a
modeled_square_paymentsview with gross, fee, refund, and net per payment. - Keep tips and taxes in separate columns from product revenue.
- Join line items to catalog for item- and category-level analysis.
- Carry
location_ideverywhere for store comparison. - Reconcile modeled sales and payouts against Square Dashboard.
Which Square metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| Gross sales | Sum of completed payment amounts. | Before fees and refunds. |
| Net sales | Gross − fees − refunds. | What the business keeps. |
| Average order value | Sales ÷ order count. | Trend by location and daypart. |
| Refund rate | Refunded ÷ completed payments. | By count or amount — label which. |
| Fee rate | Processing fees ÷ gross sales. | Watch by payment method. |
| Dispute rate | Disputes ÷ payments. | High rates risk penalties. |
What SQL powers Square dashboards in Metabase?
These assume the modeled tables above (PostgreSQL dialect, amounts in minor units). Adjust identifiers to match your schema.
Gross sales and what lands after Square processing fees.
SELECT
date_trunc('day', created_at) AS day,
COUNT(*) AS payments,
ROUND(SUM(amount_money) / 100.0, 2) AS gross_sales,
ROUND(SUM(processing_fee) / 100.0, 2) AS fees,
ROUND(SUM(amount_money - processing_fee) / 100.0, 2) AS net_sales
FROM payments
WHERE status = 'COMPLETED'
AND created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;Compare stores and registers on volume and average order value.
SELECT
l.name AS location,
COUNT(*) AS orders,
ROUND(SUM(p.amount_money) / 100.0, 2) AS gross_sales,
ROUND(AVG(p.amount_money) / 100.0, 2) AS avg_order_value
FROM payments p
JOIN locations l ON l.id = p.location_id
WHERE p.status = 'COMPLETED'
GROUP BY l.name
ORDER BY gross_sales DESC;Refunded payments and the amount returned.
SELECT
date_trunc('month', created_at) AS month,
COUNT(*) FILTER (WHERE status = 'COMPLETED') AS payments,
COUNT(*) FILTER (WHERE refunded_amount > 0) AS refunded_payments,
ROUND(SUM(refunded_amount) / 100.0, 2) AS refunded_amount
FROM payments
GROUP BY 1
ORDER BY 1;