CRM migration

Migrate from Bill4Time to Microsoft Dynamics 365 Sales

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 logo

Bill4Time

Source

Microsoft Dynamics 365 Sales

Destination

Microsoft Dynamics 365 Sales  logo

Compatibility

100%

14 of 14

objects map 1:1 between Bill4Time and Microsoft Dynamics 365 Sales .

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Bill4Time logo

Bill4Time

What's pushing teams away

  • The API is read-only (GET routes only), making it difficult to export data programmatically and forcing manual CSV exports or support-assisted migrations for bulk record movement.
  • The platform lacks a native general ledger, requiring firms to export data into QuickBooks or similar accounting software, which creates a two-system workflow and reconciliation risk.
  • Reports occasionally show discrepancies between invoice status and the accounting page, creating confusion during month-end billing reconciliation.
  • Custom Fields and unlimited data imports are gated behind the Enterprise Add-On, making them inaccessible to smaller firms that need them most.
  • The client portal is basic — it shows invoices and balances but lacks case document sharing and secure messaging that competitors offer natively.

Choosing

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

What's pulling them in

  • Deep Microsoft 365, Teams, and Outlook integration makes Microsoft Dynamics 365 Sales a natural fit for Microsoft-first organizations already invested in that ecosystem
  • Sales Enterprise and Premium tiers offer unlimited custom tables and advanced AI-driven forecasting and predictive analytics not available in lower tiers
  • Professional tier pricing at $65 per user per month offers a lower entry cost than Salesforce for SMB teams with straightforward CRM needs
  • Flexible customization options allow businesses to build bespoke apps, tailor forms and views, and integrate with other Dynamics 365 modules
  • Microsoft Copilot AI tools are embedded directly into the sales workflow on Enterprise and Premium, automating routine tasks and providing deal intelligence

Object mapping

How Bill4Time objects map to Microsoft Dynamics 365 Sales

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

maps to

Microsoft Dynamics 365 Sales

Account

1:1
Fully supported

Bill4Time 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)

maps to

Microsoft Dynamics 365 Sales

Contact

1:1
Fully supported

Clients 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

maps to

Microsoft Dynamics 365 Sales

Opportunity

1:1
Fully supported

Bill4Time 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)

maps to

Microsoft Dynamics 365 Sales

Custom Table: Matter

1:1
Fully supported

Projects 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

maps to

Microsoft Dynamics 365 Sales

Task (Activity)

1:1
Fully supported

Each 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)

maps to

Microsoft Dynamics 365 Sales

Custom Column: LitigationCode__c

1:1
Fully supported

Bill4Time 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

maps to

Microsoft Dynamics 365 Sales

Invoice

1:1
Fully supported

Bill4Time 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

maps to

Microsoft Dynamics 365 Sales

Custom Table: b4t_Expense

1:1
Fully supported

Bill4Time 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

maps to

Microsoft Dynamics 365 Sales

SystemUser

1:1
Fully supported

Bill4Time 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)

maps to

Microsoft Dynamics 365 Sales

Account Column

1:1
Fully supported

Bill4Time 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)

maps to

Microsoft Dynamics 365 Sales

Opportunity Column or b4t_Matter Column

1:1
Fully supported

Custom 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)

maps to

Microsoft Dynamics 365 Sales

Task Column

1:1
Fully supported

Enterprise 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

maps to

Microsoft Dynamics 365 Sales

SharePoint Location (Linked)

1:1
Fully supported

Bill4Time 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

maps to

Microsoft Dynamics 365 Sales

Power Automate Flow

1:1
Fully supported

Bill4Time 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.

Gotchas + challenges

What specifically takes care here

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 logo

Bill4Time gotchas

High

API is read-only with no write endpoints

Medium

Enterprise Add-On gates Custom Fields and unlimited imports

Low

Invoice status divergence between reports and accounting page

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales gotchas

High

Professional tier 15-table custom table limit blocks migrations

High

October 2024 pricing increase applies at renewal for all customers

Medium

Custom fields must be created in the UI before API writes

Medium

Power Platform request limits apply to bulk migrations

Medium

Activity records orphaned to inactive owners fail silently

Pair-specific challenges

  • Matter-billing structures don't map directly to Dynamics 365 Opportunity fields

    Bill4Time projects with flat-fee or contingency billingMethod carry override rates and flat amounts that Dynamics 365's Opportunity Amount field cannot represent natively. If a project uses FLATRATE billing and $12,000 as a fixed engagement fee, storing that in an Opportunity's Estimated Revenue field misrepresents the billing model and breaks revenue recognition. We solve this by creating a custom b4t_Matter Dataverse table linked to each Opportunity — this table holds b4t_BillingMethod, b4t_FlatFeeAmount, b4t_HourlyOverrideRate, and b4t_OvertimeOverrideRate. Your finance team can query this alongside the Opportunity in Power BI without altering the standard CRM schema. The gotcha: you must decide during scoping whether each project is standard hourly or flat-fee, because this determines whether a b4t_Matter record is created — this decision point adds a validation step before migration commits.

  • Bill4Time time entries lack native Activity fields for billing data

    Dynamics 365 Tasks and Appointments have no native fields for billable hours, billing rate, or labor cost — these concepts exist in Bill4Time but not in the standard Dynamics 365 Sales data model. Migrating a time entry's billableAmount and laborTime into a bare Task creates a record that looks correct but has no billing data visible in Dynamics 365 reports. We address this by creating custom columns (b4t_BillableAmount__c, b4t_BillableTime__c, b4t_LaborTime__c, b4t_IsBillable__c) on the Task entity. Power BI reports must reference these custom columns to reproduce Bill4Time-style time-tracking dashboards. If your team uses Dynamics 365 Project Service Automation, time entries could alternatively map to Project Service's Time Entry entity — this is a design choice surfaced during scoping that affects reporting downstream.

  • Sales Professional tier caps custom tables at 15, Enterprise required for full migration

    Bill4Time Enterprise accounts frequently have 20+ custom fields across Client, Project, TimeEntry, and User objects — plus the b4t_Matter and b4t_Expense custom tables for flat-fee projects and expense tracking. Dynamics 365 Sales Professional limits custom tables (entities) to 15. If your Bill4Time implementation uses custom fields on more than four objects plus two custom tables, the migration requires Sales Enterprise licensing. We check custom-field count and custom table count during the scoping phase and flag this before migration begins. Migrating to a Sales Professional org that later needs to upgrade to add custom tables requires schema changes post-migration — it is simpler to license Enterprise upfront.

  • Bill4Time API is read-only; no write-back or delta API exists for live sync

    Bill4Time's public API (v1 and v2) exposes GET routes only — there is no POST, PATCH, or DELETE endpoint. This means FlitStack cannot perform a live bidirectional sync or write back migration IDs to Bill4Time during the delta-pickup window. Any records modified in Bill4Time after the initial extraction run must be manually identified or matched by timestamp comparison against the initial export snapshot. For high-volume time-entry environments (firms with hundreds of daily entries), we recommend scheduling the delta pickup as close to go-live as possible to minimize the catch-up window. If your cutover window spans more than 48 hours, manual verification of the delta set may be required before you close the Bill4Time account.

  • Bill4Time user billing rates don't map to any Dynamics 365 native field

    Bill4Time stores user-level billingRate, overtimeRate, doubleRate, and payableRate — these are used to calculate time-entry amounts based on which user logged the entry. Dynamics 365 has no native equivalent; there is no User-level rate table in the standard CRM schema. We migrate these as custom currency columns on the SystemUser record (b4t_BillingRate__c, b4t_OvertimeRate__c, b4t_DoubleRate__c, b4t_PayableRate__c). Power Automate flows that calculate time-entry billing in Dynamics 365 must reference these custom user fields explicitly. If you use Dynamics 365 Project Service Automation, rates can be managed in the Project Service rate tables instead — we surface this as a configuration option during the approach step.

Migration approach

Six steps for a successful Bill4Time to Microsoft Dynamics 365 Sales data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

Bill4Time logo

Bill4Time

Source

Strengths

  • Simple per-user pricing with a free trial and no setup fees.
  • Native time tracking with timers, manual entries, and multi-device sync tied to Clients and Projects.
  • Flexible billing methods supporting hourly, flat fee, and percentage-based arrangements per Project.
  • Built-in invoicing with customizable templates, billing increments, and online payment processing via LawPay, PayPal, or Stripe.
  • OData-compatible API supports $filter, $select, $top, $skip, and $count for targeted data queries.

Weaknesses

  • API is entirely read-only — no POST, PUT, or DELETE endpoints exist, blocking automated migration scripts and two-way integrations.
  • No native general ledger; firms must integrate with external accounting software for full financial reporting.
  • Invoice status and accounting page reports have been observed to diverge in some configurations.
  • Enterprise features (Custom Fields, unlimited imports) require a paid add-on, not available on standard tiers.
  • Attachment and document storage is not exposed via the public API, limiting what can be migrated programmatically.
Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

Destination

Strengths

  • Native integration with Microsoft 365, Teams, Outlook, and SharePoint for unified productivity workflow
  • Unlimited custom tables and complex workflows on Enterprise tier enable deep customization for complex sales processes
  • AI-driven predictive analytics and deal intelligence on Enterprise and Premium tiers help sales teams prioritize pipeline
  • Dataverse unified data layer provides a consistent API and data model across all Dynamics 365 and Power Platform apps
  • Strong security model with Field-Level Security and Record Ownership rules for governance-conscious enterprises

Weaknesses

  • Sales Professional tier caps custom tables at 15, creating a migration ceiling for highly customized SMB environments
  • October 2024 pricing increases of $15 per user across all tiers apply to existing customers upon renewal
  • Implementation typically requires costly certified partners, adding 30–50% to total project cost
  • Updates and platform releases can disrupt customizations and plugins, requiring regression testing after each wave
  • Non-Microsoft integrations require additional configuration or middleware, limiting flexibility for heterogeneous tech stacks

Complexity grading

How hard is this migration?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Bill4Time and Microsoft Dynamics 365 Sales .

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    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

    B

    Bill4Time doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your Bill4Time to Microsoft Dynamics 365 Sales migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Bill4Time to Microsoft Dynamics 365 Sales data migrations

Answers to the questions buyers ask most during Bill4Time to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most Bill4Time to Dynamics 365 Sales migrations complete within 48–72 hours of migration clock time for accounts under 50,000 total records. The planning and schema-design phase typically runs 3–5 business days before any data moves. Firms with over 200,000 records (especially those with years of time-entry history) extend to 5–10 days. The primary variable is how many custom fields exist and whether b4t_Matter and b4t_Expense custom tables are required — each adds a schema-validation step. FlitStack sequences the migration in phases so you can verify each stage before the next begins.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Bill4Time.
Land in Microsoft Dynamics 365 Sales , intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day