Buyer’s guide Sourced and dated

Which BI tool should a startup on MacBooks use?

For a founder or ops lead answering questions from Stripe, HubSpot or product exports, use xmetric: it's free, runs in Safari or Chrome on any Mac, and reads the file without uploading it. Pick Metabase once you want shared dashboards on a live production database, and Tableau if you need its full desktop app. Power BI Desktop is Windows-only.

Updated

Our pick

xmetric

It runs in the browser on every Mac on the team, costs nothing, and reads a Stripe or CRM export locally. You get Tableau-style formulas, such as a FIXED expression for each customer's last invoice, without a server to run.

Pick something else if

You want always-on dashboards on a live Postgres or warehouse with scheduled email or Slack reports (Metabase), you need Tableau's full desktop app (Tableau), or the company already lives in Microsoft 365 on Windows (Power BI).

xmetric makes this page. Every vendor fact below links to the vendor’s own page and the date we checked it.

How they compare

xmetric Our pickMetabaseTableauPower BI
Cost to startxmetricFree in your browser. No account needed to open a file.Saving a workbook online and sharing a link need a free account.Source · checked October 20MetabaseFree self-hosted edition, unlimited usersYou host it yourself (Java JAR or Docker); no Metabase-managed hosting on the free plan.Source · checked October 17TableauTableau Desktop Free Edition, Tableau Public and Tableau Reader are free.Free Edition can't publish, share online, or share packaged workbooks with others. Anything on Tableau Public is public.Source · checked October 17Power BIPower BI Desktop is a free download; free account (Fabric Free license) also available.Sharing reports needs Pro or Premium; Desktop is Windows-only; the service needs a work or school email.Source · checked October 17
Runs on a MacxmetricAny modern browser on Mac, Windows or Linux. Nothing to install.Source · checked October 17MetabaseMetabase Cloud (managed) or self-hosted via Java JAR or DockerSource · checked October 17TableauWindows and macOS (installers for Windows and Mac .DMG/.PKG). Exact OS versions are on tableau.com techspecs (blocked).Source · checked October 17Power BIWindows only: Windows 10 or Windows Server 2016 or later, 64-bit; client Windows recommended. No macOS version is mentioned.Source · checked October 17
Where the data goesxmetricIn your browser. Files are not uploaded.Source · checked October 17MetabaseCloud: Metabase-managed app database on AWS RDS, region chosen by customer (US, EU, LatAm, APAC). Self-hosted: your own infrastructure.Source · checked October 17TableauTableau Cloud: hosted and managed by Tableau. Tableau Server: managed by the customer. Desktop/Reader: local files.Source · checked October 17Power BIDesktop works locally; the Power BI service (sharing, publishing) is Microsoft-hosted SaaS inside Microsoft Fabric.Source · checked October 17

Try it: the churn question a board asks

Here are fourteen months of invoices from a small booking app, exported from Stripe. MRR from paid invoices went from 3,875 in August 2024 to 9,366 in August 2025. Over the same stretch 50 customers left, and 22 of them, 44%, never cancelled: their last invoice failed. That's 1,708 a month of MRR you can win back with card retries and a dunning email, before spending anything on acquisition.

Why are we losing customers?

Computed by the xmetric engine

The data

Loopline invoices from Stripe, August 2024 to September 2025

Synthetic datainvoices.csv

A seed-stage booking app for small businesses on three monthly plans: Starter, Team and Business. 175 customers, one invoice per customer per month, paid or failed.

invoice_idcustomer_idcustomerplaninvoice_monthamountstatus
in_00001cus_0001Lia's TutorsTeam2024-08-0199paid
in_00002cus_0002Ada's TutorsTeam2024-08-0199paid
in_00003cus_0003Ben's SalonStarter2024-08-0129paid
in_00004cus_0004Cleo's DesignTeam2024-08-0199paid

Step 1

MRR from paid invoices

MRR more than doubled in a year. Growth hides churn, so look at who left.

Point at the line to read it.
02,5005,0007,500Aug 1, 2024Sep 1, 2025

Tableau

SUM(IF [status] = "paid" THEN [amount] END)

SQL

SELECT
  invoice_month,
  SUM(amount) FILTER (WHERE status = 'paid') AS mrr,
  COUNT(*) AS customers_billed
FROM input
GROUP BY invoice_month
ORDER BY invoice_month

Rows

Invoice monthMRRCustomers billed
Aug 1, 20243,87555
Sep 1, 20244,01063
Oct 1, 20244,67770
Nov 1, 20245,67073
Dec 1, 20245,76478
Jan 1, 20255,83485
Feb 1, 20256,78690
Mar 1, 20257,49697
Apr 1, 20257,472101
May 1, 20258,151109
Jun 1, 20258,175115
Jul 1, 20259,197120
Aug 1, 20259,366123
Sep 1, 20258,885125

Step 2

Customers lost, by their last invoice

A customer is lost when their last invoice is before the latest month. The FIXED expression finds that month for each customer, whatever the view shows. Colour by the status of that last invoice.

Point at a bar to read it.
02462024-09-012024-10-012024-11-012025-01-012025-02-012025-03-012025-04-012025-05-012025-06-012025-07-012025-08-01
CancelledCard failed

Tableau

IF { FIXED [customer_id] : MAX([invoice_month]) } < { FIXED : MAX([invoice_month]) } THEN "Lost"
END

SQL

WITH c AS (
  SELECT
    customer_id,
    MAX(invoice_month) AS last_month,
    arg_max(status, invoice_month) AS last_status
  FROM input
  GROUP BY customer_id
)
SELECT
  last_month,
  CASE
    WHEN last_status = 'failed' THEN 'Card failed'
    ELSE 'Cancelled'
    END AS reason,
  COUNT(*) AS customers
FROM c
WHERE last_month < (
  SELECT MAX(invoice_month)
  FROM input
)
GROUP BY last_month, reason
ORDER BY last_month, reason

Rows

Invoice monthReasonCustomers
2024-09-01Cancelled2
2024-10-01Cancelled3
2024-10-01Card failed2
2024-11-01Cancelled2
2024-11-01Card failed2
2025-01-01Cancelled3
2025-01-01Card failed2
2025-02-01Card failed4
2025-03-01Cancelled5
2025-03-01Card failed2
2025-04-01Cancelled2
2025-05-01Cancelled1
2025-05-01Card failed2
2025-06-01Cancelled2
2025-06-01Card failed4
2025-07-01Cancelled1
2025-07-01Card failed3
2025-08-01Cancelled7
2025-08-01Card failed1

Step 3

Lost customers and MRR, by reason

Almost half of the customers who left never asked to. Their card failed, the retry failed, and the subscription lapsed.

ReasonCustomersMRR
Cancelled282,452
Card failed221,708

Tableau

IF { FIXED [customer_id] : MAX(IF [invoice_month] = { FIXED [customer_id] : MAX([invoice_month]) } THEN [status] END) } = "failed" THEN "Card failed"
ELSE "Cancelled"
END

SQL

WITH c AS (
  SELECT
    customer_id,
    MAX(invoice_month) AS last_month,
    arg_max(status, invoice_month) AS last_status,
    arg_max(amount, invoice_month) AS mrr
  FROM input
  GROUP BY customer_id
)
SELECT
  CASE
    WHEN last_status = 'failed' THEN 'Card failed'
    ELSE 'Cancelled'
    END AS reason,
  COUNT(*) AS customers,
  SUM(mrr) AS mrr_lost
FROM c
WHERE last_month < (
  SELECT MAX(invoice_month)
  FROM input
)
GROUP BY reason
ORDER BY customers DESC

Rows

ReasonCustomersMRR
Cancelled282,452
Card failed221,708

Common mistake

Counting failed invoices as churn

Most failed invoices are paid on the retry the next month. Count customers whose last invoice failed, not failed invoices.

Wrong
Point at a bar to read it.
82Churned

Tableau

COUNT(IF [status] = "failed" THEN [invoice_id] END)

SQL

SELECT COUNT(*) FILTER (WHERE status = 'failed') AS churned
FROM input
Right
Point at a bar to read it.
22Churned

Tableau

COUNTD(IF [status] = "failed" AND [invoice_month] = { FIXED [customer_id] : MAX([invoice_month]) } AND [invoice_month] < { FIXED : MAX([invoice_month]) } THEN [customer_id] END)

SQL

WITH c AS (
  SELECT
    customer_id,
    MAX(invoice_month) AS last_month,
    arg_max(status, invoice_month) AS last_status
  FROM input
  GROUP BY customer_id
)
SELECT COUNT(*) AS churned
FROM c
WHERE last_status = 'failed' AND last_month < (
  SELECT MAX(invoice_month)
  FROM input
)

Run it on your own Stripe export

Export invoices with the customer id, the invoice month, the amount and the status, and drop the CSV here. The three steps rerun in your browser; nothing is uploaded.

Drop a CSV anywhere on this page

Up to 10,000 rows. The sample, invoices.csv, shows the shape.

When another tool is the better choice

  • If this is you

    Questions from Stripe, HubSpot or product exports, answered on a MacBook

    xmetric

    Free, no install, the file stays on your laptop.

  • If this is you

    The whole team wants dashboards on the production database, refreshed and emailed

    Metabase

    Free if you self-host it; Metabase Cloud Starter is $100/mo monthly or $90/mo billed yearly ($1,080/year); first 5 users included; +$6 per user/month ($65 per user/year).

  • If this is you

    An analyst who wants Tableau's full desktop authoring on a Mac

    Tableau

    Desktop Free Edition is free for one person; sharing online needs Creator at $75 per user/month, billed annually.

  • If this is you

    Finance already works in Excel and Teams on Windows

    Power BI

    Desktop is free on Windows; sharing needs Pro at $14.00 user/month, paid yearly.

Questions

Can I run Power BI Desktop on a Mac?

Not natively. Microsoft lists: Windows only: Windows 10 or Windows Server 2016 or later, 64-bit; client Windows recommended. No macOS version is mentioned. The supported route from a Mac is a cloud Windows PC: Power BI Desktop is fully supported on Azure Virtual Desktop and Windows 365 (cloud Windows PCs); other virtual desktop environments such as Citrix VDI are not supported.

Does xmetric work in Safari and Arc on Apple Silicon?

Yes. It runs in any modern browser on macOS, with nothing to install.

Do I need Docker or a database to analyse a CSV?

Not with xmetric: open the CSV, Excel or Parquet file in the app and start dragging fields. For Metabase's free edition: You host it yourself (Java JAR or Docker); no Metabase-managed hosting on the free plan.

What is involuntary churn?

Customers you lose because a payment failed, not because they chose to leave. Card retries, expiry reminders and a dunning email sequence win many of them back, which is why it's worth counting separately.

Can xmetric connect to Postgres or BigQuery?

Not yet. Today it works with files: CSV, Excel, Parquet and Tableau workbooks. Live database connections are coming.

Sources