CRM migration

Migrate from Bill4Time to Twenty CRM

Field-level mapping, validation, and rollback between Bill4Time and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

Bill4Time logo

Bill4Time

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between Bill4Time and Twenty CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Bill4Time organizes work around time tracking, client billing, and matter management — its core objects are Clients, Projects, Time Entries, Invoices, and Users, with an Enterprise-tier custom field model and a read-only v1/v2 OData API. Twenty CRM uses a standard CRM object graph: People (contacts), Companies, Opportunities, Tasks, and Notes, with custom objects available on Organization tier plans. The two platforms share almost no native object equivalents — Bill4Time has no contacts/leads, and Twenty has no billing or time-tracking primitives. FlitStack AI resolves this by mapping Bill4Time Clients to Twenty Companies, Projects to Opportunities (with stage set to a custom Won/Lost state), and Time Entries to Tasks with a billable flag preserved as a custom select field. Invoice records — which have no Twenty equivalent — are exported as a custom Invoice object or as a linked Notes attachment with the full invoice JSON for reference. We sequence the load as Companies → People → Opportunities → Tasks → Custom Objects so foreign-key resolution is clean. The migration runs against Bill4Time's read-only API (v1 or v2, whichever is available in your plan) with a delta-pickup window capturing any entries logged during cutover. Workflows, invoicing rules, and billing automations from Bill4Time do not migrate — those must be rebuilt manually in Twenty or with the aid of our exported configuration reference.

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

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How Bill4Time objects map to Twenty CRM

Each row shows how a Bill4Time object lands in Twenty CRM, 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

Twenty CRM

Company

1:1
Fully supported

Bill4Time Clients map directly to Twenty Companies. Address, phone, email, and account-manager fields carry over as Company fields. Clients with a billing name distinct from the legal name get the billing name stored in Company.name with the original client name preserved in a custom text field.

Bill4Time

Project

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Bill4Time Projects become Twenty Opportunities. Project name maps to Opportunity.name, and the project budget or flat-fee amount maps to Opportunity.amount. The project status (Open/Closed) maps to Opportunity.stage as a custom pick-list — Open maps to an active pipeline stage, Closed maps to Won or Lost based on the project's outcome field.

Bill4Time

Time Entry

maps to

Twenty CRM

Task

1:1
Fully supported

Bill4Time Time Entries migrate as Twenty Tasks linked to the parent Company and Opportunity (project). The description field maps to Task.title, entry date to Task.dueDate, and hours to a custom number field (Task_Billable_Hours__c). The billable/non-billable flag is preserved as a custom select field (Billable__c) on the Task.

Bill4Time

Invoice

maps to

Twenty CRM

Custom Object (Invoice) or Note

1:1
Fully supported

Twenty has no native invoice object. We create a custom Invoice object in Twenty (Settings → Data Model → Custom Objects) and migrate invoice metadata (invoice number, date, amount, status, client link) as fields on that object. The full invoice body — line items, taxes, notes — is preserved as a JSON blob in a long-text field or attached as a Note to the associated Company record.

Bill4Time

User (Bill4Time employee/contractor)

maps to

Twenty CRM

Workspace Member (Twenty)

1:1
Fully supported

Bill4Time User records map to Twenty Workspace Members. First name, last name, email, department, and billing rate carry over. Unmatched users (employees who do not yet have a Twenty account) are flagged before migration and must be invited to Twenty before their records can be assigned.

Bill4Time

Expense

maps to

Twenty CRM

Custom Object (Expense) or Task

1:1
Fully supported

Bill4Time Expense records migrate as a custom Expense object linked to the parent Company and Project. Expense amount, date, category, and billable flag are custom fields. If the custom object is not pre-created in Twenty, expenses attach as Tasks with a custom Expense_Amount__c field and an Expense__c checkbox.

Bill4Time

Client Custom Fields

maps to

Twenty CRM

Company Custom Fields

1:1
Fully supported

Bill4Time Enterprise-tier custom fields on Clients (text, number, date, list, client-list, user-list types) migrate to custom fields on Twenty Companies. List-type custom fields require value mapping if the pick-list options differ between platforms. The custom field schema must be created in Twenty (Settings → Data Model) before the import batch runs.

Bill4Time

Project Custom Fields

maps to

Twenty CRM

Opportunity Custom Fields

1:1
Fully supported

Bill4Time custom fields on Projects migrate to Twenty Opportunity custom fields using the same type-mapping logic. ProjectType (Hourly/Flat Fee/Percentage) becomes a custom select on the Opportunity. Billing rates and overtime rates from the Project record store as custom currency fields.

Bill4Time

Time Entry Custom Fields

maps to

Twenty CRM

Task Custom Fields

1:1
Fully supported

Bill4Time custom fields on Time Entries — such as litigation codes or activity type categories — migrate as custom select or text fields on Twenty Tasks. Activity type maps to Task.Status or a custom select field depending on Twenty's field availability at migration time.

Bill4Time

Account Manager (on Client)

maps to

Twenty CRM

Workspace Member relation on Company

1:1
Fully supported

The Bill4Time accountManagerId on a Client record resolves to a Twenty Workspace Member by email match and links to the Company as the assigned owner. If the account manager has no Twenty account, the Company is assigned to a fallback owner flagged in the pre-migration owner-resolution report.

Bill4Time

Project Assignment (assignedTo)

maps to

Twenty CRM

Opportunity assignee relation

1:1
Fully supported

The Bill4Time assignedTo user on a Project resolves by email to a Twenty Workspace Member and populates the Opportunity.assignee field. Unresolved assignments map to a placeholder assignee and surface in the pre-flight report for manual correction before the full migration commits.

Bill4Time

Invoice Attachment / File

maps to

Twenty CRM

Note attachment on Company

1:1
Fully supported

Bill4Time invoice PDF attachments have no native Twenty equivalent. FlitStack re-uploads each PDF as a Twenty Note linked to the corresponding Company record, sets the custom Invoice_Document__c checkbox to true, and names the Note using the original invoice filename. The PDF blob is stored as a file attachment on the Note, preserving the full document for download while the custom field enables quick filtering in Twenty.

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

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • No native invoice or billing object in Twenty CRM

    Twenty has no concept of invoices, billing, trust accounting, or time-and-expense invoicing. Bill4Time's entire billing engine — invoices, line items, tax calculations, payment records, and trust account balances — has no direct equivalent to migrate into. We handle this by creating a custom Invoice object in Twenty (Settings → Data Model) and populating it with invoice metadata pulled from Bill4Time's v1/v2 API. The full invoice JSON, including line items, taxes, and notes, is stored as a long-text field or attached as a Note to the linked Company record. This preserves the data for reference but your team will need to use a separate invoicing tool (Stripe, QuickBooks, or a custom build) for new invoices post-migration.

  • Import order is strict — Companies before People, then Opportunities, then Tasks

    Twenty's CSV import enforces referential integrity: a record with a foreign key cannot import if the target record does not yet exist. Bill4Time Clients have Projects, and Projects have Time Entries — so the migration must run Companies first, then People (if any), then Opportunities (which reference Companies), then Tasks (which reference both Companies and Opportunities). If Bill4Time has user IDs without corresponding Twenty Workspace Members, the assignee links on Tasks and Opportunities remain unresolved until those members are invited and accept. FlitStack sequences the load to respect this dependency chain and surfaces a pre-flight report listing every unresolvable link before data commits.

  • Twenty CSV export caps at 20,000 records per operation

    Twenty's UI-based CSV export has a hard limit of 20,000 records per export operation. Bill4Time workspaces with more than 20,000 time entries, invoices, or combined records require batched exports via Twenty's REST or GraphQL API. The API rate limits on Twenty's Pro plan are 100 calls per minute and Organization is 200 calls per minute — sufficient for migration workloads but requiring throttling logic in the export script. We handle this by pulling data in paginated batches and re-assembling the export files before import, staying within Twenty's rate limits.

  • Bill4Time Enterprise-tier custom fields required for full field mapping

    Bill4Time custom fields — available only on Enterprise Add-On accounts — are the most likely source of data loss if the account does not hold an active Enterprise subscription at migration time. On Pro or lower tiers, only standard Bill4Time fields export. If the migration plan includes custom fields, we verify the Enterprise Add-On status during scoping. If the subscription has lapsed, custom field data cannot be pulled via the API and would need to be exported manually from the UI before the migration begins.

  • Bill4Time workflows do not export and cannot be reconstructed from API data

    Bill4Time's Workflow Templates (Enterprise Add-On feature for task routing and matter-step automation) are not exposed via the v1 or v2 API. The workflow definitions — step names, trigger conditions, assignee rules, and recurrence patterns — exist only in the Bill4Time UI. We export a screenshot-based reference of every active workflow and provide it as a rebuild brief for your Twenty admin. Twenty's own workflow builder covers task creation and field-update automations but does not replicate Bill4Time's matter-step sequences natively. This gap requires manual rebuild effort that is scoped separately from the data migration.

Migration approach

Six steps for a successful Bill4Time to Twenty CRM data migration

  1. Audit Bill4Time data and verify Enterprise Add-On status

    FlitStack connects to Bill4Time via your API key (v1 or v2, whichever your plan exposes) and inventories all object types: Clients, Projects, Time Entries, Invoices, Expenses, and Users. We count records per object, flag the presence of custom fields, and verify whether the Enterprise Add-On is active — this determines whether custom field definitions are accessible for migration. We also identify duplicate records, records with missing required fields (clientId with no name, time entries with no date), and records where the assigned user has no email address. The audit output is a data-quality report that your team reviews before migration scoping is finalized.

  2. Build the Twenty custom object schema before any data loads

    Twenty requires all custom fields and custom objects to exist before CSV import can populate them. FlitStack delivers a schema-setup plan: create the Invoice custom object (with fields for invoice number, date, amount, status, client link, and a long-text field for the full JSON body) and any custom fields on Company, Opportunity, and Task that carry Bill4Time-specific data. Workspace Members must also be invited and accepted before the migration runs so owner resolution by email match succeeds on the first pass. We deliver this as a step-by-step setup checklist your Twenty admin completes in Settings → Data Model before FlitStack begins the data migration.

  3. Run a sample migration of 200–500 representative records

    A representative slice — typically 200–500 records spanning the most complex object types — migrates first against a test Twenty workspace. FlitStack generates a field-level diff comparing source Bill4Time values against the migrated Twenty records. Your team reviews the diff to confirm that project-to-opportunity mapping, time-entry-to-task linking, owner resolution, and custom field population all render correctly in Twenty's UI. Any field mapping corrections feed back into the migration configuration before the full run. This step typically runs 24–48 hours after the schema is confirmed ready.

  4. Execute the full migration with delta-pickup window

    The full migration runs against your live Bill4Time workspace using read-only API access. Companies load first, then Opportunities (linked to Companies), then Tasks (linked to both). Invoice records and custom Bill4Time fields populate after their target objects exist. During the cutover window — typically 24–48 hours — your team continues working in Bill4Time. A delta-pickup pass at the end captures any new or modified time entries, projects, or clients logged during the migration run. FlitStack writes an audit log of every record inserted or updated. One-click rollback is available if post-migration reconciliation identifies unexpected gaps.

  5. Deliver a workflow-rebuild brief and post-migration reconciliation report

    After data lands in Twenty, FlitStack delivers two documents: a workflow-rebuild brief enumerating every active Bill4Time Workflow Template with screenshots and step definitions, formatted for your Twenty admin to recreate in Twenty's workflow builder; and a reconciliation report comparing Bill4Time record counts by object type against Twenty record counts, with a list of any records that failed to migrate and the reason for each failure. Any records that failed due to missing foreign-key targets (unresolved users, orphaned projects) are queued for manual resolution with a one-click retry once the dependency is corrected.

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.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 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 Twenty CRM.

  • Object compatibility

    B

    2 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 Twenty CRM 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 Twenty CRM data migrations

Answers to the questions buyers ask most during Bill4Time to Twenty CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Bill4Time to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most Bill4Time-to-Twenty migrations complete within 48–72 hours of clock time for workspaces under 50,000 total records. The longest phase is typically schema setup in Twenty (creating the Invoice custom object and all custom fields) and owner resolution for Bill4Time users who need Twenty invitations. Heavier workloads — over 500,000 time entries or multi-year invoice history — extend to 5–7 days because data must export in API-batched chunks and the custom Invoice object requires validation across multiple sub-objects. FlitStack delivers a time estimate within 24 hours of scoping based on the record counts pulled during the audit phase.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Bill4Time.
Land in Twenty CRM, 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