Skip to content
Custom Software & CRM3 min read

Build a customer portal on top of an existing CRM without copying the CRM

A portal should expose a deliberate customer contract, not the CRM's internal tables. Decide which system owns each field and how an uncertain write is reconciled.

CRMAPIsPortals
Customer portal connected to CRM data through an integration layer

Build the portal as a narrow customer-facing layer over the CRM, with explicit ownership of each data field. Do not expose the CRM schema or credentials to the browser. A portal can be valuable without replacing the CRM or duplicating its entire database.

Start with one customer journey

Suppose customers need to view service requests and upload a document. Map the request lifecycle, which fields customers may edit, and what staff may change in the CRM. Identify the authoritative system for status, attachments and identity. A screen mockup is not enough; the disagreement cases define the integration.

Put a service boundary between browser and CRM

The portal backend authenticates the user, resolves their organization and authorizes each requested record. It exposes purpose-built endpoints, then calls a CRM API or integration service using server-held credentials. Filter responses down to customer-safe fields; an internal note should not leak because it happened to sit beside a visible status field.

Customer browser -> Portal API -> authorization + DTO -> CRM API
                   |
                   +-> portal-owned upload/status record where required

Prefer direct reads where latency and availability allow. Cache or replicate only the subset that needs it, with a visible freshness contract. A nightly copy may be acceptable for reference data but wrong for a customer checking whether their case was closed ten minutes ago.

Handle uncertain writes honestly

If the CRM times out after the portal submits an update, the portal does not know whether the CRM committed it. Store an operation identifier, reconcile by that identifier where the CRM supports it, and show pending or needs-review rather than claiming success or automatically resubmitting. Audit the actor, the request and the final outcome.

This pattern is unnecessary when a CRM's own secure customer portal already meets the business need. First test configuration and extension options. Custom development earns its cost when the required workflow, identity boundary or cross-system view genuinely exceeds them.

A field ownership exercise

Take a service request with customer contact, priority, internal owner and resolution status. The portal may own the submitted description, the CRM may own assignment and resolution, and an identity service may own user membership. Write that ownership down field by field. A bidirectional sync of every field is usually a conflict generator, not an integration plan.

When customer data changes in two systems, define precedence or a human review path. Do not rely on last-write-wins for addresses, contractual status or permission fields without understanding the consequences. Keep a source record identifier and a change version to investigate disagreements.

Security at the seam

The CRM's service credential may be able to read every customer. The portal backend must narrow that power for each request. Test that changing the record ID in a URL cannot expose another tenant's case. Redact internal notes, staff-only attachments and fields whose disclosure would violate the customer's contract.

Separate CRM downtime from portal downtime. A cached view can say when it was last refreshed, but a write should show pending or unavailable unless the portal has a durable acceptance queue. If the queue exists, define an escalation time and a way to reconcile uncertain outcomes.

A useful proof of concept is one customer journey, one tenant and one sanitized dataset. It should demonstrate access boundaries and correction behavior, not just a beautiful dashboard.

Services This Relates To

Written by KYCONNECTS Engineering.

Talk Through Your Requirements

We typically respond within 4–8 business hours.