You've built your client base in Notion. Your contacts table is clean, your deal pipeline has custom rollups, linked records track conversations and invoices. Then you hit 300 active contacts and everything stalls. Rollup calculations lag by hours. Linked records stop syncing reliably. The export flattens your entire relationship graph into a spreadsheet. You realize Notion was never built for CRM at scale—and your data is now trapped in a system that can't deliver it whole. This isn't a Notion flaw; it's a design boundary. Notion optimizes for documents and views, not relational data at volume. But that doesn't mean your work is lost. With the right extraction sequence, you can recover every contact, every relationship, every deal—and move it to a platform built to scale. Here's the checklist that survives the switch. Why Notion breaks at 300 contacts Notion's database engine is document-first, not SQL. Each record is stored as a document; rollups and linked records are calculated on-the-fly. At small scale (under 50 contacts), queries are instant. By 300 contacts, you hit two hard walls: Rollup latency. A formula like rollup(deals.value, sum) must scan every deal linked to every contact. Notion's backend doesn't index these joins efficiently. The result: multi-second delays, timeout errors, or stale totals. Linked record sync breakdown. Notion's two-way linked records are not atomic. If you add a contact to a deal, the reverse link sometimes doesn't appear for minutes. At 300 contacts with 500+ cross-linked deals, sync breaks become routine. Export flattening. Notion's CSV export collapses every multi-select, relation, and rollup into text. A contact linked to 10 deals becomes a comma-separated string. A rollup of deal values becomes a single text field. You lose the structure entirely. The core problem: Notion treats databases as views of a document store. CRM demands a relational model. At 300 contacts, the gap becomes catastrophic. Step 1: Audit what you actually have (before export) Before you touch an export button, map your data schema in Notion itself. This takes 30 minutes and saves you days of reconstruction. List every table. Contacts, Deals, Invoices, Activities, Companies—write them down. For each table, log every field type: Text, Number, Date, Checkbox (simple fields) Multi-select, Select (pick lists) Relation, Rollup, Formula (derived data) Email, Phone, URL (special fields) Map every relation and rollup. "Deals linked to Contacts" — which direction? One deal per contact, or many-to-many? What's the rollup doing? (Sum, count, average, concatenate?) Write it down verbatim. Test the rollups live. Open a contact with 5+ linked deals. Does the rollup show instantly? Does it lag? Screenshot or note any errors. This map becomes your recovery blueprint. Without it, you'll rebuild blind and lose relationships. Step 2: Pull raw data via Notion's API (not CSV export) The CSV export is a trap. It flattens everything. Instead, use Notion's API to extract structured JSON, which preserves relationships. You'll need: A Notion integration token (create one at notion.so/my-integrations) The database ID for each table (visible in the URL when you open the database) A script to call the API (Python, Node.js, or cURL) Basic workflow: Query the Contacts database via POST /v1/databases/{id}/query . Notion returns paginated JSON with every field intact, including relation IDs. For each contact, the relation field (e.g., "linked_deals") will include deal IDs. Save those IDs. Query the Deals database and cross-check those IDs. You now have a join table in JSON. Do the same for Invoices, Activities, Companies. Save all JSON locally. You now have the raw relational structure. This takes an hour or two, but it's the only way to extract relationships intact. CSV will not do it. Pro tip: Notion's API has a rate limit of 3 requests per second. For 300+ contacts, this may take 10–30 minutes. Be patient; don't retry aggressively. Step 3: Map and transform your schema Now you have clean JSON. But your new platform (Orin, HubSpot, Pipedrive, etc.) has a different schema. You need to map every Notion field to the target platform. Create a mapping table: Notion Field Type Target Field Transform Rule Contact Name Text First Name + Last Name Split on space, or keep as full name Email Email Email None (direct map) Phone Phone Phone Strip non-numeric if needed Deal Tags (multi-select) Multi-select Tags or Category Join into comma-sep or split into rows Linked Deals (relation) Relation Deals table + Contact ID Re-link by ID in target platform Total Deal Value (rollup) Rollup Re-calculate in target Sum all linked deal values on import For fields that exist in both systems (email, phone, name), it's a 1:1 copy. For relations and rollups, you'll rebuild them in the new platform using the target's native linking. Tools to help: Zapier or Make (formerly Integromat) : Can transform Notion JSON field-by-field before pushing to your target