Definition → Processor → Data. One pattern, everywhere.
Every non-trivial capability follows the same three-part shape. Once the processor is tested, new behaviour is just a new definition, not new code. That is the lever that compounds on every subsequent feature.
A JSON document that captures intent: this object, this flow, this agent, this campaign. Versioned, diffable, reviewable like source code.
Runtime code that consumes documents of that shape. Tested once, thoroughly; every subsequent definition inherits that guarantee.
The actual customer records, messages and events processed against the definition.
What customers use
A CRM as the core product, with the sales-workflow layer on top. Every surface renders dynamically from definitions on a shared runtime.
CRM · Classic
Live · core productContacts, companies, deals, pipelines, tasks, notes and any number of custom modules, all as Module definitions. Forms, lists, detail views and validators render fully dynamically.
Email · Marketing + Mail Client
Live · bestsellerCampaigns (audience via Lead Search) and a full 1:1 mail client inside the CRM. Sending goes through the customer's own channel (SMTP / Google / Microsoft); reputation stays with their domain, no shared relay.
Calling & Call Intelligence
In progressA Twilio dial-pad (WebRTC) & SMS already exist in the CRM. Being extended into a sales-call layer: pre-call briefing, in-call assistance, post-call summarisation, each on Agent & Flow definitions.
AI Chat / Assistant
Approaching launchA global assistant layer spanning every CRM feature, embedded and standalone. Evolves from Q&A chat into a personal assistant: next-best actions, drafts, deal summaries, cross-feature flows.
Content Creation
PlannedAssistant for website copy, outbound content and chat scripts. Agent definitions with brand guardrails, review flows and per-channel publishing connectors.
Additional channels
RoadmapSMS, WhatsApp, LinkedIn and further outreach channels on the same Agent + Flow substrate. The channel is new; the shape of the work is not.
How we solve it: six subsystems, one pattern
The same definition/processor shape carries six very different subsystems. New subsystems inherit inspectability, versioning, AI-authorability and testability for free.
| Subsystem | Definition | Processor |
|---|---|---|
| CRM modules | Fields · form · list · detail · validators | react-fe renderer + laravel-api schema/validator |
| Process flows | Steps · branches · tool / LLM / agent calls | Orchestrator Engine |
| AI agents | Prompt · tools · memory · guardrails | Orchestrator Engine + AI API |
| MCP tools | Name · input/output schema · side-effect scope | MCP Processor |
| Email campaigns | Audience · template · schedule · deliverability | laravel-api campaign engine + SMTP |
| Lead search | Search / crawl / enrichment definitions | lead-search-engine |
Nine services, cleanly bounded
Multi-tenant from row zero. Each service has an identity and (often more informative) a defined anti-scope. The Orchestrator is the centre every AI capability converges on.
System of record. CRM data (MySQL), auth, tenant boundary, queues (Horizon), outbound integrations.
Multi-audience surface (customer/admin/support/dev). Renders dynamically from definitions. Hosts CRM, marketing, calling & the 5 authoring tools.
Executes every Flow & Agent definition. One runner, three entry paths: chat, in-CRM action, headless trigger.
The model gateway. Every LLM call, embedding and RAG retrieval crosses this boundary; provider swap = one place.
Hosts the MCP tool catalogue. Registered once → callable everywhere. Validates inputs/outputs, enforces side-effect scope.
Real-time assistant surface, embedded & standalone. Consolidating onto the Orchestrator store (path to a stateless FE).
B2B retrieval & enrichment. Crawlers + 3rd-party → normalisation/dedup → Qdrant vector store (RAG-ready). Sellable as a standalone API.
Outbound integration, live in production. Connects Wholix to thousands of apps via Zapier's catalogue. Marketplace listing = GTM switch.
Infrastructure as code. AWS (CRM stack) + Hetzner (AI stack), DNS, TLS, environments, deploy scripts. No hidden cloud config.
Data flow across the platform
The authoritative topology: every node and every dependency below has a running process and a working connection in production today. Requests flow top-to-bottom; every LLM call crosses the AI API, every CRM read/write crosses the Laravel API.
Chat messages, in-CRM actions and headless triggers all resolve to one set of Flow definitions on the Orchestrator, through one observability layer. This mirrors the authoritative Mermaid topology in Part III · §9. See the repo for the exact arrowed diagram.
Multi-tenancy as a primitive, not a filter
account_id.- At the schema: the persistence layer refuses cross-account writes.
- At the API: every request resolves an account context first, so no path reads CRM data without a scope.
- In the runtime: Orchestrator, AI API, MCP, Lead Search carry the account context through every internal call.
- Customer sending never uses a shared relay; deliverability reputation stays with the customer.
- Secrets never in git. Per-tenant secrets encrypted at rest, decrypted only at the boundary that uses them.
- SOC 2 Type I preparation, SSO & an audit-log inventory are within the current planning horizon.
The authoring tools are the product and the moat
Feature velocity is unbundled from release velocity. The extender pool grows over time: today engineers & senior CSMs → 2026 power users → 2027 AI-assisted → beyond, runtime adaptation.
Module Builder
Live internalCRM objects as JSON → forms, lists, detail, validators, permissions. Saving migrates the schema & deploys renderers automatically.
Flow Studio
Live internalVisual authoring of Process Flows (branches, tool / LLM / agent calls). Output = a Flow definition for the Orchestrator. Every run produces traces.
Agent Builder
Live internalDeclarative agents (prompt + tools + memory + guardrails + model policy) as JSON, versioned, tested, composable inside Flows.
MCP Tool Catalogue
Live internalRegister a capability once → instantly callable from every Agent & Flow, including existing ones. Single source of truth for "what can this platform do".
+ Process Builder
Live · daily productionAn older but still-used surface for CRM-centric automations (LLM agents + CRM data operations), executed as Laravel Horizon workers. Bidirectionally composable with Flow Studio: a Process can invoke a Flow and vice versa.
Six-stage pipeline: fast and safe
Cheap checks early, deliberate decisions late. Every PR gets an ephemeral live environment (FE + API) with isolated fixture data. AI accelerates the input; the pipeline enforces the same standard regardless of how the code was authored.
Three independent scaling vectors
Each addressable without touching the others. Per the deep-dive, 10× and 100× are operational changes, not an architectural rewrite. The third vector is the one that returns capital on a different curve.
Stateless services, queue-backed workers, horizontally ready. Adding capacity = a Terraform change, not an architecture change.
Account-isolated schema & hot paths. New tenants do not degrade existing ones, with no shared points of contention.
Every new capability delivered through the authoring tools multiplies what an engineer (and soon a power user, then an AI) can ship without touching code.