CRM migration
Field-level mapping, validation, and rollback between Voopty Inc. and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Voopty Inc.
Source
Twenty CRM
Destination
Compatibility
8 of 10
objects map 1:1 between Voopty Inc. and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Migrating from Voopty Inc. to Twenty CRM is a cross-category move from a niche school-management platform to a general-purpose open-source CRM. Voopty organizes data around Students, Courses, Scheduled Sessions, and Attendance; Twenty uses People, Companies, Opportunities, Tasks, and Custom Objects. The structural difference means there is no direct object-by-object equivalence — Courses map to Custom Objects, Students and Clients map to People records, and attendance and scheduling history requires a custom object schema built in Twenty before migration. Voopty has no documented public API, so data extraction requires either CSV exports from the platform UI or coordination with Voopty support. We do not migrate Workflows, automations, or Telegram/email campaign configurations; we deliver a written inventory of these for the customer's admin to rebuild in Twenty's settings. The self-hosted and open-source nature of Twenty eliminates per-seat licensing costs indefinitely, which is the primary financial driver for this switch.
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.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Voopty Inc. 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.
Voopty Inc.
Student
Twenty CRM
Person (custom Student fields)
1:1Voopty Student records map to Twenty Person records with custom fields added via Settings > Data Model before import. Required custom fields include student_id (external reference), enrolled_courses (multi-select or related Custom Object link), attendance_rate (calculated percentage), and enrollment_status (active/inactive/enrolled). Voopty contact details (email, phone, address) map directly to the standard Person fields. We set Person type = Person since Twenty does not support a separate Student object natively.
Voopty Inc.
Client
Twenty CRM
Person
1:manyVoopty Client records (adult learners and parents who book services) map to Twenty Person records. Where a single Voopty Client account spans multiple Student records (parent-child relationships), we create Person records for each parent account and link them via a custom person_relationship__c field or topic tagging. Active-client status derived from Voopty's one-lesson-per-month threshold is preserved in a custom field original_active_status__c for future reconciliation.
Voopty Inc.
Teacher / Staff
Twenty CRM
WorkspaceMember
1:1Voopty Staff records with teacher and administrator roles map to Twenty WorkspaceMembers. Role assignments (teacher, admin) migrate as custom fields on the WorkspaceMember record. Voopty staff contact details map to the WorkspaceMember profile fields. We extract staff records before student records so that Teacher lookups on Scheduled Sessions and Attendance records are resolvable at migration time.
Voopty Inc.
Course
Twenty CRM
Custom Object: Course
1:1Voopty Course records (group classes and individual lesson configurations) map to a Twenty Custom Object named Course, created via the /metadata API before migration. Custom fields include course_type (group/individual), max_students (integer), duration_minutes (integer), and pricing_tier (text or picklist). Course definitions are migrated before Student enrollment records so that the lookup relationship resolves at import time.
Voopty Inc.
Student Enrollment
Twenty CRM
Custom Object: CourseEnrollment
lossyVoopty's student-course relationship (which students are enrolled in which courses) does not map to a native Twenty object. We create a CourseEnrollment Custom Object with fields student_id (lookup to Person), course_id (lookup to Course), enrollment_date, and status. This is the highest-risk relationship in the migration because it requires both the Student and Course records to exist and resolved before the enrollment import. We sequence CourseEnrollment last among core records.
Voopty Inc.
Scheduled Session
Twenty CRM
Custom Object: ScheduledSession
1:1Voopty Scheduled Sessions (both static fixed schedules and dynamic scheduling) map to a Twenty Custom Object named ScheduledSession. Fields include session_date (date), start_time and end_time, teacher_id (lookup to WorkspaceMember), course_id (lookup to Course), and session_type (static/dynamic). Recurrence rules from dynamic schedules are preserved as a custom recurrence_json__c text field. We convert static schedules to individual session records at migration time.
Voopty Inc.
Attendance Record
Twenty CRM
Custom Object: AttendanceRecord
1:1Voopty attendance tracking per session per student maps to a Twenty Custom Object named AttendanceRecord. Fields include student_id (lookup to Person), session_id (lookup to ScheduledSession), attendance_status (present/absent/excused), and notes. Status values require value-mapping since Voopty's attendance vocabulary may differ from the destination's conventions. We flag any attendance records with missing session references for manual resolution.
Voopty Inc.
Subscription
Twenty CRM
Custom Object: Subscription
1:1Voopty Subscription plans tied to students or clients map to a Twenty Custom Object named Subscription. Fields include subscriber_id (lookup to Person), plan_name, billing_cycle (monthly/quarterly/annual), amount, currency, start_date, and status. Billing cycle and pricing are stored as text and numeric fields rather than a native billing object since Twenty lacks a built-in subscription management module. We flag any subscription records referencing inactive Voopty clients for status reconciliation.
Voopty Inc.
Payment
Twenty CRM
Custom Object: Payment
1:1Voopty payment records tied to WayForPay, LiqPay, and Stripe integrations map to a Twenty Custom Object named Payment. Fields include payment_id (original transaction reference), subscriber_id (lookup to Person), amount, currency, payment_date, payment_provider (WayForPay/LiqPay/Stripe/other), and status (paid/pending/refunded). Provider references and transaction IDs preserve as text for audit purposes. Payment records are migrated after Subscription records so that the subscription_id lookup resolves correctly.
Voopty Inc.
Note (platform-level communications)
Twenty CRM
Note
1:1Voopty notes and session-level observations stored as text records map to Twenty Note objects linked via ContentDocumentLink to the parent Person or Custom Object record. We preserve note body as rich text and set the note creation date from the original Voopty timestamp. Notes are migrated after all parent records are in place.
| Voopty Inc. | Twenty CRM | Compatibility | |
|---|---|---|---|
| Student | Person (custom Student fields)1:1 | Fully supported | |
| Client | Person1:many | Fully supported | |
| Teacher / Staff | WorkspaceMember1:1 | Fully supported | |
| Course | Custom Object: Course1:1 | Fully supported | |
| Student Enrollment | Custom Object: CourseEnrollmentlossy | Fully supported | |
| Scheduled Session | Custom Object: ScheduledSession1:1 | Fully supported | |
| Attendance Record | Custom Object: AttendanceRecord1:1 | Fully supported | |
| Subscription | Custom Object: Subscription1:1 | Fully supported | |
| Payment | Custom Object: Payment1:1 | Fully supported | |
| Note (platform-level communications) | Note1: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.
Voopty Inc. gotchas
No documented public API for data export
Active client definition affects subscription mapping
Static scheduling exports require format conversion
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
Data extraction scoping and Voopty access coordination
We audit the Voopty portal for available export formats, record counts per object (Students, Clients, Teachers, Courses, Scheduled Sessions, Attendance, Subscriptions, Payments), and any custom fields or configurations. Because Voopty has no documented public API, we coordinate with Voopty support or guide the customer through CSV export from the platform UI. We validate export completeness against in-system record counts before accepting the export as our migration source. Any objects that cannot be exported in structured form are flagged and scoped as a manual-rebuild item.
Destination schema design and custom object creation
We design the Twenty CRM destination schema before any data import. This includes creating the Course, CourseEnrollment, ScheduledSession, AttendanceRecord, Subscription, and Payment Custom Objects via the Twenty /metadata API, adding all required custom fields (with correct field types: text, number, date, picklist, lookup), and configuring lookup relationships between Custom Objects. Standard Person and Company fields are also reviewed and extended with custom fields where Voopty contact data has sub-structures not covered by Twenty's defaults. Schema is validated in a Twenty staging workspace before production deployment.
WorkspaceMember provisioning and user mapping
We extract every distinct Voopty Teacher and Staff record and map them to Twenty WorkspaceMembers. Voopty role assignments (teacher, administrator) migrate as custom fields on the WorkspaceMember. WorkspaceMembers must be provisioned and active in Twenty before any ScheduledSession or AttendanceRecord records are imported, since these records carry teacher lookups. Any Voopty staff without a corresponding Twenty user are held in a reconciliation queue for the customer's admin to provision.
Core record migration in dependency order
We run production migration in record-dependency order: WorkspaceMembers first (for teacher lookup resolution), then Persons (for Student and Client records), then Course Custom Object (for enrollment lookups), then CourseEnrollment Custom Object, then ScheduledSession Custom Object, then AttendanceRecord Custom Object, then Subscription and Payment Custom Objects. Each phase emits a row-count reconciliation report before the next phase begins. Voopty active-client status derived from the one-lesson-per-month threshold is preserved in a custom field for audit.
Cutover, validation, and automation rebuild handoff
We freeze Voopty writes during cutover, run a final delta migration of any records modified during the migration window, then enable Twenty as the system of record. We validate a sample of 30-50 records per object type against the Voopty source for field-level accuracy. We deliver a written inventory of any Voopty Telegram campaigns, email campaign configurations, or workflow-style automations that cannot migrate, with a rebuild guide for Twenty Settings. We support a one-week post-migration window for reconciliation issues.
Platform deep dives
Voopty Inc.
Source
Strengths
Weaknesses
Twenty CRM
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 Voopty Inc. and Twenty CRM.
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
Voopty Inc.: Not publicly documented. We confirm available export channels with Voopty support before scoping a migration..
Data volume sensitivity
Voopty Inc. 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 Voopty Inc. to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Voopty Inc. to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Voopty Inc.
Other ways to arrive at Twenty CRM
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.