Skip to content

Product deal engine

ID MOD-109
System SD08
Repo bank-app
Build status Not started
Deployed No

What it does

MOD-109 manages agent-initiated bespoke product deals. When an agent is speaking with a customer (via call, chat, or in-branch) and determines that a personalised arrangement would retain or acquire the customer, they propose specific deal terms through the back-office UI (MOD-083). MOD-109 validates those terms, routes them through the appropriate authorisation tier, presents the accepted deal to the customer, and logs the full lifecycle immutably.

Deal vs offer distinction

  • MOD-108 product offer — system-initiated; generated without agent involvement; terms derived algorithmically; no authorisation workflow; sent to customer via app or automated channel.
  • MOD-109 product deal — agent-initiated; triggered by a direct customer interaction; terms may include bespoke rate reductions, fee waivers, or enhanced limits; requires authorisation if outside the agent's self-approval tolerance.

Why it exists

Direct customer interactions are the bank's highest-conversion sales channel. When a retention conversation is in progress, the agent needs the ability to propose a competitive deal in real time — without a multi-day approval process that causes the customer to leave. MOD-109 provides the authorisation workflow and audit trail that make this operationally possible while maintaining the governance and consistent-treatment obligations of CON-006 and CON-001.

Authorisation tiers

Three tiers with configurable tolerance bands:

Tier Who Rate reduction tolerance Fee waiver tolerance Limit increase tolerance
1 — Agent self-approve Frontline agent ≤ 25 bps ≤ $500 ≤ $2,000
2 — Team manager Team manager (back-office role) ≤ 50 bps ≤ $2,000 ≤ $10,000
3 — Product/pricing committee Senior approval (product governance role) Any Any Any

All tolerance values are configurable in the deal_authorisation_config table — the tier structure is fixed but the numbers are IaC-managed.

Deal lifecycle

PROPOSED (agent submits deal terms)
  → SELF_APPROVED (within Tier 1 tolerance — proceeds immediately to PRESENTED)
  → PENDING_APPROVAL (exceeds Tier 1 — routed to Tier 2 approver queue)
    → APPROVED (Tier 2 approver confirms)
    → REFERRED (Tier 2 refers to Tier 3 product/pricing committee)
      → APPROVED
      → DECLINED (deal outside policy; agent notified with reason)
  → PRESENTED (approved deal terms communicated to customer)
    → ACCEPTED (customer agrees; triggers application or account modification)
    → REJECTED (customer declines)
    → EXPIRED (customer did not respond within validity window — default 48 hours for deals)

Data model

-- app.product_deals (Postgres — bank_app)
CREATE TABLE app.product_deals (
  deal_id               uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  party_id              uuid NOT NULL,
  product_id            text NOT NULL,
  jurisdiction          text NOT NULL CHECK (jurisdiction IN ('NZ','AU')),
  proposed_terms        jsonb NOT NULL,        -- rate, limit, fee waiver as proposed
  approved_terms        jsonb,                 -- may differ if approver modifies terms
  approval_tier         int NOT NULL CHECK (approval_tier IN (1,2,3)),
  proposed_by           text NOT NULL,         -- staff_id of proposing agent
  approved_by           text,                  -- staff_id of approver (null if tier 1 self-approved)
  approval_rationale    text,
  status                text NOT NULL CHECK (status IN (
                          'PROPOSED','PENDING_APPROVAL','APPROVED','DECLINED',
                          'PRESENTED','ACCEPTED','REJECTED','EXPIRED')),
  interaction_id        uuid,                  -- links to MOD-054 call or chat session
  proposed_at           timestamptz NOT NULL DEFAULT now(),
  approved_at           timestamptz,
  presented_at          timestamptz,
  responded_at          timestamptz,
  expires_at            timestamptz NOT NULL,
  created_at            timestamptz NOT NULL DEFAULT now()
);

-- app.deal_events (append-only lifecycle log)
CREATE TABLE app.deal_events (
  event_id    uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  deal_id     uuid NOT NULL REFERENCES app.product_deals(deal_id),
  event_type  text NOT NULL,
  actor_id    text NOT NULL,   -- staff_id or 'system'
  event_at    timestamptz NOT NULL DEFAULT now(),
  detail      jsonb
);

Events

  • product.deal_approved — on Tier 1 self-approval or Tier 2/3 approval; triggers presentation to customer.
  • product.deal_accepted — customer accepts; triggers account modification or new application workflow in the relevant system domain.
  • product.deal_declined — approval tier declined; carries decline reason for agent feedback.

Module dependencies

Depends on

Module Title Required? Contract Reason
MOD-105 Product eligibility engine Required Customer must be eligible for the product before any deal can be proposed — eligibility is verified at deal creation time.
MOD-083 Agent assist & compliance coaching panel Required Agent assist provides the interface through which deals are proposed; deal creation is embedded in the agent interaction workflow.
MOD-047 Agent action logger Required Every deal proposal and authorisation is an agent action logged via the agent action logger.
MOD-104 AWS shared infrastructure bootstrap Required AWS shared infrastructure provisioned by MOD-104 is required before this module can be deployed.
MOD-103 Neon database platform bootstrap Required Neon database provisioned by MOD-103 must exist before this module can read or write Postgres.

Required by

(No modules in this wiki currently declare a dependency on this module.)


Policies satisfied

Policy Title Mode How
CON-006 Product suitability and governance GATE Agent-proposed deal terms are validated against product floor/ceiling rules and eligibility constraints before being presented to the customer — no deal outside configured tolerance can be authorised without the required approval tier.
CON-004 Product Disclosure & Sales Practice Policy LOG Every deal proposal, authorisation decision, and customer acceptance or rejection is logged immutably in the deal audit trail with the agent ID, authoriser ID, terms, and timestamp.
CON-001 Customer Fairness & Conduct Policy LOG Deal audit trail enables periodic review for consistent treatment — agents cannot offer materially different deals to similarly situated customers without an auditable reason.

Capabilities satisfied

(No capabilities mapped)


Part of SD08 — Customer App & Back Office Platform Compiled 2026-05-22 from source/entities/modules/MOD-109.yaml