Navigation

14.24. Profitability Reporting: Measure Gross Margin per Client, Agreement, and Ticket

Use the AlgaPSA Profitability report to measure actual gross margin per client, agreement, and ticket against configurable labor cost rates.

14.24. Profitability Reporting: Measure Gross Margin per Client, Agreement, and Ticket
Use the AlgaPSA Profitability report to measure actual gross margin per client, agreement, and ticket against configurable labor cost rates.
14. Billing and ContractsUpdated: 7/10/2026

The Profitability report lets MSP operators measure actual gross margin at four levels: the tenant summary, per client, per agreement, and per ticket. It replaces a legacy placeholder that used a hardcoded $50/hr labor cost and a broken invoice–time-entry join.

Open the report at Billing > Reports > Profitability.

Step 1 — Configure cost rates

Before the report shows meaningful data, set your internal labor costs in Settings > Billing > Cost Rates.

  • Add a rate per user (and optionally a tenant-wide default for unconfigured users).
  • Each rate has an effective date range so historical analysis stays accurate when rates change.

See 14.2. Tenant Billing Settings — Cost Rates Sub-Tab for the full configuration workflow.

Running the report

  1. Navigate to Billing > Reports > Profitability.
  2. Select a date range using the filter bar (defaults to the current month).
  3. The summary cards load automatically.

Summary cards

The top of the report shows tenant-wide totals for the selected period:

CardWhat it shows
RevenueTotal invoiced amount (all currencies converted to tenant default).
CostLabor cost calculated from cost rates × hours worked.
Gross MarginRevenue − Cost, as an amount and a percentage.
Uncosted hoursHours with no matching cost rate — excluded from the margin calculation. A non-zero value means margin figures are understated.

Additional data-quality warnings appear as banners when present: unapproved hours, unconverted revenue (non-default currencies with no exchange rate), uncosted materials, and currency mismatches.

Per-client drill-down

The client table beneath the summary cards lists every client with invoiced time in the period. Click a client row to expand it to the agreement level, then click an agreement to expand to the ticket level.

LevelWhat you see
ClientRevenue, cost, margin, and uncosted-hour count for all agreements under that client.
AgreementSame columns scoped to one agreement.
TicketPer-ticket revenue, cost, margin, and attribution quality.

Attribution quality

Each time entry is attributed to an invoice charge in one of two ways:

QualityMeaning
ExactThe time entry is linked to a specific invoice line item (applies to invoices generated after the July 2026 migration).
AllocatedRevenue is distributed proportionally by hours across entries in the same billing period (fixed-fee, bucket, or pre-migration invoices).

Exact attribution gives precise per-ticket margin. Allocated attribution is an approximation — ticket-level figures should be treated as estimates.

Data-quality warnings

WarningWhat it meansHow to fix
Uncosted hoursHours where no cost rate exists for the user + work date.Add a cost rate in Settings > Billing > Cost Rates.
Unapproved hoursTime entries that have not been approved; excluded from billing and cost.Review and approve time entries.
Unconverted revenueInvoice amounts in non-default currencies with no exchange rate on file.Add exchange rates in Settings > Accounting.
Uncosted materialsProduct/material line items with no cost price set.Add cost prices to the product catalog.
Currency mismatchesAgreements billed in a currency different from the tenant default, affecting consolidated totals.Informational only; drill to individual agreements for accurate per-currency figures.

Permissions

ActionRequired permission
View profitability reportbilling.read
View cost ratesbilling.read
Create / edit / delete cost ratesbilling.update

Related