Billing & Accounting Export
This page covers what CMDash records about money — subscriptions, enterprise invoices, and MSP/vCISO managed-workspace statements — where to find each record in the product, and how to get that data into a small-business accounting system. For the mechanics of upgrading, downgrading, or cancelling a plan, see Admin: Billing & Subscription; this page does not repeat that.
1. What CMDash Tracks
| Record | What it is | Who has it |
|---|---|---|
| Subscription & Stripe invoices | Your recurring card subscription and its payment history | Any tenant on a paid Stripe plan |
| Enterprise contract invoices | Draft/sent/paid invoices from the annual prepay-by-invoice or purchase-order path | Orgs using enterprise contracts |
| Partner statement | Monthly usage and the managed-workspace overage charge for a vCISO/MSP partner | Partners with client (managed) workspaces |
CMDash tracks what you owe CMDash for your own plan and for managed workspaces. It does not track — and cannot compute — what a partner charges their own end clients; see §5, Limits.
2. Customer Billing (Settings → Billing)
Navigate to Settings → Billing in the tenant app (/settings/billing).
This page shows your current plan, seat/integration usage, and — if you have
an active paid subscription — a Manage Subscription button.
Clicking Manage Subscription opens a Stripe-hosted Billing Portal session
(POST /billing/portal). Stripe's own portal is where your payment method,
plan changes, and downloadable PDF invoice history live — CMDash does not
render its own invoice list or PDFs for card subscriptions; it hands you off
to Stripe's. This is the "Invoices" surface referenced in
Admin: Billing & Subscription.
The customer portal's own Billing page (www.cmdash.com/portal/billing) is a
lighter, read-only view of the same subscription and the published tier
table. Its "Manage in Stripe" button is currently disabled in this
environment (it requires a live Stripe customer and a configured Stripe
portal) — use Settings → Billing in the tenant app instead.
Current tier pricing is not repeated here because it is a placeholder in this environment; see the published pricing page or the plan table on Settings → Billing for current figures.
3. Enterprise Contract Invoices
Orgs on the annual prepay-by-invoice or purchase-order path (self-serve
checkout on Settings → Billing, or a contract created by sales) have
invoice records at Enterprise Billing (/enterprise-billing in the
tenant app). Selecting a contract lists its invoices — invoice number,
status (DRAFT/SENT/PAID/OVERDUE/VOID), and amount.
An invoice shows PAID only once CMDash has recorded the payment: send your
remittance advice to billing@cmdash.com, and staff mark the invoice paid when
the funds arrive. It cannot be marked paid from the app (the request is
refused with PAYMENT_RECORDED_BY_CMDASH), so a PAID invoice always means
money CMDash has seen.
There is no PDF or CSV export for these invoices today. The screen
displays the record; there is no download button and no API export route for
it. If you need a document to attach to your books, request one from your
Customer Success Manager or billing@cmdash.com — the numbers on screen are
the numbers to key in.
4. Partner / MSP Statement (vCISO Console)
A partner running client workspaces sees a live summary at the vCISO
console → Billing tab (/vciso, click Billing). It shows:
- Managed-workspace counts (active, included in your tier, over the allotment) for the current period
- The managed-workspace cost — what you owe CMDash for workspaces over your tier's allotment. This is clearly labeled as a cost, not your margin: CMDash has no visibility into what you charge your own clients, so it cannot and does not compute a margin figure (see §5)
- Whether that cost is a recorded charge or a live estimate — an
estimate means the daily usage-billing job hasn't snapshotted the period
yet, which is the default state unless your environment has
USAGE_BILLING_ENABLED=trueorUSAGE_BILLING_SHADOW=trueset (both defaultfalse) - Enterprise invoices for your own org, if you have an enterprise contract
- Your client workspaces and whether each is linked to a control-plane billing account
Exporting the statement as CSV
The same statement is available as an importable CSV file: GET /partner-statement/export?periodKey=YYYY-MM (omit periodKey for the
current period). It requires the same sign-in as the Billing tab (Owner/Admin
— the settings permission) and returns
Content-Disposition: attachment; filename="partner-statement-<period>.csv".
There is no download button for this in the web app yet — the Billing tab renders the JSON version of the same data but does not link to the CSV route. Until that button ships, a bookkeeper who needs the file can fetch it directly with your session's bearer token, e.g.:
curl -H "Authorization: Bearer <token>" \
"https://app.cmdash.net/api/partner-statement/export?periodKey=2026-09" \
-o partner-statement-2026-09.csv
The file has two sections, separated by a blank line:
Section 1 — the charge line (one row):
date,description,period,quantity,unit,amount,currency,reference,basis
dateis the period's last calendar day, not the run date, so re-exporting the same period always produces the same date.basisis eitherrecorded(an actual charge the usage-billing cron wrote and, once processed, reports to Stripe) orestimate(computed live with the same pricing function the cron uses, not yet a real charge). Treatestimaterows as provisional.
Section 2 — one row per client workspace (no dollar amount — see §5):
client_workspace_id,client_name,industry,posture_score,open_risks,integrations,period
Import Section 1 as a single journal/bill line into your accounting system (QuickBooks Online, Xero, or any tool that accepts a CSV/journal-entry import), and use Section 2 to allocate that cost across your own clients however you bill them.
5. What This Cannot Do Yet
Be direct with anyone expecting more than the above — none of the following exists in CMDash today:
- No QuickBooks Online, Xero, or any other accounting-software connector. There is no accounting-sync integration anywhere in the codebase. An owner decision recorded directly in the partner-statement code says why: a rate model and accounting connectors for partner billing were closed unbuilt — CMDash exports the CSV above instead, because statements (a charge plus a cost allocation, not a line-item sale) are something most accounting-system APIs cannot ingest as a native object anyway; a file is the complete answer, not a stopgap for a future connector.
- No margin or markup figure. CMDash reports what a partner owes CMDash for managed-workspace overage. It has no visibility into what a partner bills their own clients, so it cannot report profit, margin, or a per-client price.
- No UI button for the partner-statement CSV export. The API route exists and works; the Billing tab does not yet link to it (see §4).
- No PDF or CSV export for enterprise contract invoices. Only the on-screen record exists (§3).
- Purchase-order and partner-Stripe-Connect payments are not in use. A purchase-order provider and partner-Stripe-Connect scaffolding exist in the codebase, but none of it runs in production and none of it is reachable by a real customer or partner. Everything usable is described above.
- Stripe subscription invoice data is Stripe's, not CMDash's own. The PDF invoices reached via Manage Subscription (§2) come from Stripe's hosted portal; CMDash does not store or re-render them, and its own CSV export (§4) does not include Stripe subscription line items.
6. Related Documentation
- Admin: Billing & Subscription — upgrading, downgrading, payment methods, cancellation
- FAQ — common billing questions