Open API CRM Connector Framework — v1.0.19
Open API CRM Connector Framework
Available from v1.0.19
NurtureHub's CRM connector framework provides bidirectional sync between NurtureHub and the major UK proptech CRMs — Reapit, Alto, Street, and Loop — through a single, consistent integration layer.
Supported CRMs
| CRM | Provider |
|---|---|
| Reapit | Reapit Ltd |
| Alto | Zoopla Property Group |
| Street | Street.co.uk |
| Loop | Loop Software |
How It Works
Each CRM connector implements a standard four-method interface. This means all connectors behave identically from NurtureHub's perspective — credentials, sync schedules, conflict resolution, and error recovery are all handled uniformly regardless of which CRM you use.
Standard Connector Interface
interface CRMConnector {
authenticate(): Promise<void>
listContacts(): Promise<Contact[]>
pushContact(contact: Contact): Promise<void>
subscribeToEvents(handler: EventHandler): Promise<void>
}
authenticate()
Exchanges credentials (API key or OAuth flow) with the CRM provider and stores the resulting tokens encrypted at rest. Re-authentication and token refresh are handled automatically.
listContacts()
Fetches all contact records from the connected CRM and normalises them into NurtureHub's internal contact schema. This runs on a scheduled basis via Inngest cron jobs.
pushContact(contact)
Writes a NurtureHub contact record — including any updated fields or engagement signals — back to the CRM. This is called automatically when a contact's status or score changes in NurtureHub.
subscribeToEvents(handler)
For CRMs that support webhooks, this registers a real-time event listener so that changes made inside the CRM are reflected in NurtureHub immediately, without waiting for the next scheduled poll.
Sync Scheduling
Polling-based sync is powered by Inngest cron jobs. The schedule runs automatically in the background — no manual triggers are required. For event-driven CRMs, subscribeToEvents() replaces polling with real-time webhooks where supported.
Conflict Resolution
When a contact record is modified in both NurtureHub and the connected CRM between sync cycles, the framework applies a last-write-wins strategy:
- The record with the most recent modification timestamp is kept.
- The discarded version is not deleted — it is written to an audit trail.
- The audit trail is immutable and records: which system's version was applied, the timestamp of both writes, and the fields that differed.
This ensures no data is silently lost and every conflict resolution decision is traceable.
Error Recovery
All connector operations (authenticate, listContacts, pushContact, subscribeToEvents) are wrapped in error recovery logic:
- Transient failures (network timeouts, rate limits) are retried automatically with exponential backoff.
- Persistent failures (invalid credentials, revoked access) surface as actionable alerts in the NurtureHub dashboard.
- Failed operations are never silently dropped.
Credential Security
All credentials — including API keys, OAuth access tokens, and refresh tokens — are encrypted at rest. Plaintext credentials are never stored in the application database or exposed via any API response.
Managing Integrations
All CRM connectors are managed from a single page:
/dashboard/settings/integrations
From this page you can:
Connect a CRM
- Navigate to
/dashboard/settings/integrations. - Locate the CRM you wish to connect.
- Click Connect and follow the authentication steps (API key entry or OAuth redirect, depending on the CRM).
- Once authenticated, the first sync runs automatically.
Trigger a Manual Sync
- Navigate to
/dashboard/settings/integrations. - Find the connected CRM.
- Click Sync to trigger an immediate, out-of-schedule sync.
Disconnect a CRM
- Navigate to
/dashboard/settings/integrations. - Find the connected CRM.
- Click Disconnect.
- NurtureHub will revoke its access and remove all stored credentials for that CRM. Existing contact records in NurtureHub are retained.
Notes
- Disconnecting a CRM does not delete contacts already synced into NurtureHub.
- The audit trail for conflict resolution is retained independently of the connection status.
- Each CRM connection is scoped to a single agency account — credentials are not shared across accounts.