What goes in a cash flow and runway dashboard?
A cash flow and runway dashboard combines bank or treasury balances with categorized cash movements and a clearly defined burn rate. It should show today's liquidity separately from forecast assumptions.
What does this dashboard look like?
Three sections move from today's liquidity to where the cash sits and how it moves, so a treasury or FP&A reader can check runway and this week's exceptions in one pass.

Which cards belong on this dashboard?
- Available cash by account and currency
- Base-currency cash balance
- Weekly inflows, outflows, and net cash flow
- Net burn and gross burn
- Cash runway in months
- 13-week cash movement and forecast
- Largest unexpected cash movements
- Restricted cash and transfers in flight
What data does this dashboard need?
- Daily account balance snapshots with native currency
- Posted bank or wallet transactions with consistent inflow/outflow signs
- Approved FX rates for the reporting date
- Budget or forecast cash movements for the forward-looking view
- Restricted-cash and minimum-balance classifications
How do you build it?
- Sync the source systems into a database and retain raw IDs, timestamps, status, and currency.
- Build reconciled models at the business grain this dashboard requires.
- Create one saved question per card and certify the shared models and definitions.
- Add dashboard filters for Legal entity, account, currency, cash category, date range.
- Show refresh time and the latest complete or reconciled period.
Example card SQL
WITH monthly_cash_flow AS (
SELECT
date_trunc('month', movement_date) AS month,
SUM(reporting_currency_amount) AS net_cash_flow
FROM modeled_cash_movements
WHERE is_posted = TRUE
GROUP BY 1
), burn AS (
SELECT AVG(-net_cash_flow) AS average_monthly_net_burn
FROM monthly_cash_flow
WHERE month >= date_trunc('month', CURRENT_DATE) - INTERVAL '3 months'
AND net_cash_flow < 0
)
SELECT
SUM(reporting_currency_balance) AS available_cash,
burn.average_monthly_net_burn,
SUM(reporting_currency_balance)
/ NULLIF(burn.average_monthly_net_burn, 0) AS runway_months
FROM latest_cash_balances
CROSS JOIN burn
WHERE is_restricted = FALSE
GROUP BY burn.average_monthly_net_burn;