Integration notes: Oper and the Bank's CRM
1. Context
The Bank's CRM holds every customer in every branch; its API is unverified, see section 6.
The connector is 1 adapter in Oper's integration framework; bank rules stay in configuration. Assumption: framework, roles, case audit trail, configurable fields and steps exist (Oper platform team).
The CRM stays master of identity: number, flags, owning branch, details; Oper never updates an existing customer. Oper owns prospects (delete-after stamped), dated snapshots, and the lookup audit log.
2. Data flows
| Direction |
Data |
When |
Purpose |
Personal data? |
| Into Oper |
Thin rows: name, date of birth, place of birth, city, masked number |
Go-live |
Pick the person |
Yes |
| Into Oper |
Customer detail by number, agreed field set |
Go-live |
Fill case, write snapshot |
Yes |
| Into Oper |
Status flags and values, on detail only |
Go-live |
Guard at selection and milestones |
Yes |
| Into Oper |
Branch marker per record |
Go-live |
Second filter, mismatch alert |
No |
| Into Oper |
Error codes, rate limit headers, overflow flag |
Go-live |
Backoff, forced refine |
No |
| Into Oper |
Unscoped match at milestone, back office |
Go-live |
Stop cross-branch duplicate |
Yes |
| Into Oper |
Customer number from create |
Go-live |
Link case to master record |
Yes |
| Into Oper |
Products, address history, segment |
Phase two |
Separate common names |
Yes |
| Into Oper |
Neutral existence signal on exact match, unscoped, at search time |
Phase two |
Referral without disclosure; needs a written DPO yes |
Yes |
| Out of Oper |
Exact keys: customer number, IBAN (CRM question 11); fuzzy: name, date of birth, place of birth (optional, CRM question 11); advisor id, branch, correlation id |
Go-live |
Find the person |
Yes |
| Out of Oper |
Customer number on detail, each live flag read |
Go-live |
Read selected record |
Yes |
| Out of Oper |
Create payload: identity fields, case reference, prospect id as key |
Go-live |
The 1 write |
Yes |
| Out of Oper |
Change request raised as a task to the CRM owner, no API write |
Go-live |
Correct master data |
Yes |
| Out of Oper |
Review screen, ownership flag, update path |
Phase two |
Write back agreed fields |
Yes |
| Out of Oper |
ID document number (exact), phone (filter) |
Phase two |
Better hit rate |
Yes |
D11 at go-live is read plus 1 create.
3. The 3 calls
3.1 Search
- The gate blocks the next configured step, not typing. Inputs: customer number or IBAN as exact keys, or name plus date of birth, with place of birth optional; 1 weak field fires no call.
- Oper sends advisor id, branch, correlation id; the CRM applies scope. Assumption: scope from the credential (CRM team, CRM question 1).
- Session cache keyed by advisor plus query, in memory, flags excluded, cleared on scope change or sign-out. Assumption: 10 minutes (Oper platform team).
- Thin fields only, cap 10, no flag on a row; an overflow flag, not a count, forces refine, asking for place of birth first, then an exact key: customer number, IBAN or ID document number; no paging. Assumption: the hit carries city and masked number (CRM team, CRM question 4).
- Oper re-filters by branch; out-of-scope rows dropped. The alert reaches a role outside the requesting branch, never the advisor, and names no customer or number. The lookup log, not the alert, keeps the dropped id and both branches (D8). Assumption: the Bank names that role in configuration (Bank, Bank question 8).
- No auto-select; an exact key, customer number or IBAN, preselects 1 row.
- An exact key returning 2 or more records is a CRM duplicate: nothing renders, an alert routes it to the merge review queue, unseen by the advisor.
- Audit: time, advisor, branch, query, rows shown, total matches, ids ordered, correlation id; detail adds flags and schema version, create adds key and attempts.
3.2 Detail
- Advisor selects 1 row; others fetch nothing. The call sends the number and search correlation id.
- Flags reach Oper on detail, not on a row; they read live here and at each milestone, never cached. A detail read that finds nothing: no link, identification pending. Milestones at go-live: application submitted, offer produced. Assumption: 2 milestones, configurable (Bank).
- Pinned schema: the pin is a version string in connector configuration, owned by the squad, changed by release; in-flight cases keep theirs. A removal comes from the CRM's published version, never from a missing key.
- Unknown flag value fails closed; the map is corrected within 1 working day. Assumption: 1 working day (Bank compliance).
- Deceased: hard stop, no override. A disputed flag raises an urgent correction to the CRM owner.
- Blocked: a second role outside the advisor's reporting line releases, typed reason, audit names the approver. The release records the flag value seen; a later live re-read re-blocks only if it changed. Assumption: that rule holds (Bank compliance); that role exists at go-live and covers Saturday (Bank); otherwise blocked is a hard stop too.
- Pass: number stored as identity truth; dated snapshot written, re-read each milestone, on case retention, not the prospect clock. Assumption: case retention applies (Bank DPO).
- A changed field raises a task, never an overwrite; that task is the change request S11 reviews.
3.3 Create at the milestone
- No match: the advisor creates a prospect in Oper, inside the flow, stamped with a delete-after date; nothing reaches the CRM until the configured milestone, default "application submitted".
- Search re-runs first, unscoped, by a back-office job under its own credential, unseen by the advisor, with its own access control and audit.
- Hit: merge queue, worked by a role outside the requesting branch, write held, neutral in-review state, no reason. Entries kept 12 months after the decision. Assumption: the Bank names that role in configuration (Bank, Bank question 8); 12 months (Bank DPO); queue configurable (Oper platform team).
- No hit: create once, prospect id as idempotency key. Assumption: the CRM accepts a key (CRM team, CRM question 6).
- The idempotency record (id, attempts, status) sits with the prospect and expires 30 days after the create resolves. Assumption: 30 days (Oper platform team).
- Timeout: search by key, adopt if landed; else wait 60 seconds, search again, then queue. Never a blind second create. Assumption: 60 seconds (Oper platform team).
- Success: number linked, snapshot written, prospect state cleared.
4. Failure modes
| Failure |
What the advisor sees |
What the system does |
What is logged |
| Search times out at 10 s |
Lookup unavailable, keep typing |
Identification pending, submit blocked, nothing written |
Correlation id |
| CRM down an hour |
Same banner |
Degraded capture, lookup re-runs later, gate holds |
Blocked submits |
| 429 rate limited |
Short wait, then results |
Retry-After honoured, else base 1 s doubling to 30 s, jitter, 5 attempts |
Retries, headers, wait |
| Slow, p95 above target |
Longer spinner |
Cache served where valid, latency alert |
p95 per branch |
| Out-of-scope record returned |
Nothing renders |
Dropped; the alert to the named role names no customer or number |
Dropped id, both branches |
| Exact key returns 2 records |
Nothing renders |
Alert, merge review queue |
Both ids, key type, no key value |
| Detail not found for a shown row |
Row is stale, search again |
No link, identification pending |
Number, correlation id |
| Unknown flag value |
Contact back office |
Fails closed, mapped within 1 working day |
Value, number, version |
| Flag field missing |
Contact back office |
Call fails, identity not confirmable |
Field, endpoint, version |
| Create times out |
Finishing, do not retype |
Search by key, wait 60 s, search again, then queue |
Key, attempts |
| Duplicate returned on create |
In-review state, no reason |
Write held, merge review opened |
Both numbers, queue id |
| Schema drift |
Blank optional field, or hard stop on identity and flags |
Additive passes, published removal alerts |
Pinned version |
| Auth failure |
Lookup unavailable |
Calls stop, operations alerted, no unscoped fallback |
Credential id, error code |
5. Non-functional
Rate budget per branch, unknown until CRM question 2. Size per party, not per case: each applicant costs 1 search, 1 detail and 1 live flag read per milestone, plus retries, in sequence. Assumption: backoff base 1 s doubling to 30 s, jitter, 5 attempts (Oper platform team).
Latency. Assumption: search under 2 seconds at p95 (CRM team). Client timeout above the agreed p99, not p95. Assumption: 10 seconds (Oper platform team).
Lookup audit log: append-only, identifiers not payloads, restricted role scoped to its own branches, reads logged in the same log and retention. The log, not a repeat query, is the evidentiary record; CRM ordering may be unstable. Assumption: 7 years, own clock (Bank DPO, Bank question 3); CRM access log kept at least as long (CRM team, CRM question 10).
Subject access: 1 export per person reads prospect, snapshot and lookup log through the audit reader role; append-only entries stay under a documented basis on erasure. Assumption: that basis is documented (Bank DPO).
Reason fields carry the business ground only, never health or family detail. Assumption: the wording is agreed (Bank compliance).
Prospect retention configurable. Assumption: 6 months after last activity, 30 days for an abandoned draft (Bank, Bank question 2). Stamp at go-live, purge job phase two, before the first stamped date falls due. Until the job ships a monthly report lists prospects past their delete-after date and the back office deletes them by hand.
Change requests: 1 queue in Oper. Assumption: under 20 a week, reviewed within 5 working days (Bank).
6. Open questions for the CRM team
| # |
Question |
What changes with the answer |
| 1 |
Scope from credential or request parameter? |
Parameter: our filter is the only guard. Credential: 1 per branch. |
| 2 |
Rate limits in numbers, per what unit, and the 429 response? |
Sets ceiling, cache lifetime, backoff. |
| 3 |
Fuzzy algorithm, stable ordering, overflow flag, paging, exact-versus-fuzzy marker per hit? |
Unstable ordering: audit cannot prove what was shown. No marker: S9 cannot gate on exact. |
| 4 |
Which fields differ between a search hit and the detail record? |
Missing city or number: the row omits it; never a detail call per row (D3). |
| 5 |
Are deceased and blocked on the hit or only detail, and who versions the flag values? |
Detail-only suits the guard, which reads at selection; values become the flag map, others fail closed. |
| 6 |
Create idempotent with key support, and does the CRM deduplicate? |
No key: search before every retry, wider duplicate window. |
| 7 |
Sandbox with realistic data, and a schema version to pin? |
Without it, fuzzy-behaviour criteria stay untested. |
| 8 |
Does the search endpoint accept phone as an input, and how fuzzy is it? (Address is no longer a search input, E6.) |
Yes: phone switches on in phase two as a last-resort filter (D2); no: a CRM change first. |
| 9 |
Is there an update endpoint, and which fields may a channel change? |
Yes: phase-two write-back once ownership is agreed; no: corrections stay change requests. |
| 10 |
Does your access log store our correlation id, and for how long? |
No echo: join by timestamp plus credential. Shorter retention: identifications stop reconstructing. |
| 11 |
Does the search endpoint accept IBAN, ID document number and place of birth as inputs, and are they indexed as exact keys? Which of them does the CRM store at all? |
Yes: IBAN is a go-live exact key, ID number a phase-two one, place of birth a go-live input and result column; no: customer number stays the only go-live exact key, IBAN becomes the first item of phase two (S8), ID number needs a CRM change, and name plus date of birth stay the only fuzzy inputs. |
7. Definition of ready for the squad
The squad can start when 4 things exist.
- Written CRM contract: endpoints, authentication, scope mechanism, field lists, flag list with values, error codes, pagination, idempotency on create, and the unscoped back-office credential.
- Per-branch rate budget in numbers, including the ceiling the connector enforces.
- Sandbox with realistic data: common surnames, flagged records, records outside the caller's branch.
- Schema version to pin, with flag values versioned as well as fields.
Until all 4 arrive, the squad builds against a mock; this gates 1 sprint, not the go-live.