End-of-month billing at most MSPs looks like this: somebody pulls a device count from NinjaOne, a license count from Huntress, an order count from Pax8, opens a spreadsheet, copies them into the right rows for each customer, then re-types every line into QuickBooks. A half-day of careful copy-paste, every month. One typo on the device count and you under-bill a client for six months before anybody notices.
Morton Command Center collapses that into one click. Plans, services, devices, and licenses are configured per client and synced live before each invoice batch. Dry-run preview shows you every line before anything posts. One click and 80 invoices land in QuickBooks Desktop ready to send.
Every contract shape, configurable per client
- Managed plans with per-device rates (workstations, servers, mailboxes, network devices, MDM devices). Bronze / Silver / Gold / Platinum / custom — tenants build their own catalog rather than inheriting an ITPS-flavored default.
- A la carte services with volume tiers, customer-facing labels separate from internal names, and optional vendor sync per line.
- Block hours — both monthly installment plans (counted in MRR) and lump-sum prepayments. Drawdown tracking against actual labor.
- Time & Materials — billable labor sourced from timecards with per-tenant labor-type classification (onsite, remote, onsite_project, remote_project).
- Custom contracts — anything that doesn't fit the above. Per-company laborDefault setting decides included vs billable.
- Setup fees, recurring software resale, hosted services — each item type classified separately so MRR + billable + parts revenue stay distinguishable.
Live vendor sync, per line
Each billable line opts into vendor sync independently. You don't sync the whole invoice — you sync the lines where automation pays off:
- NinjaOne device counts — workstations, servers, network devices pulled from the customer's NinjaOne org right before billing. Adds and removals reflected immediately.
- Huntress license counts — agents_count, billable_identity_count, logs_sources_count, sat_learner_count fetched per company. Your EDR + ITDR + SIEM + SAT licenses bill at the actual deployed count, not last quarter's spreadsheet.
- Pax8 quantities + prices — subscription quantity and supplier price pull live. Microsoft seat-add-and-remove churn doesn't require any manual reconciliation.
Sync NinjaOne devices on a cyber line, sync Pax8 quantities on the M365 line, leave T&M and block hours manual. Mix and match per client without rebuilding the whole invoice.
Dry-run preview before anything posts
Open any company's billing page. Hit Preview. See every line item, every quantity, every rate, the subtotal, the discount, the total. See what changed since last month (device counts went up, a license got removed, a custom item was added). Catch mistakes once a month, not once a quarter when a client emails you.
Dry-run is a real engine pass — same code that generates the actual invoice. No "looks right but the real one drops a line" risk.
One-click batch into QuickBooks Desktop
Pick a month, pick clients (or "everyone marked included in batch"), click Run. The engine respects each client's billing frequency (monthly every month, quarterly in Q-start months, annual in January) and batches creation in 15-company chunks to stay under Cloudflare Worker timeouts. Idempotency keys prevent duplicates on retry. Every invoice posts straight to QuickBooks Desktop via the Conductor agent, ready to send.
Per-company success and failure reporting tells you exactly what landed and what didn't — without you having to scroll through QB to verify.
Item taxonomy + recurring-item index
Every QuickBooks item is classified per tenant: LABOR / RECURRING / PRODUCT / SETUP_FEE / CREDIT / OTHER. This drives the revenue dashboard's breakdown (MRR vs billable labor vs parts revenue vs setup fees) and prevents double-counting — recurring lines that are already in a customer's monthly plan don't get re-counted as billable labor when they show up on invoices.
An item-history backfill scanned 12 months of QB invoice history and inferred which items were recurring for which customer, even when the operator never explicitly mapped them. Items that USED to be in a plan and got swapped (Essentials → Silver migration) are recognized correctly on past invoices.
Audit trail + concurrency control
Plan changes, item-mapping changes, and rate changes are timestamped with who made the change. Optimistic concurrency tokens prevent two operators from silently overwriting each other when editing the same client's billing config simultaneously — the second save gets a 409 conflict with a clear "your colleague changed this; refresh and try again" message.
Per-line vendor failure tolerance
If NinjaOne is down at billing time, the device-synced lines hold their previous values rather than zeroing out. If Pax8 returns a partial response, the lines that DID sync update; the ones that didn't keep what was there. Vendor sync errors don't cascade into an empty invoice.
Honest limits
- QuickBooks Desktop only via the Conductor agent. QuickBooks Online and Xero adapters aren't shipped (the invoice-vendor abstraction is in place; the adapters aren't built).
- USD only. No multi-currency, no multi-entity consolidation, no inter-company billing.
- Vendor sync is cached, not real-time. Device index has a 24-hour TTL; Huntress is 12 hours. A device added an hour before billing won't show up unless you trigger a refresh.
- Credit memos are read, not written. Refunds and credits authored in QB show up correctly in the revenue analytics but Command Center doesn't author them.
- No client-facing self-service invoice portal yet. Clients view invoices through your QB delivery or the optional Customer Portal feature.
Pricing
Flat monthly pricing — no per-seat fees, no per-vendor surcharge. See current pricing on the homepage →
Ready to talk?
The first call is a 30-minute discovery — we map your current contract types and billing workflow and figure out where the catalog needs to land on day one. No commitment, no sales pressure.
Questions first? Email [email protected] or read the FAQ.