Professional Services ERP Migration: Moving to D365 Project Operations
A technical guide to migrating professional services data — WBS hierarchies, JTD actuals, ASC 606 schedules, and rate cards — to Dynamics 365 Project Operations.
Planning a migration?
Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.
Schedule a free call- 1,500+ migrations completed
- Zero downtime guaranteed
- Transparent, fixed pricing
- Project success responsibility
- Post-migration support included
A professional services ERP migration is fundamentally different from moving a manufacturing or distribution system. Your most valuable data is not inventory or BOMs — it is project hierarchies, time entries at the user-day-task grain, revenue recognition schedules tied to in-flight contracts, and rate cards that vary by client, role, and contract type. If you copy legacy tables into Dynamics 365 Project Operations without reworking the project hierarchy, rate logic, time history, and revenue cutover, you end up with broken utilization reporting, duplicated actuals across dual-write, or blown ASC 606 continuity on active work.
This guide covers the technical constraints, data traps, and cutover logic that operations directors and CFOs at 50–500 person consultancies, agencies, A&E firms, and IT services companies need to plan for when moving to D365 Project Operations. If you want the broader patterns of why ERP data migrations fail, start with Why ERP Migrations Fail at the Data Layer: 9 Core Patterns.
Last verified against D365 Project Operations 2025 Release Wave 1. D365 PO evolves rapidly — confirm limits and feature availability against current Microsoft documentation before finalizing your migration plan.
The Professional Services Data Model: Why It Breaks Standard ERP Migrations
Most ERP migration tools and methodologies were built for products, not projects. Standard documentation focuses on customer masters, vendor lists, and open AP/AR. For a consultancy, agency, or A&E firm, those are the easy parts.
The core objects in a services migration are highly relational and deeply nested:
- Projects with multi-level work breakdown structures (WBS)
- Tasks and phases nested up to 10 hierarchy levels in legacy systems
- Time entries at user × day × project × task granularity — the atomic unit of your revenue
- Expense entries tied to projects and often to specific tasks
- Rate cards and billing rules — complex matrices that vary by client, role, project type, contract terms, and geography
- Revenue recognition schedules — often mid-stream on active projects, governed by ASC 606 or IFRS 15
- Resource profiles with skills, certifications, and utilization history
The dependency chain is brutal. A single time entry touches a user record, an organizational unit, a project, a task within the WBS, a billing rate card, and a revenue recognition schedule. Migrate any of those objects out of sequence and you break referential integrity across the entire system. This is the same cross-module dependency problem that kills ERP migrations at the data layer, amplified by the project-centric structure.
Why Services Firms Are Moving to D365 Project Operations
The shift to D365 Project Operations (D365 PO) is driven by three concrete factors:
Native Microsoft stack integration. Your people already live in Outlook, Teams, and Excel. D365 PO is built on Dataverse and integrates directly with these tools. Time entry can happen inside Teams. Project Operations uses Dataverse for the front-office experience and Dynamics 365 Finance for project accounting and revenue recognition, with dual-write synchronizing data between them. (learn.microsoft.com)
ASC 606 and IFRS 15 compliance built in. D365 PO's 2025 release wave introduced the ability to calculate revenue recognition based on contract line value rather than billing milestones. This separation means you can recognize revenue based on effort or stand-alone selling price — aligning directly with ASC 606 requirements without bolt-on ISVs. One important design note: once contract-line-based revenue recognition is enabled, it cannot be disabled. Lock this design decision down early, not during UAT. (learn.microsoft.com)
Modern resource scheduling. D365 PO connects sales, resourcing, project management, and finance in one application, with universal resource scheduling and skill-based matching. Copilot features extend to AI-generated task plans, risk assessments, and status reports — but these features only work if the underlying migrated data is correctly structured.
D365 PO offers three deployment models: Lite, Resource/Non-stocked, and Stocked/Production. Most professional services firms need the Resource/Non-stocked model, which integrates Dataverse with Finance & Operations via dual-write. Choosing the wrong deployment model is a project-level mistake that is expensive to reverse.
Legacy Source Systems: Export Limits and Data Traps
Every source system has its own extraction headaches. Your migration plan should start with the source system's real shape, not the sales demo.
Source System Comparison Matrix
Before diving into each system, this matrix summarizes the key migration-relevant differences across the most common source platforms:
| Dimension | Deltek Vision / Vantagepoint | Kantata (Mavenlink) | QuickBooks + Spreadsheets | Harvest | Replicon |
|---|---|---|---|---|---|
| API availability | No public REST API; extraction via custom SQL views against the backend database | REST API with 200 records/page, 3-minute timeout per request | QuickBooks Online REST API (rate-limited); Desktop requires IIF/CSV export | REST API with entry-level fields (project, task, hours, rates, billable status) | REST API with delta-tracking export capability |
| WBS export depth | 5–6 levels typical (Project > Phase > Task > Sub-task > Activity); requires SQL extraction | Flat or 2–3 level hierarchy; tasks within projects | No native WBS; project tracking is flat or spreadsheet-managed | Flat: Projects > Tasks only | No WBS; time entries reference project/task codes only |
| Financial data completeness | Full: JTD costs, revenue, AR/AP, billing, budgets, GL | Partial: billing, invoicing, basic revenue; no GL | Accounting complete in QuickBooks; project-level financials manual or absent | No financial data; time and billing rates only | No financial data; time entries only |
| Rate card complexity | Role × client × project type × contract terms; embedded in custom fields and tables | Role-based with historical rate preservation on logged hours; rate card changes apply forward only | Manual or absent; rates in spreadsheets if tracked at all | Per-project billable and cost rates; no multi-dimensional rate cards | Basic billable rates per user; no multi-dimensional rate logic |
| Revenue recognition data | JTD-based; requires period conversion for D365 PO | Basic; no ASC 606 native support | Manual or nonexistent | None | None |
| D365 PO mapping difficulty | High: JTD conversion, deep WBS flattening, complex rate card extraction | Medium-High: API pagination at scale, rate card history, custom field gaps | Medium: consolidation problem across disconnected sources; no single project key | Low-Medium: clean time data but requires enrichment with financial dimensions | Low-Medium: clean time data but requires enrichment with financial dimensions |
Deltek Vision / Vantagepoint
Deltek Vision was purpose-built for project-based professional services — A&E firms, government contractors, consultancies. Its data model uses a project → phase → task hierarchy with job-to-date (JTD) accounting that calculates revenue cumulatively. JTD revenue is computed by running Revenue Generation, which calculates accrued revenue on a job-to-date basis — you subtract prior JTD revenue from the new JTD to get current-period revenue.
The migration trap: Deltek's JTD approach does not map cleanly to D365 PO's period-based transaction model. You cannot dump JTD totals into D365 and expect the numbers to reconcile. Deltek reporting can calculate JTD using today's date, the period end date, or a specific date, and Vision/Vantagepoint also supports multi-period processing where postings are stamped by the processing period. If your CFO's sign-off report is period-based but your migration team extracts today's JTD, your opening balances will never reconcile. (help.deltek.com)
Firms often use five or six levels of WBS (Project > Phase > Task > Sub-task > Activity). Extracting this data requires untangling custom SQL views and translating JTD balances into opening balances that D365 PO can interpret.
Deltek announced end-of-support for Vision, pushing customers toward Vantagepoint. But firms that have made the switch report that Vantagepoint retains many of the same structural limitations. Many are choosing to leapfrog to D365 instead.
QuickBooks + Spreadsheets
This is the most common setup at sub-100-person firms: QuickBooks handles accounting, a spreadsheet tracks project budgets, and a separate tool (or more spreadsheets) handles time tracking. The problem is not any single system — it is that project data is scattered across three or more disconnected sources with no shared key. Revenue recognition, if it exists, is manual. (quickbooks.intuit.com)
The migration is really a consolidation exercise. The hardest part is establishing a single project ID that links financial data to project data to time data. Deduplication and fuzzy matching become the primary engineering problems, not extraction. For more on QuickBooks extraction challenges, see How to Export Data from QuickBooks Online: API Limits & Audit Gaps.
Mavenlink / Kantata
Kantata (formerly Mavenlink) is a SaaS PSA with a REST API. The API enforces a maximum of 200 records per page and all requests timeout after 3 minutes. If you are extracting millions of historical time entries, you need robust pagination logic with retry handling — a naive script will 429 or timeout well before you finish. Kantata's API documentation notes that rate limits may be subject to change, so build in exponential back-off logic from the start. (knowledge.kantata.com)
In-product time exports are limited to one year's data per export. Custom fields do not always export cleanly via the API — the optional_fields parameter must be explicitly requested per endpoint. Miss a field in your extraction script and you will only find out during UAT.
Rate card behavior is another edge case worth noting: Kantata preserves older logged hours at pre-change rates while later hours adopt the new default. That historical pricing logic needs to be carried forward in the migration. (knowledge.kantata.com)
Replicon / Harvest
Replicon and Harvest are time-tracking-only tools. They hold time entry data but no financial data, no revenue recognition, and no billing logic.
Harvest exposes entry-level fields via its REST API — project, task, hours, billable status, billable rate, cost rate, and billed/closed flags. Its project structure is flat (Projects > Tasks) with no deeper WBS hierarchy. Rate cards are per-project billable and cost rates with no multi-dimensional logic (no role × client × geography matrices). Harvest data is clean but shallow: you get accurate time, but every entry needs to be enriched with financial dimensions, organizational units, and role mappings before it can land in D365 PO.
Replicon exposes raw time exports with delta tracking, which is useful for incremental extraction. (replicon.com) Like Harvest, Replicon records basic billable rates per user but lacks multi-dimensional rate logic. Its time entries also lack the strict dimensional tags required by an ERP.
The migration challenge for both tools is marrying time data with financial data from your accounting system — and the join key is usually a project code that may not match across systems. You will need to programmatically enrich the time data with financial dimensions during the migration. Plan for a mapping and reconciliation step between your accounting system's chart of accounts and the project/task codes in the time-tracking tool.
Project Hierarchy and WBS Conversion: D365 PO's Structural Limits
This is where many migrations go sideways. Legacy PSAs often have deeply nested, non-standard project structures. D365 PO enforces specific structural limits.
According to Microsoft's official documentation, D365 Project Operations currently enforces these WBS limits: (learn.microsoft.com)
| Constraint | Limit |
|---|---|
| Maximum tasks per project | 3,000 |
| Maximum hierarchy depth | 10 levels |
| Maximum project duration | 5,475 days (15 years) |
| Maximum resources per project | 1,000 |
| Maximum resources per task | 50 |
| Maximum links (successor) per project | 600 |
While the overall WBS limit is now 3,000 tasks, importing from quote or contract line details is still capped at 500 tasks. If your migration path involves creating projects from contract lines — which is the standard flow for the Resource/Non-stocked deployment — you hit this 500-task ceiling. Plan your WBS flattening strategy around this constraint, not the headline 3,000 number. (learn.microsoft.com)
D365 PO uses a single WBS for both schedule and financial management. It does not support an independent Cost Breakdown Structure (CBS). If your legacy system manages project budgets in a different hierarchy than the schedule, you need to reconcile these during migration — not after.
External scheduling mode can bypass the Project for the Web limits, but Microsoft warns that it brings limited validation and disables some features, including Copilot on externally scheduled projects. Use it only if you truly own the WBS model outside the app. (learn.microsoft.com)
The Flattening Exercise
Legacy Deltek projects with 6-level phase/task hierarchies and hundreds of tasks need to be restructured to fit D365 PO's model. This is a standardization exercise, not a copy job. It requires project managers to review and approve the new structure for active projects.
The approach: analyze the legacy hierarchy and compress the bottom-most layers into financial dimensions rather than explicit scheduling tasks.
For example, instead of migrating:
Implementation (Phase) > Discovery (Task) > Interviews (Sub-task) > Stakeholder A (Activity)
You flatten to:
Implementation (Phase) > Discovery (Task)
The granular details (Interviews, Stakeholder A) are mapped as descriptive text fields on the time entry or handled via F&O financial dimensions. This preserves reporting granularity while keeping the literal task count within limits. The key insight: your reporting transitions from relying on deep task structures to utilizing F&O financial dimensions.
Time and Expense Volume: Migrating Millions of Rows
A 200-person consultancy with 5 years of history generates roughly 200 × 250 working days × 5 years = 250,000 time entry rows — and that is before task-level splits, overtime entries, and adjustments. That number is illustrative; larger firms with detailed task tracking easily reach millions of rows.
Migrating every historical time entry at the atomic level into D365 PO is an anti-pattern. It bloats Dataverse storage costs and degrades system performance. The practical approach: summary historical, detail for current and prior fiscal year.
- Current fiscal year + prior fiscal year: Full detail at user × day × project × task grain. This supports active project management, billing, and auditing.
- Older history: Summarized to project × task × month or project × task × fiscal period. This preserves utilization and cost reporting without loading millions of rows that nobody queries at the transaction level.
- Archive outside D365: Anything only needed for litigation, audit support, or occasional reference stays in a separate data store.
The critical constraint: your summarization logic must preserve the totals that tie to your general ledger. If JTD costs in the source system are $4.2M for a project, the sum of migrated detail + summary rows in D365 must equal exactly $4.2M. Off-by-a-penny errors in summarization will haunt your first close.
When mapping these entries, you must also navigate the rate card minefield. Legacy systems often have conflicting rate cards (a standard role rate vs. a client-specific negotiated rate). Kantata, for example, preserves older logged hours at pre-change rates while later hours adopt the new rate. Your migration scripts must recalculate the expected billable value of historical time against the legacy rate cards to ensure the migrated financial totals match the source system exactly.
For guidance on what financial history to migrate vs. archive, see What Data Should You Actually Migrate to Your New ERP?.
Revenue Recognition Continuity (ASC 606) for In-Flight Projects
Mid-project revenue recognition at cutover is the single riskiest piece of a professional services ERP migration. Get this wrong and you either double-count revenue (audit finding) or fail to recognize earned revenue (understated financials).
D365 PO supports ASC 606 and IFRS 15 revenue recognition, including contract-line-based revenue recognition that separates contract value from billing milestones. Microsoft is explicit that revenue recognition and invoicing are independent processes in Project Operations and Finance. (learn.microsoft.com)
But the challenge is not D365's capabilities — it is the cutover logic for projects that are mid-stream. Here is the approach that works:
Step 1: Lock source ASC 606 schedules at cutover. Run a final revenue recognition cycle in your legacy system at a specific cutover date (typically month-end). Generate a complete snapshot of each project's recognized revenue, deferred revenue, and unbilled amounts. This becomes your audit trail.
Step 2: Migrate as opening balances. In D365, load the cumulative recognized revenue and costs as opening balance journal entries — not as individual transactions. Opening balance journal entries record aggregate financial positions at a point in time, whereas individual transactions would replay every historical event and create phantom actuals. The journal entries should reference the project, contract line, and cutover date. Microsoft's beginning-balance guidance explicitly covers opening balances for costs, revenue, WIP, and billing in integrated deployments. One nuance: beginning balance journals update the project subledger, not the general ledger. Your GL cutover still needs its own controlled process. (learn.microsoft.com)
Step 3: Recognize forward in D365. All revenue recognition from the cutover date forward happens natively in D365 PO. The system picks up from the opening balances and applies its own ASC 606 logic to the remaining contract value. For previously invoiced fixed-price milestones, use the cutover milestone logic Microsoft documents to preserve contract value without affecting customer AR or general-ledger balances. (learn.microsoft.com)
Step 4: Reconcile. Run parallel reporting for at least one full accounting period post-cutover. Total recognized revenue in the legacy system (through cutover) plus total recognized revenue in D365 (after cutover) must equal the expected total for each contract.
Do not attempt to replay individual historical revenue recognition transactions in D365. This creates phantom actuals that will double-count against your GL. Opening balances are the only safe approach for mid-project ASC 606 continuity. See 7 Costly Mistakes to Avoid When Migrating Financial Data.
// Example: Mapping Opening Balances to prevent double-counting
{
"ProjectId": "PRJ-9921",
"ContractValue": 150000.00,
"LegacyRecognizedRevenue": 85000.00,
"RemainingPerformanceObligation": 65000.00,
"MigrationJournalType": "ASC606_OpeningBalance",
"SyncStatus": "ReadyForDualWrite"
}The Dual-Write Minefield: Sequencing Dataverse and F&O
D365 Project Operations (Resource/Non-stocked) runs on a dual-write architecture that connects Dataverse and Finance & Operations (F&O). The front-end project management, resource scheduling, and time entry happen in Dataverse. The back-end invoicing, revenue recognition, and general ledger happen in F&O. Microsoft bridges these with dual-write, a near-real-time synchronization engine. (learn.microsoft.com)
This architecture is powerful for end-users but volatile during a data migration. Records in entities like project contracts can only be created and deleted in Dataverse — but accounting attributes like sales tax groups and financial dimensions are added in F&O. If you push a project into Dataverse and the prerequisite financial dimensions, customer groups, or currency codes do not already exist in F&O, the dual-write sync fails, leaving you with orphaned records in Dataverse.
The real-time dual-write sync also has a hard limit: a maximum of 1,000 invoice lines per customer invoice. Microsoft introduced asynchronous dual-write integration specifically to overcome this constraint for high-volume billing scenarios.
Project Schedule API Constraints
The WBS side has another layer of complexity. D365 PO uses Project Scheduling APIs — not standard Dataverse web APIs — for project tasks, assignments, dependencies, buckets, and team members. These APIs have specific operating limits: only users with a Microsoft Project license can call them (application users and integration users are excluded), each OperationSet can contain at most 200 operations, and each user can have only 10 open OperationSets. (learn.microsoft.com)
Flat reference data loads fine through ordinary ETL, but WBS and assignment migration is a batching and sequencing problem that standard tools do not handle out of the box.
Migration Sequencing
To migrate successfully, you must enforce strict sequencing:
- Disable dual-write maps during the initial bulk load to prevent race conditions and API throttling.
- Load F&O prerequisites. Migrate all legal entities, financial dimensions, currencies, and customer groups directly into F&O via the Data Management Framework (DMF).
- Load Dataverse prerequisites. Migrate users, resource profiles, roles, and rate cards into Dataverse.
- Enable and run dual-write maps in the documented order. Microsoft's documentation is explicit about the required app installation sequence, solution order, and entity metadata refresh.
- Create project contracts and projects in Dataverse. They sync to F&O automatically via dual-write.
- Load the flattened WBS structures using the Project Schedule API, batching within the 200-operation and 10-OperationSet limits.
- Load historical actuals as journal entries in F&O. Do not load them as new transactions in Dataverse, or the system will attempt to re-recognize the revenue.
- Validate that dual-write maps are running clean before loading full transaction volume.
Standard ETL tools like SSIS or KingswaySoft can move data into individual tables, but they do not orchestrate the dual-write handshake or the Project Schedule API's batching requirements. For a comparison of migration tooling, see SSIS vs Azure Data Factory vs ClonePartner.
Resource, Rate Card, and Client Data: The Deduplication Exercise
Client / Customer Master
Services firms typically have customer data in three places: CRM, accounting system, and project tool. "Acme Corp" in Salesforce, "ACME Corporation" in QuickBooks, and "Acme" in Deltek are all the same client. Migration is also a deduplication and normalization event. Establish a golden customer record before loading anything into D365 — and use that as the master for both Dataverse (CRM side) and F&O (accounting side).
This is not just CRM hygiene. In D365 PO, account records can carry customer-specific project price lists, and project quotes or contracts can fork those into quote-specific or contract-specific custom price lists. Duplicate customer records become billing defects.
Rate Cards
Rate cards are where data quality problems surface most painfully. A mid-sized consultancy might have billing rates that vary by:
- Client (preferred pricing for key accounts)
- Role (Senior Consultant vs. Associate)
- Project type (fixed-price vs. T&M)
- Contract terms (negotiated discounts)
- Geography (US vs. offshore)
D365 PO uses price lists tied to organizational units and roles. Sales prices on time actuals are resolved using date, currency, and typically the combination of Role + Resourcing Unit from the applicable price list. If your legacy rate cards are embedded in spreadsheets or custom fields in Deltek, extracting them into D365's price list structure is a mapping exercise that requires finance team involvement. Do not delegate this to IT alone. (learn.microsoft.com)
The correct load order matters: master customers/accounts first, then roles, then resource records, then effective-dated rate cards, and only then migrate operational actuals. If you reverse that order, your time history prices against the wrong logic.
Resource and Skill Data
Resource profiles — skills, certifications, billable rates, organizational unit assignments — are often split between HR systems and project tools. D365 PO maintains project resources in Dataverse and synchronizes resource roles to F&O.
The key decision: do you migrate full skill profiles, or do you treat the migration as a fresh start for resource data? For firms under 200 people, a clean re-entry is often faster than cleaning up years of stale skill tags. For larger firms, consider a hybrid: migrate active resource profiles (anyone who has logged time in the past 12 months) with their current role and organizational unit assignments, and treat inactive resources as archive-only records that do not need to land in D365 PO's active resource pool.
Regardless of approach, ensure that the resource-to-role mapping is finalized before loading time history. Time entries in D365 PO resolve billing rates against the resource's role and resourcing unit — if those associations are missing or incorrect at import time, every downstream financial calculation will be wrong.
Pre-Cutover Validation Checklist
Before you flip the switch, walk through every item on this list. Skipping even one has downstream consequences that surface as reconciliation failures during your first close.
- WBS flattening confirmed. Every active project's restructured WBS has been reviewed and approved by its project manager. Task counts fall within the 500-task contract-line import ceiling (or 3,000 if loading directly).
- Customer master deduplicated. A single golden record exists for each client across CRM, accounting, and project data. No duplicates will reach Dataverse or F&O.
- Rate cards loaded and effective-dated. All role × client × project type rate combinations are loaded in D365 PO price lists with correct effective dates. Historical rates match source system values.
- Resource-to-role mapping finalized. Every active resource has a role and resourcing unit assignment in Dataverse. Inactive resources are flagged as archive-only.
- F&O prerequisites loaded. Legal entities, financial dimensions, currencies, customer groups, and tax codes are all present in F&O before dual-write maps are enabled.
- Dual-write maps enabled in documented order. App installation sequence, solution order, and entity metadata refresh completed per Microsoft's documentation. Maps are running clean with no sync errors.
- ASC 606 opening balances reconciled. Cumulative recognized revenue, deferred revenue, WIP, and unbilled amounts per project match the final legacy system snapshot to the penny. Beginning balance journals are posted to the project subledger.
- GL cutover completed separately. General ledger opening balances are loaded independently from project subledger entries. Trial balance in D365 matches the legacy system's closing trial balance.
- Time entry summarization validated. Sum of migrated detail rows (current + prior fiscal year) plus summarized rows (older history) equals source system JTD totals for every project.
- Parallel-run period defined. At least one full accounting period is designated for parallel reporting. Reconciliation owners and sign-off criteria are assigned per project or contract.
Parallel Run and Phased Go-Live Strategy
The four-step ASC 606 cutover process above mentions running parallel reporting for one period. That single sentence understates how much planning this requires.
A parallel run means both systems — legacy and D365 PO — are producing financial outputs for the same period. The goal is to verify that D365 PO's revenue recognition, billing, and cost tracking produce results consistent with what the legacy system would have produced. This is your safety net: if the numbers diverge beyond acceptable tolerances, you have a window to correct data or mappings before the legacy system is decommissioned.
What parallel looks like in practice:
- Week 1–2 post-cutover: All new time entries go into D365 PO. The legacy system is read-only. Finance runs the period close in both systems.
- Week 2–3: Reconcile project-by-project. Compare recognized revenue, WIP balances, and unbilled AR between systems. Document every variance and its root cause.
- Week 3–4: Resolve variances. Common sources: rate card mismatches on edge-case contracts, WBS mapping errors on projects that were restructured, and financial dimension misalignments on cross-entity projects.
- End of period: CFO or controller signs off on the reconciliation. Legacy system moves to archive status.
For firms with more than 50 active projects at cutover, consider a phased go-live by business unit or project type rather than a big-bang cutover. Move time-and-materials projects first (simpler revenue recognition), then fixed-price projects (more complex ASC 606 logic). This reduces the blast radius of any data issue and gives your finance team a manageable reconciliation workload.
The trade-off: phased go-live means maintaining integrations and dual-entry processes for longer. But for firms with complex multi-year contracts, the reduced risk is worth the temporary operational overhead.
Getting the Migration Right
A professional services ERP migration to D365 Project Operations is not a lift-and-shift. It is a data transformation that touches every part of your financial and operational model — WBS structures, JTD actuals, ASC 606 schedules, rate cards, and the dual-write architecture that holds it all together.
The firms that succeed treat this as an engineering problem. They flatten WBS hierarchies before migration, not during UAT. They lock revenue recognition at cutover instead of trying to replay history. They sequence dual-write maps correctly instead of debugging orphaned records after go-live. They master customers and rate cards before loading time history, so billable amounts resolve against the right logic.
Microsoft FastTrack is valuable for guidance and best practices. It is not the same as someone owning your Deltek extract, your WBS reshape, your rate-card mapping, and your cutover reconciliation. That gap between advisory and execution is where specialist migration teams come in. For more on why standard implementation partners struggle here, see Why Standard Partners Fail at Data Integrity.
Frequently Asked Questions
- What happens to in-flight projects during an ERP migration to D365 Project Operations?
- Active projects are migrated with flattened WBS structures, team assignments, and financial opening balances. The cutover date becomes the boundary — all prior history loads as opening balance journal entries in D365 F&O, and all forward transactions are native D365. Plan for a parallel-run period of at least one full accounting cycle where PMs validate project data in both systems.
- How do you handle ASC 606 revenue recognition during a mid-project ERP migration?
- Lock your legacy ASC 606 schedules at the cutover date, run a final revenue recognition cycle, and migrate cumulative recognized revenue as opening balance journal entries in D365 F&O. All forward recognition happens natively in D365. Never replay individual historical revenue transactions — that causes double-counting. Note that beginning balance journals update the project subledger, not the general ledger, so your GL cutover needs its own controlled process.
- What is the WBS task limit in Dynamics 365 Project Operations?
- D365 PO supports up to 3,000 tasks per project overall with a maximum hierarchy depth of 10 levels. However, importing from quote or contract line details is still capped at 500 tasks — a critical constraint for the standard Resource/Non-stocked deployment path that most services firms use.
- Can I migrate from Deltek Vision directly to D365 Project Operations?
- Yes, but Deltek's JTD (job-to-date) accounting model does not map directly to D365 PO's period-based transactions. JTD actuals need to be decomposed into period-level transactions or loaded as opening balances with explicit cutover dates. The project hierarchy also likely needs flattening to fit D365 PO's WBS limits.
- How much historical time and utilization data should we migrate?
- Migrate full transaction-level detail for the current and prior fiscal year. Summarize older history to project × task × period level, preserving billable vs. non-billable splits. Ensure summarized totals tie exactly to your general ledger before loading. Archive anything only needed for litigation or occasional reference outside D365.
