Job Costing and Project Profitability on Dynamics 365 Finance & Operations
D365 F&O's Project management and accounting module knows what's been posted to a project. It doesn't know what a piece of plant cost today, what a subcontractor is about to invoice, or whether a change order was ever priced. Here's where native project accounting stops being enough, and the architecture that closes the gap, from a production build.

Key Takeaway
D365 F&O's Project management and accounting module knows what's been posted to a project. It doesn't know what a piece of plant cost today, what a subcontractor is about to invoice, or whether a change order was ever priced. Here's where native project accounting stops being enough, and the architecture that closes the gap, from a production build.
Where D365 F&O's Native Project Accounting Hits a Wall
Job costing on Dynamics 365 Finance & Operations means attributing every cost -- labour, materials, subcontractors, plant, overhead -- to the specific project or work-breakdown element that incurred it, automatically and at the moment the cost is known, so a project's margin is a live number instead of a month-end reconstruction. D365 F&O ships a genuinely capable Project management and accounting module to do exactly this: cost categories, cost groups, WBS-style project structures, hour and expense journals, revenue recognition methods. For a services business whose costs are mostly timesheet hours and a handful of expense lines, it's often enough on its own.
Construction and other project-heavy businesses hit a different wall. A contractor running D365 for construction work described it plainly in a Reddit thread on r/Dynamics365: the platform handled general ledger and procurement fine, but "construction-specific bits like AIA billing, job costing, change orders -- those needed some serious custom tweaks and add-ons. Power Platform helped a lot to fill gaps." That's a real practitioner describing a real limitation, not a Fintask client -- we're citing it because it names the exact shape of the problem: D365 F&O's project accounting was built around a services-and-manufacturing cost model, and construction-style job costing needs subcontractor invoice matching, plant and equipment costing, change-order tracking, and retention -- none of which the base module was designed to carry.
Ramp, the spend-management vendor, has published a "what is construction job costing software" explainer aimed at this exact search intent -- worth knowing as a competitor already working the term, though its content is generic rather than ERP-specific. The rest of this guide is the ERP-specific version: what D365 F&O gives you natively, where it stops, and the architecture that closes the gap without abandoning the ERP.
The Reframe: Source Data First, Documents and Journals Second
The instinct inside D365 F&O is to key everything as a journal: an hour journal for labour, an expense journal for materials, a project invoice for subcontractor costs once it arrives. That's fine for the labour side, where timesheets already flow into the module cleanly. It breaks down for everything that originates outside D365 F&O -- plant and equipment usage, fuel, subcontractor progress claims, telematics, supplier feeds that have nothing to do with a purchase order.
The fix is the same reframe that applies to job costing on any ERP: build from the source data, and treat the ERP's project journals as the destination, not the workspace. That means:
- Costs are known when the transaction happens, not when someone gets around to keying a journal entry against a WBS element.
- Line-item precision the summary document can't give you -- a subcontractor's monthly progress claim says "civils: €62,000"; the underlying schedule of works says which activity, which retention percentage, which change order it relates to.
- The invoice or claim becomes a reconciliation check, not a data-entry task -- it's compared against costs the allocation engine has already computed from source feeds, and discrepancies become findings.
D365 F&O's Data Management Framework and OData endpoints make the destination side straightforward -- posting an hour journal, an expense journal, or a project-level invoice line is a well-documented API call. The gap is entirely upstream of that: nothing native assembles multi-source cost data into WBS-ready form before it's posted.
The Four Places Native D365 F&O Project Accounting Runs Out of Road
Each of these is a genuine, specific limitation -- not a case against the module, which does plenty else well:
- Subcontractor invoices against a schedule of works. D365 F&O can match a purchase order to an invoice, but a subcontractor's progress claim against a schedule of works with retention held back line by line is a different shape of matching entirely -- there's no native concept of "claimed to date," "certified to date" and "retention held" per activity.
- Equipment and plant costs. Owned-plant depreciation, hire costs, fuel and maintenance need to land on the job that used the machine, not a generic overhead pool. Getting that requires either continuous telematics/usage feeds or manual timesheet-style plant logs -- neither is native to the module.
- Change orders. A change order needs its own approval trail, its own cost-to-date, and a clear link back to the original budget line it varies. D365 F&O's project budgeting can hold a revised budget, but tracking the change-order lifecycle -- proposed, priced, approved, invoiced -- is exactly the "serious custom tweaks" the Reddit thread describes.
- Retention. Retention held on both sides -- what you hold back from subcontractors, what your customer holds back from you -- needs its own ageing and release logic tied to practical completion and defects-liability dates. Nothing in the base module tracks retention as a first-class object.
Individually, each of these is solvable with configuration or a workaround. Together, on a contractor running dozens of live jobs with multiple subcontractors and live change orders on each, they're what pushes teams back into spreadsheets -- the exact failure mode job costing automation exists to fix.
Three Ways to Close the Gap on D365 F&O
Same decision shape as AP and AR on this pillar: buy a construction-specific add-on, extend with generic tooling, or build a dedicated layer on your own Azure tenant.
| Native D365 F&O project accounting alone | Construction ISV add-ons (COINS, Viewpoint-style, Power Platform extensions) | Custom platform on your Azure tenant | |
|---|---|---|---|
| Handles subcontractor claims + retention | No -- manual journals | Often yes, for the vendor's specific construction model | By design -- built around your actual schedule of works |
| Handles plant/equipment cost allocation | No, without custom fields | Sometimes, depends on the add-on | Yes -- built from telematics/usage feeds directly |
| Change-order lifecycle tracking | No native object | Usually yes | Yes, modelled on your approval workflow |
| Fit with non-ERP data (fuel cards, telematics, supplier feeds) | None | Limited, vendor-specific connectors | By design -- the whole point of the architecture |
| Data leaves your tenant | No | Often yes, depending on hosting | No |
| Cost shape | Included in D365 licence, but manual effort scales with job count | Per-user/module licence on top of D365, ongoing | One-time build + Azure running costs |
| Time to live | Immediate, but effort-heavy | Weeks-months (implementation-heavy) | Weeks |
The honest read, consistent with the rest of this pillar: if your jobs are simple -- one subcontractor per job, no plant fleet, change orders are rare -- native D365 F&O plus disciplined journal entry is genuinely fine, and we'll say so directly in an assessment. A construction ISV add-on earns its cost when you want an off-the-shelf construction data model and can live with its assumptions. The custom route earns its cost when your cost sources are genuinely varied -- multiple subcontractors, an owned plant fleet, live change orders, retention on both sides -- and you want the allocation logic built around your actual jobs rather than a vendor's template.
Streamline Your Financial Operations
Join hundreds of businesses already saving time with FinTask. Get a personalised demo today.
The Architecture: What We've Actually Built, Honestly Labelled
To be direct: Fintask's production job-costing build runs on Sage 50, not D365 F&O, and it's for an Irish pan-European freight operator, not a construction business. We're not going to invent a D365 or construction case study that doesn't exist. What we can say honestly is that the architecture pattern is identical regardless of which ERP sits at the end of it -- and the freight build is the proof that the pattern works at real operational scale.
For that operator, ~40 tractor units generate costs across five disconnected systems: a transport management system, fleet telematics, a fuel-and-toll card provider, ferry operators sending PDF invoices, and Sage 50 for the books. The platform we built:
- Ingests continuously from the TMS, telematics and card feeds, joined by a vehicle-and-driver master built from licence plates.
- Allocates 101,000+ toll transactions to the exact trip leg whose stop window contains each one, with country-specific toll-regime logic.
- Reconciles ~9,500 fuel-card records a year against tank-level telemetry, flagging sensor faults and leakage instead of averaging them into a blended cost line.
- Reads ferry invoice PDFs with AI extraction where no data feed exists, matching each crossing to its trip with human approval before anything posts.
- Rolls costs up per leg, per trip, per job -- roughly 4,400 trips across ~450 jobs -- into profit and margin, with completeness flags so a partially-costed job is never mistaken for a final number.
- Maps every cost type to a Sage nominal code, with an explicit review queue for anything unmapped, so nothing uncategorised reaches the ledger.
In its first months, that engine surfaced a ~€41,000 cost gap from tractor assignments missing in the TMS across 13 trip legs, and an unclaimed fuel-duty rebate configuration worth €5,683 in one country -- the kind of finding a hand-built spreadsheet has no mechanism to catch, because it inherits the blind spots of whoever built it. Full detail in the Sage job costing automation guide and the underlying case study.
Mapping the Pattern onto D365 F&O
Nothing about the architecture above is Sage-specific. The ingestion layer, the entity master that joins disconnected systems, the allocation engines, the AI extraction for documents with no feed, the completeness flags on rolled-up job profit -- all of that sits entirely upstream of the ERP. The only thing that changes moving to D365 F&O is the posting adapter at the very end:
- Nominal codes become cost categories and cost groups. Instead of mapping fuel, tolls, plant hire and subcontractor costs to a Sage chart of accounts, each cost type maps to a D365 F&O project cost category, rolled into the cost group your project managers already report against.
- Jobs become WBS elements. Rather than posting to a flat job code, allocated costs post against the specific work-breakdown-structure element and activity they relate to -- which is what makes change-order variance and retention calculations possible on the D365 F&O side.
- Posting goes through the Data Management Framework or OData endpoints. An hour journal for labour, an expense journal for materials and plant, and a project invoice line for subcontractor costs -- all posted as clean, pre-coded batches once the allocation engine has resolved them, exactly the "review-and-post" model the Sage build already runs.
- Dimensions carry the detail D365 F&O doesn't model natively. Change-order ID, retention percentage and claim status travel as project dimensions or custom fields, so the D365-side reporting can filter and roll up by them even though the base module has no dedicated object for a change order.
The platform itself runs on the same Azure stack across every ERP we integrate with: Azure Functions or Container Apps for the ingestion and allocation jobs, Azure PostgreSQL for the platform's own operational data, Entra ID for staff sign-on, managed identities throughout so there are no connection-string secrets to rotate. For a D365 F&O build specifically, the platform stays read-only on the ERP wherever possible -- pulling live project and cost data through OData -- and writes back only through the one controlled posting path once a cost batch is reviewed and approved.
Where to Start
The questions that determine build shape are the same regardless of ERP: how many distinct systems hold a piece of job cost today (TMS, telematics, plant hire, fuel cards, subcontractor portals); which of those costs are material enough to allocate at transaction level rather than summary; and which report does your team currently rebuild by hand most often. That last one is usually the first automation target, because the demand for it is already proven.
Our AI readiness assessment maps exactly this for a D365 F&O environment: which sources connect through OData or the Data Management Framework, what needs AI extraction because no feed exists, and what a live per-job or per-WBS-element profitability view would look like once the cost categories are mapped. If job profitability on your D365 F&O estate is still a spreadsheet exercise, tell us which systems hold the pieces.
Frequently Asked Questions
Does Dynamics 365 F&O support job costing natively?
Yes, through the Project management and accounting module -- cost categories, cost groups, WBS-style project structures, and hour and expense journals. It handles labour and simple expense costing well. It doesn't natively model subcontractor progress claims against a schedule of works, plant and equipment cost allocation from usage data, change-order lifecycle tracking, or retention -- the areas construction and other multi-source project businesses tend to hit first.
Has Fintask built job costing on D365 F&O specifically?
Not yet, and we want to be direct about that rather than imply otherwise. Our production job-costing build runs on Sage 50, for an Irish pan-European freight operator -- not construction, but the same job-costing problem shape: costs scattered across disconnected source systems that need allocating to jobs before the ledger sees them. The architecture pattern -- source-data-first ingestion, an entity master joining the systems, deterministic allocation, AI extraction for documents with no feed, mapped posting to the ledger -- is ERP-agnostic. Moving it to D365 F&O changes the posting adapter, not the pattern.
What's different about job costing for construction versus other project-based businesses?
The cost sources are more varied and more operationally messy: subcontractor progress claims with retention held back line by line, owned or hired plant and equipment, change orders that need their own approval and pricing trail, and materials that arrive against purchase orders that rarely match delivery notes exactly. A services business's job costing is mostly timesheet hours; a construction job's costing spans five or six source systems that don't talk to each other or the ERP.
Where does AI actually help in a D365 F&O job costing build?
In the same two deliberately limited places as the Sage build: document extraction, for cost sources that arrive as PDFs with no underlying feed -- a subcontractor's progress claim, a plant hire invoice, a ferry crossing charge -- read by an LLM and matched to the right project or WBS element with human approval before posting; and anomaly surfacing, flagging cost gaps, unassigned equipment usage or unreconciled claims instead of averaging them away. The core allocation logic stays deterministic and auditable.
Should we buy a construction ISV add-on for D365 F&O instead of building custom?
Depends on fit. If your cost model matches what a construction-specific add-on assumes -- its schedule-of-works structure, its retention logic, its change-order workflow -- buying is faster than building, and we'll say so in an assessment. The custom route earns its cost when your cost sources are genuinely varied and don't fit a vendor's template cleanly, which is common once you're running multiple subcontractors, an owned plant fleet, and live change orders across several concurrent jobs.
How does this compare to Sage-based job costing in terms of what changes?
Almost nothing changes upstream of the ERP -- the ingestion, allocation engines, entity master and AI extraction are identical. What changes is the last step: instead of mapping cost types to a Sage nominal code and posting a journal, costs map to D365 F&O project cost categories and cost groups, post against WBS elements via the Data Management Framework or OData, and carry change-order and retention detail as project dimensions. The ledger changes; the engine that feeds it doesn't.
Ready to Automate Your Accounting?
See how FinTask can save your team hours every week with AI-powered automation. Book a free consultation to get started.

Written by Reza Shahrokhi ACA
Chartered Accountant (Chartered Accountants Ireland) • Founder of FinTask • 8+ years in finance & automation
Reza is a Chartered Accountant and the founder of FinTask. He specialises in helping growing businesses automate accounts payable, invoice processing, and financial reconciliation using AI-powered tools integrated with Xero and QuickBooks.
More about the authorRelated Articles
Job Costing Automation with Sage: Real-Time Project Profitability
Sage holds your books; your job costs live in fuel cards, timesheets, supplier feeds and telematics. Reconstructing profitability by hand in Excel means you find out whether a job made money a quarter late -- if at all. Here's the source-data-first pattern that fixes it, from a production build.
13 min readERP Finance AutomationAccounts Receivable Automation for Dynamics 365 Business Central
Business Central knows which invoices are open. It doesn't know who promised to pay, which dispute is blocking a six-figure payment, or whose turn it is to chase. Here's how mid-market teams close that gap -- with the architecture from two production builds, an $11.8M ledger and a €7.6M one.
14 min readERP Finance AutomationAccounts Payable Automation for Business Central and Dynamics 365 F&O
Business Central and D365 F&O know which purchase orders are open. They don't know that a supplier billed in cases when the PO ordered eaches, or that one damaged-parts credit memo on a consolidated invoice shouldn't hold up the other 49 lines. Here's the matching architecture that fixes that, from a production build.
13 min readERP Finance AutomationMicrosoft Fabric for Finance Teams: From Reporting to Automation
Companies deploy Microsoft Fabric, wire Business Central into the medallion layers, build Power BI dashboards -- and stop. The same Gold layer that feeds your dashboards can feed systems that do finance work. Here's what that looks like in production.
12 min read