Skip to main content
CMDashCybersecurity Maturity Dashboard
DocsBilling & Accounting Export

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

RecordWhat it isWho has it
Subscription & Stripe invoicesYour recurring card subscription and its payment historyAny tenant on a paid Stripe plan
Enterprise contract invoicesDraft/sent/paid invoices from the annual prepay-by-invoice or purchase-order pathOrgs using enterprise contracts
Partner statementMonthly usage and the managed-workspace overage charge for a vCISO/MSP partnerPartners 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=true or USAGE_BILLING_SHADOW=true set (both default false)
  • 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.:

code
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):

code
date,description,period,quantity,unit,amount,currency,reference,basis
  • date is the period's last calendar day, not the run date, so re-exporting the same period always produces the same date.
  • basis is either recorded (an actual charge the usage-billing cron wrote and, once processed, reports to Stripe) or estimate (computed live with the same pricing function the cron uses, not yet a real charge). Treat estimate rows as provisional.

Section 2 — one row per client workspace (no dollar amount — see §5):

code
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.

This page is the product manual, published from the repository at docs/user/billing-and-accounting.md. Customers read the same text inside CMDash under Help. Last updated October 7, 2026.

Billing & Accounting Export — CMDash Docs