CRM migration

Migrate from LawPracticeZA to Twenty CRM

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

LawPracticeZA logo

LawPracticeZA

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

92%

11 of 12

objects map 1:1 between LawPracticeZA and Twenty CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

LawPracticeZA is a South African legal practice management platform built around clients, matters, fee earners, and trust accounting — with deep compliance controls for the Legal Practice Act. Twenty CRM is an open-source general-purpose CRM with standard objects for People, Companies, Opportunities, Tasks, and Notes, plus a custom-object model that your admin configures in Settings → Data Model. The two platforms share no native legal-matter or trust-accounting objects, which means the migration requires custom-field creation on Twenty's Opportunities object to hold matter references, trust-account balances, and client-specific billing data. FlitStack AI reads LawPracticeZA via its REST API (authenticated as a bookkeeper-level API user), extracts client records, matter records, fee-earner assignments, and trust-account transactions, then maps them into Twenty's People and Companies objects first, followed by Opportunities with a cascade of custom fields. Billing invoices and trust transfers are exported as structured CSV for re-import into Twenty as Note attachments or custom-object records — they do not map as native billing objects because Twenty has no invoice or trust-account entity. We sequence the migration so parent relationships resolve correctly: Companies → People → Opportunities. Owner resolution matches LawPracticeZA fee-earner email addresses to Twenty workspace member email addresses. A sample import runs before the full cutover, and a 24–48 hour delta window captures any LawPracticeZA records modified during the switchover.

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

LawPracticeZA logo

LawPracticeZA

What's pushing teams away

  • API documentation is incomplete and focused narrowly on fees, invoices, and transactions — limits automation and migration capabilities
  • Rate limits are not publicly documented, making it difficult to plan bulk data extraction without trial-and-error
  • Firms outgrowing the platform's feature set often move to larger competitors with broader ecosystem integrations
  • Limited third-party integration options frustrate firms wanting to connect legal practice management with other business tools
  • Regional focus to South Africa and Botswana restricts multi-jurisdiction firms from using a single system

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 LawPracticeZA objects map to Twenty CRM

Each row shows how a LawPracticeZA 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.

LawPracticeZA

Client

maps to

Twenty CRM

People

1:1
Fully supported

LawPracticeZA clients map directly to Twenty People. The client name splits into firstName and lastName on the Twenty People record. If LawPracticeZA stores a company name instead of an individual name, the record maps to a Company in Twenty and a People record is created as the primary contact within that Company.

LawPracticeZA

Client

maps to

Twenty CRM

Company

1:many
Fully supported

When a LawPracticeZA client record represents a law firm or corporate entity rather than an individual, the name maps to Twenty Companies. The People record created from the same client row becomes the primary contact linked to that Company via the People.companyId relation. This split is resolved during the mapping phase using the client name format and presence of an email address.

LawPracticeZA

Matter

maps to

Twenty CRM

Opportunity

1:1
Fully supported

LawPracticeZA matters have no direct Twenty equivalent. We map each matter to a Twenty Opportunity, capturing the matter name as Opportunity.name, the matter reference number as a custom field (Matter_Reference__c), and the matter status as a custom select field (Matter_Status__c). The Opportunity Stage in Twenty is set based on the LawPracticeZA matter phase — active matters map to an open stage, closed matters map to a Won or Lost stage depending on outcome.

LawPracticeZA

Matter Stage / Phase

maps to

Twenty CRM

Opportunity Stage

1:1
Fully supported

LawPracticeZA matter phases (Intake, Instruction, Drafting, Negotiating, Settlement, Trial, Closed) map value-by-value to Twenty Opportunity stage values. We create a stage-mapping table during discovery. Firms can rename Twenty stages to match their matter phases before migration so the import lands with correct labels.

LawPracticeZA

Fee Earner

maps to

Twenty CRM

WorkspaceMember

1:1
Fully supported

LawPracticeZA fee earners are attorneys and staff who bill time to matters. Twenty has no native fee-earner object — workspace members are regular Twenty users. We resolve each LawPracticeZA fee earner by matching their email address to a Twenty workspace member. If no match exists, the fee earner is flagged before migration and can be invited to Twenty first. Unmatched fee earners are assigned to a fallback Twenty user for time-tracking continuity.

LawPracticeZA

Trust Account

maps to

Twenty CRM

Custom Object (TrustAccount)

1:1
Fully supported

LawPracticeZA trust accounts have no Twenty equivalent. We create a TrustAccount custom object in Twenty (available on Professional and Organization tiers, or self-hosted) with fields for account number, bank name, opening balance, and running balance. Trust transfers between clients are stored as TrustTransaction records linked to the TrustAccount and to the People record.

LawPracticeZA

Invoice

maps to

Twenty CRM

Note + Custom Object (Invoice)

1:1
Fully supported

LawPracticeZA invoices are legal billing documents. Twenty has no invoice entity. We export invoice PDFs from LawPracticeZA, re-upload them as Files attached to the relevant Opportunity record in Twenty, and create an Invoice custom object capturing invoice number, date, amount, and status as read-only fields. The invoice PDF is linked as an attachment to the Invoice custom record.

LawPracticeZA

Time Entry / Fee Record

maps to

Twenty CRM

Note + Custom Object (FeeEntry)

1:1
Fully supported

LawPracticeZA fee entries record billable time against matters. We export fee entries as a FeeEntry custom object in Twenty — capturing date, hours, rate, description, and linked Opportunity. The original fee entry text is preserved as a Note on the Opportunity. Fee entries are not recreated as billable records in Twenty since Twenty has no native billing engine.

LawPracticeZA

Document / File

maps to

Twenty CRM

File

1:1
Fully supported

LawPracticeZA files attached to matters are downloaded and re-uploaded to Twenty's file storage, then linked to the corresponding Opportunity or People record. File names are preserved. Inline images embedded in documents are extracted and re-hosted as Twenty File attachments. The original document link URL from LawPracticeZA is stored in a custom text field on the Twenty record for traceability.

LawPracticeZA

Activity (Email, Call, Meeting)

maps to

Twenty CRM

Task + Event

1:1
Fully supported

LawPracticeZA activity logs (recorded time entries, ad hoc notes) map to Twenty Tasks for calls and general activities, and to Twenty Events for meetings with a start/end time. The original timestamp, fee-earner owner, and linked matter are preserved as fields on the Twenty record. If LawPracticeZA stores email body text, it maps to a Note on the related People or Opportunity record.

LawPracticeZA

Branch / Department

maps to

Twenty CRM

Custom Field on People/Opportunity

1:1
Fully supported

LawPracticeZA firms operating multiple branches store department assignments on staff and matters. Twenty has no native branch object — we create a Branch__c select field on People and Opportunity, populated from LawPracticeZA's department_id. Branch-level reporting is then achievable using Twenty's existing filter and grouping views on the custom field.

LawPracticeZA

Client Payment

maps to

Twenty CRM

Note on Opportunity

1:1
Fully supported

LawPracticeZA records client payments against invoices. Twenty has no payment tracking entity. We export payment records as structured CSV and attach them as Notes on the related Opportunity, capturing payment date, amount, method, and reference number. Firms using dedicated accounting software (Xero, Sage) for payment tracking should continue that workflow post-migration — Twenty is not a legal accounting system.

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.

LawPracticeZA logo

LawPracticeZA gotchas

High

South African trust accounting compliance requirements

Medium

Zone-based permission model does not map directly to other systems

Medium

API authentication uses firm code prefix and requires bookkeeper access

Low

Incomplete API reference requires support coordination

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

  • Trust-accounting data has no native Twenty home

    LawPracticeZA trust accounts and trust transfers are first-class legal compliance records in South Africa under the Legal Practice Act. Twenty CRM has no trust-accounting entity — there is no TrustAccount object, no running-balance field, and no linked transaction log. We create a TrustAccount custom object and a TrustTransaction custom object in Twenty Professional or Organization tier, with fields for account number, bank name, opening balance, running balance, and a linked transaction history. However, Twenty does not enforce trust-accounting rules (no prevented overdraft, no automated trust-to-business transfer workflows). Firms relying on LawPracticeZA's built-in trust compliance controls must either rebuild those controls in Twenty's workflow builder or continue trust accounting in a dedicated legal accounting tool. This is the most significant data-model gap in the migration.

  • Twenty CSV import requires strict ordering — matters cannot land before clients

    Twenty's CSV import function enforces a dependency chain documented in its Data Migration guide: Companies must be imported first, then People (which reference companyId), then Opportunities (which reference peopleId). LawPracticeZA exports all record types simultaneously, so the migration process must reorder the data before loading. If a matter's client has not yet been created as a People record in Twenty, the Opportunity import for that matter fails with a relation-not-found error. FlitStack sequences the migration as Companies → People → Opportunities and validates the dependency chain before each import run. Firms with circular or multi-party matter relationships (shared clients, class actions) may need additional junction-record handling.

  • Fee-earner-to-workspace-member resolution breaks without email parity

    LawPracticeZA fee earners may not have email addresses populated in the system — some firms create fee-earner records without contact details, especially for junior attorneys or trust-account-only staff. Twenty workspace members require an email to accept an invitation. When a LawPracticeZA fee-earner record has no email, FlitStack cannot automatically match it to a Twenty user for owner assignment on migrated Opportunities and FeeEntry records. We surface all unmatched fee-earner IDs in a pre-migration report. The firm's admin must either add email addresses to LawPracticeZA fee-earner records before export, or manually invite those users to Twenty first. Unresolved fee-earner records are assigned to a fallback Twenty user and flagged in the audit log.

  • Invoice PDFs do not become native Twenty records

    LawPracticeZA generates invoices as system documents with a structured data model (invoice number, line items, tax, totals, payment status). Twenty has no invoice object — invoices must be re-imported as either attached PDF files or as entries in a custom Invoice object with limited fields. We capture invoice number, date, client, amount, and status as custom fields on an Invoice custom object and attach the original PDF as a Twenty File. However, the line-item detail (individual fee descriptions, quantities, rates) does not map cleanly into Twenty's flat-field structure. Firms that need detailed invoice history for billing audits should export the full invoice dataset from LawPracticeZA as a structured report and store it in a document management system — not rely on Twenty for invoice record-keeping.

  • Starter tier API limitations affect delta-pickup and large exports

    LawPracticeZA to Twenty migrations that exceed 5,000 records may require multiple API pagination cycles to pull the full dataset. Twenty's Starter tier (free) does not include API access — the delta-pickup window and any post-go-live reconciliation queries require either a Professional or Organization tier subscription, or self-hosted deployment with full REST and GraphQL API access. We confirm the target Twenty workspace tier before scoping the delta-pickup mechanism. If a firm is on Twenty Starter, we implement a final manual CSV export from LawPracticeZA at cutover time and import it as a one-time delta batch rather than a live API sync.

Migration approach

Six steps for a successful LawPracticeZA to Twenty CRM data migration

  1. Audit LawPracticeZA data and map to Twenty schema

    FlitStack connects to LawPracticeZA using a bookkeeper-level API user (sufficient for all read and fee-posting operations) and exports a full data dump: all client records, matter records, fee-earner records, trust-account balances, trust transactions, invoice headers, and fee entries. We cross-reference this with the firm's stated record counts to confirm completeness. During this phase we also identify: clients with no email address, matters with no linked client, trust accounts with negative balances, and invoice records with missing line-item data. We produce a Data Assessment Report and a Field Mapping Document that names every source field and its Twenty destination — both standard and custom — before any data moves.

  2. Configure Twenty workspace: custom objects, fields, and users

    Before importing data, your Twenty admin (or our team) creates the schema the data will land into. We deliver a schema setup plan specifying: TrustAccount and TrustTransaction custom objects, custom fields on Opportunity (Matter_Reference__c, Matter_Status__c, Instruction_Date__c, Branch__c), a custom Invoice object with standard invoice fields, and a FeeEntry custom object. All Twenty workspace members who correspond to LawPracticeZA fee earners must be invited and have accepted their invitations before we attempt to resolve assigneeId on migrated Opportunities. We provide the exact email list to invite based on the fee-earner records extracted in Step 1.

  3. Resolve owners and run ordered test import

    Fee-earner email addresses from LawPracticeZA are matched to Twenty workspace member email addresses. Matched records set the Opportunity and FeeEntry assigneeId directly. Unmatched records are listed in a Pre-Migration Owner Report — your firm resolves these before the full migration runs. Once all owners are resolved, we run an ordered test import using a representative slice of data (typically 100–300 records covering clients, companies, matters, and a few trust transactions). The test import follows Twenty's required order: Companies first, then People with companyId populated, then Opportunities with peopleId and companyId populated, then custom objects last. We generate a field-level diff between the LawPracticeZA source values and the Twenty destination values so you can verify mapping accuracy before the full run commits.

  4. Run full migration with delta-pickup window

    The full data migration runs against your Twenty workspace. All client, company, matter, fee-entry, trust-account, and document records import in the correct dependency order. A delta-pickup window — typically 24 to 48 hours from the migration start time — captures any records created or modified in LawPracticeZA during the cutover period while your team continues working in the source system. FlitStack uses scoped read access on LawPracticeZA throughout this window; your team retains full read and write access to the source. At the end of the delta window, a final export captures in-flight changes and a reconciliation script compares record counts and key field values between source and destination. An audit log records every operation. One-click rollback reverts the Twenty workspace to its pre-migration state if reconciliation uncovers critical discrepancies.

  5. Post-migration: document export and rebuild handoff

    After migration, FlitStack delivers: (1) a migration summary report with record counts, any unmapped fields, and a list of custom-field values populated; (2) a JSON export of all field mappings for your records; (3) a CSV export of all LawPracticeZA invoice line-item detail for import into a dedicated billing tool if needed; (4) a rebuild reference for LawPracticeZA workflows — we document each automation rule's trigger, condition, and action so your Twenty admin can recreate equivalent logic in Twenty's workflow builder. Trust-accounting compliance logic (overdraft alerts, trust-to-business transfer approvals) is explicitly called out as a separate configuration project since it requires business-rule decisions, not just data migration.

Platform deep dives

Context on both ends of the pair

LawPracticeZA logo

LawPracticeZA

Source

Strengths

  • Built-in compliance with South African legal trust accounting rules and audit requirements
  • WhatsApp invoice delivery option reaches clients without reliable email access
  • Phased migration approach allows firms to go live incrementally rather than一次性 big-bang cutover
  • Cloud-based with full mobile access — fee earners can invoice from court or remote locations
  • Proven adoption by thousands of users including advocates across all legal specialities

Weaknesses

  • API documentation is incomplete and only covers fees, invoices, and transactions broadly
  • Rate limits are not publicly documented, complicating bulk extraction planning
  • Limited third-party integrations restrict automation and ecosystem connectivity
  • Smaller vendor with fewer development resources compared to global competitors
  • Regional focus limits firms operating in multiple jurisdictions outside South Africa and Botswana
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 LawPracticeZA 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

    LawPracticeZA: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your LawPracticeZA 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 LawPracticeZA to Twenty CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most LawPracticeZA to Twenty migrations complete within 48–72 hours for firms with fewer than 5,000 client and matter records. The delta-pickup window adds another 24–48 hours to the overall cutover window. Firms with large matter histories (10,000+ records), multiple trust accounts, or extensive document attachments extend to 7–14 days because document re-upload and trust-account data setup require manual configuration steps in Twenty before import can complete. The longest planning step is the schema setup in Twenty — creating custom objects and inviting workspace members — which typically takes 2–3 days before any data moves.

Adjacent paths

Related migrations to explore

Ready when you are

Move from LawPracticeZA.
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