Concorbit HelpAll guides →

Overview

Profitability (Job Costs & Profits)

The JCP module answers the one question every services business eventually has to face: "are we actually making money on this customer, this contract, this engineer, this ticket?"

It pulls from the data you're already collecting (time entries, charges, invoices, products with cost prices, support contracts) and turns it into live revenue-vs-cost reporting. No snapshots, no end-of-month batch job: the numbers are calculated on the fly from the underlying records, so what you see is always current.

Who sees this

JCP is admin-only. The headline view is the Profitability tab on the Insights page (/insights), visible only to users with the jcp.view permission. From there, "Detailed dashboard →" opens the full 6-tab deep dive at /jcp. The settings page is at /settings/jcp and requires jcp.settings.

We gate it tightly because it surfaces sensitive margin data: cost prices, engineer hourly costs, customer profitability. These are numbers you typically don't want your sales rep or frontline engineer seeing.

The eight tabs

  • Analytics: the headline view. KPI scoreboard, 12-month revenue/cost trend, revenue by source breakdown, cost breakdown, customer concentration risk, margin distribution histogram, top 5 customers and engineers

  • Overview: quick KPI cards, 12-month trend, top/bottom 5 jobs by profit

  • Jobs (tickets): sortable ticket table with company, engineer, hours, revenue, cost, profit, and margin. Filter by company, paginated. (Named "Jobs (tickets)" to disambiguate from Field Jobs, because helpdesk tickets are internally called "jobs" in concorbit's service-work terminology.)

  • Field Jobs: same table shape, but rows come from the Jobs module's field-service records rather than tickets. Time entries logged via the mobile app or /jobs/{id} produce pending Charges automatically (one per billable time entry, rate × hours); the dashboard aggregates these just like tickets. See Jobs > Lifecycle for how the time-to-charge pipeline fires.

  • Engineers: per-tech utilisation bars with contracted hours context, revenue, cost, profit, margin

  • Customers: per-company profitability with contract-type badges and ticket counts

  • Contracts: per-contract profitability with hours-used bars (against included hours for block contracts), implied effective hourly rate, labour cost, revenue

  • P&L: cost-per-hour (from accounting data if connected, else salary estimate), monthly P&L table from connected accounting

  • Accrual schedule: recurring-service invoices spread across the months they cover. The view your accountant wants at year-end

Exports

The Export menu in the top-right offers:

  • Current table as CSV: Jobs / Engineers / Customers / Contracts as CSV with money formatted in pounds (Excel-friendly)

  • Accrual schedule: full HTML/PDF schedule of recurring revenue spread by month

  • Management report: composite monthly summary with KPIs, revenue/cost breakdowns, top customers, top engineers, customer concentration, margin distribution

All exports respect the active period filter at the top of the page, and all are scoped by the jcp.view permission.

Period selector

Date range selector at the top of every tab. Presets: this month (default), last month, this quarter, last quarter, this year, or a custom range via the date inputs.

Canvas and dashboard

JCP plugs into both the canvas workspace and your custom dashboard:

  • Canvas panels: drag a "Profitability summary", "Engineer utilisation", or "Revenue & cost trend" panel onto any canvas. The summary panel is context-aware: drop it on a customer canvas and it scopes to that customer.

  • Profitability workspace template: one-click canvas template that lays out the summary, trend, utilisation, and an open-tickets panel in a sensible 4-panel grid.

  • Dashboard widgets: add "Gross profit", "Profit margin", or "Team utilisation" KPI tiles to your dashboard from the widget picker.

All three surfaces are gated by the jcp.view permission. Users without it never see the panels or widgets in their pickers.

Backfilling historical data

If you've been running concorbit for a while before activating JCP, your older tickets won't have cost prices set on their charges, so margin reports for past months will look inflated. Run the backfill command once to fix this:

php artisan jcp:backfill-cost-prices

The command:

  • Walks every charge with no cost price and recomputes from the linked time entry × engineer's hourly cost

  • Is idempotent, safe to re-run

  • Supports --dry-run to preview the changes

  • Supports --tenant={uuid} to limit to one workspace

  • Logs progress and summary

You only need to run this once per workspace, after JCP is enabled and after you've configured engineer hourly costs in Settings → JCP.

Performance and freshness

The dashboard is calculated live from the underlying time entries and charges: no nightly batch job, no stale snapshots. Numbers update as soon as new time is logged (subject to a 5-minute cache for the headline KPIs to keep the page snappy). Settings changes (cost rate updates, per-user overrides) bust the cache immediately, so an admin tweaking rates sees the impact on next page load.

Coming next

  • Per-user cost management in canvas: edit engineer costs inline without leaving the canvas

  • Xero accounting sync: extends the existing QuickBooks accounting connection to Xero, pulling live month-by-month operational data including rent, utilities, salaries

How costs are calculated

  • Labour cost = every hour logged × the engineer's hourly cost (not just billable hours, since you paid them for non-billable time too)

  • Engineer hourly cost comes from: per-user override (set in Settings) → jcp.rates.engineer_hourly_cost_override tenant setting → claims.rates.engineer_hourly_cost tenant setting → £0 if nothing configured

  • Historical cost is frozen on each Charge row at the moment it's created. Changing the engineer's cost later does NOT rewrite old margins, so you're always looking at what the work actually cost when it happened

Settings reference

On the settings page (Settings → JCP):

  • JCP override: a labour cost specifically for JCP. Overrides the claims rate. Leave blank to share with claims.

  • Year start month: month 1 of your financial year. April in the UK is typical.

  • Revenue recognition: accrual (count revenue when earned) or cash (when paid). Accrual is standard.

  • Per-user cost overrides: inline-editable table with columns for hourly cost, burden multiplier (1x / 1.5x / 2x), and contracted weekly hours (for utilisation %)

  • Accounting integration: connect QuickBooks Online to pull your monthly P&L into the P&L tab. Xero support is planned.