CRM migration
Field-level mapping, validation, and rollback between Bill4Time and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
Bill4Time
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
14 of 14
objects map 1:1 between Bill4Time and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
48–72 hours
Overview
Bill4Time organizes data around clients, projects (matters), and time entries with a billing-centric schema: hourly rates, flat-fee arrangements, expense reimbursement, and invoice generation are core to the product. Dynamics 365 Sales organizes data around Accounts, Contacts, Leads, and Opportunities using Dataverse as its underlying data platform. The migration challenge is substantial because Bill4Time's matter-centric structure (projects tied to clients with granular time tracking) has no direct equivalent in Dynamics 365's opportunity-based sales pipeline. We map Bill4Time clients to Dynamics 365 Accounts, Bill4Time projects to Opportunities or a custom Matter table, time entries to Activities or a custom TimeEntry table, and invoices to the Dynamics 365 Sales Invoice entity. Custom fields from Bill4Time Enterprise migrate as custom columns on their respective Dataverse tables. FlitStack's migration engine reads Bill4Time via its read-only REST API (v1 and v2), transforms records using OData-compatible filtering, and writes to Dynamics 365 via the Dataverse Web API — handling user resolution by email match, duplicate detection by customId, and a 24-48 hour delta pickup window for records modified during cutover. Workflows, automation rules, and template configurations in Bill4Time do not migrate and must be rebuilt in Dynamics 365 using Power Automate flows.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Source platform
Bill4Time platform overview
Scorecard, SWOT, gotchas, and pricing for Bill4Time.
Destination platform
Microsoft Dynamics 365 Sales platform overview
Scorecard, SWOT, gotchas, and pricing for Microsoft Dynamics 365 Sales .
Data migration guide
The complete Microsoft Dynamics 365 Sales migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Destination checklist
Microsoft Dynamics 365 Sales migration checklist
Pre- and post-cutover tasks for moving onto Microsoft Dynamics 365 Sales .
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Bill4Time object lands in Microsoft Dynamics 365 Sales , including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Bill4Time
Client
Microsoft Dynamics 365 Sales
Account
1:1Bill4Time clients map directly to Dynamics 365 Accounts using clientName as Account Name, address fields as Address fields, and phone/email as telephone1 and emailaddress1. accountManagerId resolves to a Dynamics 365 User lookup; unresolvable managers flag for manual assignment before migration commits.
Bill4Time
Client (individual practitioner)
Microsoft Dynamics 365 Sales
Contact
1:1Clients flagged with clientType indicating an individual practitioner (rather than a company organization) map to Dynamics 365 Contacts rather than Accounts. The Contact's parentcustomerid field links to the associated Account, preserving the relationship hierarchy. Email, phone, address, and mobile fields migrate directly; billingName populates the Contact's full name field for display clarity.
Bill4Time
Project
Microsoft Dynamics 365 Sales
Opportunity
1:1Bill4Time projects (matters) map to Dynamics 365 Opportunities — projectName becomes Opportunity Name, amount migrates as Estimated Revenue, and closedate maps to Close Date. Project status (Open/Closed) controls whether the Opportunity state is Open or Won/Closed. Each project requires an Account lookup that must resolve before the Opportunity inserts.
Bill4Time
Project (flat-fee or contingency)
Microsoft Dynamics 365 Sales
Custom Table: Matter
1:1Projects using billingMethod='Flat Fee' or 'Percentage' carry billing arrangements that don't fit Dynamics 365's standard Opportunity amount model. We create a custom 'b4t_Matter' Dataverse table with columns for b4t_BillingMethod, b4t_HourlyOverrideRate, b4t_OvertimeOverrideRate, and b4t_FlatFeeAmount — linked to the Opportunity via a lookup. This preserves the full billing structure for finance review.
Bill4Time
TimeEntry
Microsoft Dynamics 365 Sales
Task (Activity)
1:1Each Bill4Time time entry becomes a Dynamics 365 Task with Subject derived from projectName + descriptionPublic, and the entryDate maps to the Task's scheduledstart. BillableAmount and laborTime migrate as custom fields on the Task since Dynamics 365 Activities lack native billing fields. activityType translates via value mapping to a Task category option set.
Bill4Time
TimeEntry (litigated matters)
Microsoft Dynamics 365 Sales
Custom Column: LitigationCode__c
1:1Bill4Time records ABA litigation codes and descriptions per time entry for law firm compliance reporting. We map litigationCode and litigationCodeDesc to custom text columns on the Task entity (b4t_LitigationCode__c, b4t_LitigationCodeDesc__c). Values map directly since these are free-text compliance codes with no Dynamics 365 equivalent.
Bill4Time
Invoice
Microsoft Dynamics 365 Sales
Invoice
1:1Bill4Time invoices map to the Dynamics 365 Invoice entity using invoiceDate as Invoice Date, invoiceAmount as Total Amount, laborAmount and expenseAmount as custom line-amount fields. Status mapping: 'prebill' → 'Draft', 'finalized' → 'Active', 'Paid' → 'Closed'. The invoiceId and customId are preserved as b4t_SourceInvoiceId__c for reconciliation.
Bill4Time
Expense
Microsoft Dynamics 365 Sales
Custom Table: b4t_Expense
1:1Bill4Time expense entries migrate to a custom 'b4t_Expense' Dataverse table linked to the parent Project (Opportunity) and Client (Account). Fields include expenseDate, expenseAmount, description, and expenseType — with the original Bill4Time expense record ID preserved for audit trail and delta-sync verification.
Bill4Time
User
Microsoft Dynamics 365 Sales
SystemUser
1:1Bill4Time users map to Dynamics 365 System Users resolved by email match. Billing rate fields (billingRate, overtimeRate, doubleRate, payableRate) migrate as custom columns on the SystemUser entity (b4t_BillingRate__c, b4t_OvertimeRate__c, b4t_DoubleRate__c, b4t_PayableRate__c). userType maps to a custom picklist for security-role reference during post-migration cleanup.
Bill4Time
Custom Field (Client)
Microsoft Dynamics 365 Sales
Account Column
1:1Bill4Time Enterprise custom fields on Client records create matching custom columns on the Dynamics 365 Account entity. Field types (text, number, date, list) translate to Dataverse column types. List-type custom fields create option sets in Dynamics 365 with values preserved from Bill4Time's list configuration.
Bill4Time
Custom Field (Project)
Microsoft Dynamics 365 Sales
Opportunity Column or b4t_Matter Column
1:1Custom fields on Bill4Time projects migrate to the Opportunity entity for standard project mappings, or to the b4t_Matter custom table for flat-fee/contingency projects. The target depends on the billingMethod field value — determined during the scoping phase and locked before migration begins.
Bill4Time
Custom Field (TimeEntry)
Microsoft Dynamics 365 Sales
Task Column
1:1Enterprise custom fields on Bill4Time time entries (such as expense-code tags or matter-reference fields) migrate as custom columns on the Dynamics 365 Task entity. Non-searchable custom field data in Bill4Time's customFields JSON blob is flattened and mapped to named columns for reporting visibility.
Bill4Time
Attachment / File
Microsoft Dynamics 365 Sales
SharePoint Location (Linked)
1:1Bill4Time attachments on clients, projects, or invoices re-upload to a SharePoint location linked from the Dynamics 365 Account or Opportunity. We document the SharePoint URL on the record's b4t_DocumentStore__c field. Direct Dynamics 365 Notes attachments are created where SharePoint integration is not configured.
Bill4Time
Bill4Time Workflow / Automation
Microsoft Dynamics 365 Sales
Power Automate Flow
1:1Bill4Time workflow templates (Enterprise feature) do not migrate. We export workflow definitions as JSON metadata with rule logic described in plain language so your Dynamics 365 admin can reconstruct equivalent Power Automate flows. This is a manual rebuild — not automated migration.
| Bill4Time | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Client | Account1:1 | Fully supported | |
| Client (individual practitioner) | Contact1:1 | Fully supported | |
| Project | Opportunity1:1 | Fully supported | |
| Project (flat-fee or contingency) | Custom Table: Matter1:1 | Fully supported | |
| TimeEntry | Task (Activity)1:1 | Fully supported | |
| TimeEntry (litigated matters) | Custom Column: LitigationCode__c1:1 | Fully supported | |
| Invoice | Invoice1:1 | Fully supported | |
| Expense | Custom Table: b4t_Expense1:1 | Fully supported | |
| User | SystemUser1:1 | Fully supported | |
| Custom Field (Client) | Account Column1:1 | Fully supported | |
| Custom Field (Project) | Opportunity Column or b4t_Matter Column1:1 | Fully supported | |
| Custom Field (TimeEntry) | Task Column1:1 | Fully supported | |
| Attachment / File | SharePoint Location (Linked)1:1 | Fully supported | |
| Bill4Time Workflow / Automation | Power Automate Flow1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Bill4Time gotchas
API is read-only with no write endpoints
Enterprise Add-On gates Custom Fields and unlimited imports
Invoice status divergence between reports and accounting page
Microsoft Dynamics 365 Sales gotchas
Professional tier 15-table custom table limit blocks migrations
October 2024 pricing increase applies at renewal for all customers
Custom fields must be created in the UI before API writes
Power Platform request limits apply to bulk migrations
Activity records orphaned to inactive owners fail silently
Pair-specific challenges
Migration approach
Extract Bill4Time data via read-only API with OData filtering
FlitStack authenticates to Bill4Time using an API key generated from the API tab in Settings. We pull all v1 and v2 endpoints — Clients, Projects, TimeEntries, Invoices, Expenses, and Users — using OData-compatible query parameters ($filter, $select, $orderBy) to paginate large record sets efficiently. For accounts with custom fields, we request the customFields JSON blob and flatten it into named columns based on the Enterprise custom field configuration exported from Bill4Time Settings. The extraction runs against a point-in-time snapshot; we record the extraction timestamp for delta-window calculation.
Design Dynamics 365 custom schema: b4t_Matter and b4t_Expense tables plus custom columns
Before data loads, FlitStack creates the custom Dataverse tables and columns required by the migration plan. The b4t_Matter table is created with columns for b4t_BillingMethod__c (option set), b4t_FlatFeeAmount__c (currency), b4t_HourlyOverrideRate__c (currency), b4t_OvertimeOverrideRate__c (currency), and a lookup to Opportunity. The b4t_Expense table is created with expenseDate, amount, description, and type columns plus lookups to Account and Opportunity. On existing entities (Account, Opportunity, Task, SystemUser), we create the b4t-prefixed custom columns identified during the field-mapping step. This schema setup plan is delivered to your Dynamics 365 admin for review and pre-creation in the target environment before the migration run begins.
Resolve Bill4Time users to Dynamics 365 SystemUsers by email match
FlitStack matches Bill4Time user records to Dynamics 365 SystemUsers by email address. Resolved users get their billingRate, overtimeRate, doubleRate, and payableRate values written to the custom SystemUser columns. Unresolved users — those without a corresponding Dynamics 365 account — are flagged in the pre-flight report with two options: invite the user to Dynamics 365 before migration, or assign their records to a fallback owner. No time entry or project lands in Dynamics 365 without a resolved owner, preventing orphaned activity records.
Sequence migration: Accounts → Opportunities → Tasks → Invoices → b4t_Expense
Dynamics 365 requires foreign-key resolution in a specific order — Account must exist before Contact, Opportunity must reference an AccountId, and Tasks must link to a regarding object (Opportunity or Account). We sequence the migration: first Accounts (from Clients), then Opportunities (from Projects, with b4t_Matter records for flat-fee projects), then Tasks (from TimeEntries, with b4t_LitigationCode__c populated for law firm compliance), then Invoices (with b4t_LaborAmount__c and b4t_ExpenseAmount__c preserved), then b4t_Expense records linked to their parent Account and Opportunity. Each phase generates a count report and validation log before the next phase starts.
Run sample migration with field-level diff before full commit
A representative slice — typically 200–500 records spanning multiple clients, projects, time entries, and invoices — migrates first. We generate a field-level diff comparing each Bill4Time source field against the corresponding Dynamics 365 destination column, flagging any truncation (e.g., text fields exceeding Dataverse column length limits), missing option-set values, or owner-resolution failures. This diff report is reviewed with you before the full run commits. For flat-fee projects, we verify that the b4t_Matter record was created and linked correctly to the Opportunity, not just that the Opportunity itself migrated.
Execute full migration with delta-pickup window and audit log
The full migration run processes all remaining records in sequenced batches, writing to Dynamics 365 via the Dataverse Web API. A 24–48 hour delta-pickup window opens simultaneously — any Bill4Time records modified or created during the cutover are captured in a secondary extraction and written to Dynamics 365 after the initial run completes. FlitStack generates an audit log covering every record created, updated, or skipped with reason codes. If reconciliation against the Bill4Time totals report reveals discrepancies, one-click rollback reverts the Dynamics 365 environment to its pre-migration state. After rollback confirmation (if needed), the delta records are applied and final reconciliation runs.
Platform deep dives
Bill4Time
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Bill4Time and Microsoft Dynamics 365 Sales .
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Bill4Time: Not publicly documented — confirm with Bill4Time support during scoping. The vendor's API reference does not publish per-minute or per-day request ceilings..
Data volume sensitivity
Bill4Time doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Bill4Time to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your Bill4Time to Microsoft Dynamics 365 Sales migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Bill4Time
Other ways to arrive at Microsoft Dynamics 365 Sales
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.