Your business data at your fingertips

Why Stripe Sigma

Get insights from your Stripe data powered by SQL and AI

Sigma empowers businesses to easily explore and analyse their Stripe data for faster business insights within the Stripe Dashboard.

Make data-driven decisions

Gain insights, track trends, and analyse patterns in your data down to the transaction level. Use SQL or natural language prompts to get instant answers to your business questions.

Fully customisable reporting

Monitor your business by creating custom metrics and reports that fit your needs. Write SQL from scratch, start with a pre-built template, or modify existing reports with the help of our AI-powered assistant. Then, easily visualise your data by transforming reports into dynamic charts.

Get insights on your schedule

Stay informed with automated report delivery straight to your inbox. Schedule your reports to be sent on a daily, weekly, or monthly basis, so you can get the answers you need exactly when you need them.

Collaborate with ease

Move faster by saving frequently run queries for easy access. Share queries directly with your teammates in Sigma, or download them as CSV files for offline analysis.

Use cases

How teams use Stripe Sigma

From founders to finance teams, anyone can effortlessly pull insights from their Stripe data – SQL knowledge not required. Simply type in your question, and the AI-powered Sigma Assistant will transform it into a query and resulting report.

What percentage of disputes did we contest?

What was our charge volume in February?

Which customers have not paid their invoices?

Which charges reconcile with our latest bank payout?

How much does cash flow change from month to month?

What is our company's daily balance?

How many active customers do we have?

Why do customers dispute payments?

What are our most popular subscription plans?

How many payments are made with each payment card brand?

How much revenue comes from different customer channels?

Business teams use Stripe Sigma to run their company more efficiently

Finance teams use Stripe Sigma to close the books faster.

Data teams use Stripe Sigma to analyse everything from ARPU to churn.

Product management uses Stripe Sigma to find new business opportunities.

Business Operations

What percentage of disputes did we contest?

--This template returns an itemized list of disputed charges for the past 30 days, --along with information such as whether evidence has been submitted and the status of the dispute -- Note: if you have currencies that do not have cents (e.g. JPY), you should not divide by 100.0 select charges.id as charge_id, date_format(disputes.created, '%Y-%m-%d') as dispute_date, date_format(charges.created, '%Y-%m-%d') as charge_date, charges.card_brand, disputes.reason, disputes.status, disputes.amount / 100.00 as dispute_amount, disputes.currency, disputes.evidence_details_has_evidence as evidence_saved, case when disputes.evidence_details_submission_count = 0 then false else true end as evidence_submitted from disputes join charges on charges.id = disputes.charge_id where date(charges.created) >= date_add('day', -30, current_date) order by 2 desc
~

Business Operations

What was our charge volume in February?

-- This template returns a monthly summary of your activities, including all payments in the UTC time zone -- Note: this query may need to be modified to handle additional payout/transfer types if you are using Connect -- monthly_balance_transactions is a temporary table that aggregates and pivots different -- balance_transaction types on a monthly basis for each currency -- Note: only months with at least 1 balance transaction will be returned with monthly_balance_transactions as ( select date_trunc('month', case when type = 'payout' then available_on else created end) as month, -- payouts are considered when they are posted (available_on) currency, sum(case when type in ('charge', 'payment') then amount else 0 end) as sales, sum(case when type in ('payment_refund', 'refund') then amount else 0 end) as refunds, sum(case when type = 'adjustment' then amount else 0 end) as adjustments, sum(case when type not in ('charge', 'payment', 'payment_refund', 'refund', 'adjustment', 'payout') and type not like '%transfer%' then amount else 0 end) as other, sum(case when type <> 'payout' and type not like '%transfer%' then amount else 0 end) as gross_transactions, sum(case when type <> 'payout' and type not like '%transfer%' then net else 0 end) as net_transactions, sum(case when type = 'payout' or type like '%transfer%' then fee * -1.0 else 0 end) as payout_fees, sum(case when type = 'payout' or type like '%transfer%' then amount else 0 end) as gross_payouts, sum(case when type = 'payout' or type like '%transfer%' then fee * -1.0 else net end) as monthly_net_activity, count_if(type in ('payment', 'charge')) as sales_count, count_if(type = 'payout') as payouts_count, count(distinct case when type = 'adjustment' then source_id end) as adjustments_count from balance_transactions group by 1, 2 ) -- Compute the month_end_balance for each month and format output -- Note: if you have currencies that do not have cents (e.g. JPY), you should not divide by 100.0 select date_format(month, '%Y-%m') as month, currency, sales / 100.0 as sales, refunds / 100.0 as refunds, adjustments/100.0 as adjustments, other / 100.0 as other, gross_transactions / 100.0 as gross_transactions, net_transactions / 100.0 as net_transactions, payout_fees / 100.0 as payout_fees, gross_payouts / 100.0 as gross_payouts, monthly_net_activity/100.0 as monthly_net_activity, sum(monthly_net_activity + gross_payouts) over(partition by currency order by month)/100.0 as month_end_balance, -- use SUM Window Function sales_count, payouts_count, adjustments_count from monthly_balance_transactions where month < date_trunc('month', current_date) -- exclude current, partial month order by 1 desc, 2
~

Business Operations

Which customers have not paid their invoices?

-- This template returns all unpaid invoices and relevant customer and plan information -- Note: if you have currencies that do not have cents (e.g. JPY), you should not divide by 100.0 select date(invoices.date) as invoice_date, invoices.amount_due / 100.0 as amount_due, invoices.attempt_count, invoices.customer_id, customers.email, plans.name as plan_name from invoices join subscriptions on invoices.subscription_id = subscriptions.id join plans -- join subscriptions on plans to get plan name on subscriptions.plan_id = plans.id join customers -- join on customers to get customer email on invoices.customer_id = customers.id where not invoices.paid -- filter out paid and forgiven invoices and invoices.status != 'uncollectible' order by 2 desc, 1
~

Finance

Which charges reconcile with our latest bank payout?

-- This template returns itemized information for transfers/payouts linked to -- automatic transfers within the past 30 days select date(transfers.date) as transfer_date, transfers.id as transfers_id, transfers.amount/100.0 as transfer_amount, transfers.status as transfers_status, balance_transactions.id as balance_transaction_id, balance_transactions.source_id as balance_transaction_source_id, balance_transactions.type as balance_transaction_type, balance_transactions.currency, balance_transactions.amount/100.0 as balance_transaction_amount, balance_transactions.net/100.0 as balance_transaction_net, charges.statement_descriptor as statement_descriptor, disputes.reason as disputes_reason, refunds.reason as refund_reason from transfers join balance_transactions on balance_transactions.automatic_transfer_id = transfers.id left join charges on charges.id = balance_transactions.source_id -- balance_transactions.source_id can be used to join on charges, disputes, and refunds table. left join disputes on disputes.id = balance_transactions.source_id left join refunds on refunds.id = balance_transactions.source_id where transfers.type = 'bank_account' and transfers.date >= date_add('day', -30, current_date) order by transfers.date desc, transfers.id, balance_transactions.created desc
~

Finance

How much does cash flow change from month to month?

-- This template returns gross processing volume for each currency per month, assuming a local timezone of PT -- Note: charges can change over time, for example if a charge gets refunded. -- Always use the balance transactions table if you need to create reports for accounting purposes -- charges_timezone_conversion is a temporary table that converts timestamp with UTC timezone to 'America/Los_Angeles' timezone with charges_timezone_conversion as ( select date_trunc('month', created at time zone 'America/Los_Angeles') as month, currency, amount from charges where captured -- filter out uncaptured charges ) -- Compute the monthly gross charges for each month and currency select date_format(month, '%Y-%m') as month, currency, sum(amount)/100.0 as gross_charges from charges_timezone_conversion where month >= date_add('month', -24, date_trunc('month', current_timestamp at time zone 'America/Los_Angeles')) group by 1, 2 order by 1 desc, 2
~

Finance

What is our company's daily balance?

-- This template returns the balance at the end of every day in the UTC time zone -- daily_balance_transactions is a temporary table that aggregates and pivots different -- balance_transaction types on a daily basis for each currency with daily_balance_transactions as ( select -- payouts are considered when they are posted (available_on) date(case when type = 'payout' then available_on else created end) as day, currency, sum(net) as daily_balance, sum(case when type = 'payout' then net else 0 end) as payouts, sum(case when type <> 'payout' then net else 0 end) as net_transactions, sum(case when type in ('charge', 'payment') then net else 0 end) as payments, -- net = amount - fee sum(case when type in ('payment_refund', 'refund', 'payment_failure_refund') then net else 0 end) as refunds, sum(case when type = 'transfer' then net else 0 end) as transfers, sum(case when type = 'adjustment' and lower(description) like 'chargeback withdrawal%' then net else 0 end) as chargeback_withdrawals, sum(case when type = 'adjustment' and lower(description) like 'chargeback reversal%' then net else 0 end) as chargeback_reversals, sum(case when type = 'adjustment' and lower(description) not like 'chargeback withdrawal%' and lower(description) not like 'chargeback reversal%' then net else 0 end) as other_adjustments, sum(case when type not in ('payout', 'transfer', 'charge', 'payment', 'refund', 'payment_refund', 'adjustment') then net else 0 end) as other_transactions from balance_transactions group by 1, 2 ) -- Compute the current_balance for each day and format output select day, currency, -- use SUM Window Function to calc. running total sum(daily_balance) over(partition by currency order by day)/100.0 as current_balance, payouts/100.0 as payouts, net_transactions/100.0 as net_transactions, payments/100.0 as payments, refunds/100.0 as refunds, transfers/100.0 as transfers, chargeback_withdrawals/100.0 as chargeback_withdrawals, chargeback_reversals/100.0 as chargeback_reversals, other_adjustments/100.0 as other_adjustments, other_transactions/100.0 as other_transactions from daily_balance_transactions order by 1 desc, 2
~

Data Analysis

How many active customers do we have?

-- This template returns itemized subscription information for each customer and plan select subscriptions.customer_id as customer_id, customers.email as customers_email, subscriptions.plan_id as plan_id, plans.nickname as plan_name, subscriptions.quantity as quantity, case when subscriptions.canceled_at is null and subscriptions.ended_at is null then 'active' else 'inactive' end as state, date_format(subscriptions.created, '%Y-%m-%d') as created_date, date_format(subscriptions.start, '%Y-%m-%d') as start_date, date_format(least(subscriptions.canceled_at, subscriptions.ended_at), '%Y-%m-%d') as end_date from subscriptions join plans -- join subscriptions on plans to get plan name on subscriptions.plan_id = plans.id left join customers on subscriptions.customer_id = customers.id order by 2
~

Data Analysis

Why do customers dispute payments?

-- This template returns the number of disputes grouped by reason and dispute status select reason, -- reason given by cardholder for dispute status, -- current status of dispute count(id) as disputes, count_if(evidence_details_submission_count > 0) as disputes_with_evidence_submitted from disputes group by 1, 2 order by 3 desc
~

Product Management

What are our most popular subscription plans?

-- This template returns itemized subscription information for each customer and plan select subscriptions.customer_id as customer_id, customers.email as customers_email, subscriptions.plan_id as plan_id, plans.nickname as plan_name, subscriptions.quantity as quantity, case when subscriptions.canceled_at is null and subscriptions.ended_at is null then 'active' else 'inactive' end as state, date_format(subscriptions.created, '%Y-%m-%d') as created_date, date_format(subscriptions.start, '%Y-%m-%d') as start_date, date_format(least(subscriptions.canceled_at, subscriptions.ended_at), '%Y-%m-%d') as end_date from subscriptions join plans -- join subscriptions on plans to get plan name on subscriptions.plan_id = plans.id left join customers on subscriptions.customer_id = customers.id order by 2
~

Product Management

How many payments are made with each payment card brand?

-- This template returns the number of charges and amounts for each card type, by currency select coalesce(card_brand, 'Non-card or Other') as card_brand, currency, count(id) as charge_count, sum(amount)/100.0 as total_amount from charges where captured group by 1, 2 order by 4 desc
~

Product Management

How much revenue comes from different customer channels?

-- This template returns itemized information for charges and associated customer metadata (from charges_metadata) -- charges_metadata_dictionary is a temporary table that creates a row for every charge_id with a dictionary of associated metadata with charges_metadata_dictionary as ( select charge_id, map_agg(key, value) metadata_dictionary -- MAP_AGG creates a key:value dictionary from charges_metadata group by 1) select charges.created, charges.id, charges.customer_id, charges.amount/100.0 as amount, metadata_dictionary['customer_source'] as customer_source -- 'customer_source' is the key we are accessing and returning the associated value (provided via metadata) from charges left join charges_metadata_dictionary on charges.id = charges_metadata_dictionary.charge_id where date_trunc('year', charges.created) = date_trunc('year', current_date) and charges.captured order by charges.created desc limit 1000
~

Turn your data into actionable business insights

Learn how to use Stripe’s data tools to surface revenue opportunities and optimise your operations. This guide covers the key metrics that you can track to drive better business decisions.

Prebuilt templates

Optimised for fast answers

We’ve already written the queries for the most useful reports for different types of businesses. From computing ARPU to analysing the payment methods your customers prefer, you can jump in quickly by editing one of our pre-built templates or start from scratch to fully customise your report. Our built-in AI-powered assistant is also ready to help you build custom SQL queries.

~
NORMAL
100%
0/1
ln
:
1

Easy-to-use schema

Stripe data, at the ready

Quick sidebar access to a full map of the structure of your data stored in Stripe (including any additional metadata you send us) makes it easy to combine all the relevant data needed from across Stripe’s products – payments, payouts, customers, subscriptions, refunds, and more.

Payment Tables
balance_transactions_fee_details
balance_transactions
id Varchar
amount Bigint
available_on Timestamp
created Timestamp
currency Varchar
description Varchar
fee Bigint
net Bigint
status Varchar
type Varchar
source_id Varchar
automatic_transfer_id Varchar

Preview the full schema

Designed for collaboration

Save and share queries with your team

Save frequently-used queries to run them again at any time or share a link to a useful query so that any of your team-mates can use it too.

How many customers do we have in France?

select id, email, shipping_address_country from customers where shipping_address_country = 'FR'
~

What was our charge volume last month?

with monthly_balance_transactions as ( select date_trunc('month', case when type = 'pa' from monthly_balance_transactions where month = date_trunc('month', date '2017') order by 1 desc, 2
~

Can you remind me how we calculate monthly recurring revenue?

with calendar_days as ( select day cast(captured_amount/customer_count as dec from monthly_summary order by 1 desc, 2
~

Pricing

Estimate your cost

Get started with a 30-day free trial and access all your Stripe data to create custom reports using SQL or natural language prompts. After the trial, your monthly fee will be based on the total number of charges and authorisation requests that your business processes.

0

Charges per month

0

Estimated monthly cost

Contact Sales 
  • 0-500

    0.135zł/charge

  • 501-1,000

    0.12zł/charge

  • 1,001-5,000

    0.11zł/charge

  • 5,001-50,000

    0.10zł/charge

  • 50,001+

infrastructure fee

Custom pricing is available for companies with large payments volume, high value transactions, or unique business models. Contact our sales team to learn more.

Streamlined account management and faster data analysis for your enterprise

With Stripe Organisations, centrally manage all lines of business or subsidiaries across multiple Stripe accounts in the Dashboard, and access new business insights by using Sigma to analyse data across all your accounts.

sigma.latin-gb

Ready to get started?

Analyse and create custom reports using your Stripe data.

Learn how it works

Details on how to build custom Stripe reports.

Connect Stripe to your data warehouse

Streamline your analytics and access additional insights by centralising your Stripe data in your data storage destination.

Morty Proxy This is a proxified and sanitized view of the page, visit original site.