Every CRM migration turns into a project because the platform is the code. Formula fields written in a proprietary scripting language. Workflow logic tied to a vendor toolkit. A role hierarchy that only makes sense inside one console. An admin surface with a separate sandbox-to-production release ceremony. By the time you’ve mapped it, transformed it, and re-implemented the surrounding automation, six-to-eighteen months are gone.

Actionary sits on public foundations. The data lives in Postgres. The agent uses the same tools the app uses. The storage layer is S3-compatible. The role model is a small set of grants. Every load-bearing layer is a public specification with multiple compatible implementations. Moving data in is a standard ETL job. Moving it out is one database-export command.

pg_dump is the exit plan

Full-stack backup — schema, rows, retrieval index — runs as one command against PostgreSQL 16. The search index rides in the same export as the customer records. There is no separate vector store to re-hydrate. There is no hosted transcription surface to re-license. The audit log is a table. The workflow engine’s state is a table. The public webhook ledger is a table. pg_dump walks all of it.

The commitment that makes this real: no proprietary database quirks, no proprietary cloud services in the critical path. Standard SQL against standard PostgreSQL, so there is no schema portability tax on the way out. See the substrate for the mechanics.

The role model is a set of grants

Legacy CRMs ship a role hierarchy — profiles inheriting from profiles, permission sets stacking on permission sets, a sharing rule engine that fires on every write. Unwinding it is an archaeology exercise.

Actionary’s contract is smaller. Platform-admin access is one clear session flag, held to a SOC 2 invariant. Row-level access is one grant per record-and-grantee pair, where the grantee is a user, team, department, role, tenant, or partner. Entity-level access is the set of grants the caller holds.

That is the model. There is no hierarchy to invert, no sharing rule to translate, no formula-field scripting to port. What you had elsewhere becomes rows in three tables.

Schema change is a diff

The schema definitions drive the app, the admin API, the agent’s tool surface, the audit log, and the search index from one source of truth. Adding a new entity is a small migration plus a row in the schema. The app renders it, the API serves it, and external agent clients (Claude Desktop, Cursor, any standards-compliant caller) see it in the tool catalogue — automatically.

Migrations apply through an in-app runner with content-hash drift detection. The runner reads numbered SQL files in order, applies each one under a database lock, and records the content hash. A hash mismatch flags drift and refuses to silently re-run. The developer who wrote the migration is the one who applies it — no DBA gate, no metadata API dance. Detail lives with the CTOs’ brief.

The stack is public specifications

Every layer is replaceable. PostgreSQL 16. Redis 7. S3-compatible object storage (Cloudflare R2, MinIO, Backblaze B2 — one environment-variable swap). OpenTelemetry for observability. Open standards for the agent tool surface and machine identity. Docker for the runtime. The LLM provider is per-tenant configuration — Anthropic, OpenAI, Bedrock, Azure OpenAI, Gemini all work as full streaming adapters, and bring-your-own-key credentials are encrypted with a tenant-scoped key derived from the platform master key.

The application core Actionary owns — the retrieval pipeline, the durable workflow engine, the schema layer, the permission contract — sits behind those open boundaries. The stance is the industry pattern for portable software: adapters at the edge, domain code at the core. Full stance at open standards.

Migration is a straightforward ETL

Extract from the source system’s export API. Transform to the field shape you configured in Schema Admin. Load through the same admin API the app uses, or through agent tools if the agent is doing the load. Row-level grants get one row per share. Files land in the tenant’s private storage bucket through the secure upload flow. Audio and video assets index automatically through the shared chunker and transcription pipeline — the same one the in-app meeting recorder uses.

No vendor toolkit on the critical path. No proprietary scripting language to rewrite. No sandbox-to-production ceremony holding up the cutover.

The takeaway

Closing the door on vendor lock-in is a quarter of work. The data model exports through a public utility. The stack rests on public specifications. The permission model is a small set of grants. The schema is metadata that any migration can extend. When the next CTO walks in and asks how the exit story works, the answer is the answer for every layer — and the CFO’s version is that migration cost sits inside one budget cycle.